拡張INT13h

さて、ある程度、作戦の目処は立ってきたのだが、
ここで、もう一つ、大きな問題がある。
目標のセクタは、56,252,521。
これを、今まで使っていた INT 13h で処理しようとすると、
CHS指定では、最大でも C=1024 * H=255 * S=63 = 16,450,560で、足りないわけです。
そこで、この問題に対応した、拡張 INT 13h を使用する事にする。
拡張 INT 13h は、パラメータを Disk Address Packet(DAP) と呼ばれる、データ構造に格納する。


Disk Address Packet の内容は、以下の通り。

オフセット 内容 サイズ
0 パケットのサイズ(0x10h) 1
1 予約(0固定) 1
2 セクタ数 2
4 メモリ・オフセット 2
6 メモリ・セグメント 2
8 セクタ開始位置(LBA) 8


メモリのアドレスをフラットな64bitで指定したい場合は、以下の通り。

オフセット 内容 サイズ
0 パケットのサイズ(0x18h) 1
1 予約(0固定) 1
2 セクタ数 2
4 メモリ・オフセット(0xFFFF) 2
6 メモリ・セグメント(0xFFFF) 2
8 セクタ開始位置(LBA) 8
16 メモリ・アドレス 8
  • INT 13h (AH=0x41):EDD(Enhanced Disk Drive)サポートチェック

入力
AH = 0x41
BX = 0x55AA
DL = ドライブ番号
出力
キャリーフラグ・オン(BIOS未サポート:AH=01h[Function Invalid])
BX != 0xAA55(BIOS未サポート?)
出力(成功時?)
AH = メジャーバージョン(01h=1.x, 20h=2.0/EDD-1.0, 21h=2.1/EDD-1.1, 30h=EE-3.0)
AL = 内部で使用
CX = サポートフラグ(bit0=42h/43h/44h/47h/48h, bit1=45h/46h/48h/49h[INT 15h (AH=52h)], bit2=48h/4Eh)
DH = 拡張バージョン

  • INT 13h (AH=0x42):読み込み

入力
AH = 0x42
DL = ドライブ番号
DS:SI = DAP 構造体へのアドレス
出力
成功:CF=0, AH=0x00
失敗:CF=1, AH=エラーコード

  • INT 13h (AH=0x43):書き込み

入力
AH = 0x43
DL = ドライブ番号
DS:SI = DAP 構造体へのアドレス
出力
成功:CF=0, AH=0x00
失敗:CF=1, AH=エラーコード