NEStinymachines

マリオのような手触りのジャンプ

地面の上の赤い四角。右で歩き、A で跳ぶ。プログラムは 513 バイトの命令 228 個で、解剖がリスティングを書くのと同じテキストで書き、同じアセンブラでカートリッジにした。アセンブラは、そのテキストが一バイトも違わずカートリッジを返すことを確かめる。

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

画面の上では

フレーム 100
フレーム 100
フレーム 215
フレーム 215
フレーム 330
フレーム 330
フレーム 430
フレーム 430

数がどこから来たか

プログラムの中の数はどれも、私たちのコンソールでスーパーマリオブラザーズを遊び、フレームごとにメモリを見て読み取った: 右を押している間に横の速さがどれだけ増えるか、跳ぶときの最初の速さ、そして下向きの速さに毎フレーム足される量。そのうち二つは A で変わる: A を押していて、まだ上がっている間は引きが弱く、離すか落ち始めるとずっと強くなる。だから軽く押せば小さく跳び、長く押せば高く跳ぶ。

二つを同じように遊ぶ

同じボタン操作を、このカートリッジと スーパーマリオブラザーズ で遊んだ結果:

このカートリッジスーパーマリオブラザーズ
右を押して最高速になるまでのフレーム数3840
最高速、1 フレームあたりのピクセル1.51.5
A を 4 フレーム押す: 宙にいたフレーム数、上がったピクセル数27 フレーム、34 ピクセル27 フレーム、34 ピクセル
A を 20 フレーム押す: 宙にいたフレーム数、上がったピクセル数45 フレーム、63 ピクセル45 フレーム、63 ピクセル
A を 80 (70) フレーム押す: 宙にいたフレーム数、上がったピクセル数58 フレーム、71 ピクセル57 フレーム、71 ピクセル

一行の置き場所

最初の版は、動かす前に引いていた: 毎フレーム、引きを速さに足してから、新しい速さで動かす。どのジャンプもマリオより低くなった。下のプログラムは先に動かして後で引く。上の表は、その順で得られたものだ。 残る違い: A を 80 (70) フレーム押すと、このカートリッジは 58 フレーム、71 ピクセル、スーパーマリオブラザーズ は 57 フレーム、71 ピクセル。

書いたとおりに

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

;; Up and down: a new press of A on the ground starts a jump.
jump:
    LDA $03
    BNE air
    LDA $02
    EOR #$FF
    AND $01
    AND #$80
    BEQ done
    LDA #$00
    STA $16
    LDA #$FC
    STA $17
    LDA #$01
    STA $03
air:
    CLC
    LDA $14
    ADC $16
    STA $14
    LDA $15
    ADC $17
    STA $15
    LDX #$60
    LDA $01
    AND #$80
    BEQ pull
    LDA $17
    BPL pull
    LDX #$1E
pull:
    TXA
    CLC
    ADC $16
    STA $16
    LDA $17
    ADC #$00
    STA $17
    BMI fall
    CMP #$04
    BCC fall
    LDA #$00
    STA $16
    LDA #$04
    STA $17
fall:
    LDA $17
    BMI done
    LDA $15
    CMP #$B0
    BCC done
    LDA #$B0
    STA $15
    LDA #$00
    STA $14
    STA $16
    STA $17
    STA $03
done:
    RTS

すべてのレッスン