マリオのようにスクロールする絵
ジャンプのレッスンの四角を、画面より広い世界に置いた。右で歩き、四角が少し進むと絵がそれを追う。プログラムは 902 バイトの命令 441 個で、作り方も確かめ方も同じだ。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: scroll.nes
画面の上では
先の土地をどう書くか
絵のチップはタイル二画面ぶんを横に並べて持ち、スクロールはその中のどこから絵を始めるかを言う。カメラの先、右端の外に、プログラムはカメラがこれから着く土地を書く。スーパーマリオブラザーズがこれをするところを、絵のチップのメモリへの書き込みをすべて記録して見ると、形が分かった: カメラが 32 ピクセル動くたびに、幅 32 ピクセルの帯を、下へ向かうタイルの列四本として何フレームかに分けて書き、それからその帯の色の選び方を一列書く。このカートリッジも同じことをし、表は両方を同じやり方で測る。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| 走行の間に書いた帯の数 | 63 | 40 |
| 帯と帯の間にカメラが動いたピクセル | 31 から 33、平均 32 | 31 から 33、平均 32 |
| 帯のカウントダウンが続くフレーム数 | 8 | 8 |
| 帯一本の列の数 | 4 | 4 |
| 列一本のタイルの数 | 26 | 26 |
| 帯一本の色のバイト数 | 7 | 7 |
| 帯が始まる位置、右端から何ピクセル先か | 92 から 93 | 94 から 95 |
| 帯の何フレーム目に各列を書くか | 2, 3, 6, 7 | 1, 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