Un Game Boy Rom Desarsembler.
Requiere Python v3.6 o posterior.
Los archivos de ensamblaje generados por MGBDIS están diseñados para ensamblarse con RGBDS V0.6.0 o posterior.
Desmontar una rom:
./mgbdis.py some-game.gb
La salida predeterminada es al directorio disassembly . Puede verificar el resultado del desmontaje ejecutando make y luego verificando el archivo game.gb (o game.gbc ) creado:
cd disassembly && make
También hay una serie de opciones disponibles para controlar el estilo de formato e instrucción del código de ensamblaje generado. Puedes verlos ejecutando:
./mgbdis.py -h
Los archivos de símbolos le permiten indicar dónde están los bloques de datos de código, datos, pruebas e imágenes en la ROM.
Las instrucciones de la CPU de Game Boy (SM83) tienen diferentes longitudes, y los datos pueden interconectarse con código en la ROM, por lo que no es posible identificar siempre con precisión dónde comienza y se detiene una instrucción. La definición de bloques de código en un archivo de símbolos puede ayudar a evitar problemas con MGBDIS tratando de desmontar en medio de una instrucción.
Si no tienes un archivo de símbolos, puedes intentar generar uno con mi emulador de Boy Boy: Beated Dying Moon. Puede usar la demostración web, o hay compilaciones disponibles para Windows y MacOS. Puede generar un archivo de símbolos con definiciones de bloque de código en función de las direcciones de las instrucciones que realmente se han ejecutado mientras ha estado jugando el juego, evitando problemas de alineación de instrucciones.
Para usar un archivo de símbolos con MGBDIS, debe existir en el mismo directorio que la ROM y tener el mismo nombre, excepto que cambie la extensión para ser .sym .
Todos los valores (excepto los anchos de imagen) deben estar en hexadecimal. Las entradas comienzan con un número bancario seguido de la dirección en la memoria.
Los tipos de bloques se pueden definir usando las etiquetas mágicas .code , .data , .text y .image , seguidas de la longitud del bloque en bytes.
Agregar una etiqueta para algún código:
03:47f2 Read_Joypad_State
Agregar una etiqueta para 512 bytes de datos:
0d:4800 Level_Data
0d:4800 .data:200
Agregar una etiqueta para 16 bytes de texto:
00:3d00 Character_Name
00:3d00 .text:10
La etiqueta .image mágica le permite definir bloques de 1 o 2 bits por datos de mosaico de píxeles en la ROM. Las imágenes se emiten como archivos PNG en el directorio /gfx del desmontaje, y se convierten de nuevo a datos de mosaico 1BPP o 2BPP por el makfile utilizando RGBGFX. Si se especifica una etiqueta en la dirección del bloque de imágenes, se usará para el nombre del archivo PNG.
La longitud del bloque en bytes debe ser un múltiplo de 16, ya que cada mosaico requiere 16 bytes de datos de imagen.
El ancho de la imagen en píxeles se puede especificar como un número decimal prefijado con w . El valor de ancho debe ser un múltiplo de 8, y la combinación de longitud de bloque y ancho de imagen debe dar lugar a una imagen rectangluar sin ningún mosaico vacío. El ancho de imagen predeterminado es 128 píxeles, o si la longitud del bloque indica un número impar de mosaicos, entonces se generará una imagen con una sola fila de mosaicos.
La paleta es un valor del tamaño de un byte que selecciona los tonos de gris para usar al generar la imagen. Utiliza el mismo formato que el registro BGP en 0xFF47 . El valor se puede especificar en hexidecimal prefijo con p . La paleta predeterminada es E4 .
El valor predeterminado es tratarlo como 2 bits por datos de mosaico de píxeles. Se puede suministrar una opción 1bpp para tratar los datos como 1 bit por datos de mosaico de píxeles.
Agregar una etiqueta para 1280 bytes de datos de baldosas, con un ancho de 128 píxeles y paleta 0xe4:
02:791a Title_Screen_Tile_Data
02:791a .image:500:w128,pe4
Imagen resultante:
Ejemplo de datos de mosaico de 1BPP:
05:4000 Font
05:4000 .image:200:w128,1bpp
Imagen resultante:
NOP después de STOP y HALT , por lo que el desapsumbler los producirá como bytes de datos si la instrucción no es seguida por un NOP en la ROM original. Utilice --disable-halt-nops con MGBDIS para instruir a RGBDS para deshabilitar la inserción de instrucciones automáticas NOP después de las instrucciones HALT .