2010年10月17日の日記の2番目の記事へのコメント
■板
今日は先手を打ってソニックの電池切れ対策をやってみました.MAMEのソースによると,ソニックの羊羹は,RAMのとあるアドレスにデータが書かれると,別の場所をゼロクリアしたりしつつ,書かれた値を元にROM上のテーブルを引いて,RAMの別の領域に書き出すということをやってるらしいです.
MAMEを使って調べたところ,このトリガとなるRAMの領域はステージを管理する変数っぽく,主に2ヶ所で値を書いているようです.ウォッチポイントをセットして確認した感じだと,片方はコインを入れてキャラを選んだり,ステージが次に進んだりするときに書き込まれる感じ.もう片方は全然通らないけど,近くのデータ領域を見るに,何となくデバッグ目的のステージセレクト用っぽい.とりあえず前者が動けば十分そうですなー.
しかし,そうはいってもMAMEでやってる処理と同じ処理を書いて,それをうまいこと差し込む方法を探すのは結構面倒そう.・・・そうだ,どこかにデバッグ用の羊羹相当の機能を提供する関数が残ってるんじゃない?というわけで,一生懸命探してみたんですが,それっぽいところは見つかりませんでした.テーブルをROMからRAMにコピーしているところを発見したので.この近くにあるかと思ったんですけどねー.
そんな感じで前者の部分をJSR命令に置き換え,後ろの方の空き領域に以下のコードをドカッと足してみました.アセンブラはないので,今回も当然ハンドアセンブラ _|‾|○.MAMEで答え合わせができるのがせめてもの救いかw.ちなみにpush/popとか,ぱっと見ソニックではあんまり使われていないようだけど,どうなんだろう・・・.
push R1 cmp.b #E, 65C4[R25] ble LABEL1 mov.b #E, 65C4[R25] LABEL1: mov.h 65C4[R25], R1 mov.h 7500[R25](R1), R1 mov.h R1, 706E[R25] mov.w #0, 70BC[R25] pop R1 rsr
ひとまず,羊羹のエミュレーションを切ったMAME上で,このパッチで動くようになりました.あとは,実機上での確認ですが,電池の切れたソニックが手元にないので,これを実機上で試すことはできません・・・.あ,EPROMとGALとジャンパを電池のないJリーグ1994のサブボードに移植すればいけるかな?
ちなみに,ソニックのこのプロテクションは,デモプレイなどでは発動しないため,電池が切れても立ち上がって普通にデモがぐるぐる回るはずです.コインを入れてキャラを選んだ時点で初めて電池切れがわかるっぽい (リセットがかかったり,変なステージから即死の状態で始まったりすると思われる).恐ろしい・・・.
2010年10月17日の日記の2番目の記事へのコメント
[コメントを書く]