直線上に配置

フロッピーディスクの構造 (MS-DOS)


独自研究の内容を多く含みます
※1.44MB FDについては無いものとします
直線上に配置
★FDDの基礎
PC98のFDDは主に1MB、640KB、両用の3種類があります。
扱えるディスクの種別は、
1MB : 2HD (1.2MB)、8"2D(1.2MB)、8"1(S)(256KB)
640KB : 2DD/8(640KB)、2DD/9(720KB)
    * : 2D/8(320KB)、2D/9(360KB)、1D/8(160KB)、1D/9(180KB)
* : 640KB FDDから読み込み専用。書き込みは不可。

3.5"/5" 2HDと8"2Dはディスクの仕様が異なりますが、
通常のDOSにおける使用範囲では意識する必要ありません。
[Tips]
8"2Dは77トラックしかない。
3.5"/5"2HDは80トラックあるが、77トラックまでしか使わない。

VX以降の内臓FDDは640KB/1MB両用であることが多いです。
両用 = 内臓FDDと思ってもらってもかまいません。
(のっぺらボードを使って外部FDを内臓=両用とすることもできます)

尚、黎明期のDOSでは使用可能なFDDに制限があります。

・MS-DOS 1.25 PS98-111-SF
8"ドライブ2基固定です。ドライブが1基しかなくても
Bドライブがあるものとして認識されます。
8"2D (=1MB)と8"1 (250KB)をサポートしています。

・MS-DOS 2.0 PS98-121-H4W
8"ドライブ(=1MB)と5"ドライブ(=640KB)に対応
まだ5"2HD(1MB)は販売されていませんが、
8"2Dとして5"2HDが利用可能です。
8"2D(=1MB)、8"1(250KB)、5"2DD(640KB)の読み書き、
640KB FDDからの5"1D(160KB/180KB)、5"2D(320KB/360KB)の読みに対応

1MB/640KB両用FDDは非対応です。
1.両用FDDから起動した場合、起動ディスクのフォーマットに固定
2.外部FDDから起動した場合、両用FDDは認識されない

・MS-DOS 2.0 PS98-122 以降
このバージョンから1MBと640KBという表記に変更。
両用FDDにも対応しました。
以降のバージョンは全て同じだと思います。

・MS-DOS 5.0A(-H)の後期版は1.44MB FDに対応しています

★320KB FD (MS-DOS 2.0以降)
320KB FDの利用は制限があります。
・640KB FDからのみ読み取り可能(←重要)
・読み取りのみでデータの書き込みはできない

両用FDDからも読み取りのみ可能です。

640KB経由の320KB FD書き込みに関してはこちらを参照

640KB FDDで1D/2Dを書く

★320KB FDD (MS-DOS 1.25 - 2.0)
PC-9801/E/F/Mには320KB FDインタフェースという、
PC-80S31等と接続するポートがありました。
このFDDについてわかっている事を一番下にまとめました。

★FDフォーマット
1MB 250KB 1.25MB 1.21MB 1.44MB
名称 8"1
8"1S
8"2D
5"2HD
3.5"2HD
5"2HC
3.5"2HC
3.5"2HD
全容量
(バイト)
256,256 1,261,568 1,213,952 1,474,560
実容量
(バイト)
252,416 1,250,304 1,457,664
片面 両面 両面 両面
シリンダ
/面
77 77 80 80
トラック 77 154 160 160
セクタ/
トラック
26 8 15 18
セクタ長
(バイト)
128 1024 512 512
ルート
ディレクトリ
68 192 224 224
セクタ/
FAT
6 2 7 9
FAT ID FE FE F9 F0 (?)
PDA 90 90 90 30
※2HCはEPSON製MS-DOSのみ正式サポート。

640KB 640KB 720KB 160KB 180KB 320KB 360KB
名称 2DD/8 2DD/9 1D/8 1D/9 2D/8 2D/9
全容量
(バイト)
655,360 737,280 163,840 184,320 327,680 368,640
実容量
(バイト)
649,216 730,112 160,256 179,712 322,560 362,496
両面 両面 片面 片面 両面 両面
シリンダ
/面
80 80 40 40 40 40
トラック 160 160 40 40 80 80
セクタ/
トラック
8 9 8 9 8 9
セクタ長
(バイト)
512 512 512 512 512 512
ルート
ディレクトリ
112 112 64 64 112 112
予約
セクタ
1 1 1 1 1 1
FAT 2 2 2 2 2 2
セクタ/
FAT
2 3 1 2 1 2
FAT ID FB F9 FE FC FF FD
PDA 70 70 70 70 70 70


320KB
(DOS 1.25)
160KB 320KB
データ
320KB
システム
名称 5"1D 5"2D 5"2D
全容量(バイト) 163,840 327,680 327,680
実容量(バイト) 160,256 322,560 ?
片面 両面 両面
シリンダ/面 40 40 40
トラック 40 80 80
セクタ/トラック 8 8 16
セクタ長(バイト) 512 512 256
ルートディレクトリ 112 112 112
予約セクタ 1 1 1
FAT 2 2 2
セクタ/FAT 1 1 2
※1.25は2.0と大きく仕様が異なります
・BPBがないためFAT IDが無い
・そもそも320KB FDDの制御はupd765でない

★FDの構造
2DD/8を例に説明します
セクタ 中身
1 IPL & BPB
2 FATテーブル(1024バイト)
3
4 予備FAT(1024バイト)
5
6 ルートディレクトリエントリ
1エントリ=32バイト
1セクタ=16エントリ
16エントリ×7セクタ=112エントリ
7
8
9
10
11
12
13 クラスタ002h
14 クラスタ003h
15 クラスタ004h
16 クラスタ005h
・IPL & BPB
実質ブートローダ(IPL)領域。
ディスクのフォーマット情報(BPB)も格納されている。

・FATテーブル
巨大なファイルは複数のクラスタ(セクタ)に跨って保存される。
その時、どこのクラスタに保存したかを記述する場所がFAT。
該当のクラスタ番号に対して次に参照すべき
クラスタ番号(または終端)が格納されている。
また、不良セクタや空きクラスタといった情報も格納されている。

非常に重要な領域なので、同じ内容の予備FATが後に続く。

・ルートディレクトリエントリ
ルートディレクトリのファイル情報が格納された領域。
ファイルの名前、サイズ、更新日時、
先頭クラスタ番号といったデータが格納されている。
領域が固定されているため、エントリ数に制限がある。

・クラスタ
データ領域。サブディレクトリエントリも含みます。
クラスタ000hと001hはFAT12の仕様上、無い事になっているため
クラスタ002hが先頭です。

★IPL & BPB
場所:セクタ0

2.0以降ではBPBと呼ばれるFDの仕様を収めたブロックがあります。
PC98ではファイル操作時、BPBの情報を参照しません。
※2DDのIPLではFATIDで8セクタか9セクタかを判別しています。

※加筆予定。工事中

★FAT
IPLの次はFATテーブルがあります。
各セクタの使用状況が12bitで収められています。
FATが12bitだから、FAT12です。
基本的には次のセクタ番号です。
以下は特別な意味をもった値です。
・空き状態である (000h)
・終端セクタである (FFFh)
・不良セクタである(FF7h)
・予約済みである (FFBh, FFEhなど)

・リトルエンディアンの読み方
1セクタにつき12bit = 1.5バイトの情報のため、
読み取る際は2セクタ毎、3バイト毎に読みます。
桁毎にA2 A1 A0と振って、以下のような状況を仮定します。

クラスタA: A2 A1 A0 h
クラスタB: B2 B1 B0 h

この時、FATテーブルでは次のように格納されています。
[A1 A0] [B0 A2] [B2 B1]

以下は2DD/8の例です。
FATはIPLの次、セクタ1にあります。


     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0200 FB FF FF 03 40 00 05 60 00 07 80 00 09 A0 00 0B
0210 C0 00 0D E0 00 0F 00 01 11 20 01 13 40 01 15 60

この中から、FATセクタ010h, 011hを見てみます。

     08 09 0A
0210 11 20 01

この時、FATの値は次のように読み取る事ができます。
いずれも、次のセクタ番号が格納されています。
クラスタ010h: 011h
クラスタ011h: 012h

クラスタ000hと001hは予約済という仕様になっており、
領域がそもそも存在しません。

クラスタ002hの位置はフォーマット毎に異なります。
2DD/8であれば、セクタ12がクラスタ002hです。

次のセクタにも同じ内容のFATが予備で記録されています。

★ディレクトリエントリ
1エントリ32バイトで次の内容が記述されています。
オフセット
+00h - +0Ah : ファイル名(8文字+拡張子3文字) or 名前
+0Bh        : 属性
              0x01 : 読み取り専用 +R
              0x02 : 隠しファイル +H
              0x04 : システムファイル +S
              0x08 : ボリュームラベル
              0x10 : ディレクトリ
              0x20 : アーカイブ +A
+16h - +17h : 最終更新時刻
+18h - +19h : 最終更新日付
+1Ah - +1Bh : 先頭クラスタ番号
              0バイトのファイルとラベルは"0"
+1Ch - +1Fh : ファイルサイズ
              ディレクトリとラベルは0

・ファイル (+RHSA)
49 4F 20 20 20 20 20 20 53 59 53 27 00 00 00 00 IO      SYS'....
00 00 00 00 00 00 5B 7E 31 07 02 00 00 A0 00 00 ......[~1.......

・ボリュームラベル
50 52 4F 47 52 41 4D 20 20 20 20 28 00 00 00 00 PROGRAM    (....
00 00 00 00 00 00 BB 60 2E 11 00 00 00 00 00 00 ......サ`........

・サブディレクトリ
49 4E 43 4C 55 44 45 20 20 20 20 10 00 00 00 00 INCLUDE    .....
00 00 00 00 00 00 40 09 2E 11 30 02 00 00 00 00 ......@...0.....

ルートディレクトリエントリとサブディレクトリエントリは
少し内部の仕様が違います。
サブディレクトリエントリはデータとして考えるべきです。

★ルートディレクトリエントリ固有の仕様
・ボリュームラベルはルートディレクトリを1エントリ消費する
・領域固定のため、エントリ数に制限がある
・そのかわりいくらエントリを増やしてもクラスタを消費しない

★サブディレクトリエントリ固有の仕様
・サブディレクトリ作成時に「./」と「../」で2エントリ消費する
・1クラスタ内に収まらないと空きクラスタを消費する
(2DD/8なら16エントリ、2HDなら32エントリ毎に1クラスタ消費)
・そのかわりクラスタチェインによりエントリ数に制限が無い

★FDの構造
2D/8 システムディスク

・トラック0サイド0
セクタ 中身
1 IPL & BPB
2
3 FATテーブル(512バイト)
4
5 予備FAT(512バイト)
6
7 ルートディレクトリエントリ
1エントリ=32バイト
1セクタ=8エントリ
8エントリ×14セクタ=112エントリ
8
9
10
11
12
13
14
15
16
・トラック0サイド1
セクタ 中身
1 ルートディレクトリエントリ
1エントリ=32バイト
1セクタ=8エントリ
8エントリ×14セクタ=112エントリ
2
3
4
5 クラスタ002h
6 クラスタ003h
★MS-DOS 1.25 (PS98-111)での320KB FDDについて
・MS-DOS 1.25の5"版、PS98-111-H2Wは
 確定で320KB FDDから起動した
 (当時は640KBがないので5" = 320KB)

・PS98-111-H2Wは256バイトセクタ

・PS98-111-SFのIO.SYSは1MB FDのDS0決め打ちで
 COMMAND.COMを探しにいくため、PS98-111-H2Wを
 練成する試みは失敗している

PS98-111-SFは8"2D×2の決め打ち認識であり、
1MB FDDを4台使うことはできませんし、
320KB FDDについても認識しておらず使用できません。

FORMAT.COMには2D用IPLがあるため錬成は容易に見えますが、
PS98-111-H2WのIO.SYSが必要と思われます。

尚、PS98-111-H2W, -HSF, -SF でIO.SYSが異なるという事が
PC-PR101F2のマニュアルに書いてありました。

ゆえに、1MB -> 320KB への移植はできないものと考えています。

★MS-DOS 2.0 (PS98-122)以降での320KB FDDについて

みなさんご存知(?)の通り、MS-DOSは320KB FDDを認識しません。
そもそもMS-DOSのマニュアルに320KB FDDサポートの記述がありません。
(1MB FDD/640KB FDD/固定ディスクの3種類)

PS98-122のIPLを書き換えて320KB FDDから起動を試みたところ、
8"2D版MS-DOS 1.25と同じく、1MB FDD or 640KB FDDのディスクへ
COMMAND.COMを探しに行ってしまいます。

また、640KB FDDからシステムディスク形式の2Dフォーマットは
利用できない事も確認しました。
※MS-DOS 2.0のマニュアルには以下のことが書かれている
  「PS98-111-H2Wシステムにてフォーマットされた
  システムディスクの形式のディスクはMS-DOS 2.0では
  使用できません」

尚、外部ドライバで320KB FDDを認識・使用することは可能です。

★MS-DOS 2.0 (PS98-121)での320KB FDDについて

基本、上に同じですが、PS98-121-H2Wとして
320KB FDDから起動できるものが販売されていました。

ただ手持ちのPS98-121-H4Wでは320KB FDDを認識できず、
IPLを書き換えても1MB or 640KB FDDを探しに行ってしまいます。

そのためPS98-121-H2Wは特別なIO.SYSを持っていて、
そのバージョンでは320KB FDDが認識できたものと推測します。

★IPLの書き換えについて

システムディスク形式な320KB 2D用のIPLのつくりかた

合言葉は以下5つのパラメータ

・0100: BX FAT
・0105: DX IO.SYSの開始場所
・0007: DX FAT
・0C00: BX 最初のサイドで読む量
・1000: BX 1サイドあたりの容量

;とあるバージョンのIPL
BB0001         MOV	BX,0100 	;読み込むバイト(256バイト)
C70602020501   MOV	Word Ptr [0202],0105 
BA0600         MOV	DX,0007 	;ヘッド No.0 セクタ  No.7
C7060402000C   MOV	Word Ptr [0204],0C00 
C70606020010   MOV	Word Ptr [0206],1000 
B501           MOV	CH,01 		;セクタ長N(256バイト)

;別のとあるバージョンのIPL
BB0001         MOV	BX,0100         ;読み込むバイト(256バイト)
C70604020501   MOV	Word Ptr [0204],0105 ;サイド1セクタ5
C70606020700   MOV	Word Ptr [0206],0007 ;サイド0セクタ7
C7060802000C   MOV	Word Ptr [0208],0C00 ;256×12=3072バイト
C7060A020010   MOV	Word Ptr [020A],1000 ;256×16=4096バイト

バージョン毎にIPLが違うので↑を参考に変えてみてください。

★320KB FDD用MS-DOS起動ディスクは作れるのか?

【結論】
320KB 2D版MS-DOS以外はそもそも320KB FDD未対応で、
IPLを書き換えても無駄。

起動ディスクを作るには320KB 2D版MS-DOSが必要と思われる。

【蛇足】
推測ですが、IO.SYSで320KB FDDを認識させることができれば、
320KBな起動ディスクが作れると思います。

ただそんな技術力はない^^;

直線上に配置

トップ アイコン