「拡張ディスクリード」タグアーカイブ

BIOSと戯れてみる(4)

x86レガシーBIOSで遊んでみようというネタの4回目になります。
環境は以前と変わってWindows11+VSCode+WSLになります。

さて、拡張ディスクリードというBIOSコールがあるそうです。
なんでもシリンダ、ヘッダ、セクタの構成を気にしないで、セクタ番号だけでディスクを読み込めるとか。それは何気に嬉しいなぁ、というわけで試してみました。

拡張ディスクリード

拡張ディスクリードがどんなものかというと、DAP構造体とかいうものを使うそうです。DAP構造体に必要なパラメータを設定して実行すると、ディスクから読み込まれるらしいです。DAP構造体ってのは1バイト目が0x10固定、2バイト目が0固定……
説明するよりソース見た方が早いですかね。なのでソースです。

実行するとBIOS.BINの最初のセクタの冒頭がダンプされます。
で、DAP構造体です。

DAP構造体

内容というか意味はコメントである程度分かると思います。
size of packet : 16固定です。
reserved :0固定なのかな?
sectors to read :読み込むセクタ数
offset of load :データを読み込むバッファのアドレス
segment to load :データを読み込むバッファのセグメント
LBA :読み込み開始セクタ(0オリジン)

下4つを指定して読み込むわけですね。
今回は

sectors to read :1
offset of load :0x8000
segment to load :0x0000
LBA :0

ですから、ディスクの0セクタ目から1セクタ分を0x0x0000:8000に読み込むことになります。ディスクをダンプしてみて0x100000バイト目を読み込みたいときは1セクタ分の512で割って0x800セクタを読めばいいわけです。
いやぁ、楽です。ヘッダ・シリンダ・セクタを計算しないですむってホント楽です。

固定データだと、読み込む場所が変わるたびに構造体を用意しなければいけないんで面倒だし不合理です。せっかくなのでこの辺を可変にしてみましょう。

パラメータ指定

パラメータ指定する場合のサンプルコードはこちら。

キモというかポイントはこの部分。

ここで、DAPの位置から2バイト目にセクタ数、4バイト目にメモリオフセット、6バイト目にセグメント、8バイト目に開始セクタを指定しています。
実行すると第2セクタが読み込まれます。
これを少し修正すれば汎用のディスク読み込みルーチンができそうですね。

さて、今日はここまでです。お疲れさまでした。

《2025/11/02 07:56:23》