今日もゲームの改造記事。飽きもせずやってます。
まずはバトランティス。
去年の基板屋さんセールで購入してからしばらく遊んでいたのですが、あまりに難しい上にコンティニューが最高でも5回(ディップ設定)しかできず、嫌になって放置していたゲームです。
とりあえずMAME PLUSで起動してみます。
今度こそ68000だと思ってたら、HD6309という日立製の6809上位互換CPUらしいです。
まあ、6809なら少しいじってたことあるから……
チートの内容はこんな感じです。
ちゃんと無限コンティニューがありますねw
チートファイルのxmlを読むと、10A4Hにコンティニュー回数を保存しているようです。
いつものようにデバッガでここに数値を書き込んでいる命令を探します。
コンティニューした瞬間に増えるはずなので、こういうのは探しやすいですよね。
ここです。
8F81: 0C A4 INC $A4
もう手っ取り早くここをNOPで潰しましょう。
8F81: 12 NOP 8F82: 12 NOP
安易ですがOKですw
では……
アッー!?
なんということでしょう!なんということでしょう!
最初のROMチェックが通りません。
ROMチェック→BAD表示→リセット→ROMチェック再開を繰り返します。
……まあ、当然こういうこともありますよね。
仕方ないので、起動〜ROMチェックを、ステップ実行とコマメなブレークポイント設定でしらみ潰しに当たっていきます。
ここですね。
8320: 27 6A BEQ $838C 8322: 7E 80 00 JMP $8000 → チェックサムエラーで最初へ
超安易ですが、ここも潰しましょうww
8322: 12 NOP 8323: 12 NOP 8324: 12 NOP
これはひどい……
でも起動したよーwww
おお!コンティニューもガンガンできます!
最終面まで来ましたー。
コンティニューしてみて、かなりの鬼ゲーとわかりました……
さて、次はA-JAXの改造するよー。
A-JAXもこの頃のコナミらしく、5回までしかコンティニューできない謎仕様です。
これのおかげで6〜7面の練習でくじけるんですよね……
チートを見てみましょう。
なんと無限コンティニューがありません!
自分で探さねば……というわけでデバッガで探します。
ちなみに、A-JAXのメインCPUはKONAMIカスタム(?)らしいです。
ニーモニックは6809互換みたいです。
8bitCPUはメモリ空間も小さいのでお目当てのワークエリアもすぐに見つかりますね。
コンティニュー回数は20A9Hに格納されてました。
で、書き込みルーチンはここです。
8CFB: 8B C4 A9 inc $a9
こうです……あれ?
8CFB: AE NOP 8CFC: AE NOP 8CFD: AE NOP
6809のNOPはオペコードでは12Hのはずですが、なぜかA-JAXではAEHです。
これはデバッガが吐き出した逆アセンブルのソースを読んでわかったのですが、A-JAXのカスタムCPUは6809に似てる別のCPUのようです。なんなんでしょうね……
アッー!やっぱりーwww
仕方ないのでバトランティス同様、こちらもチェックルーチンを潰します。
なぜか3ヶ所のチェックルーチンで引っかかっていたので全部潰してしまいました。
あ、あれ……?w
なんか画面が変ですww
ゲームも正常に進行しません……これはダメですね。
どうやらチェックルーチンでチェックしつつ、何か初期設定的な処理をしているようです。
この時点でだいぶ時間も遅かったのですが、そのままあきらめるのもすっきりしないので、のすけさんにツイッターでデバッグのコツを色々教えてもらいながらもうちょっと頑張ってみました。
以下のすけさんによるアドバイスです。
・デバッガのF8でVSYNC割り込みまで飛ばしながら進めてみる ・書き換えたプログラム部分にウォッチポイントを設定して読み出しているルーチンを探し出す ・基板購入のノルマを早回しして稼ぎに突入する ・まとめて落札して余ったら新宿、小松、上田
ROMチェックを通過した後にどこかから勝手ルーチンを呼び出して、自らプログラムを書き換えてみますか。
アッー!
プログラムに直接手が入れられないようなので、とりあえずメモリの最上位にある割り込みベクタを書き換え、勝手ルーチンへ飛ばしてみることにしました。
アッー!
これは……何がなんでも書き換えは許さないみたいです。
試しにROMのいろいろな場所を書き換えてみましたが、どこを書き換えてもROMチェックで引っかかります。
どうもROM全体をチェックしてるっぽい?
ぐぬぬ……
どうにも八方塞がりです。さすがにどこも書き換えられない状態では改造のしようがありません……
さっきアドバイスしてもらったウォッチポイントを設定してループしているチェックルーチンをよーーーーく眺めます。
815E: 17 32 addb ,-y 8160: 18 00 adca #$00 8162: 08 24 FF leax #$-01,x 8165: 63 F3 bne $815a (-13)
どうもここが気になりますね……
yはインデックスレジスタですか。
詳細な範囲はわかりませんが、メモリ内を絨毯爆撃で読み出してbレジスタに加算していますね。
さらに念入りに繰り上がりをaレジスタに加算しているようです。
うーん……足してるだけならコード変わった差分をどこかに書きこめばいいのかな…?w
書き換え前 8BH + C4H + A9H 合計 1F8H ↓ 書き換え後 AEH + AEH + AEH 合計 20AH
差分は、20AH - 1F8H = 12H でいいのかな?単純すぎる……?ww
ワークエリアっぽいところがFFHでフィルされているので、ここを1バイトだけ、12H減らしたEDHに書き換えてみますか。
こんなんでいいのか?ww
さて、動作チェック……
ROMチェック通ったー!wwww
ゲームも正常に動作してます。
何回コンティニューしても行けます!
うーん、同じ時期の同じ会社のゲームでも違うものですねー。
慣れたような気でいたけど、今回はなかなか一筋縄では行かなかったです。
まとめ
バトランティス編
777_e02.7e コンティニュー回数増加を無くす 8F81 0C A4 → 12 12 ROMチェックスルー 8322 7E 80 00 → 12 12 12
A-JAX編
770_l01.n11 コンティニュー回数増加を無くす 8CFBH inc $a9 8B C4 A9 → AE AE AE まさかのワークエリアチェックサム調整 FFD0H FF → ED