ゲームボーイロム分解者。
python v3.6以降が必要です。
MGBDISによって生成されたアセンブリファイルは、RGBDS V0.6.0以降で組み立てられるように設計されています。
ROMを分解する:
./mgbdis.py some-game.gb
デフォルトの出力は、 disassemblyディレクトリにあります。 makeを実行してからgame.gb (またはgame.gbc )ファイルをチェックすることにより、分解の結果を確認できます。
cd disassembly && make
また、生成されたアセンブリコードのフォーマットおよび命令スタイルを制御するための多くのオプションもあります。実行してこれらを表示できます。
./mgbdis.py -h
シンボルファイルを使用すると、コード、データ、テスト、画像データブロックがROM内の場所を示すことができます。
Game Boy CPU(SM83)の指示は長さが異なり、データをROM内のコードとインターリーブできるため、命令がどこで開始および停止するかを常に正確に識別することはできません。シンボルファイルでコードブロックを定義することは、命令の途中で分解しようとするMGBDISの問題を回避するのに役立ちます。
シンボルファイルがない場合は、Game Boy Emulator -Beaten Dying Moonで生成するファイルを生成してみてください。 Webデモを使用するか、WindowsやMacOで利用できるビルドがあります。ゲームをプレイしている間に実際に実行された命令のアドレスに基づいて、コードブロック定義を使用してシンボルファイルを生成でき、命令の調整の問題を回避できます。
MGBDISを使用してシンボルファイルを使用するには、ROMと同じディレクトリに存在し、拡張子を.symに変更することを除いて同じ名前を持つ必要があります。
すべての値(画像幅を除く)は、16進分する必要があります。エントリは、銀行番号から始まり、その後にアドレスがメモリになります。
ブロックタイプは、 .code 、 .data 、 .text 、および.image Magicラベルを使用して定義でき、その後にブロックの長さがバイトの長さを使用します。
いくつかのコードのラベルを追加:
03:47f2 Read_Joypad_State
512バイトのデータのラベルを追加します。
0d:4800 Level_Data
0d:4800 .data:200
16バイトのテキストのラベルを追加:
00:3d00 Character_Name
00:3d00 .text:10
.image Magicラベルを使用すると、ROMのピクセルタイルデータごとに1ビットまたは2ビットのブロックを定義できます。画像は、分解の/gfxディレクトリ内のPNGファイルとして出力され、RGBGFXを使用してMakeFileによって1BPPまたは2BPPタイルデータに戻されます。画像ブロックのアドレスでラベルが指定されている場合、PNGファイルの名前に使用されます。
各タイルには16バイトの画像データが必要なため、バイトのブロック長は16の倍数である必要があります。
ピクセルの画像幅は、 wが付いた10進数として指定できます。幅の値は8の倍数でなければならず、ブロックの長さと画像幅の組み合わせは、空のタイルのない長方形の画像になる必要があります。デフォルトの画像幅は128ピクセルです。または、ブロックの長さが奇数のタイルを示している場合、タイルの1列を持つ画像が生成されます。
パレットは、画像を生成するときに使用する灰色の色合いを選択するバイトサイズの値です。 0xFF47のBGPレジスタと同じ形式を使用します。値は、 pで接頭辞を付けた16進んで指定できます。デフォルトのパレットはE4です。
デフォルトは、ピクセルタイルデータごとに2ビットとして扱うことです。データを1ビットあたりピクセルタイルデータとして扱うために、 1bppオプションを提供できます。
128ピクセルとパレット0xe4の幅の1280バイトのタイルデータのラベルを追加します:
02:791a Title_Screen_Tile_Data
02:791a .image:500:w128,pe4
結果の画像:
1bppタイルデータの例:
05:4000 Font
05:4000 .image:200:w128,1bpp
結果の画像:
STOP後にNOP命令を自動的に追加します。そのため、命令HALT後に元のROMのNOPが続いていない場合、分解者はデータバイトとしてこれらを出力します。 MGBDISを使用した--disable-halt-nopsを使用して、rgbdsにHALT指示後に自動NOP命令の挿入を無効にするよう指示します。