2011年10月16日の日記の1番目の記事へのコメント
■スパIIX 電池レス化
さらにスパIIXの電池レス化を進めています.命令とデータの切り分けは,1個目のROMが細々としていて地獄でしたが,後の方のROMに行くに連れて次第にデータ領域が増え,徐々に楽になりました.まさに渋滞を抜けるような感覚w.まあそれでも境界のチェックは非常に手間でしたが・・・.
で,何とか6個目までデータ領域の抽出が終わったので,今度はプログラム自体の改修を行います.ここでは,メモリとして0xfffff0より後ろの領域を読み書きしないようにするのと,0x400000からの16Byteくらいに配置されているレジスタへのアクセスを0xfffff0からの16Byteに移す修正を行います.
0xfffff0は,メモリの後ろの方なので,メモリの初期化やチェックで読み書きされるケースと,スタックとして使われるケースが考えられます.メモリの初期化やチェックの処理はすぐにみつかり,カウンタの初期値を減らすことであっさり回避できました.
一方,スタックについては,スパIIXではSSPがこの領域を使うようになっていました.まあ普通に動いている間はSSPなんて使わないだろうと思っていたんですが,起動直後にわざとトラップを発生させて例外処理とかやりまくっているため,普通に対処が必要なことが判明.対処は,SSPの初期値を0から0xfffff0にずらせばいいだけなので,0番地に0xfffff0と書いて修正完了・・・と思いきや,しばらく動かすといつの間にか0xfffff0より後ろが使われるようになりますね・・・.おかしい・・・と思って逆アセンブル結果を読み返したら,何か例外処理の中でわざわざA7に0を書き直す処理をやっていました.くそー.ここを0xfff0に書き換えて今度こそ修正完了.ふぅ.
これでようやく起動シーケンスを抜けるようにはなったんですが,ちょっと動いてはすぐに例外が発生してリセット の繰り返しで,なかなかタイトル画面まで到達してくれません.まあでも,トレースの取り方を覚えたお陰で,解析が非常に楽にはなりました(笑).セイヴァー2のときもこれを知っていればもっと楽だったんだろうなぁ・・・w.結構範囲の指定間違いや見落としなんかが見つかりました.やはり怪しいところは,復号化した方からJMPやRTSを探してチェックする必要がありそうですね.うーむ,ツールに逆アセンブラ組み込めないかなぁ・・・.
まあ,そんなこんなで,最初のリュウとケンが戦って,その後乱入があってフェイロンが選ばれるあたりまでは進むようになりました.ホンコンにステージが切り替わる瞬間にリセットがかかるんで,まだまだ先は長そうですが,サクッと終わらせたいですねー.そして,今回の経験で新たに得たことを忘れないうちにツールに組み込んで,さらにもう少し楽にやれるようにしたいなぁとw.手元には電池が切れてるタイトルが,まだ他にもまだ数本あるので・・・.
しかしスパIIXは先頭4MByteが全部暗号化対象なんですよねー.最後の1MByteは多分全部データなのでそのままでよさそうですが,それでも実機で動かす際はEPROMを6個も焼かなければならないというのが何とも・・・w
2011年10月16日の日記の1番目の記事へのコメント
[コメントを書く]