Table of Contents
Frequently Asked Questions (FAQ)
Where do I start?
Using Windows 10 or Windows 11 to romhack is highly recommended
Get MAGE, mGBA, HxD Hex Editor, and Floating IPS
See Why Rom Hack?
See Beginner's Guide to Playing ROM Hacks
What is MAGE?
A: MAGE is the Metroid Advance Game Editor. It is used for editing Metroid Fusion and Metroid Zero Mission.
How do I use MAGE?
A: Keep the MAGE Documentation (doc.html) and Technical Information (technical.html) manuals handy. Both of these are included with MAGE. They cover most of MAGE's features and technical information about the MAGs. Always refer to these documents before asking others for assistance. If the answer is already in there, It saves both parties time and effort.
How do I apply a .ips patch to my hack?
A: Use Floating IPS to select an IPS file and apply the patch you downloaded. It will ask you where to put the new patched ROM.
What is Hexadecimal?
A: Hexadecimal or “Hex” is the base 16 number system. In our everyday lives, we use the base 10, or “decimal” system because we have 10 fingers on our hands. Base 10 uses symbols 0-9 to represent all known numbers we use. Instead, Base 16 (hexadecimal) uses 0-9 and A-F to represent all known numbers. We use it in ROM hacking because it is easier to read data this way, as hex is more compact than decimal. Follow along the list of numbers and you'll get how it works:
Base 10: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Base 16: 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A
You can tell if something is hexadecimal if it has 0x or $ at the beginning, or h at the end. For example, the number 1 in hex could be either 0x1, $1, or 1h. As another example, if you want missiles to deal 20 damage in decimal, you would set their damage to 16 in hex.
How do I apply hex tweaks?
A: For this example, let's use this tweak from raygun:
[ZM_U] Powergrip enabled Regardless of activation status. 08005FDE 7D D0 -> C0 46
Open the HxD Hex Editor. Next, open a USA metroid zero mission ROM. This tweak requires us to go to 08005FDE
. Hit Ctrl + G, and type in 08005FDE
. Hold on, this offset is not in the ROM! The reason for that is because the start of this address just says it's located in ROM. (08000000 = ROM
) If you see an address that starts with 8
or 08
, and has six digits after, you can ignore the first 8. This time, just type 5FDE
and hit enter. Look for your flickering text cursor. You will see it flickering near the end of a line, to the left of 7D D0
. To perform this tweak, we need to replace those two bytes with C0 46
. Simply type C046
(no spaces) and the changed bytes will be RED. Save 💾 the rom (Ctrl + S), and start a new game. You now have power grip!
What is ASM?
A: ASM is short for assembly code. Assembly languages are low level programming languages that run on specific hardware. A lot of things a hacker may wish to do that MAGE cannot do requires custom ASM. The Gameboy Advance uses an ARM7TDMI processor, so GBA games are programmed in ARM and THUMB assembly. Both GBA Metroid games are mostly written in THUMB, a subset of ARM using smaller and faster instructions. You do not need to know or understand ASM to become a Metroid hacker, but you will likely use someone else's ASM for your hack. Because of this, it is not a bad idea to familiarize yourself with THUMB, as you may want to use custom code in the future.
How do I apply an ASM file to my hack? (Both Games)
A: In order to apply ASM to a ROM, you'll need an assembler, the ASM file, and your ROM all in the same place. ARMIPS is an assembler that allows you to apply ASM. Download and Extract ARMIPS, then put your ROM and ASM in the same folder as armips.exe. In this example we will use SparkControl. Next, open the .asm you want to apply in a text editor and look at the top. You should see a second line beginning with .open:
.open “zm.gba”,“SparkControl.gba”,0x8000000
Rename your unpatched rom to what is inside the first set of quotations. (usually it is zm.gba or ZM_U.gba) To apply it in Windows, hold shift then right click an empty spot in the folder. Select “Open PowerShell window here” On Windows 10, or “Open command window here.” to patch it, run armips with your ASM File:
For PowerShell (Windows 10): ./armips SparkControl.asm
For command prompt (legacy): armips SparkControl.asm
If it was successful, the output should be the second quotations (SparkControl.gba). If it failed, the command window will explain why. ARMIPS does NOT overwrite your original rom, so you can keep running the same command over again as you fix the ASM. If the file doesn’t compile, the command line will tell you why. So if an ASM fails to produce an output file after dragging the ASM onto armips, try running it through the command line so you can find out what the issue is. From there you can fix it yourself or contact the author of the code. Armips also comes with a detailed README file. You'd do yourself a favor in reading that.
Patches are conflicting, what can I do? (Both Games)
A: You can't do anything about IPS patches, but you can repoint (relocate) ASM.
Freespace can be found with a hex editor and is generally a bunch of FF
at the end of the ROM. Unused space is documented and is sometimes required to use, as end of rom freespace might be too far away for some commands. Look through the ASM for lines with .org and see where they match between files.
For instance, a block of code under .org 0x8760D40
is pointed to 760D40
in a hex editor. So if two patches share that same pointer, then they will conflict. Not every address after a .org instruction is freespace. Most programmers will put a comment next to .org
to indicate what is freespace/can be repointed. All you have to do is find freespace that isn't used by other code and replace the original address of that specific .org
instruction.
For instance .org 0x8760D40
is used by two asm, so we will repoint one of the codes freespace. Let's say that code one is 10 bytes, and that all the space after that code is also freespace. We will leave code one pointed to 0x8760D40
. We will then change code two's pointer to 0x8760D4B
. That way, they no longer overlap and both can now work.
Be aware however, that some conflicting patches may use the same hijack or overwrite some original code. Repointing in this case will not solve the conflict. You will have to find a new hijack.
Can I port enemies from Fusion to ZM/ZM to Fusion?
A: Short answer, no. You'd need to make a new sprite and new AI.
How do I change the starting position? (ZM)
A: Use the Starting Room ASM.
How do I activate gravity suit, space jump, and plasma beam as soon as I obtain them? (ZM)
A: Use the Known Items ASM.