ゼルダのように滑り込む部屋
上から見た部屋の格子の中の四角。四角が歩く間、絵は止まっている。左か右の端から出ると、次の部屋が滑り込んできて四角を運ぶ。プログラムは 1,032 バイトの命令 497 個で、作り方も確かめ方も同じだ。
ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: rooms.nes
画面の上では
一度に一部屋
ゼルダの伝説のメモリを見ると、リンクが画面を出るたびに変わるバイトが一つあった: 左へ一歩で 1 減り、上へ一歩で 16 減った。だから土地は幅 16 部屋の格子で、行に沿って番号が振られている。端に着くと、絵は一画面ぶんを一定の速さで滑らせ、リンクも一緒に運ばれる。このカートリッジも同じように部屋の番号を持ち、同じように滑らせる。違うのは、入ってくる部屋をどう描くかで、表は絵のチップへの書き込みをすべて記録したものからそれを示す。
| このカートリッジ | ゼルダの伝説 | |
|---|---|---|
| どのネームテーブルが隣り合うか | 横に並ぶ、基板で決まっている | 遊んでいる間は縦に並ぶ。滑る 4 フレーム前から滑った 2 フレーム後まで横に並ぶ |
| 左へ一歩出る前と後の部屋の番号 | 103 から 102 | 119 から 118 |
| 番号が変わってから絵が動き出すまでのフレーム数 | 2 | 31 |
| 滑るのにかかるフレーム数 | 64 | 64 |
| 動いたピクセル、1 フレームあたりのピクセル | 256、1 フレームあたり 4 | 256、1 フレームあたり 4 |
| 絵が動く前に書いたもの | なし | 32 タイルの行を 23 本、24 タイルの行を 2 本 |
| 滑っている間に書いたもの | 30 タイルの列を 32 本 | 22 タイルの列を 32 本、24 タイルの行を 2 本 |
| 最初の列を書いた、滑り始めから何フレーム目か | 0 | 31 |
| 列と列の間のフレーム数 | 2 | 1 |
| 上へ一歩出る前と後の部屋の番号 | 119 から 103 | 119 から 103 |
| 上へ一歩: 横に書いた行の数、一行のタイルの数 | 30, 32 | 22, 32 |
| 何行目から、何行目まで | 29, 0 | 29, 8 |
| 番号が変わってから最初の行までのフレーム数 | 2 | 6 |
| 行と行の間のフレーム数 | 2 | 2 |
二つが分かれるところ
ゼルダの伝説 は、絵が動く前に 32 タイルの行を 23 本、24 タイルの行を 2 本 を書き、それに 31 フレームかかる。滑りの前半には何も書かず、列は滑り始めから 31 フレーム目以降、1 フレームに一本ずつ来る。このカートリッジは前もっては何も書かず、滑っている間ずっと入ってくる部屋を描く。2 フレームに一列ずつ、見えてくる端のすぐ先に。
ゼルダの伝説 の行が何のためのものかは、カートリッジ自身のレジスタへの書き込みを記録して分かった。その基板では、二つのネームテーブルをどう並べるかをプログラムが選べる。リンクが歩いている間は縦に並び、行は画面の下の、見えないテーブルに入る。滑る直前にゲームはそれを横並びに変え、その新しい部屋が画面の部屋の隣に来て、滑りがそこへ横に入っていく。その間に列が新しい部屋を一つ目のテーブルへ写し、滑りが終わるとすぐにテーブルは縦並びに戻り、新しい部屋が画面にある。このカートリッジの基板にはそれができない: テーブルは横並びに作り付けなので、進みながら新しい部屋を描く。
上下は、画面上の部屋に上書きする
横には、新しい部屋を描き込むもう一つのネームテーブルがある。上下には無いので、どちらも画面上のテーブルの古い部屋に新しい部屋を一行ずつ上書きする。それぞれ、絵がそれを見せる直前に。書いている行はその間、反対の端から出ていく行でもあるので、そこの 8 ライン幅の帯が新しい部屋を一瞬早く見せる。たいていのテレビでは、その数ラインは絵の外だ。ゼルダの伝説 の行が少ないのは、上の数行が動かないステータスバーだからだ。
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: rooms.s
;; Sliding: on every second step a column of the new room, the next to
;; come into sight (from its right side going left, from its left going
;; right); then the scroll moves 4 pixels toward the new room, the square
;; goes with the picture, and after 64 steps the new room is the one on
;; the screen.
slide:
LDA $34
AND #$01
BNE stepped
LDA $34
LSR A
LDX $32
BNE fromleft
EOR #$1F
fromleft:
JSR prepcol
LDA $35
EOR #$01
ASL A
ASL A
ORA $39
STA $39
LDA #$01
STA $38
stepped:
LDA $32
BNE east
SEC
LDA $36
SBC #$04
STA $36
LDA $37
SBC #$00
AND #$01
STA $37
LDA $11
CMP #$EC
BCS carried
CLC
ADC #$04
STA $11
JMP carried
east:
CLC
LDA $36
ADC #$04
STA $36
LDA $37
ADC #$00
AND #$01
STA $37
LDA $11
CMP #$04
BCC carried
SEC
SBC #$04
STA $11
carried:
INC $34
LDA $34
CMP #$40
BNE sliding
LDA $35
EOR #$01
STA $35
STA $37
LDA #$00
STA $36
STA $31
sliding:
RTS
;; What tile is at a place in a room: the column in $05, the row in X,
;; the room in $3B; the tile comes back in A and X is kept. Trees along
;; the top and bottom two rows and down both sides, with a gap in the
;; middle of each to walk out by; inside, a tree wherever the room's
;; number and the place agree on it, so each room is different.
tileat:
CPX #$02
BCC edge
CPX #$1C
BCS edge
LDA $05
BEQ side
CMP #$1F
BEQ side
CMP #$04
BCC sand
CMP #$1C
BCS sand
CPX #$04
BCC sand
CPX #$1A
BCS sand
;; inside: col*7 + row*3 + room, a tree when its low five bits are 0
LDA $05
ASL A
ASL A
ASL A
SEC
SBC $05
STA $07
TXA
ASL A
STA $08
TXA
CLC
ADC $08
CLC
ADC $07
CLC
ADC $3B
AND #$1F
BEQ tree
JMP sand
edge:
LDA $05
CMP #$0E
BCC tree
CMP #$12
BCS tree
JMP sand
side:
CPX #$0C
BCC tree
CPX #$12
BCS tree
sand:
LDA #$00
RTS
tree:
LDA #$03
RTSこの前は: マリオのものと同じ、カメラの遊び