NEStinymachines

ゼルダのように滑り込む部屋

上から見た部屋の格子の中の四角。四角が歩く間、絵は止まっている。左か右の端から出ると、次の部屋が滑り込んできて四角を運ぶ。プログラムは 1,032 バイトの命令 497 個で、作り方も確かめ方も同じだ。

ここで遊ぶ 机の上で変えてみる カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: rooms.nes

画面の上では

フレーム 120
フレーム 120
フレーム 140
フレーム 140
フレーム 160
フレーム 160
フレーム 180
フレーム 180

一度に一部屋

ゼルダの伝説のメモリを見ると、リンクが画面を出るたびに変わるバイトが一つあった: 左へ一歩で 1 減り、上へ一歩で 16 減った。だから土地は幅 16 部屋の格子で、行に沿って番号が振られている。端に着くと、絵は一画面ぶんを一定の速さで滑らせ、リンクも一緒に運ばれる。このカートリッジも同じように部屋の番号を持ち、同じように滑らせる。違うのは、入ってくる部屋をどう描くかで、表は絵のチップへの書き込みをすべて記録したものからそれを示す。

このカートリッジゼルダの伝説
どのネームテーブルが隣り合うか横に並ぶ、基板で決まっている遊んでいる間は縦に並ぶ。滑る 4 フレーム前から滑った 2 フレーム後まで横に並ぶ
左へ一歩出る前と後の部屋の番号103 から 102119 から 118
番号が変わってから絵が動き出すまでのフレーム数231
滑るのにかかるフレーム数6464
動いたピクセル、1 フレームあたりのピクセル256、1 フレームあたり 4256、1 フレームあたり 4
絵が動く前に書いたものなし32 タイルの行を 23 本、24 タイルの行を 2 本
滑っている間に書いたもの30 タイルの列を 32 本22 タイルの列を 32 本、24 タイルの行を 2 本
最初の列を書いた、滑り始めから何フレーム目か031
列と列の間のフレーム数21
上へ一歩出る前と後の部屋の番号119 から 103119 から 103
上へ一歩: 横に書いた行の数、一行のタイルの数30, 3222, 32
何行目から、何行目まで29, 029, 8
番号が変わってから最初の行までのフレーム数26
行と行の間のフレーム数22

二つが分かれるところ

ゼルダの伝説 は、絵が動く前に 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

この前は: マリオのものと同じ、カメラの遊び

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

すべてのレッスン