一个游戏男孩ROM拆卸器。
需要Python v3.6或更高版本。
MGBDI生成的汇编文件旨在与RGBDS v0.6.0或更高版本组装。
拆卸一个ROM:
./mgbdis.py some-game.gb
默认输出是disassembly目录。您可以通过运行make然后检查game.gb (或game.gbc )文件来验证拆卸的结果:
cd disassembly && make
还有许多选项可以控制生成的汇编代码的格式和说明样式。您可以通过运行来查看这些:
./mgbdis.py -h
符号文件允许您指示ROM中的代码,数据,测试和图像数据块在哪里。
游戏男孩CPU(SM83)的说明具有不同的长度,并且数据可以与ROM中的代码交织在一起,因此不可能始终准确地确定指令在哪里开始和停止。在符号文件中定义代码块可以帮助避免MGBDI的问题,试图在指令中间拆卸。
如果您没有符号文件,则可以尝试与我的游戏男孩模拟器生成一个符号文件 - 击败垂死的月亮。您可以使用Web演示,也可以使用Windows和MacOS的构建。它可以根据您在玩游戏时实际执行的指令的地址生成带有代码块定义的符号文件,避免使用指令对准问题。
要将符号文件与MGBDI一起使用,它应该与ROM相同的目录中存在,并且具有相同的名称,除非将扩展名为.sym 。
所有值(图像宽度除外)都应在十六进制中。条目以银行号码开始,然后是内存中的地址。
可以通过使用.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的小数号。宽度值应为8的倍数,块长度和图像宽度的组合必须导致矩形图像,而无需任何空图块。默认图像宽度为128像素,或者如果块长度表示奇数的图块,则将生成具有单一图块的图像。
调色板是一个字节大小的值,可在生成图像时选择要使用的灰色阴影。它使用与0xFF47的BGP寄存器的格式相同。该值可以在用p的前缀中指定。默认调色板是E4 。
默认值是将其视为每个像素图块数据2位。可以提供1bpp选项,以将数据视为每个像素图块数据1位。
为1280个字节添加标签,宽度为128像素,调色板0xe4:
02:791a Title_Screen_Tile_Data
02:791a .image:500:w128,pe4
结果图像:
1BPP图块数据的示例:
05:4000 Font
05:4000 .image:200:w128,1bpp
结果图像:
STOP和HALT后自动添加NOP指令,因此,如果指令未遵循原始ROM中的NOP ,则拆卸器将作为数据字节输出。使用 - 与MGBDIS的--disable-halt-nops ,以指示RGBD在HALT说明后禁用自动NOP说明。