拡張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=エラーコード