マッピーの無敵を。 今回は 「プロアクションロッキー(FC用) Part2」スレの 957 [ http://game14.2ch.net/test/read.cgi/gameurawaza/1141436525/957 ] にて 「メインメモリ内で状態を記録しているところは040F」と提示されているので それを足がかりとして解析する。 死んだ直後の 0x040F 番地の値が 0x08 なので、 on write = 8 でブレイクポイントを設置し、敵に体当たりをかける $DA70:A5 1E LDA $001E $DA72:C9 20 CMP #$20 $DA74:D0 08 BNE $DA7E $DA76:AD 2A 04 LDA $042A $DA79:F0 03 BEQ $DA7E $DA7B:CE 2A 04 DEC $042A $DA7E:20 B7 E0 JSR $E0B7 $DA81:F0 55 BEQ $DAD8 $DA83:20 90 EA JSR $EA90 $DA86:20 B1 F0 JSR $F0B1 $DA89:20 E7 F0 JSR $F0E7 $DA8C:D0 03 BNE $DA91 $DA8E:4C 83 DB JMP $DB83 $DA91:A0 08 LDY #$08 $DA93:B1 1E LDA ($1E),Y $DA95:38 SEC $DA96:E9 49 SBC #$49 $DA98:C9 09 CMP #$09 $DA9A:B0 06 BCS $DAA2 $DA9C:20 E9 DE JSR $DEE9 $DA9F:4C 72 E9 JMP $E972 $DAA2:A5 1E LDA $001E $DAA4:C9 20 CMP #$20 $DAA6:F0 03 BEQ $DAAB $DAA8:20 A6 DE JSR $DEA6 $DAAB:A9 0B LDA #$0B $DAAD:A0 07 LDY #$07 $DAAF:91 1E STA ($1E),Y $DAB1:A9 D0 LDA #$D0 $DAB3:A0 0B LDY #$0B $DAB5:91 1E STA ($1E),Y $DAB7:A9 09 LDA #$09 $DAB9:C8 INY $DABA:91 1E STA ($1E),Y $DABC:A9 04 LDA #$04 $DABE:A0 0F LDY #$0F $DAC0:91 1E STA ($1E),Y $DAC2:A0 04 LDY #$04 $DAC4:91 1E STA ($1E),Y $DAC6:60 RTS $DAC7:A0 07 LDY #$07 $DAC9:B1 1E LDA ($1E),Y $DACB:38 SEC $DACC:E9 01 SBC #$01 $DACE:91 1E STA ($1E),Y $DAD0:D0 03 BNE $DAD5 $DAD2:4C 83 DB JMP $DB83 $DAD5:4C 3D E0 JMP $E03D $DAD8:A5 1E LDA $001E $DADA:D0 35 BNE $DB11 $DADC:A9 1E LDA #$1E $DADE:8D 04 04 STA $0404 $DAE1:A9 00 LDA #$00 $DAE3:8D 07 04 STA $0407 $DAE6:A9 08 LDA #$08 $DAE8:8D 0F 04 STA $040F << ここでブレイク 問題になるのは 0xDA81 番地の分岐。 ここさえ通過してしまえば 0xDAE8 のストア命令は実行されない。 なので $DA81:F0 55 BEQ $DAD8 ↓ $DA81:F0 00 BEQ $DA83 に書き換える。 これで歩行時の体当たりは無効化できるようになったが、 トランポリンでご先祖様と接触すると死んでしまう。 このばあいも 0x040F 番地の値は 0x08 なので、 そのまま解析を続行する。 実際にブレイクが発生するのは前と同じく 0xDAE8 番地なのだが、 トレーサをさかのぼってみると、いくつかの分岐命令から 0xDAD8 番地にジャンプしている。 というか、0xDAD8 番地が死亡処理の先頭だったりする。 $DB94:20 02 E1 JSR $E102 $DB97:F0 0B BEQ $DBA4 $DB99:A0 08 LDY #$08 $DB9B:B1 1E LDA ($1E),Y $DB9D:38 SEC $DB9E:E9 49 SBC #$49 $DBA0:C9 07 CMP #$07 $DBA2:B0 03 BCS $DBA7 $DBA4:4C D8 DA JMP $DAD8 << 下降中の接触時にジャンプ $DBA7:A0 03 LDY #$03 $DBA9:B1 1E LDA ($1E),Y $DBAB:C9 1C CMP #$1C $DBAD:90 03 BCC $DBB2 $DBAF:4C D8 DA JMP $DAD8 << 画面外に落下時にジャンプ $DBB2:20 6A E0 JSR $E06A $DBB5:20 69 E4 JSR $E469 $DC5C:20 02 E1 JSR $E102 $DC5F:D0 03 BNE $DC64 $DC61:4C D8 DA JMP $DAD8 << 上昇中の接触時にジャンプ $DC64:A0 03 LDY #$03 $DC66:B1 1E LDA ($1E),Y $DC68:29 03 AND #$03 $DC6A:38 SEC 落下時の方は、つぶしてしまうと詰んでしまうので置いておくとして、 残りの二つは、直前に同じサブルーチン 0xE102 番地へのジャンプがあるので、 このサブルーチンの終端付近を見てみる。 $E128:69 01 ADC #$01 $E12A:C9 02 CMP #$02 $E12C:B0 03 BCS $E131 $E12E:A9 00 LDA #$00 $E130:60 RTS $E131:A9 FF LDA #$FF $E133:60 RTS 先ほどの二つは、どちらもゼロフラグの成立時に死亡処理に進むようになっていたので、 $E12E:A9 00 LDA #$00 ↓ $E12E:A9 FF LDA #$FF こう書き換えればどちらも基本的には回避できる。 ただし、どういう条件なのかよくわからないが、 トランポリンに乗ろうとした瞬間に、小さくジャンプして床にめり込み そのまま死んでしまう現象が発生することがある。 これを処理してしまうと、床にめりこんだまま詰んでしまうので そのままにしておく。 歩行中無敵 FC4524CA ジャンプ中無敵 2C4D0A04