ゼルダのように、表から打ち込む名前
名前を打ち込む画面。文字の表は私たちが描いた。遊んでみてほしい: 十字でカーソルを動かし、A でその下の文字を打ち、十字を押し続けると動き続ける。プログラムは 611 バイトの命令 268 個で、作り方も確かめ方も同じだ。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: menu.nes
画面の上では
カーソルは文字の後ろにいる
名前を登録する画面で、ゼルダの伝説のカーソルは背景の後ろに描くスプライトなので、下の文字が透けて見え、点滅する。押した次のフレームで動き、押し続けると少し待ってから、もっと速く動き続ける。表の端でも止まらず、読む順にそのまま進むので、最初の文字から左へ行くと最後のマスに出る。一歩ごとにクリック音が鳴り、A を押すと次のフレームで名前にタイル一つ、その文字を書く。このカートリッジも、自前の表と待ちと拍とクリック音で同じようにする。
| このカートリッジ | ゼルダの伝説 | |
|---|---|---|
| 押してからカーソルが動くまでのフレーム数 | 0 | 1 |
| 押し続けて次に動くまでのフレーム数 | 20 | 17 |
| そのあと動く間隔のフレーム数 | 6 | 9 |
| 表の横の文字数 | 10 | 11 |
| 最初のマスから左へ行くと着くマス | 39 | 43 |
| 一文字打つごとに書くタイル数と、A からのフレーム数 | 1 個、1 フレーム後 | 1 個、1 フレーム後 |
| カーソルは文字の後ろに描く | はい | はい |
| カーソルを見せるフレーム数と、隠すフレーム数 | 16、16 | 8、8 |
| クリック音が鳴った移動の数 | 13 回中 13 回 | 11 回中 11 回 |
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: menu.s
;; Up, Down, Left and Right (bits 3 to 0 of the pad). A new press moves
;; at once and sets the wait at 20 frames; held, the cursor moves again
;; when the wait runs out, and then every 6.
steer:
LDA $01
AND #$0F
BEQ still
LDA $02
AND #$0F
BNE held
LDA #$14
STA $06
JMP step
held:
DEC $06
BNE still
LDA #$06
STA $06
step:
LDA $01
LSR A
BCS right
LSR A
BCS left
LSR A
BCS down
LDA $40
SEC
SBC #$0A
BCS moved
ADC #$28
JMP moved
down:
LDA $40
CLC
ADC #$0A
CMP #$28
BCC moved
SBC #$28
JMP moved
left:
LDA $40
SEC
SBC #$01
BCS moved
LDA #$27
JMP moved
right:
LDA $40
CLC
ADC #$01
CMP #$28
BCC moved
LDA #$00
moved:
STA $40
;; The click: a short high note on the first square channel.
LDA #$9F
STA $4000
LDA #$00
STA $4001
LDA #$40
STA $4002
LDA #$00
STA $4003
still:
RTS
;; A new press of A: the letter under the cursor waits to be written at
;; the end of the name, while the name has room. The empty cell types a
;; space: nothing is written and the name moves on.
type:
LDA $02
EOR #$FF
AND $01
AND #$80
BEQ full
LDA $41
CMP #$08
BCS full
CLC
ADC #$CC
STA $43
INC $41
LDA $40
JSR tileof
STA $42