NEStinymachines

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

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

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

画面の上では

フレーム 200
フレーム 200
フレーム 300
フレーム 300
フレーム 330
フレーム 330
フレーム 360
フレーム 360

一度に一部屋

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

このカートリッジゼルダの伝説
左へ一歩出る前と後の部屋の番号119 から 118119 から 118
番号が変わってから絵が動き出すまでのフレーム数130
滑るのにかかるフレーム数6464
動いたピクセル、1 フレームあたりのピクセル256、1 フレームあたり 4256、1 フレームあたり 4
絵が動く前に書いたものなし32 タイルの行を 23 本、24 タイルの行を 2 本
滑っている間に書いたもの30 タイルの列を 32 本22 タイルの列を 32 本、24 タイルの行を 1 本
最初の列を書いた、滑り始めから何フレーム目か132
列と列の間のフレーム数21

二つが分かれるところ

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

すべてのレッスン