161013 AXエミュ製作 [9]MS-DOS 3.21でFDのフォーマットを可能に
DOSBox上でMS-DOS 3.21を動かし、FORMATコマンドでFDのフォーマットを試みると、必ず320KBでフォーマットされる。
ドライブパラメータやCMOSの返すデータが間違っているのかと疑ったけど、複雑なコードを時間をかけて追ったところ、そこは問題ないことが分かった。FORMATコマンドの逆アセンブルに挑戦してみるが、MS-DOS 3.2以降ではフォーマットの機種依存ルーチンはIO.SYSに統合されている(という話を聞いたことがある)ためか、なかなか決め手になる手がかりが得られない。
諦めそうになっていたところ、J-3100 BIOSについて解説されているページで気になる記述を発見。
Int 13h, AH=15h リードドライブタイプ
入力 | 出力 |
---|---|
AH 15H DL ドライブ番号 |
AH ドライブタイプ 00H ドライブなし 01H FDD メディアチェンジ検出機能なし 2D 02H FDD メディアチェンジ検出機能あり 2DD/2HD 03H HDD 70H ハードRAM CX:DX セクタ総数(HDD、ハードRAMの場合のみ) |
Int 13h, AH=15hというファンクションについて、海外のサイトでは2D, 2DD/2HDという区別は書かれていなかったので盲点だった。この部分をDOSBoxに組み込んだところ、1.2MB、720KB、1.44MBフォーマットができるようになった。(ただし、MS-DOS起動時にドライブの種別が固定されてしまう制限がある。)
case 0x15: /* Read drive type : DOSVAX */
if (driveInactive(drivenum)) {
reg_ah = 0x00;//drive not present
CALLBACK_SCF(true);//CF=1
return CBRET_NONE;
}
if (imageDiskList[drivenum]->hardDrive) {
//hard drive
Bit32u sectnum = imageDiskList[drivenum]->sectors;
reg_ah = 0x03;
reg_cx = (Bit16u)(sectnum >> 16);
reg_dx = (Bit16u)sectnum;
}
else {
//floppy drive
if (imageDiskList[drivenum]->floppytype < 6)
reg_ah = 0x01;//2D
else
reg_ah = 0x02;//>2DD or 2HD
}
CALLBACK_SCF(false);//CF=0
break;
AXエミュの新ビルドは週末にひっそり置き換える予定。