Ein Game Boy ROM Disassembler.
Benötigt Python v3.6 oder höher.
Die von MGBDIS generierten Assemblerdateien sind so konzipiert, dass sie mit RGBDS v0.6.0 oder höher zusammengestellt werden.
Ein ROM zerlegen:
./mgbdis.py some-game.gb
Die Standardausgabe erfolgt zum disassembly . Sie können das Ergebnis der Demontage durch das Laufen make und dann die Datei game.gb (oder game.gbc ) erstellt:
cd disassembly && make
Es stehen auch eine Reihe von Optionen zur Verfügung, um den Formatierungs- und Anweisungsstil des generierten Montagecode zu steuern. Sie können diese durch Ausführen anzeigen:
./mgbdis.py -h
Mit Symboldateien können Sie angeben, wo sich Code-, Daten-, Test- und Bilddatenblöcke im ROM befinden.
Die Anweisungen der Game Boy CPU (SM83) haben unterschiedliche Längen, und Daten können mit Code im ROM verschachtelt werden, sodass es nicht möglich ist, immer genau zu ermitteln, wo eine Anweisung beginnt und stoppt. Das Definieren von Codeblöcken in einer Symboldatei kann dazu beitragen, Probleme mit MGBDIS zu vermeiden, die versuchen, mitten in einer Anweisung zu zerlegen.
Wenn Sie keine Symboldatei haben, können Sie versuchen, einen mit meinem Game Boy -Emulator zu generieren - geschlagener sterbender Mond. Sie können entweder die Web -Demo verwenden oder es stehen Builds für Windows und MacOS zur Verfügung. Es kann eine Symboldatei mit Code -Block -Definitionen generieren, die auf den Adressen der Anweisungen basieren, die beim Spielen des Spiels tatsächlich ausgeführt wurden, wodurch Probleme mit der Ausrichtung von Anweisungen vermieden werden.
Um eine Symboldatei mit MGBDIS zu verwenden, sollte sie im selben Verzeichnis wie das ROM existieren und denselben Namen haben, außer dass die Erweiterung so geändert wird .sym
Alle Werte (mit Ausnahme von Bildbreiten) sollten in hexadezimal sein. Die Einträge beginnen mit einer Banknummer, gefolgt von der Adresse im Speicher.
Blocktypen können definiert werden, indem die Labels für .code , .data , .text und .image Magic Labels verwendet werden.
Hinzufügen eines Etiketts für einen Code:
03:47f2 Read_Joypad_State
Hinzufügen einer Etikett für 512 Daten Bytes:
0d:4800 Level_Data
0d:4800 .data:200
Hinzufügen eines Etiketts für 16 Bytes Text:
00:3d00 Character_Name
00:3d00 .text:10
Mit dem .image Magic Label können Sie Blöcke von 1 oder 2 Bit pro Pixelfliesendaten im ROM definieren. Die Bilder werden als PNG -Dateien im Verzeichnis /gfx der Demontage ausgeben und werden von der Makefile mit RGBGFX wieder in 1BPP- oder 2BPP -Fliesendaten konvertiert. Wenn an der Adresse des Bildblocks eine Beschriftung angegeben wird, wird sie für den Namen der PNG -Datei verwendet.
Die Blocklänge in Bytes sollte ein Vielfaches von 16 sein, da jede Fliese 16 Bytes Bilddaten benötigt.
Die Bildbreite in Pixeln kann als Dezimalzahl angegeben werden, die mit w vorangestellt sind. Der Breitenwert sollte ein Vielfaches von 8 sein, und die Kombination aus Blocklänge und Bildbreite muss zu einem rechteckigen Bild ohne leere Fliesen führen. Die Standard -Bildbreite beträgt 128 Pixel, oder wenn die Blocklänge eine ungerade Anzahl von Kacheln angibt, wird ein Bild mit einer einzelnen Zeile von Kacheln erzeugt.
Die Palette ist ein Byte -Größe -Wert, der die Graustufen auswählt, die beim Erzeugen des Bildes verwendet werden sollen. Es verwendet das gleiche Format wie das BGP -Register bei 0xFF47 . Der Wert kann in hexidezimalen Voraussetzungen mit p angegeben werden. Die Standardpalette ist E4 .
Die Standardeinstellung besteht darin, es als 2 Bit pro Pixelfliesendaten zu behandeln. Eine 1bpp -Option kann geliefert werden, um die Daten als 1 -Bit pro Pixelfliesendaten zu behandeln.
Hinzufügen eines Etiketts für 1280 Bytes von Fliesendaten mit einer Breite von 128 Pixel und Palette 0xE4:
02:791a Title_Screen_Tile_Data
02:791a .image:500:w128,pe4
Resultierendes Bild:
Beispiel für 1BPP -Fliesendaten:
05:4000 Font
05:4000 .image:200:w128,1bpp
Resultierendes Bild:
NOP -Anweisungen nach STOP and HALT automatisch hinzu, sodass der Disassembler diese als Datenbytes ausgibt, wenn die Anweisung im ursprünglichen ROM nicht von einem NOP folgt. --disable-halt-nops mit MGBDIS, um RGBDs zum Deaktivieren von automatischen NOP -Anweisungen nach HALT zu unterweisen.