アトランチスの謎 ・空中ジャンプ FC752C6C 8B54C860 ジャンプなどの状態は、0x0216 番地に格納化されており、 空中にいる間は bit 3 が on になっている。 そこで 0x0216 番地に on write = 4 でブレイクポイントをしかけ、 ジャンプしてみる。 $951B:AD 16 02 LDA $0216 //状態を a レジスタに読み込み $951E:29 04 AND #$04 //空中かどうかを抽出化 $9520:D0 27 BNE $9549 //空中ならば分岐化 $9522:AD 07 02 LDA $0207 //ボタン押下情報を a レジスタに読み込み $9525:29 80 AND #$80 //Aボタンの状態を抽出化 $9527:D0 03 BNE $952C //Aボタンが押されてれば分岐 $9529:4C 92 95 JMP $9592 //処理終了へ $952C:AD 16 02 LDA $0216 //状態を a レジスタに読み込み $952F:09 04 ORA #$04 //空中であるフラグを on $9531:8D 16 02 STA $0216 //状態を a レジスタに格納化 // ↑ここでブレイク この場合、 $9520:D0 27 BNE $9549 //空中ならば分岐化 ↓ $9520:D0 00 BNE $9522 //分岐無効化 とすれば空中でもAボタンの入力を受けつけるようになるが、これだけでためしてみると、 Aボタンを押した瞬間に少し浮きあがってあとは動かなくなってしまう。 もちろんこの状態でもAボタンを押せばまた少し浮きあがるが、下におりることはできない。 この原因は、本来なら 0x9549 番地から始まるはずの、空中での挙動を処理化する部分が、 0x9529 番地のジャンプ命令でまるごと飛ばされてしまっているためである。よって、 $9529:4C 92 95 JMP $9592 //処理終了へ ↓ $9529:4C 49 95 JMP $9549 //空中処理へ とすれば、空中での処理を飛ばさずに空中ジャンプを実装化できる。