Greaseweazle互換基板を作る!いろいろな3.5インチFDを読んでみた
この記事について
前回は、Greaseweazle互換基板にファームウェアを書き込み、3.5インチFDDを接続して、実際にFDを読み込むところまで確認しました。
今回はその続きとして、手元にある別の3.5インチFDをいろいろ試してみます。
Windows用のFD、2DD 720kB、PC-9801用と書かれたFDなどを順番に読んでみました。
ただ、古いFDは思った以上に状態差が大きく、読めるものと読めないものがかなり分かれます。
今回は、その試行錯誤の作業ログです。

🎀 今回は、読めたFDよりも“読ませちゃいけないFD”の怖さが見えてきた回だね
WindowsのFD
まず、Windowsで使っていた3.5インチFDは普通に読めました。
前回と同じく、Greaseweazle互換基板と3.5インチFDD SONY MPF920 の組み合わせで読み込みできます。

普通の1.44MBのFDなので、フォーマットは ibm.1440 です。
./gw read disk.img --format ibm.1440
ここは特に問題ありませんでした。
読み出したimgは、7-Zipでも中身が見えます。
この時点では、Greaseweazle互換基板も、3.5インチFDDも、ハードウェアとしてはちゃんと動いていると見てよさそうです。
🎀 まずは普通のFDで読めることを確認できたので、ここまでは順調だね
2DD 720kB
次に、手元にあった2DD 720kBのFDを試してみました。

フォーマットは ibm.720 を指定します。
PS D:\gw\greaseweazle-1.23> ./gw read disk_720.img --format ibm.720
ところが、FDを入れて回すと、キュルキュル音がします。
さらに読み込み時には、シャカシャカというか、シャリシャリというか、あまり聞きたくない音がしました。
Reading c=0-79:h=0-1 revs=2 Format ibm.720 T0.0: IBM MFM (9/9 sectors) from Raw Flux (86635 flux in 400.93ms) T0.1: IBM MFM (1/9 sectors) from Raw Flux (88063 flux in 400.56ms) Unknown mark f9 Unknown mark f9 Unknown mark f9 Unknown mark f9 T0.1: IBM MFM (1/9 sectors) from Raw Flux (132073 flux in 600.53ms) (Retry #1.1) Unknown mark f9 Unknown mark f9 Unknown mark f9 Unknown mark f9 T0.1: IBM MFM (1/9 sectors) from Raw Flux (132007 flux in 600.52ms) (Retry #1.2) Unknown mark f9 Unknown mark f9 T0.1: IBM MFM (1/9 sectors) from Raw Flux (132034 flux in 600.50ms) (Retry #1.3) T0.1: Giving up: 8 sectors missing : :
ibm.720 は9セクタ構成なので、T0.0やT1.0が 9/9 sectors まで読めている時点で、指定が完全に外れているわけではなさそうです。
ただし、反対側はかなり怪しいです。
T0.1は 1/9 sectors、T1.1は 0/9 sectors のまま、最終的に Giving up になりました。
さらに読み進めると、こんなログも出てきました。
T16.0: Ignoring unexpected sector C:15 H:0 R:3 N:2 T16.0: Ignoring unexpected sector C:15 H:0 R:9 N:2 T16.0: IBM MFM (0/9 sectors) from Raw Flux (83430 flux in 400.44ms)
T16.0を読んでいるはずなのに、セクタIDとしては C:15 が見えています。
つまり、Greaseweazleから見ると、今読もうとしている場所と、FD上に書かれているトラック番号が合っていません。
フォーマット指定だけの問題ではなさそうです。
FDの状態なのか、FDDの読み取り状態なのか、ヘッドに付いたゴミの影響なのかどうかは分かりません。
このあたりから、カチッ、カチッ という音がし始めて、
明らかに普通ではありません。
これは何かヤバそうだと思い、途中で中断しました。
あまり深追いしないほうがよさそうです。
🎀 読めないだけならまだしも、変な音がするFDはかなり怖いね……
Fluxとは
Greaseweazleのログには、flux という数値が出てきます。
これは、FDDのヘッドが読み取った磁気変化のパルス数のようなものです。
普通のFDDでは、この信号をFDCが処理して、セクタ単位のデータとして読み出します。
一方、Greaseweazleでは、この磁気変化のタイミングをPC側に取り込み、ソフトウェア側で後から解析します。
つまり、flux の数値が出ているということは、FDDからGreaseweazle側に何らかの信号は届いている、ということになります。
今回の2DDでも、flux は 86635 などの数値が出ていました。
状態がかなり悪いFDでは、小さな数値になるはずです。
ただし、fluxが取れているからといって、必ずファイルとして読めるわけではありません。
FDのフォーマットが違っていたり、磁性体が劣化していたりすると、信号は取れていてもセクタとして復元できないことがあります。
保存目的で考えると、最初からimg化を狙うより、まずfluxとして保存しておくほうがよさそうです。
Greaseweazleでは、FDから信号を取り込むことと、その信号をフォーマットとして解釈することを分けて実行できます。
これは、フォーマットがはっきり分からないFDを扱うときにはかなり大きな強みです。
まずfluxとして保存しておけば、あとから ibm.1440 や pc98.2hd など、別の指定で解析し直せる可能性があります。
補足:保存現場でも使われる考え方
フロッピーディスクの保存では、最初から通常のディスクイメージだけを作るのではなく、磁気変化の情報を低レベルに保存しておき、あとから解析する考え方も使われています。
Library of Congress のブログでも、KryoFluxを使って磁気変化のイメージを作り、そこからフォーマット済みのディスクイメージを作る流れが紹介されています。
ディスクの見た目だけではフォーマットが分からないことがあり、preservation streamを残しておけば、元のFDや機材を何度も摩耗させずに、あとから複数の形式で試せる、という説明です。
このあたりは、今回Greaseweazleで感じたこととかなり近いです。
ただし、fluxやstream形式は容量が大きくなります。
Library of Congress の解説でも、KryoFlux Stream files は通常のディスクイメージよりかなり大きくなり、ハードウェア依存性などの課題もあるとされています。
なので、fluxで保存すれば何でも解決、というわけではありません。
それでも、フォーマットがはっきり分からない古いFDを扱うときには、最初に低レベルな形で残しておく意味はありそうです。
ただし、物理的に傷んでいるFDは別問題です。
flux保存でもFDDで回すこと自体は同じなので、シャリシャリ音がするFDを無理に読み続けるのは危険です。
🎀 fluxは“読めた結果”というより、“あとから考えるための材料”みたいな感じだね
他のFDまで怪しくなる
問題はその後でした。
さっきまで普通に読めていたFDを入れてみると、今度はSIDE1側でエラーが頻発します。
それまで読めていたFDなので、急にFDそのものが悪くなったとは考えにくいです。
そこで、先ほどの2DDのFDのDISK面を見てみました。
すると、同心円状の傷がありました。

さらに、前回読み込めたFDにも、同じような傷がついていました。
どうやら、劣化したFDを入れると、FDDのヘッドにゴミのようなものが残り、その状態で別のFDを読むと、他のFDまで傷つけてしまうようです。
これは、かなり怖いです。
FDが読めないだけならまだしも、読めないFDを入れたことで、正常だったFDまで傷つけてしまう可能性があります。
🎀 読めないFDが、次のFDまで巻き込むのはかなり危険だね
USB-FDDでも試す
手元にある3.5インチのUSB-FDDにも、例の2DDを入れてみました。
これは、以前 Let’s note を買ったときに付属していた Panasonic CF-VFDU03 です。
すると、こちらもおかしくなってしまい、以降はまったくFDを読めなくなってしまいました。
仕方がないので分解して、ヘッドを洗浄することにしました。
中のFDDには TEAC FD-005U と書かれていました。

ケース内には、ドライブ以外のロジック基板は見当たりません。
ドライブからそのままUSBに配線されていたので、FD-005U自体がUSBインタフェースを持ったFDDのようです。
ヘッドを洗浄すると、とりあえず普通のFDは読めるようになりました。
ただし、Greaseweazleで読めなかった例の2DDは、USB-FDDでも読めませんでした。
なお、このUSB-FDDが2DDに対応しているかどうかは確認できていません。
いわゆる3モードFDDなのかどうかも分かりません。
一方で、USB-FDDでは読めなかったFDでも、Greaseweazleでは問題なく読めたものもありました。
FDDそのものの違いなのか、USB-FDD内部の制御の違いなのか、そのあたりは分かりません。
Greaseweazleでは、FDDから出てくる信号を取り込んで、ソフトウェア側でFDCのような処理をしています。
そのため、普通のUSB-FDDとは、読める/読めないの結果が違うこともあるようです。
🎀 USB-FDDで読めないからといって、そのFDが完全に読めないとは限らないんだね
ヘッドをクリーニング
Greaseweazle側で使っていた3.5インチFDDも、ヘッドをクリーニングしました。
綿棒にアルコールを湿らせて、軽く掃除します。
その後、正常そうなFDを入れて読み直すと、こちらは再び読めるようになりました。
とりあえず、FDD側が完全に壊れたわけではなさそうで、そこはほっとしました。
ただし、先ほど傷がついてしまったFDは、NGのままでした。
おそらく、壊してしまったのだと思います。
数十年前のFDは、見た目がキレイで大丈夫そうに見えても、DISK面が滑らかではなくなっていたり、磁性体がはがれやすくなっていたりするようです。
現役で使っていた頃は、こんな音がした記憶はありません。
当時なら問題なかったFDでも、今はもう状態が変わっているということだと思います。
手元には、3.5インチで2DDのDISKが他にないため、2DDについてはいったん保留にしました。
🎀 古いFDは、読めたらラッキーくらいの気持ちで扱ったほうがよさそうだね
PC-9801用のFD
次に、「PC-9801シリーズ」と書かれたMS-DOS純正FDを試してみました。

ここからが、さらにややこしい話になります。
まずは ibm.1440 で試しました。
PS D:\gw\greaseweazle-1.23> ./gw read pc98_disk.img --format ibm.1440 Reading c=0-79:h=0-1 revs=2 Format ibm.1440 Unknown mark f0 T0.0: IBM MFM (0/18 sectors) from Raw Flux (136182 flux in 400.58ms) T0.0: Ignoring unexpected sector C:0 H:0 R:6 N:3 T0.0: IBM MFM (0/18 sectors) from Raw Flux (204123 flux in 600.24ms) (Retry #1.1) T0.0: Ignoring unexpected sector C:0 H:0 R:6 N:3 Unknown mark f9 Unknown mark fc
ログを見ると、完全に何も読めていないわけではありませんでした。
ibm.1440 は 512バイトセクタを想定しています。
ところが、ログには N:3 と出ています。
これは1024バイトセクタを示しているので、ibm.1440 としては想定外です。
そのため、Greaseweazleはこのセクタを無視しています。
つまり、このFDはまったく信号が読めていないわけではなく、少なくともセクタIDらしきものは見えていました。
ただ、指定したフォーマットとは合っていないため、imgとしては読み出せませんでした。
このあたりを見ると、やはりラベルだけではなく、実際のログを見ないと分からないなと思います。
次に pc98.2hd を試しました。
Greaseweazle の diskdefs_pc98.cfg ファイルを見ると、pc98.2hd は以下のようになっています。
disk 2hd
cyls = 77
heads = 2
tracks * ibm.mfm
secs = 8
bps = 1024
gap3 = 116
rate = 500
rpm = 360
end
end
1024バイトセクタになっています。
早速、pc98.2hd フォーマットでやってみました。
PS D:\gw\greaseweazle-1.23> ./gw read pc98_disk.img --format pc98.2hd Reading c=0-76:h=0-1 revs=2 Format pc98.2hd T0.0: IBM MFM (8/8 sectors) from Raw Flux (136239 flux in 400.52ms) T0.1: IBM MFM (0/8 sectors) from Raw Flux (59412 flux in 400.58ms) T0.1: IBM MFM (0/8 sectors) from Raw Flux (87041 flux in 600.24ms) (Retry #1.1) T0.1: IBM MFM (0/8 sectors) from Raw Flux (85237 flux in 600.43ms) (Retry #1.2) T0.1: IBM MFM (0/8 sectors) from Raw Flux (85198 flux in 600.41ms) (Retry #1.3) T0.1: Giving up: 8 sectors missing T1.0: IBM MFM (8/8 sectors) from Raw Flux (152434 flux in 400.83ms) T1.1: IBM MFM (0/8 sectors) from Raw Flux (59712 flux in 400.31ms) T1.1: IBM MFM (0/8 sectors) from Raw Flux (89244 flux in 600.47ms) (Retry #1.1) T1.1: IBM MFM (0/8 sectors) from Raw Flux (89761 flux in 600.45ms) (Retry #1.2) T1.1: IBM MFM (0/8 sectors) from Raw Flux (88766 flux in 600.39ms) (Retry #1.3) T1.1: Giving up: 8 sectors missing :
すると、T0.0 は最終的に 8/8 sectors まで読めました。
つまり、まったく見当違いのフォーマットというわけではなさそうです。
ただし、SIDE 1 が全滅しました。
flux は出ているので、FDDから何も信号が来ていないわけではありません。
でも、セクタとしては1つも読めていません。
ここまで来ると、フォーマットの問題だけではなく、FDの状態や、FDDのヘッド側の状態も疑いたくなります。
特に今回は、劣化した2DDを読んだあとにSIDE1側でエラーが増えていたので、その影響もありそうです。
cfgファイルには rpm = 360 とあったので、
もしかして、PC-9801はrpmが360じゃないとダメなのかもしれません。
ただ、このFDD、MPF920ではどうやって回転数を変えるのかが分かりません。
🎀 PC-9801用って書いてあるだけでは、まだ何も分からない感じになってきたね
DENS信号
Greaseweazleには、信号線を変化させるコマンドがあります。
そこで、DENS信号(FDDコネクタの Pin2)を変えてみました。
PS D:\gw\greaseweazle-1.23> ./gw pin set 2 l Pin 2 is set Low (0v) PS D:\gw\greaseweazle-1.23> ./gw rpm Rate: 299.992 rpm ; Period: 200.005 ms PS D:\gw\greaseweazle-1.23> ./gw pin set 2 h Pin 2 is set High (5v) PS D:\gw\greaseweazle-1.23> ./gw rpm Rate: 300.003 rpm ; Period: 199.998 ms
High/Lowどちらに設定しても、rpmが300のままでした。
テスターで見ると、期待したようには信号がまったく変わっていません。
FDDのケースを開けて基板を見ると、DENS、つまりPin2はハンダジャンパーになっていました。
この時点ではOpenです。
なるほど。
そもそも、外からDENS信号を入れられる状態になっていなかったようです。
内部的にはPull-Upのはずなので、常に Open = High となっていると思います。
そこで、このハンダジャンパーをCloseしてみました。

赤丸のところがハンダジャンパー
その後、Pin2を変化させると、実際の信号も変わるようになりました。
PS D:\gw\greaseweazle-1.23> ./gw pin set 2 l Pin 2 is set Low (0v) PS D:\gw\greaseweazle-1.23> ./gw rpm Rate: 359.921 rpm ; Period: 166.703 ms
rpmを計測すると、Pin2をLowにしたときに360rpmになりました。
High(Open)の状態では300rpmです。
🎀 DENSという名前だけ見ても、実際に何が変わるのかはFDD次第なんだね
360rpmでも読めない
360rpmになった状態で、もう一度 pc98.2hd を試しました。
powershell id="mxpcgu"
./gw read pc98_disk.img --format pc98.2hd
しかし、結果は300rpmのときと全く同じでした。
3枚組だったので、ほかのFDでも試しましたが、同じように読めませんでした。
DENSで回転数は変わりました。
ただ、この信号が密度まで変えているのか、それとも回転数だけなのかは分かりません。
3.5インチFDは、FDの穴で2DD/2HDを検出しているはずです。
なので、外部から密度を指定する必要はないと思うのですが、このあたりはFDD側の動きが見えません。
結局、このPC-9801用MS-DOS純正FDは、今回は読めませんでした。
🎀 360rpmにできたから読める、という単純な話ではなかったみたい
PC-9801用でもいろいろ
DENSを元に戻して、他の「PC-9801用」と書かれたFDを試してみました。
すると、これは ibm.1440 で読めました。
はて?
読み出したimgは、7-Zipでも中身が見えました。
つまり、こちらは普通にDOSのFDとして読めているようです。
ますます、わけが分かりません。
PC-9801用と書いてあっても、いろいろなフォーマットが混在しているのでしょうか。
それとも、フォーマットの問題ではなく、FDの劣化なのか。
あるいは、FDDの対応や状態の問題なのか。
ちなみに、ここまで試したものは全部DOS/WindowsのFDです。
N88-BASICのFDではありません。
pc98.2hd で読めないからPC-9801用ではない、とも言えません。
逆に、PC-9801用と書いてあっても、ibm.1440 で読めるものもありました。
見た目やラベルだけでは、実際のフォーマットは分からないようです。
🎀 ラベルより、実際に読んだときのログのほうが正直なんだね
ドライバの裏側
当時、普通にPCでFDを読んでいたときは、こちらがフォーマットを細かく指定することはありませんでした。
FDを入れれば、読めるものは普通に読めます。
でも今回、Greaseweazleで読み込んでみると、512バイトセクタだったり、1024バイトセクタだったり、片面だけ読めたり、フォーマット指定と合わなかったりと、いろいろな情報が見えてきます。
おそらく、当時のBIOSやFDDドライバは、こういう違いを裏側で吸収してくれていたのだと思います。
だから利用者は、FDを入れて読むだけでよかった。
Greaseweazleでは、その裏側で起きていたことがログとして見えてしまいます。
便利でもあり、同時に沼でもあります。
🎀 普通に読めていたものの裏側には、けっこう面倒な処理が隠れていたんだね
いったん保留
ここまでで分かったのは、Greaseweazle互換基板と3.5インチFDDの組み合わせで、3.5インチFDはハードウェア的には読めるということです。
WindowsのFDは読めました。
2DD 720kBも試しましたが、劣化したFDはかなり危険でした。
PC-9801用と書かれたFDも試しましたが、pc98.2hd で読めるとは限りませんでした。
一方で、別のPC-9801用FDは ibm.1440 で読めました。
フォーマットの問題なのか、FDの劣化なのか、FDDの対応なのか。
このあたりは、まだ整理しきれていません。
とりあえず今回は、3.5インチFDの再挑戦はここまでで、いったん保留としました。
奥が深すぎて、完全に沼にはまってしまいました。
🎀 今回は、読めたことよりも、読めない理由がいろいろありすぎることが分かった回だったね
次回は5インチ
このあと、いよいよ今回の目的である本命の5インチFDに挑戦しました。
FD1155Dを使い、Greaseweazle互換基板と変換基板で読み込みを試しています。
ただ、5インチは5インチで、また別のハマりどころがありました。
DENS、HDE、RD、Drive Select、そして古いFDの劣化。
話が長くなるので、5インチ編は次回に分けます。
🎀 3.5インチでも十分に沼だったけど、5インチはさらに本命っぽい雰囲気だね
📪 お問い合わせなど
技術的なご相談やご質問などありましたら、
📩お問い合わせフォーム
または、
📮info@shachi-lab.com までお気軽にどうぞ。
🎀 この記事についての質問やコメントがあれば、お問い合わせから送ってね
🔗 関連リンク
しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:
- 🌐しゃちらぼ公式サイト
- 🐦 X(旧Twitter):@shachi_lab
- 📗 Qiita:@shachi-lab
- 🐙 GitHub:@shachi-lab
- 📸 Instagram:@shachi_lab
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬



コメント