「Hyfax、x86、リアルモード、レガシーブート」タグアーカイブ

Hyfaxのこと(4)

x86リアルモードでモニタプログラムを作ろうの第4回目です。今回はブート処理の2段階目、VBRからの起動になります。
前回、boot1.asmで使用するであろう数値群をあらかじめ用意したので、モニタプログラムを起動することだけなら簡単にできます。ちょっと重複しますが確認しておきますね。

①MBRからVBRのLBAを取り出して読み込み遷移する。
②BPBから必要な数値を得る。
③FAT開始位置を得る。
④DIR領域開始位置を得る
⑤DIR領域からファイルの開始LBAとサイズを得る。
⑥サイズとFATを比べながらファイルを読み込む
⑦ファイルに遷移する。

ざっくり言うとこういう流れになります。①②はboot0.asmでやってますので、boot1.asmは③~⑦をやることになります。盛りだくさんですね。
FATを利用して、となるとこうなるのですが、このシリーズではファイル位置は固定ですので(作り方がいつでも一緒なので同じ位置に作られる)単にモニタプログラムを起動するだけなら、モニタの開始位置とサイズがあれば実現できます。モニタが複数クラスタにまたがったとしても、連続領域に配置されることは確定なので、FATによるクラスタチェーンも追う必要はなかったりします。
要するに突き詰めれば⑤だけあればいいことになります。
モニタプログラムは『MONITOR .BIN』という名前なので、ダンプして調べてみるとこんな感じ。

VBR領域の後、FAT1、FAT2の領域があって、その後ろにDIR領域があります。『MONITOR .BIN』はDIR領域の2番目のエントリにあって、開始クラスタは0x0002、サイズは0x000008c5となっています。(注:リトルエンディアン)
開始クラスタが2番目ということはセクタ数は0セクタ(先頭2クラスタは予約)。データ開始LBAの最初に『MONITOR BIN』ですね。
データ開始LBAは前回保存したものがあるのでそれを使うとLBAは0x08a4、バイト数で0x114800になります。
これらを踏まえてboot1.asmのプロトタイプとmonitor.asmのスタブを作ってみます。

boot1.binプロトタイプ

boot1.asmプロトタイプです。前回保存した各種数値を取り出して使えるようにしつつ、LBA0x8a4にある『MONITOR .BIN』をサイズ0x08c5Byte(5セクタ)で読込、遷移させます。

こんな感じ。

monitor.asmスタブ

monitor.asmのスタブは遷移されたことがわかるだけでいいので、メッセージを出すだけにします。こんな感じでしょうか。

実行結果

実行するとこんな感じになります。

Hello from Monitorが表示されてますね。正しく読み込まれて遷移されたことがわかります。これで一つのゴールが明確になりました。monitorを読み込んで遷移する。このゴールを崩さないように、ディレクトリエントリの検索、fatチェーンの追跡を行うことになります。

さて、そろそろいい時間なので、今日はここまでです。お疲れさまでした。
細切れにして情報量少なくなってごめんなさいです。
でもね、この程度でも書くのとってもしんどいんですよ?
ともあれ、また次回お会いしましょう。

《2025/12/14 4:59:42》