ゼルダの物語のように、画面を這い上がる言葉
私たちの四角のための「について」の画面: 私たちの言葉が数行、画面を這い上がり、尽きるとまた初めから。遊んで、一緒に読んでみてほしい。プログラムは 663 バイトの命令 221 個で、作り方も確かめ方も同じだ。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: about.nes
画面の上では
一行動くごとに一行
ゼルダの伝説のタイトルを放っておくと、物語を語り始め、言葉が画面をゆっくり上っていく。コンソールには背景二画面ぶんの場所があり、このボードでは上下に積まれている。ゲームはそれを下へ、二フレームに一ピクセルずつスクロールし、端まで来るとまた初めに戻るだけだ。画面を描き直すことはない: 言葉が一行の高さ、8 ピクセル上がるたびに、これから見えてくる行へ 32 タイルの新しい一行を書き、色つきで見せる言葉のために、ときどき色のバイトを少し書く。物語一つに要る描画はそれだけだ。このカートリッジも、私たちの言葉を一色で同じように見せる。
| このカートリッジ | ゼルダの伝説 | |
|---|---|---|
| 言葉が動くピクセル数と、その間のフレーム数 | 1、2 フレームおき | 1、2 フレームおき |
| 書いた行数と、その間のフレーム数 | 74 行、16 フレームおき | 80 行、16 フレームおき |
| 一行書くごとの這い上がりのピクセル数 | 8 | 8 |
| 書いた色のバイト数 | 0 | 152 |
| そのほかに書いたタイルの数 | 0 | 0 |
| 絵を分ける | いいえ | いいえ |
| 測ったフレームの間に這い上がったピクセル数 | 1,182 フレームで 590 | 1,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