510bytesで何ができるか

gpuppur2008-08-07

PCの電源を入れてからOSが起動するまでをおおまかに説明すると
1, CPUが初期化されてBIOSにあるプログラムが実行される
2, BIOSは設定されたメディア(ハードディスクとかフロッピーディスク等)のブートセクタと呼ばれる最初の512bytesを読み込んでメモリに書き込む
3, メモリに書き込んだ先にジャンプしてそのプログラムを実行する

ここで、ほとんどのOSは512bytesに収まらないのでブートセクタにはさらにメディアからOSを読み込むようなプログラムが置かれている。
そこでブートセクタの512bytesに収まるプログラムの作成に挑戦してみた。
ちなにブートセクタの最後の2bytesには0x55,0xaaがないとブートセクタとは認めて貰えず実行されないので
実質的には510bytesまでしか使えない。

ブートセクタのプログラムが実行されるときはもちろんOSの機能は全く使えないがBIOSに用意された機能を使えば
画面に絵を描いたりすることができるのでメガデモのようなプログラムを作る事にした。


以下に作成したプログラムのバイナリコードを公開する。
実際にOSの無い状態から動かすのは少し面倒なのでまずはcomファイルとして実行できるコードを公開。
このプログラムを実行するのは自己責任でお願いします。
ビープスピーカーから音がでるように作られているので注意。
ms-dos, Windows Vistaより古いwindowsだとそのまま実行できると思うけど
それ以外のOSを使っている人はDOSBox(ms-dosエミュレータ)等を使って実行して下さい。
直接comファイルを実行するのが不安な人やビープスピーカから音がでるのが嫌な人もDOSBoxを使うといいかも。

B8 20 01 8E D0 BC 00 16 B8 13 00 CD 10 31 D2 B9 3F 00 51 89 CB 88 DE 88 DD B8 10 10 CD 10 59 E2 F1 B0 B6 E6 43 FC B8 20 01 8E D8 BF 00 16 B9 00 10 60 8E C0 B9 00 C0 31 C0 F3 AA 68 20 11 07 E8 70 00 30 E4 CD 1A 8E E2 61 60 8C E0 C1 E0 03 25 FF 0F 29 C1 31 C0 87 06 00 D6 87 06 02 D6 E8 A3 00 57 BA C0 4F E8 48 01 47 47 BA C0 31 E8 40 01 5E 8B 44 02 C1 F8 06 BB 40 01 F7 E3 8B 1C C1 FB 06 01 D8 89 C7 26 8A 05 3C 3F 75 0D 89 F3 C1 EB 04 81 E3 02 00 81 28 40 00 B0 3F AA 8D 7C 0C E2 BD E8 F8 00 B4 86 31 C9 BA 00 20 CD 15 E8 2E 01 EB 89 8C E0 A9 00 03 75 0C 60 B9 00 7D 31 FF 31 C0 F3 AB 61 C3 1E 06 1F 31 DB B9 C6 00 51 B9 40 01 89 CE 8D B0 40 01 AC C1 E0 08 AC 00 C4 8D B4 3E 01 AC 00 C4 AC 00 C4 C1 E8 0A 8D BC 7E FD AA E2 DF 81 C3 40 01 59 E2 D4 B9 80 02 89 DF 30 C0 F3 AA 1F C3 8D 75 0A 8C E0 05 80 00 A9 00 01 74 34 BB 5A 00 F6 D8 78 02 F7 DB 53 8B 1D 8B 55 02 89 D8 01 D0 39 D3 5B 77 0E 3D C0 31 73 04 01 1C EB 21 01 5D 08 EB 1C 3D C0 4F 73 05 29 5D 08 EB 12 29 1C EB 0E C6 04 18 81 7D 02 C0 31 72 04 C7 04 F4 E8 8C E2 F6 C2 DF 75 0B 8B 05 8B 5D 02 89 45 04 89 5D 06 F6 DA 79 13 8B 45 04 8B 5D 06 F7 DB C1 F8 05 C1 FB 05 01 5D 08 01 04 60 81 F9 D0 00 7F 17 B9 02 00 8B 45 04 C1 F8 08 3C 00 73 02 F6 D8 01 06 00 D6 47 47 E2 EC 61 C3 1E 06 B9 00 FA 31 F6 06 1F 68 00 A0 07 31 FF F3 A4 07 1F C3 8D 75 04 8B 04 89 C3 C1 FB 06 29 D8 03 45 08 C7 45 08 00 00 89 04 8B 1D C1 F8 05 01 C3 79 04 31 DB F7 1C 39 D3 76 04 89 D3 F7 1C 89 1D C3 A1 00 D6 F7 D8 05 FF FF 03 06 04 D6 D1 E8 A3 04 D6 0C 1F E6 42 88 E0 E6 42 E4 61 0C 03 E6 61 C3

きっちり510(0x1FD)バイトあるはず。
上記16進数のコードをバイナリエディタへコピペするとかして拡張子がcomとなるファイルを作成して下さい。
と思ったら手元にあるバイナリエディタ(BzとStirling)ではテキストからバイナリをコピペして貼り付けできないようだ。

http://www.mh-nexus.de/hxd/
にあるバイナリエディタだとバイナリを直接コピペしてcomファイルとして保存することができた。
このバイナリエディタはハードディスクとかを直接生でいじれるらしい。