Sdachi Snes Disassembler 備考録とエトセトラ
SNES ROM用のルーチン指向CUI逆アセンブラ、「sdachi」を作成しました。
作成経緯
私は以前から、特定のスーファミゲーム向けのMMLコンパイラを作りたい!と思っていました。
ただ、それを実現するには。
- MML言語仕様の策定
- 対象ゲームの解析(主にデータ構造・音楽転送ルーチン解析)
- MMLコンパイラの作成
といった手順が必要になります。
ここで、2.の作業を行うにあたり、既存の逆アセンブラでは関連ルーチン全摘出に骨が折れるので、この際だから自分で逆アセンブラを作ってしまおうと思い、作成に至りました。
機能
この逆アセンブラは、以下の機能を有しています。
解析対象ROMのメモリマップの自動検出
解析対象のROMのメモリマップを自動的に判定します。
SNESヘッダの有無もあわせて自動的に判断します。
おそらく以下のメモリマップのROM解析に対応しています。
- LoROM
- HiROM
- ExLoROM
- ExHiROM
- SA-1ROM (※スロット固定)
※ SA-1のスロットは、スロット0 = 0x00, スロット1 = 0x10, スロット2 = 0x20, スロット3 = 0x30 とみなして解析します。
レジスタ幅の追跡
SNESのPSWレジスタのMフラグ/Xフラグを追跡して、イミディエイトモード命令の幅を自動的に変更します。
以下のOpcodeのみ追跡します。
- REP
- SEP
PHP / PLP 等のスタックからの変更は追跡しません。
RTS/RTL/RTI 命令検出まで逆アセンブル
ルーチンが終わるまで解析をします。
これにより、無関係なデータの逆アセンブルを防ぎます。
ルーチンの再帰逆アセンブル
JSR / JSL 命令先のルーチンを追跡して逆アセンブルします。
ただし、これに対応しているのはアブソリュートモード/アブソリュートロングモードのOpcodeのみです。
最大呼び出し深度は、後述の-rオプションで制限できます。
ルーチンコール元 / コール深度の表示
ルーチンがどこから呼ばれたか、およびそのルーチンの呼び出し深度を表示します。
この逆アセンブラができないこと
逆アセンブルのアドレス範囲指定
逆アセンブラの解析の性質上、そういう機能制限をあえて持たせていません。
テーブルデータの出力
インデクスモードの命令等で参照されるデータは出力できません。
別途データ出力モード(-cオプション)で出力する必要があります。
RAMコード解析
SNES の挙動をエミュレートしているわけではないので、インダイレクトモード命令や、RAM上に展開したコードの解釈等はできません。
特に、JSL $7f2000 のように、RAM上に展開したサブルーチン実行命令を見つけた場合は、逆アセンブルエラーとなります。
断片データ解析
SNESから切り出した断片データの解析はできません。
Dispel等の既存の逆アセンブラとうまく使い分けてください。
ダウンロード
githubのDLページからどうぞ。
Windows版はbinary(sdachi.zip)を用意しました。
UNIX系OSを使用している方はcmakeをインストールしてコンパイルしてください。
コマンドライン引数
sdachi [options] <rom>
-a (–a)
逆アセンブル開始時のAレジスタを16ビットモードにします。
-x (–x)
逆アセンブル開始時のX/Yレジスタを16ビットモードにします。
-p (–pc)
逆アセンブルの開始アドレスを、SNESアドレスで指定します。
-p 0x008020
のように指定します。
指定しない場合は、リセットベクタのアドレスから逆アセンブルします。
-r (–recursive)
サブルーチンの再帰解析深度を指定します。
-r 0
で、制限なしとなります。
-c (–count)
データ出力モードを有効にします。
また、データ出力バイト数を指定します。
-c 20
で20バイトのデータが出力されます。
-s (–split)
データ出力モードにおける、改行までのバイト数の指定を行います。
-s 16
とすると、16バイト毎に改行が挿入されます。
-l (–label)
データ出力モードのラベルプレフィックスを指定します。
-l HOGE_DATA
のように指定します。
-u (–upper)
逆アセンブルデータを大文字にします。
-o (–output)
出力ファイル名を指定します。
-o boo.asm
とすると、boo.asmに逆アセンブル結果を出力します。
省略した場合は、入力ROMファイル名.asm に出力します。
-v (–version)
バージョン情報を表示します。
-? (–help)
コマンドラインオプションの一覧を表示します。
謝辞
アイコンにいらすとや様の素材を使用させていただいております。
blog comments powered by Disqus