[PR]100万円が無料で当たる!:今すぐ応募して現金を当てよう!

OS 起動の仕組みに書いたように、 PC の BIOS は ディスクの先頭セクタ(マスタブートレコード)の 512 バイトを 0000h:7C00h 〜 0000h:7DFFh に読み込み、 0000h:7C00h から起動プログラムを実行してくれます。
しかし、たった 512 バイトで OS を作るのは困難でしょう。
そのため、普通はこの 512 バイトはディスクのほかの部分を 読み込む起動プログラムローダとして使います。
とはいえ、いきなり起動プログラムローダを書くのは大変ですので、 ここではまず 512 バイトでできる簡単なプログラムを書くことにします。
今回は、Hello,world をブートセクタに移植してみましょう。
以後、マスタブートレコード用のコードをマスタブートローダと呼ぶことにします。

マスタブートローダは リアルモード BIOS が提供する機能をすべて利用できます。
PC 上での OS の起動に有用な機能の一部を表に示します。

割り込みパラメータ機能
INT 10hAH=00h
AL=モード(03h=80x25テキスト)
ビデオモードを設定します。
起動時のモードは通常、03hです。
INT 10hAH=0Eh
AL=文字
BL=文字色(07h=白)
文字を画面に出力します。
INT 12h(パラメータなし)AXにリアルモードメモリサイズをKB単位で取得します。
INT 13hAH=00h
DL=ドライブ(00h=FDD0,80h=HDD0)
ディスクをリセットします。
INT 13hAH=02h
DL=ドライブ
AL=読み込むセクタ数
CH,CL,DH=CHSパラメータ
ES:BX=データ
ディスクから読み込みます。
CHSで指定された位置からALセクタ分読み込みます。
INT 13hAH=03h
DL=ドライブ
AL=書き込むセクタ数
CH,CL,DH=CHSパラメータ
ES:BX=バッファ
ディスクへ書き込みます。
CHSで指定された位置へALセクタ分書き込みます。
INT 16hAH=00hキーボード入力を読み込みます。
AL=文字
AH=キーボードのスキャンコード
入力がなければ、入力されるまで待ちます。
読み込んだ入力は破棄されます。
INT 16hAH=01h キーボード入力があるか調べ、ZFを設定します。
ZF(ゼロフラグ)=1なら入力なし、ZF=0なら入力あり
AL=文字(入力がある場合)
AH=スキャンコード(入力がある場合)
この BIOS コールは入力を調べるだけで破棄しません。
INT 16hAH=04h 保存中のキーボード入力をすべて破棄します。
INT 1AhAH=02h 現在の日付と時刻を取得します。
BX=1980/01/01からの経過日数
CL:CL:DH:DL=時:分:秒:(1/100秒)

Hello,worldの場合、 INT 10h、AH=0Ehを使えば実現できます。
これを nasm で書くと、次のようになります。

最後の 55h、0AAh は起動可能マークです。
これを 1.44MB フロッピーディスクの先頭に書きこむと、 Hello, world を表示する起動ディスクができます。
起動ディスクを作るには、この 512 バイトをセクタ 0 に書き込むだけです。
しかし、フロッピーディスクに書きこむツールやエミュレータでは 1.44MB のファイルしか扱えないこともあります。
そこで、1.44MB に満たないファイルの後をゼロで埋めて 1.44MB (2880セクタ x 512バイト)のファイルに変換することにします。
これは、例えば次のような C プログラムを書けば良いでしょう。
(エラーチェックはしていませんので、これをそのまま使う場合は エラーが起きないように注意してください)

これでフロッピーディスクイメージを作れるようになりました。
このイメージを実際に作り、 実機や PC エミュレータ(bochsなど) で起動してみると、 Hello,world が表示されることを確認できます。


2005-08-27: ChangeLog作成 (最終更新)
Copyright (C) 2005 hoverkid, all rights reserved.
[PR]就職、仕事にも県民性が出る?:無料カンタン占いで日払いもアップ