ゼルダのように滑り込む部屋
上から見た部屋の格子の中の四角。四角が歩く間、絵は止まっている。左か右の端から出ると、次の部屋が滑り込んできて四角を運ぶ。プログラムは 759 バイトの命令 354 個で、作り方も確かめ方も同じだ。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: rooms.nes
画面の上では
一度に一部屋
ゼルダの伝説のメモリを見ると、リンクが画面を出るたびに変わるバイトが一つあった: 左へ一歩で 1 減り、上へ一歩で 16 減った。だから土地は幅 16 部屋の格子で、行に沿って番号が振られている。端に着くと、絵は一画面ぶんを一定の速さで滑らせ、リンクも一緒に運ばれる。このカートリッジも同じように部屋の番号を持ち、同じように滑らせる。違うのは、入ってくる部屋をどう描くかで、表は絵のチップへの書き込みをすべて記録したものからそれを示す。
| このカートリッジ | ゼルダの伝説 | |
|---|---|---|
| 左へ一歩出る前と後の部屋の番号 | 119 から 118 | 119 から 118 |
| 番号が変わってから絵が動き出すまでのフレーム数 | 1 | 30 |
| 滑るのにかかるフレーム数 | 64 | 64 |
| 動いたピクセル、1 フレームあたりのピクセル | 256、1 フレームあたり 4 | 256、1 フレームあたり 4 |
| 絵が動く前に書いたもの | なし | 32 タイルの行を 23 本、24 タイルの行を 2 本 |
| 滑っている間に書いたもの | 30 タイルの列を 32 本 | 22 タイルの列を 32 本、24 タイルの行を 1 本 |
| 最初の列を書いた、滑り始めから何フレーム目か | 1 | 32 |
| 列と列の間のフレーム数 | 2 | 1 |
二つが分かれるところ
ゼルダの伝説 は、絵が動く前に 32 タイルの行を 23 本、24 タイルの行を 2 本 を書き、それに 30 フレームかかる。滑りの前半には何も書かず、列は滑り始めから 32 フレーム目以降、1 フレームに一本ずつ来る。このカートリッジは前もっては何も書かず、滑っている間ずっと入ってくる部屋を描く。2 フレームに一列ずつ、見えてくる端のすぐ先に。ゼルダの伝説 の行が何のためのものかは、まだ読んでいない。
まだのこと
ここでは上下は端で止まる: 滑るのは横だけだ。ゲームで上へ一歩出ると、画面が縦に滑る。それが次の版だ。
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: 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