SNES ROM用のルーチン指向CUI逆アセンブラ、「sdachi」を作成しました。

作成経緯

私は以前から、特定のスーファミゲーム向けのMMLコンパイラを作りたい!と思っていました。

ただ、それを実現するには。

  1. MML言語仕様の策定
  2. 対象ゲームの解析(主にデータ構造・音楽転送ルーチン解析)
  3. 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

Published

18 June 2017

Tags