Image: 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エミュの新ビルドは週末にひっそり置き換える予定。

参考ページ


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

管理人 : Akamaki (akm)

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

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

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