NEStinymachines

ゼルダのように、表から打ち込む名前

名前を打ち込む画面。文字の表は私たちが描いた。遊んでみてほしい: 十字でカーソルを動かし、A でその下の文字を打ち、十字を押し続けると動き続ける。プログラムは 611 バイトの命令 268 個で、作り方も確かめ方も同じだ。

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

画面の上では

フレーム 40
フレーム 40
フレーム 100
フレーム 100
フレーム 170
フレーム 170
フレーム 230
フレーム 230

カーソルは文字の後ろにいる

名前を登録する画面で、ゼルダの伝説のカーソルは背景の後ろに描くスプライトなので、下の文字が透けて見え、点滅する。押した次のフレームで動き、押し続けると少し待ってから、もっと速く動き続ける。表の端でも止まらず、読む順にそのまま進むので、最初の文字から左へ行くと最後のマスに出る。一歩ごとにクリック音が鳴り、A を押すと次のフレームで名前にタイル一つ、その文字を書く。このカートリッジも、自前の表と待ちと拍とクリック音で同じようにする。

このカートリッジゼルダの伝説
押してからカーソルが動くまでのフレーム数01
押し続けて次に動くまでのフレーム数2017
そのあと動く間隔のフレーム数69
表の横の文字数1011
最初のマスから左へ行くと着くマス3943
一文字打つごとに書くタイル数と、A からのフレーム数1 個、1 フレーム後1 個、1 フレーム後
カーソルは文字の後ろに描くはいはい
カーソルを見せるフレーム数と、隠すフレーム数16、168、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

すべてのレッスン