マリオのような手触りのジャンプ
地面の上の赤い四角。右で歩き、A で跳ぶ。プログラムは 513 バイトの命令 228 個で、解剖がリスティングを書くのと同じテキストで書き、同じアセンブラでカートリッジにした。アセンブラは、そのテキストが一バイトも違わずカートリッジを返すことを確かめる。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: jump.nes
画面の上では
数がどこから来たか
プログラムの中の数はどれも、私たちのコンソールでスーパーマリオブラザーズを遊び、フレームごとにメモリを見て読み取った: 右を押している間に横の速さがどれだけ増えるか、跳ぶときの最初の速さ、そして下向きの速さに毎フレーム足される量。そのうち二つは A で変わる: A を押していて、まだ上がっている間は引きが弱く、離すか落ち始めるとずっと強くなる。だから軽く押せば小さく跳び、長く押せば高く跳ぶ。
二つを同じように遊ぶ
同じボタン操作を、このカートリッジと スーパーマリオブラザーズ で遊んだ結果:
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| 右を押して最高速になるまでのフレーム数 | 38 | 40 |
| 最高速、1 フレームあたりのピクセル | 1.5 | 1.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