IBM PCではPC DOSバージョン2.0より、IBM 5550では日本語DOSバージョンK2.1より、5.25インチディスケットを8セクター/トラックに加えて9セクター/トラックでフォーマットできるようになった。2Dディスケットであれば320KBから360KB、2DDディスケットであれば640KBから720KB(IBM 5550のみ)まで使える容量が増えているが、ドライブもディスケットも同じなのになぜ容量を増やせるのか、よく理解していなかった。

フォーマットの種類

フォーマットの種類 物理仕様 論理仕様
媒体の種類 回転速度 トラック密度 記録方式 転送レート ビット密度 面数 容量(U) セクタ容量 セクタ数 シリンダ数 容量(F)
2D(320KB) 5.25" 2D 300rpm 48tpi MFM 250Kbps 5876bpi 2 500KB 512B 8 40 320KiB
2D(360KB) 5.25" 2D 300rpm 48tpi MFM 250Kbps 5876bpi 2 500KB 512B 9 40 360KiB
2DD(640KB) 5.25" 2DD 300rpm 96tpi MFM 250Kbps 5922bpi 2 1.0MB 512B 8 80 640KiB
2DD(720KB) 5.25" 2DD 300rpm 96tpi MFM 250Kbps 5922bpi 2 1.0MB 512B 9 80 720KiB

「未フォーマット時の容量」に含まれるもの

平時我々が呼ぶ360KBや720KBという容量はフォーマット後の容量である。之に対して、ディスクの仕様表には「未フォーマット時の容量」が記載されており、2Dディスケットなら0.5MB、2DDディスケットなら1.0MBと書かれている。

Image: Maxell Super RD Ultra 2DD

ディスクにはデータの他に、同期用の信号やインデックス、CRC、書き込み・消去時の位置決めの誤差を吸収するギャップが記録されている。この中で今回の話に絡むのはギャップの部分になる。

5.25インチ2D/2DDドライブの仕様上の回転数は300rpm、データレートは250kbpsとなっているが、実際には回転数は1.5%以内の誤差が生じる。これによってフォーマット時にトラック一周のデータ長が変わってくるため、トラックの後ろのデータが先頭と重なってしまう恐れがある。これを吸収するのが Gap 4(または、ポスト・アンプルとも)である。

Image: MFM data and clock format

また、トラック上の特定のセクターを書き換えるとき、前後のセクターと間を空けておかないと、タイミング誤差で上書きしてしまう恐れがある。これを吸収するのが Gap 3 である。

Image: MFM data and clock format
高橋 昇司『フロッピ・ディスク装置のすべて』(1989年)より。

計算

回転数が300rpm、データレートが250kbpsの時、トラック1周のデータサイズは 250 / (300 / 60) = 50000 ビット = 6250 バイト になる。

Gap 3のサイズはソフトウェアからフロッピーディスクコントローラーへのコマンドで指定することができる。IBM PS/2の場合、2D、2DDは80バイト、5.25インチ2HCは84バイト、3.5インチ2HDは108バイトでフォーマットする(通常のセクター書き込み時はこれより小さい)。1セクターのデータ長はいずれも512バイト。よって上図より、1セクター全体のサイズは 654 バイトとなる。

プリ・アンプルのサイズはMFMフォーマットで一定であり 146 バイトである。

したがって、8セクター/トラックの場合の1トラックのポスト・アンプルを除いたサイズは146 + 8 * 654 = 5378 バイトになる。ポスト・アンプル (Gap 4) のサイズはトラック1周のサイズから先の数字を差し引いて、6250 - 5378 = 872 バイトになる。これは1トラック全体の13.4%にあたる。

これを9セクター/トラックに増やした場合、ポスト・アンプル (Gap 4) のサイズは218バイトになる。これはトラック全体の3.49%にあたり、回転数の誤差を吸収するには必要十分と言える。

ちなみに、フロッピーディスク版Windows 95のセットアップディスクには、Gap 3のサイズを減らして18セクター/トラックを21セクター/トラックに増やした DMF というフォーマットが使われている。セットアップディスクだから書き込み誤差を考慮する必要が無く、読み取りさえできれば良いという算段だろう。

なぜ当初は8セクター/トラックだったのか?

信頼性を高めるためにポスト・アンプルを長くしたと、最初はそう思っていたが、実際計算してみると、そこまでカツカツと言うほどでもない。

DOSのファイルシステムであるFATに注目すると、FATはもともと8ビットPCのDisk BASICに使われ、その時は256バイト/セクターだった(8ビットCPUには都合が良い数字だ)。256バイト/セクターの場合、インデックスやGap 3が増えて、1トラックは16セクターが限界となる。実際、IBM PC用のCP/M-86も、256バイト/セクターで16セクター/トラックのフォーマットを使用した。これとデータサイズで互換性を取って、DOS 1.xでは512バイト/セクターで8セクター/トラックにした可能性がある。

DOS 2.xでMS-DOSはUnixライクな拡張を取り入れてCP/M互換路線を早々に外した。9セクター/トラックフォーマットの追加もこの時である。実は政治的駆け引きの話なのだろうか。

と、ここまで書いていたところ、Timeline of DOS operating systems - Wikipediaに次のような記述を見つけた。

1983 March: The IBM PC/XT, the first PC to store data on a hard disk (10 MB), is announced. It ships with PC DOS 2.0, and introduces nine sectors per track floppy disk formats, which increase floppy storage capacity by about 12%. Single-sided 180 KB (184,320 bytes; 360 sectors) and double-sided 360 KB (368,640 bytes; 720 sectors) diskettes require more than the maximum 340 FAT entries a 512-byte sector can hold, so the FAT size is doubled, leaving 351 sectors (179,712 bytes) for data on single-sided disks and 354 clusters (362,496 bytes) on double-sided disks.

DOSのディスケットにおいてクラスターのサイズは固定(片面ディスク:1セクター、両面ディスク:2セクター)で、320KBから360KBへ増やすにはFATの領域を単一セクターから複数へ増やす必要があったようだ。クラスターサイズが固定になっているのは、何か理由があったかしら。単に小データを扱うときのパフォーマンスやサイズの効率の問題か。


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!