10年間、エミュレーターを開発していたら、フロッピードライブについて詳しくならざるを得なかった。IBM PCのFDCの特徴が分かってくると、なぜ日本のPCで使われるフロッピーディスクをIBM PCでイメージ化することが難しいのか。解決方法はあるのか、などが分かってくる。
ディスク交換を検出できない(PC/AT以前の2Dドライブ)
フロッピードライブはディスクの挿入を検知すると、Ready信号出力をアクティブにする。FDCはReady信号の変換を検知するとハードウェア割り込みを発生してCPUに伝え、CPU側はFDCのフラグを調べることでReady信号の変化を知ることができる。IBM PC以外のコンピューター(IBM 5550も含む)はこれを利用し、交換後のディスクに予期せずデータを上書きすることを防いだ。
IBM PCやPC/XTではFDCのReady信号入力ピンはプルアップされ、ディスク交換をソフトウェア側から検出する方法がない。つまり、ディスクアクセスのたびに最外周にあるディスク管理領域を読み取って、ディスクが交換されたかどうかを調べなければならない。フロッピードライブのシーク操作は(CPUにとって)非常に時間が掛かり、無駄が多い。そこで、MS-DOS 3.xでは最後のディスクアクセスから2秒以内の再アクセスではディスク交換されていないものとして扱われた。
PC/ATで登場した2HCドライブではディスク交換を検出する専用の信号線が追加され、ソフトウェア側から検出できるようになった。
3.5インチドライブの回転速度の違い
PC98では3.5インチ、5インチ、8インチで互換性を取るため、2HDドライブでは回転数を360rpmで揃えていることに対し、IBM PCでは3.5インチ2HDドライブで2D、2DDと同じ300rpmを採用したため、IBM PCではPC98の3.5インチフロッピーディスクを読むことができない。例外的に、日本で販売された一部のIBM互換機の内蔵FDDとUSBドライバーで駆動する外付けUSB-FDDは、回転数の切り替え機構を備えることで両方に対応している。
FM変調がサポートされていない
フロッピーディスクにはFM(単密度)とMFM(倍密度)の2つの変調方式がある。FMは1970年代からコンピューターに利用されたが、MFMの方が後発で高密度で記録できるため、PCの世界ではほとんどMFMが使われた。
PCが登場するより前、IBMのコンピューターでMFM変調方式を使ったフロッピーディスク “Diskette 2D” が登場したとき、そのフォーマットは最初のトラック(トラック0、サイド0)だけはFM方式で、他は全てMFM方式だった。MFM非対応のドライブでも最初のトラックでディスクの種別を判別できるようにするという、互換性に配慮した結果なのだろう。
PC98ではこのフォーマットがDisk BASICで8インチだけでなく5インチ、3.5インチフロッピーにも使われた。Disk BASICは1980年代末までのデスクトップPCに標準で付属し、市販ソフトも相当数がDisk BASICで開発されたため、マシン側も1990年代末までサポートせざるを得なかった。
一方、IBM PCでは当初からFM変調がサポートされていない。FM変調をサポートするにはFDC(NEC μPD765相当)のFM/MFM切り替え信号ピンとデータ/クロック分離回路のPLL IC(日本ではVFOと呼ばれることが多い)を結ぶ必要がある。IBM PCではMC4044を中心としたロジック回路でPLLが構成され、FM/MFM信号ピンは結線されていない。1990年代初頭にリファレンス的に使われたIntel 82077AAはPLLを内蔵した統合型FDCで、FM変調はもはや内部的にサポートされていない。
BIOSでサポートされていないFDCコマンド
IBM PCとPC98でハードウェア割り込みやI/Oポートの割り当てが異なるという話はさておき、BIOSでサポートされる機能の違いがIBM PCにさらなる制約を課している。
フロッピーディスクには回転速度や記録位置の誤差を吸収するための同期信号やマージン (Gap)、CRC(パリティ)が記録されているが、FDCに対する通常の読み取りコマンドではFDC内部で自動的にエラーチェックされ、データとエラー状態のみがCPUに渡される。しかし、FDCのRead Track (またはRead Diagnosticとも)コマンドによって、この同期信号やマージンをCPUから読むことができる。
Read Trackコマンドは1トラック上の全てのセクターを読んで、いずれか1つでもエラーが見つかるとエラーフラグを立てるというものだが、コマンドで渡すデータ長を本来のセクターのデータ長より長く設定すると、データの後ろにあるGapや同期信号も読み取ることができる裏技がある。データ長を1トラック分に設定すれば、1トラック丸ごとのGapを含むデータを取得することもできる(この場合、セクターの途中やトラックの境界でビットずれによるデータ化けが生じることがある)。
PC98ではDisk BIOSでこのコマンドがサポートされており、既に1980年代後半にはこれを使ったコピー保護解析が常套手段となっていたようだ。しかし、IBM PCのBIOSではこのコマンドはサポートされていないため、FDCにこのコマンドを送るためのドライバーを自力で開発しなければならない。互換機同士の微妙な仕様の違いや他のソフトウェアとの競合など、注意すべきことが多く、ドライバーを用意することは簡単ではない。
IBM PCにディスクイメージを作成するソフトウェアは多数あるが、Gapデータを取り込めるソフトウェアは今まで存在しないと思っていた。かなり細かい設定ができるIMD (ImageDisk) でさえ、Gapに関しては “The GAP lengths cannot be read from the disk, and using the wrong length can result in an unreadable copy. Unfortunately, determining the correct gap length can be “magic science”.” と書かれている。
しかし、SAMdiskというディスクイメージソフトウェアならRead Trackコマンドによるトラックデータの取得もできることが分かった。このソフトウェアは内蔵ドライブを必要とするが、Windows 2000以降で動作するという点でハードルを下げている(ラップトップPCなど選択の幅が広がる)。残念なのは、取り込んだトラックデータをセクターレベルのディスクイメージ形式に変換することはできても、HxC Floppyや86Boxでサポートされているビットストリーム形式にそのまま変換できないことか。