2011年10月19日の日記の1番目の記事へのコメント
■スパIIX 電池レス化
あまりにもデモで落ちる箇所が多く,デバッガでトレースを取って命令を遡って原因を探すのが非常にしんどい感じです.もっと楽にやる方法はないかと考えていたところで,ドイさんの発言により,以前にMAME内部でのメモリアクセスにフックをかけて,どこのアドレスにどんなアクセスがあったかを記録する仕掛けを作りかけていたことを思い出しました (元々はCPS1の電池レス化のために作った).これを完成させれば,エミュレーターで実行した範囲は完璧に命令とデータを分けられるはず・・・.
というわけで,早速以前の残骸を発掘して完成させてみることに.プログラムROMは高々先頭4MByteだけなので,4M要素の配列を静的に確保しておき,ROMの読み出しが発生したら,そこに命令として読まれたかデータとして読まれたかの情報を書き込みます.で,エミュレーターの終了時やシグナルを受けた際に,この配列の内容をファイルに書き出して利用する感じ.トレースのログみたいにアクセスの順番を残す必要は一切ないので,情報としてはひとまずこれで十分でしょう.
問題は,どうやってROMの読み出し時に処理を割り込ませるかなんですが・・・.当初,CPS2のハードウェア定義の方で,先頭4MByteのアドレス空間に対して,読み出し時に呼ばれるハンドラを登録しようとしたんですが,CPS2のように暗号化したままのROMと復号化した状態のROMの両方を使うようなプログラムの場合,後々復号化処理のための領域の登録ができなくなるようで,これはうまくいきませんでした.
そこで,上品にやるのは諦め,68000のCPUエミュレーターの方のソースに手を突っ込み,メモリアクセスする部分にこの処理を割り込ませてやったところ,こっちは成功.無事データと命令の読み出しを区別して,記録できる状態となりました.
というわけで,これを利用して,通常版でデモを延々回した際のアクセス状況を取得し,現在の電池レス化版のROMの暗号化・復号化範囲と照らし合わせたところ,見事に漏れや間違いがボロボロと・・・.いやー,まだこんなにあったのか・・・.
この辺を必死に直してやったところ,エミュレーター上でデモが落ちなくなったので,いよいよ実機で動かしてみることにします.動かすためには4MbitのROMを6個も焼かないとだめなんですよね・・・.まあ,1回焼いちゃえば,1個目以外は殆ど焼き直すことないとは思いますが・・・.
さて,どうなるか・・・キタ━━━━(゜∀゜)━━━━ッ!!
無事実機で電池レス版が動きました.
とりあえずデモに関しては落ちないですね.クレジット入れて遊ぼうとしたら即リセットがかかりましたがw.いやー,ここまで長かったなぁw
2011年10月19日の日記の1番目の記事へのコメント
[コメントを書く]