Game Boy Rom Disassembler
ต้องใช้ Python v3.6 หรือใหม่กว่า
ไฟล์แอสเซมบลีที่สร้างโดย MGBDIS ได้รับการออกแบบให้ประกอบเข้ากับ RGBDS v0.6.0 หรือใหม่กว่า
ถอดแยกรอม:
./mgbdis.py some-game.gb
เอาต์พุตเริ่มต้นคือไดเรกทอรีถอด disassembly คุณสามารถตรวจสอบผลลัพธ์ของการถอดชิ้นส่วนโดยเรียกใช้ make แล้วตรวจสอบไฟล์ game.gb (หรือ game.gbc ) ที่สร้างขึ้น:
cd disassembly && make
นอกจากนี้ยังมีตัวเลือกมากมายที่สามารถควบคุมการจัดรูปแบบและรูปแบบการเรียนการสอนของรหัสแอสเซมบลีที่สร้างขึ้น คุณสามารถดูสิ่งเหล่านี้ได้โดยการวิ่ง:
./mgbdis.py -h
ไฟล์สัญลักษณ์ช่วยให้คุณสามารถระบุว่ารหัสข้อมูลการทดสอบและบล็อกข้อมูลภาพอยู่ใน ROM
คำแนะนำของ Game Boy CPU (SM83) มีความยาวที่แตกต่างกันและข้อมูลสามารถ interleaved กับรหัสใน ROM ดังนั้นจึงเป็นไปไม่ได้ที่จะระบุได้อย่างแม่นยำว่าคำสั่งเริ่มต้นและหยุดอยู่เสมอ การกำหนดบล็อกโค้ดในไฟล์สัญลักษณ์สามารถช่วยหลีกเลี่ยงปัญหากับ MGBDIS ที่พยายามถอดแยกชิ้นส่วนในช่วงกลางของคำสั่ง
หากคุณไม่มีไฟล์สัญลักษณ์คุณสามารถลองสร้างไฟล์ด้วย Game Boy Emulator ของฉัน - พ่ายแพ้ที่กำลังจะตาย คุณสามารถใช้การสาธิตเว็บหรือมีงานสร้างสำหรับ Windows และ MacOS มันสามารถสร้างไฟล์สัญลักษณ์ที่มีคำจำกัดความบล็อกโค้ดตามที่อยู่ของคำแนะนำที่ดำเนินการจริงในขณะที่คุณเล่นเกมหลีกเลี่ยงปัญหาการจัดตำแหน่งคำสั่ง
ในการใช้ไฟล์สัญลักษณ์กับ MGBDIS ควรมีอยู่ในไดเรกทอรีเดียวกับ ROM และมีชื่อเดียวกันยกเว้นเปลี่ยนส่วนขยายเป็น .sym Sym
ค่าทั้งหมด (ยกเว้นความกว้างของภาพ) ควรอยู่ในฐานสิบหก รายการเริ่มต้นด้วยหมายเลขธนาคารตามด้วยที่อยู่ในหน่วยความจำ
ประเภทบล็อกสามารถกำหนดได้โดยใช้ .code , .data ,. .text และ .image magic labels ตามด้วยความยาวของบล็อกในไบต์
การเพิ่มฉลากสำหรับรหัสบางส่วน:
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 Label ช่วยให้คุณสามารถกำหนดบล็อก 1 หรือ 2 บิตต่อข้อมูลกระเบื้องพิกเซลใน ROM รูปภาพจะถูกส่งออกเป็นไฟล์ PNG ในไดเรกทอรี /gfx ของการถอดชิ้นส่วนและถูกแปลงกลับเป็น 1BPP หรือ 2BPP ข้อมูลกระเบื้องโดย MakeFile โดยใช้ RGBGFX หากมีการระบุฉลากตามที่อยู่ของบล็อกรูปภาพจะใช้สำหรับชื่อของไฟล์ PNG
ความยาวของบล็อกในไบต์ควรเป็นหลายตัว 16 เนื่องจากแต่ละกระเบื้องต้องใช้ข้อมูลภาพ 16 ไบต์
ความกว้างของภาพในพิกเซลสามารถระบุได้ว่าเป็นเลขทศนิยมนำหน้าด้วย w ค่าความกว้างควรเป็นคูณ 8 และการรวมกันของความยาวบล็อกและความกว้างของภาพจะต้องส่งผลให้ภาพ rectangluar โดยไม่มีกระเบื้องว่างเปล่า ความกว้างของภาพเริ่มต้นคือ 128 พิกเซลหรือหากความยาวบล็อกระบุจำนวนกระเบื้องคี่จากนั้นจะมีการสร้างภาพที่มีแถวเดียวของกระเบื้อง
จานสีเป็นค่าขนาดไบต์ซึ่งเลือกเฉดสีเทาที่จะใช้เมื่อสร้างภาพ ใช้รูปแบบเดียวกับการลงทะเบียน BGP ที่ 0xFF47 สามารถระบุค่าในคำนำหน้า hexidecimal ด้วย 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
ภาพที่ได้:
NOP โดยอัตโนมัติหลังจาก STOP และ HALT ดังนั้น disassembler จะส่งออกเหล่านี้เป็นไบต์ข้อมูลหากคำสั่งไม่ได้ตามด้วย NOP ใน ROM ดั้งเดิม ใช้ --disable-halt-nops กับ MGBDIS เพื่อสั่งให้ RGBDS ปิดการใช้งานการแทรกคำแนะนำ NOP อัตโนมัติหลังจาก HALT คำแนะนำ