NEStinymachines

マリオのようにスクロールする絵

ジャンプのレッスンの四角を、画面より広い世界に置いた。右で歩き、四角が少し進むと絵がそれを追う。プログラムは 902 バイトの命令 441 個で、作り方も確かめ方も同じだ。

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

画面の上では

フレーム 100
フレーム 100
フレーム 400
フレーム 400
フレーム 800
フレーム 800
フレーム 1200
フレーム 1,200

先の土地をどう書くか

絵のチップはタイル二画面ぶんを横に並べて持ち、スクロールはその中のどこから絵を始めるかを言う。カメラの先、右端の外に、プログラムはカメラがこれから着く土地を書く。スーパーマリオブラザーズがこれをするところを、絵のチップのメモリへの書き込みをすべて記録して見ると、形が分かった: カメラが 32 ピクセル動くたびに、幅 32 ピクセルの帯を、下へ向かうタイルの列四本として何フレームかに分けて書き、それからその帯の色の選び方を一列書く。このカートリッジも同じことをし、表は両方を同じやり方で測る。

このカートリッジスーパーマリオブラザーズ
走行の間に書いた帯の数6340
帯と帯の間にカメラが動いたピクセル31 から 33、平均 3231 から 33、平均 32
帯のカウントダウンが続くフレーム数88
帯一本の列の数44
列一本のタイルの数2626
帯一本の色のバイト数77
帯が始まる位置、右端から何ピクセル先か92 から 9394 から 95
帯の何フレーム目に各列を書くか2, 3, 6, 71, 2, 5, 6

一フレーム遅れて

このカートリッジは、各列を帯の中で スーパーマリオブラザーズ より一フレーム遅く書く (このカートリッジは 2, 3, 6, 7 フレーム目、スーパーマリオブラザーズ は 1, 2, 5, 6 フレーム目)。列をメインループで用意し、絵のチップは次のブランクでそれを受け取るからだ。スーパーマリオブラザーズ はゲーム全体をブランクの割り込みの中で走らせる。解剖はそれを、割り込みの中のループと印している。

書いたとおりに

このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: scroll.s

;; The strips. A countdown in progress goes on; otherwise a new 32-pixel
;; step of the camera starts one, for the strip eleven past it: three
;; strips beyond the right edge, as far ahead as Mario builds.
strips:
    LDA $23
    BEQ new
    DEC $23
    LDA $23
    BEQ attr
    CMP #$06
    BEQ col0
    CMP #$05
    BEQ col1
    CMP #$02
    BEQ col2
    CMP #$01
    BEQ col3
    RTS
col0:
    LDA #$00
    JMP column
col1:
    LDA #$01
    JMP column
col2:
    LDA #$02
    JMP column
col3:
    LDA #$03
column:
    STA $04
    LDA $2B
    ASL A
    ASL A
    CLC
    ADC $04
    JSR prepcol
    LDA #$01
    STA $25
    RTS
attr:
    JSR prepattr
    LDA #$01
    STA $28
    RTS
new:
    LDA $21
    ASL A
    ASL A
    ASL A
    STA $04
    LDA $20
    LSR A
    LSR A
    LSR A
    LSR A
    LSR A
    ORA $04
    CMP $22
    BEQ nostrip
    STA $22
    CLC
    ADC #$0B
    STA $2B
    LDA #$07
    STA $23
nostrip:
    RTS

すべてのレッスン