SPCのプログラムを見つけよう、の巻

SPCを解析しよう、となった時に、まず必要なのが、プログラムの位置の特定ですね。
シーケンス改造目的だけであれば、KI☆A☆Iでどうにかなりますけど、凝ったことしたい場合は、プログラムを知るとイロイロできますよね。

そこで今回は、そのプログラム部分だけをピンポイントで取り出したいとおもいます。

ひつようなもの

・ゲームのローム
・ロームから取り出したSPCファイル

てじゅん

1. SPCを抽出する

はい、まずはコレやっときましょう。
SPCツウの方なら、ココからプログラム部分だけピンポイントで取り出せそうですが、まぁ、その人はソレとして、ね。

2. プログラムのおおまかな位置を特定する

抽出したSPCでの作業になります。SPC上で、プログラムのおおよその位置を特定しましょう。
コツとして、SPCプログラムは、最初の方でclrpしたりspをセットしたりしてますので、そのへんを手がかりにします。
以下の例のようなデータの並びがSPC上の0x0300以降にあれば、そのあたりが開始位置と思ってよいでしょう。


ミスティックアークの場合:

; バイナリ列[SPC: 0x03dc]
20 CD FF BD 8F FF F4 E8 ……

スーパードンキーコング2の場合:

; バイナリ列[SPC: 0x05d8]
20 CD FF BD 3D D8 F4 3D ……

エストポリス伝記2の場合:

; バイナリ列[SPC: 0x0400]
20 CD FF BD E8 00 CD EF ……

それぞれの先頭4バイトを逆アセンブルしたもの

    clrp
    mov   x,#$ff  ;
    mov   sp,x    ; spに0xffをセット

このように、初期化処理はほとんどテンプレみたいな感じです。
" mov x,#$ff " が " mov x,#$cf " だったり、途中に" di "とか" ei "が入ることもありますが、おおよそこんなかんじです。

3. ROMからSPCプログラムを検索する

2. の作業でおおまかな位置特定はできたので、そちらの結果を基に逆アセンブルして作業ということもできます。が、今回はプログラムの正確な大きさを知ることができるので、ROM中でのプログラムの位置を特定してみましょう。

ミスティックアークを例にしてみます。


SPCから、2.で特定した位置のデータを、適当な長さだけコピーします。


コピーしたデータでROM中を検索します。
ヘッダ無しの場合、ROMの0x0d4cd0にデータが見つかるはずです。

さて、見つかったデータとSPCのデータを比較して、プログラムの先頭を特定しましょう。例の場合、プログラムは 0x0d4cd3 から開始のようです。

さて、今度はデータの大きさです。多くのROMは、プログラムデータの近くにデータ転送先及びサイズがあります。今回の例のミスティックアークもそうです。
プログラムデータの先頭位置の4バイト前から、[プログラムサイズ(2bytes)] [プログラム転送先のARAMアドレス(2bytes)] となっています。

ただし、これには例外も多くあり、別な位置にサイズ・転送位置が格納されていることも少なくないです。
ROM毎に違うので、ROMをデバッガで解析して…ってなこともありえますが、説明が面倒なので、また今度。

まとめ

というわけで、ミスティックアークの場合、まとめるとこんな感じ。

プログラムの大きさ
0x0daa バイト
ARAM上でのプログラム開始位置
0x02dc
SPC上でのプログラム開始位置
0x03dc
ROM上のSPCプログラム格納位置
0x0d4cd3(SNES $cd:4cd3)

慣れないとむつかしいとこもありますが、SPCを全部逆アセンブルするよりかは解析が捗りそうな気がします。
以上、お粗末さまでした。