2025/11/15 00:36 I wrote a Pong game in a 512-byte boot sector

ロボ子、今回のニュースはすごいぞ!Pongゲームをたった512バイトに収めたって言うんだから!

512バイトですか!?フロッピーディスクのセクターに収まるサイズですね。一体どうやって…?

それがの、OSもドライバもライブラリも使わずに、x86アセンブリとBIOS割り込み、ビデオメモリへの直接書き込みだけで実現したらしいのじゃ!

x86アセンブリ…!かなりローレベルな制御が必要になりますね。ビデオメモリへの直接書き込みは、VGAモード03hでBIOS割り込み10hを使うと。

そうそう!しかも、コードは510バイトに制限されてるんだぞ。残りの2バイトは何に使ったんだろう?

ブートセクターの終端シグネチャでしょうか?

さすがロボ子!よく知ってるのじゃ。Pongゲームとしての機能もちゃんとあって、パドルの操作、CPU対戦、ボールの速度、スコアリング、色の切り替え、リセットまであるんだから驚きだぞ。

色の切り替えはCキー、リセットはRキーで操作するんですね。記事によると、画面クリアには`Video Memory Direct Access`と`rep stosw`を使っていると。

`rep stosw`は、文字列を効率的に書き込む命令じゃ。これを使うことで、短いコードで画面全体をクリアできるのじゃ。

なるほど。パドルの位置決めには`imul di, [playerY], 160`を使っているんですね。これはどういう意味ですか?

VGAテキストモードでは、各行が160バイト(80文字 * 2バイト/文字)で構成されているから、`imul`命令でY座標を160倍することで、目的の行の先頭アドレスを計算しているのじゃ。

効率的な計算ですね!リアルタイム入力にはBIOS割り込み`0x16`、`ah=1`を使用しているとのことですが、これはノンブロッキングキーボードチェックですか?

その通り!`ah=0`だとキー入力があるまで処理が止まってしまうけど、`ah=1`ならキーが押されているかを確認するだけで、すぐに次の処理に移れるのじゃ。

物理演算と衝突判定も興味深いです。ボールの速度を1バイトで保存し、壁やパドルとの衝突時に`neg byte`で反転させる、と。

`neg byte`は、符号を反転させる命令じゃ。これを使うことで、ボールの進行方向を簡単に変えられるのじゃ。

遅延ループにはBIOSタイマー`0x46C`を使用しているんですね。`hlt`やビジーウェイトを使わずに、とのことですが。

`hlt`はCPUを停止させてしまうし、ビジーウェイトはCPUリソースを無駄に消費してしまうからの。BIOSタイマーを使うことで、より効率的に遅延を実現できるのじゃ。

色の循環は、Cキーで`drawColour`を`0x10`ずつインクリメントして16色をローテーションさせる、と。限られたリソースの中で、様々な工夫が凝らされているんですね。

まさに職人技じゃ!このPongゲームはGitHubで公開されているから、ロボ子もダウンロードして遊んでみるといいぞ。

ありがとうございます、博士。早速試してみます!しかし、512バイトでここまでのものが作れるなんて、本当に驚きです。

じゃろ?ところでロボ子、512バイトといえば…昔のゲームはもっと容量が少なかったものもあったんじゃ。例えば、テトリスは…えーと…512テラバイトくらいだったかの?

博士、それはさすがに大きすぎます!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。