Romhacking.net

Romhacking => ROM Hacking Discussion => Topic started by: mrkotfw on September 21, 2019, 10:18:21 pm

Title: Finding where Metal Gear: Ghost Babel (GBC) stage data is located
Post by: mrkotfw on September 21, 2019, 10:18:21 pm
I'm on a quest to hopefully find a table of data so I can extract maps, tilesets, palettes, etc.

So far, I've found that by placing a breakpoint at ROM0:01D3, you can change what the game would load to.

By hand, I've found these ROM offsets:

Code: [Select]
|       <r> |                           |          <r> |          |        |
|-----------+---------------------------+--------------+----------+--------|
|   Address | Description               | Size (bytes) | ROM bank | Offset |
|-----------+---------------------------+--------------+----------+--------|
| $0000FF56 | Nintendo logo             |         1024 | $5E      | $78F9  |
| $0017B2C2 | Konami logo               |              | $5E      | $72C2  |
| $0017B594 | Title screen              |              | $5E      | $4001  |
| $00178CF4 | Menu screen & font        |              | $5E      | $4CF4  |
| $00007599 | Codec font                |              | $01      | $7599  |
| $00046B9D | Life bar and number font  |              | $11      | $6B9D  |
| $000466BC | Another font?             |              | $11      | $66BC  |
| $000C1488 | ???                       |         2048 | $30      | $5488  |
| $000C184B | ???                       |         2048 | $30      | $584B  |
| $000C1742 | ???                       |         2048 | $30      | $5742  |
| $000467A8 | Game items (sprites)      |         1280 | $11      | $67A8  |
| $0003CDCA | ???                       |          128 | $0F      | $4DCA  |
| $001C5EEB | Snake parachute (sprites) |         1536 | $71      | $5EEB  |
| $001E2B78 | ???                       |         1929 | $78      | $6B78  |
| $000C1361 | ???                       |          512 | $30      | $5361  |
| $000C145A | ???                       |          512 | $30      | $545A  |
| $000C1424 | ???                       |          512 | $30      | $5424  |
| $0003CDB7 | ???                       |          128 | $0F      | $4DB7  |
| $001092B9 | Background tiles          |        13854 | $40      | $D2B9  |
| $001C620B | Snake parachute           |         1536 | $71      | $620B  |
| $001023C2 | Background tiles          |         2048 | $40      | $63C2  |
| $00101E19 | Background tiles          |         2048 | $40      | $5E19  |
| $00100098 | Background tiles          |         2048 | $40      | $4098  |
| $00100001 | Background tiles          |         2048 | $40      | $4001  |
| $0003CD63 | Shadow for Snake          |           32 | $0F      | $4D63  |
| $000529A0 | Enemy soldier             |         1536 | $14      | $69A0  |
| $0010477E | Background tiles          |         2048 | $41      | $477E  |
| $00104088 | Background tiles          |         2048 | $41      | $4088  |

The above table requires the data to be decompressed. Luckily, someone had already developed a tool for just this. I believe the actual decompression function is located in ROM0:0E29.

Here are the steps on how to get the addresses above:
Code: [Select]
1. Set a breakpoint (=PC=0:0E29=)
2. Observe the =DE= register value
3. Observe the set MBC ROM value set in I/O register
4. Calculate the absolute ROM offset
   #+BEGIN_SRC c
   // Clearing $4000 from the DE register
   ROM_ADDRESS = (MBC_ROM_VALUE << 14) | (RegisterFile[DE] & ~$4000)
   #+END_SRC
   Example:
   #+BEGIN_SRC c
   ROM_ADDRESS = ($5E << 14) | ($4CF4 & ~$4000)
   // Result: $178cf4
   #+END_SRC

Ideally, I would like to gather enough information to write a tool that would extract all the necessary data. Possibly build a map viewer.

Any information/help!
Title: Re: Finding where Metal Gear: Ghost Babel (GBC) stage data is located
Post by: mrkotfw on October 01, 2019, 11:32:55 pm
I've found these game commands (stored in $C40A).

Code: [Select]
|   <r> |                        |                               |
|-------+------------------------+-------------------------------|
| Value | Description            | Notes                         |
|-------+------------------------+-------------------------------|
|   $00 | Debug screen           |                               |
|   $01 | Konami logo            |                               |
|   $02 | X                      | White screen                  |
|   $03 | Title screen           |                               |
|   $04 | Load/save screen       | Not sure                      |
|   $05 | Debug screen           | Not sure                      |
|   $06 | VR related             |                               |
|   $07 | Game related           | Crashes                       |
|   $08 | Debug screen           |                               |
|   $09 | White screen           |                               |
|   $0A | White screen           |                               |
|   $0B | Game related           |                               |
|   $0C | Stage cleared          |                               |
|   $0D | VS battle?             |                               |
|   $0E | Debug screen           |                               |
|   $0F | Game Over screen       |                               |
|   $10 | Ending?                | Font is corrupted             |
|   $11 | Score screen           |                               |
|   $12 | Black screen           |                               |
|   $13 | Score screen           |                               |
|   $14 | Congratulations screen | "SPECIAL" is now available    |
|   $15 | Congratulations screen | "SOUND MODE" is now available |
|   $16 | Nintendo logo          |                               |

I haven't tried to trigger anything beyond $16.

I'm still looking for tables that contain map data. ROM29:4000 seems to be reading $CBC0 (stage number) and $CBC1 (map number).