2009年10月4日の日記を表示中

2009年10月 4日 (日)

セイヴァー2を電池レス化してみる その3

電話で起こされたのを機に,そのまま作業再開.サウンドテストの表示が変な問題は,単純にデコード不要な領域を見落としていて,文字列データの部分をデコードしてしまっていたのが原因でした.

ここで既知の問題は一通り片付いたので本日一発目の実機チェック.実機でもばっちりゲームまで到達しました.写真は何かハメコミっぽいけど違いますよw.

実機でも起動した

が,いざ遊んでみるといきなりリセット発生.どうも2回目のダウンを奪う直前にリセットがかかるっぽい (;´Д`).MAMEでも再現するし.今度はどこだー.

今回も例外ベクタにブレークポイントを仕掛けまくったら今度はアドレスエラーで落ちてることが判明.でもスタックを見てもどこで落ちているのかやっぱりよくわからん・・・.仕方ないので落ちる直前でトレースを取るようにしてやったところ原因がわかりました.本来デコード不要なところをデコードしてるせいで,その値をROMから読んでjmpした際にめちゃくちゃなところに飛んでいました.

何でこんな初歩的なのを今まで見落としていたのか・・・と思ったら,この部分,デコードするとちょうど 68000 の命令になるらしく,dis.x の出力ではデータではなく自然な命令列になってました (;´Д`).こういうパターンもやっぱりあるのか・・・

他にもこういうのがあったとしても dis.x 側から探すのはさすがに厳しそう.そこでデコード前のROMデータに対して現時点で判明しているデコード不要の部分のみをわざとデコードしたデータを作ってみました.こうすると,データの殆どの部分がランダムな値の並びになるので,未発見のデコードが不要な部分の規則的なデータの並びが目立つようになり,バイナリデータの目視で発見しやすくなるという具合です(笑).hexdump の出力をざーっと目で確認してみたところ,3ヶ所くらいデコード不要指定漏れが見つかりました.ほんと抜け漏れなく探すの難しいわー.

これらの修正で,勝利しても落ちなくなりました(笑).よかったよかった.というわけで,あらためて実機でプレー.落ちずに1周してくれましたよ.わーい.ていうかモリガンでクリアしたんだけど,エンディングのカットってこれでいいのかw?

エンディング

スタッフロール

ちなみにテストモード内のメモリテストがNGになるんですよねー.ワークRAMの方は 0xFFFFF0 からの16Byteを飛ばすようにして回避できましたが,ROMの方がよくわからん.何を計算していて,答えはどこにあるんだろうなー.

メモリテスト

そんなわけで,とりあえず68000初心者でも根性とROM焼き環境があれば電池レス化は可能ということが確認できました (笑).死んだ板がまだあと2個あるので,次はもう少しエレガントにやる方法を模索していきたいですね.デコード前のデータのランダムさをうまく数値化して半自動化できたら面白いかもなぁw.あと今回全く試さなかったんですが,dis.x以外の逆アセンブラも試してみたいところ.

あと,本当は「ここが俺の見つけたデコード不要領域だぜ!」とか「ここにパッチを当てろッ」とか出したいんですが,どこまで出していいものやら.それからMAMEベースに作ったツールとかもそのうち出せればと思うんですが,MAMEのソースを流用したエミュレータ以外のものはライセンス的にどうなんだろう的な・・・

ちなみに電池レス化するとメモリのアクセスレイテンシが減るからタイミングがずれるという説もありますが,そもそもゲームは1フレーム内でやること全部やったらフレーム同期待つだろうから,アクセスレイテンシが減って違いが出るとしたら処理落ちするくらい処理が重くなったときとかですかねー.考えたくないけど,プロギアとかだと差が出るのかなぁ.いやだなぁ.

2009年10月4日の日記を表示中

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2009年10月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ