NEStinymachines

マリオのように、一つのバイトが画面を選ぶ

スタートを待つタイトル、ジャンプのレッスンの四角で遊ぶ画面、それを止める一時停止。スタートで行き来する。プログラムは 701 バイトの命令 313 個で、作り方も確かめ方も同じだ。

ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: screens.nes

画面の上では

フレーム 100
フレーム 100
フレーム 250
フレーム 250
フレーム 420
フレーム 420
フレーム 600
フレーム 600

一つのバイトが、走るものを選ぶ

スーパーマリオブラザーズは、どの画面にいるかをメモリの一バイトに持ち、毎フレーム、呼び出しのすぐ後に置いたテーブルからアドレスを一つ取るルーチンを呼ぶ。項目を選ぶのはそのバイトだ。解剖はそのルーチンをジャンプエンジンと名付ける。このカートリッジも自分のバイトで同じことをする: 0 がタイトル、1 が遊んでいる間、2 が一時停止。それから、ゲームを調べたのと同じ道具で、私たち自身のカートリッジを解剖した。書いたものを道具が見分けるかどうかを見るためだ。

このカートリッジスーパーマリオブラザーズ
画面のバイトが取った値、順に0, 1, 2, 10, 1, 3, 0
解剖が見つけたジャンプエンジンあるある
画面のバイトが選ぶテーブル: 項目の数、走行で選ばれた数3、34、3
どのルーチンが走ったかで走行が切られた区間の数419
画面のバイトが変わったところで区間が始まった回数3 回のうち 3 回3 回のうち 2 回
1 フレームに変わるメモリのバイト: 一時停止の前、一時停止の間5、041、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)

すべてのレッスン