マリオのように、一つのバイトが画面を選ぶ
スタートを待つタイトル、ジャンプのレッスンの四角で遊ぶ画面、それを止める一時停止。スタートで行き来する。プログラムは 701 バイトの命令 313 個で、作り方も確かめ方も同じだ。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: screens.nes
画面の上では
一つのバイトが、走るものを選ぶ
スーパーマリオブラザーズは、どの画面にいるかをメモリの一バイトに持ち、毎フレーム、呼び出しのすぐ後に置いたテーブルからアドレスを一つ取るルーチンを呼ぶ。項目を選ぶのはそのバイトだ。解剖はそのルーチンをジャンプエンジンと名付ける。このカートリッジも自分のバイトで同じことをする: 0 がタイトル、1 が遊んでいる間、2 が一時停止。それから、ゲームを調べたのと同じ道具で、私たち自身のカートリッジを解剖した。書いたものを道具が見分けるかどうかを見るためだ。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| 画面のバイトが取った値、順に | 0, 1, 2, 1 | 0, 1, 3, 0 |
| 解剖が見つけたジャンプエンジン | ある | ある |
| 画面のバイトが選ぶテーブル: 項目の数、走行で選ばれた数 | 3、3 | 4、3 |
| どのルーチンが走ったかで走行が切られた区間の数 | 4 | 19 |
| 画面のバイトが変わったところで区間が始まった回数 | 3 回のうち 3 回 | 3 回のうち 2 回 |
| 1 フレームに変わるメモリのバイト: 一時停止の前、一時停止の間 | 5、0 | 41、9 |
解剖がそれについて言ったこと
解剖はエンジンとテーブルを見つけ、テーブルを選ぶバイトは私たちのものだった。画面のことは何も知らずに切った区間は、画面のバイトが変わった 3 回のうち 3 回、そこで始まった。一時停止の間、スタックとスプライトのページの外で 1 フレームに変わったメモリは 0 バイト: 一時停止とは、スタートを待つだけの項目に他ならない。
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: screens.s
;; What runs this frame, by the screen: the table after the call.
screen:
LDA $40
JSR engine
.word on_title
.word on_play
.word on_pause
;; The jump engine: A is the entry. The call's return address, taken off
;; the stack, is one byte short of the table that follows the call; the
;; entry's two bytes are an address, and the jump goes there. Each entry
;; ends with RTS, which returns past the call to `screen`: the engine
;; took its own return address off the stack, so the one left on top is
;; main's. (Reached from main directly, there would be none, and the RTS
;; would go wherever the stack's next two bytes said.)
engine:
ASL A
TAY
PLA
STA $04
PLA
STA $05
INY
LDA ($04),Y
STA $06
INY
LDA ($04),Y
STA $07
JMP ($06)