WASM-4のメモリレイアウト
WASM-4のメモリ空間はなんと64キロバイトしかありません。その限られたメモリをやりくりして、フレームバッファ(つまり画面に表示する内容を入れるメモリ空間)を確保し、 文字列や画像のようなリソースを読み込み、ゲーム実行中の内部状態を保持しなければなりません。
具体的には、次のようなメモリレイアウトになっています。
アドレス | サイズ (Bytes) | 内容 |
---|---|---|
$0000 | 4 | Unused |
$0004 | 16 | PALETTE |
$0014 | 2 | DRAW_COLORS |
$0016 | 4 | GAMEPADS |
$001a | 2 | MOUSE_X |
$001c | 2 | MOUSE_Y |
$001e | 1 | MOUSE_BUTTONS |
$001f | 1 | SYSTEM_FLAGS |
$0020 | 1 | NETPLAY |
$0021 | 127 | Reserved for future use |
$00a0 | 6400 | FRAMEBUFFER |
$19a0 | 58976 | Available program memory |
つまり、64キロバイトのうち先頭の6580バイトがWASM-4のシステム用に予約されていて、残りの部分をプログラムを実行するためのスタックとヒープに割り当てます。
プログラムを書いているときに常にこのレイアウトを頭に入れておかなければならないなどということはありませんが、メモリが限られているということは意識したほうがよさそうです。別の記事で触れるつもりですが、メモリを使いすぎてスタックをオーバーフローすると、フレームバッファが侵食されてゲーム画面上に変なノイズが走ったりします。JavaScriptランタイムのような環境だとありえないような生々しい現象ですね。
メモリの構造を目で確認する
WASM-4の開発ツールを使うと、現在のメモリの状況を視覚的に確認することができます。F8キーを押して開発ツールを開き、「mem」のタブを選択すると、次のようなメモリマップを見ることができます。
たぶん構造としてはこんな感じになってると思います。
参考文献
次回予告
せっかくなので次回ももうちょっと生メモリで遊びます。