15年前にDOSのディスクフォーマットについて調べていた最中にPS/55というマシンを知ったときの最初の疑問は、PS/55の日本語DOSで使われる標準のフォーマットは何?だった。この疑問はエミュレーターの完成によってようやく解決した。
例によってMCA機と非MCA機(5550互換)で異なるため、ここではPS/55はMCA機のみを指し、非MCA機のPS/55はIBM 5550に含むとする。
ディスクBIOS (Int 13h, AH = 08h)
IBM PCのローレベル(DOSやドライバー)でのディスクアクセスは Int 13h の ディスクBIOS を通して行われる。この点はPS/55もIBM 5550も同じ。
フォーマットしようとするディスケットが未フォーマットの場合、ディスケットドライブのタイプからフォーマットを仮定する必要がある。
ディスケットドライブのタイプ判別には Int 13h, AH = 08hが使われる。以下、Interrupt List Release 60 by Ralf Brown (1999)より。
INT 13 - DISK - GET DRIVE PARAMETERS (PC,XT286,CONV,PS,ESDI,SCSI)
AH = 08h
DL = drive (bit 7 set for hard disk)
Return: CF set on error
AH = status (07h) (see #00234)
CF clear if successful
AH = 00h
AL = 00h on at least some BIOSes
BL = drive type (AT/PS2 floppies only) (see #00242)
CH = low eight bits of maximum cylinder number
CL = maximum sector number (bits 5-0)
high two bits of maximum cylinder number (bits 7-6)
DH = maximum head number
DL = number of drives
ES:DI -> drive parameter table (floppies only)
(Table 00242)
Values for diskette drive type:
01h 360K
02h 1.2M
03h 720K
04h 1.44M
05h ??? (reportedly an obscure drive type shipped on some IBM machines)
2.88M on some machines (at least AMI 486 BIOS)
06h 2.88M
10h ATAPI Removable Media Device
PS/55の場合、ディスクBIOSはシステム装置内にあるシステムボードのROMに収録されており、日本語DOSはこれを呼び出している。ステージII 5551-T09の場合、ディスクBIOSはリファレンス・ディスケットによって設定されたCMOSの値を読み取ってドライブタイプを決定している。この値はIBM PCと同じで、上のTable 00242の通り。
ドライブタイプはユーザーがリファレンス・ディスケットを使って設定することになる。ハードウェアとしては2台目の内蔵ディスケットドライブがインストールされたことを検出する機能はあるが、タイプを自動判別する機能は備わっていないため、ユーザーが正しいタイプを選択する必要がある。もっとも、下の画面の場合は「1.44MB 3.5インチ」または「未装着」しか選べないため、間違えようがない。

IBM 5550の場合、システムボードはBIOSを持たないため、ディスクBIOSは日本語DOSのシステムファイル (IBMBIO.COM) に含まれている。日本語DOSのディスクBIOSは、IPL ROMの特定のアドレスにある値を読み取ってドライブタイプを決定している。この判別方法は次のようになっている。
if FFFC:Ch == 02 then 3.5 HD drive (there is no 3.5 DD drive model)
if FFFC:Ch == 01 then 5.25 DSHD drive
else 5.25 DSQD drive
ROMデータによってドライブタイプが決まるということは、ドライブタイプはシステム装置のモデルによって決まり、後から別のタイプの内蔵ドライブをオプションでインストールすることは想定されていないということになる。外付けの3.5インチディスケット駆動機構はそれに付属するドライバーソフトウェアでサポートされていたと予想できる。
Int 13h, AH=08hを呼び出したときにALが返す値は次の通り。IBM PCにはない 05h が追加されている。
02h 5.25" 1.2M
03h 3.5" 720K
04h 3.5" 1.44M
05h 5.25" 720K
日本語DOS K3.3のユーザーズ・ガイドによれば、
ディスケットは、特に指定しない限り、ディスケット・ドライブのタイプに応じたバイト/セクターでフォーマットされます。720Kバイトのディスケット・ドライブでは、DOSバージョンK2.60未満では8セクター/トラック、バージョンK2.60以上では9セクター/トラックでフォーマットされます。
と書かれていることから、日本語DOS K2.5以前では 05h = 5.25” 640K だったと予想できる。
MS-DOS IOCtl (Int 21h, AX = 440Dh)
Int 13hは機種依存の機能であり、富士通や日本電気などの他メーカーのPCで同じ機能が用意されているとは限らない。そこで、MS-DOS Ver.3.2以降ではデバイスドライバー開発用にローレベルの機能が Ioctl (Int 21h, AH = 44h) として提供されている。その中の一つ、Int 21h, AX = 440Dh にてドライブの情報を含んだ Device Parameter Block (DPB) を取得することができる。このファンクションはDOSのSYSコマンドでも使われている。
INT 21 - DOS 3.2+ - IOCTL - GENERIC BLOCK DEVICE REQUEST
AX = 440Dh
BL = drive number (00h=default,01h=A:,etc)
CH = category code (see #01558)
CL = minor code (function) (see #01559)
DS:DX -> (DOS) parameter block (see #01560,#01562,#01563,#01564,#01565)
SI:DI -> (OS/2 comp box) parameter block (see #01566,#01568,#01569,#01572)
Return: CF set on error
AX = error code (01h,02h,etc.) (see #01680 at AH=59h/BX=0000h)
CF clear if successful
DS:DX -> data block if CL=60h or CL=61h
DPBはBPB (BIOS Parameter Block) を内包していて情報量が多いため、ここでは全てを記載しない。その中でタイプ判別に重要なのは Device type で、その値は次の通り。
(Table 01561)
Values for device type:
00h 320K/360K disk
01h 1.2M disk
02h 720K disk
03h single-density 8-inch disk
04h double-density 8-inch disk
05h fixed disk
06h tape drive
07h (DOS 3.3+) other type of block device, normally 1.44M floppy
08h read/write optical disk
09h (DOS 5+) 2.88M floppy
実際に調べたところでは、IBM 5550の日本語DOS K3.4では5.25” 2DDディスケットは 01h (1.2M diskと同じ) らしい。SYSコマンドでは、DPBのdevice typeが2か7(3.5インチディスケット)なら新フォーマット、1でかつトラックあたりセクター数が15(5.25インチ2HCディスケット)なら新フォーマット、そうでなければ(トラックあたりセクター数が8または9の2DDディスケット)旧フォーマットと判断している。(フォーマットの新旧の違いについては既に260201 5550エミュ製作 [56]日本語DOSの起動に成功!で説明した。)