ちょっと間が空きすぎた[3-2]

3章の残りを全て実施してみました。

もう少しフロッピーから読んでみる

前回は2セクタ目まで読んだだけなので、まずは
⇒シリンダ1周:18セクタを読んでみる。(これが3.3)
次に
⇒10周:10シリンダを読んでみる。(これが3.4)
実機(PCの事ね)で起動をかけると、FDDの読み取り中LEDが、前回よりもとても長い時間つきっ放しになり、より長くアクセスがかかっていることが分かります。とはいえやっぱり目で見て分かる訳ではない。

OS本体開始

ここからはブートセクタ:512バイトを卒業して別ファイルに移ります。
別ファイルに新しく作ったHLTするだけのプログラム(小さいながらもOS本体です)をブートセクタからどう実行するか、という問題になります。

ファイルは一体どこに置かれるのか?

ブートセクタから新しいプログラムを実行するには、プログラムの置かれたメモリ番地へ飛ばなければいけませんが、果たしてこの番地は一体どこでしょう。
フロッピーの連続したデータをメモリのある一点をコピー先として、連続して読み出し&コピーしていくので、フロッピー上でのプログラムの位置が分かれば、メモリ番地も判明するはずです。
さて、本には無い独自な事ですが、ここでフォーマットしたばかりのフロッピーにファイルをコピーしてみます。そしてフロッピーのイメージをddで取得し、バイナリエディタで見てみると、本の記述と同じように0x002600にファイル情報、0x004200にファイル本体のデータが確認できます。
(ちなみに2回目以降のコピーを行うと、おそらくこの位置は0x002600,0x004200からずれていくでしょう。実際、ずれた結果も確認しました。ファイルシステムの仕組みでしょうが、まだFATについて調べていないので残念ながら書けません。)
付録のイメージツールedimg.exeは1,440KBのファイルをフロッピーとみなして、これをやってくれます。ということでedimg.exeにかけたイメージファイルをフロッピーに焼きこんでFDDで読み込んでみると、逆にファイル(OS本体)がA:\ディレクトリ上に存在します。

ジャンプ先決定

上の通り、ブートセクタからの次のジャンプ場所は0xC200と判明しました。
(メモリ番地0x8200を目標にフロッピーの0x0200〜0x4200が読み出されるので0x8200 + 0x4200 -0x0200 で 0xC200 になります:本の記述は少し分かりづらい)

OS本体がHLTだけでは味気ない

新しいプログラムを差し込んで、これでようやく動いていることが確認出来ます。そのプログラムですが

<ビデオモード設定>
AH=0x00;
AL=0x13(VGAグラフィックスモード、320x200x8bitカラー)

でINT 0x10して画面モードを切り替えます。結果、画面が切り替わり、今まで表示されっぱなしだったBIOSのメッセージも消えて真っ黒に。成功。

まだ少し3章が残っていますが

次エントリで。