Hyfaxのこと(5)

x86リアルモードで動くモニタプログラムのHyfaxを作るお話の5回目です。前回ではBOOT1.BINが起動するところまでを作成し確認しました。今回はBOOT1.BINにディレクトリ検索機能とFATチェーン追跡機能を追加してBOOT1.BINを完成させたいのですが、果たしてうまく事が運ぶかどうか。不安でいっぱいです。

BOOT1.BINの機能

BOOT1.BINはVBRに置かれ、MBRにあるboot0.binからメモリに読み込まれ実行されます。そしてFAT16ファイルシステム内にあるMONITOR.BINを検索して読み込み、さらにこれを実行します。MBRは完全固定で、VBRは半分ほど固定でディスク内に配置されるので、読み込む際に考慮する点は多くなく、というかとても少なく、ある意味LBA固定で作成することもできます。MONITOR.BINもLBAを固定で済ますこともできないわけじゃないです。というか、前回それをやりました。が、ご存じのようにファイル内にはいくつもファイルを置くことができますし、並び順も固定ではありません。なのでFAT16ファイルシステムを使うのであれば(言い換えれば使うときに便利にするためには)、手順を踏まなければいけません。

ファイルシステムを使うからどこにMONITOR.BINを置いてもいいかというと、そうはいきません。ブートプログラムはサイズ制限が厳しいのでMONITOR.BINはルートディレクトリに置くことになります。BOOT1.BINはルートディレクトリ管理領域からMONITOR.BINの開始クラスタ番号とサイズを読み取り、メモリに読み込んで実行することになります。

ディスクイメージダンプ

ここでもう一度ディスクイメージのダンプを見てみます。

ルートディレクトリの管理領域は0x110800Byteから始まります。数字の羅列でなにがなにやらなんですが、その右側にあるASCII表示を見ると、『MONITOR BIN』『APP BIN』『APP1 BIN』……とどこかで見たような名前があります。そうファイル名です。ディレクトリエントリは1エントリ=32Byteでファイル名、属性、開始クラスタ番号、サイズ等を持っています。最大エントリ数であるROOT_ENT_CNT(0x0200)個並んでいる中から、お目当てのファイル名を探し出して開始クラスタ番号、サイズを取り出し使用するわけです。
ディレクトリエントリの構造はこんな感じ。この例だと『MONITOR BIN』の開始クラスタは0x0002、サイズは0x000008c5ですね。(注:リトルエンディアン)あ、FAT16前提なので上位クラスタ番号は使いません。

実装

前々回DIR_START_LBA、DATA_START_LBA、ROOT_ENT_CNTを保存しました。
①DIR_START_LBAから32Byteずつ取り出し
②先頭の11文字を照合して
③目当てのファイルだったら
④下位クラスタ番号とサイズを取り出し
⑤クラスタ番号からLBA値を算出し
⑥DATA_START_LBAから始まってその値にあたる部分からファイルサイズだけ読み込む

という実装になります。うむぅ。FATのクラスタチェーンの話は次回ですね。今回は連続して置かれているだろうことを信じてサイズをそのまま使いましょう。(今回の例ではクラスタが連続していないということはあり得ないんですけどね。)
検索処理をコードにするとこんな感じになります。
前回のコードのFILEのLBAを算出する部分とファイルサイズ・セクタ変換する部分をまるっと置き換えると動くはずです。

これを見て『なんをしてるかわかんな~い』と思ったあなた。悲観する必要はありません。書いたわたしが今そう思ってます。書いた時点では理解していても時間がたつと忘れます。ホント。コメント大事です。きっぱり。

実行結果

一応実行結果もあげておきますね。

まぁ、前回と変わらないんですけどねw
とはいえゴールが明確に示され、達成がはっきりわかるのはいいことです。うんうん。

さて、今回はここまでにします。次回こそラスボス感のある掛け算七の段こと、FATクラスタチェーンの追跡を実装しようと思います。
お疲れさまでした。

《2025/12/14 17:35:29》

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です