一個遊戲男孩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說明。