NEStinymachines

ゼルダの物語のように、画面を這い上がる言葉

私たちの四角のための「について」の画面: 私たちの言葉が数行、画面を這い上がり、尽きるとまた初めから。遊んで、一緒に読んでみてほしい。プログラムは 663 バイトの命令 221 個で、作り方も確かめ方も同じだ。

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

画面の上では

フレーム 300
フレーム 300
フレーム 500
フレーム 500
フレーム 700
フレーム 700
フレーム 1100
フレーム 1,100

一行動くごとに一行

ゼルダの伝説のタイトルを放っておくと、物語を語り始め、言葉が画面をゆっくり上っていく。コンソールには背景二画面ぶんの場所があり、このボードでは上下に積まれている。ゲームはそれを下へ、二フレームに一ピクセルずつスクロールし、端まで来るとまた初めに戻るだけだ。画面を描き直すことはない: 言葉が一行の高さ、8 ピクセル上がるたびに、これから見えてくる行へ 32 タイルの新しい一行を書き、色つきで見せる言葉のために、ときどき色のバイトを少し書く。物語一つに要る描画はそれだけだ。このカートリッジも、私たちの言葉を一色で同じように見せる。

このカートリッジゼルダの伝説
言葉が動くピクセル数と、その間のフレーム数1、2 フレームおき1、2 フレームおき
書いた行数と、その間のフレーム数74 行、16 フレームおき80 行、16 フレームおき
一行書くごとの這い上がりのピクセル数88
書いた色のバイト数0152
そのほかに書いたタイルの数00
絵を分けるいいえいいえ
測ったフレームの間に這い上がったピクセル数1,182 フレームで 5901,278 フレームで 638

書いたとおりに

このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: about.s

;; Every second frame the scroll moves down one pixel, round from 479 to
;; 0; each time it is a whole row down, the next row is made ready.
crawl:
    LDA $42
    EOR #$01
    STA $42
    BNE crawled
    INC $40
    BNE carried
    INC $41
carried:
    LDA $41
    BEQ within
    LDA $40
    CMP #$E0
    BCC within
    LDA #$00
    STA $40
    STA $41
within:
;; The register's view: within the top screen below 240, else the lower.
    LDA $41
    BNE lower
    LDA $40
    CMP #$F0
    BCS lower
    STA $47
    LDA #$00
    STA $48
    JMP view
lower:
    SEC
    LDA $40
    SBC #$F0
    STA $47
    LDA #$02
    STA $48
view:
    LDA $40
    AND #$07
    BNE crawled
    JSR prepare
crawled:
    RTS
;; The row 240 below the scroll, which comes into view as it next moves:
;; its place (counting down both screens, round at 480), and in it a line
;; of the words, centred, or the gap between two lines.
prepare:
    CLC
    LDA $40
    ADC #$F0
    STA $45
    LDA $41
    ADC #$00
    STA $46
    BEQ first
    LDA $45
    CMP #$E0
    BCC first
    SBC #$E0
    STA $45
    LDA #$00
    STA $46
first:
;; $45/$46 is now 0 to 479. Below 240 it is the top screen ($2000),
;; else the lower ($2800), 240 less.
    LDA #$20
    STA $49
    LDA $46
    BNE second
    LDA $45
    CMP #$F0
    BCC place
second:
    SEC
    LDA $45
    SBC #$F0
    STA $45
    LDA #$28
    STA $49
place:
;; The row's address: the screen's, and 32 for each 8 pixels.
    LDA $45
    AND #$F8
    ASL A
    ASL A
    STA $46
    LDA $45
    LSR A
    LSR A
    LSR A
    LSR A
    LSR A
    LSR A
    ORA $49
    STA $45
    LDA #$00
    LDX #$1F
blank:
    STA $0300,X
    DEX
    BPL blank
    LDA $43
    EOR #$01
    STA $43
    BEQ ready
;; A line: its length, then its letters, placed in the middle. A length
;; of $FF is the end of the words, and they start again.
    LDY #$00
    LDA ($20),Y
    CMP #$FF
    BNE line
    LDA wordslo
    STA $20
    LDA wordshi
    STA $21
    LDA ($20),Y
line:
    TAX
    LDA #$20
    SEC
    STX $4A
    SBC $4A
    LSR A
    TAX
    LDY #$00
copy:
    CPY $4A
    BEQ copied
    INY
    LDA ($20),Y
    STA $0300,X
    INX
    JMP copy
copied:
    INY
    TYA
    CLC
    ADC $20
    STA $20
    LDA $21
    ADC #$00
    STA $21

すべてのレッスン