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

参考ページ


comments powered by Disqus

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.

(C) 2008-2017 akm. This blog theme is based on sakmug. Hosted by Xdomain