higan requires various firmware files to emulate certain games.
Firmware can represent boot ROMs, BIOS ROMs, program ROMs, and data ROMs. It can refer to both system firmware (contained inside game system hardware) and game firmware (contained inside components within game cartridges.)
higan only includes system firmware that is not subject to copyright law. It does not include any game firmware, regardless of copyright status (although nearly all of it is copyrighted.)
The Game Boy Advance requires a 16KiB BIOS ROM. Many GBA emulators will utilize high-level emulation (HLE) to simulate the functions of the BIOS. But this in turn sacrifices accuracy, especially timing.
With higan’s primary goal being accuracy, this means it will only rely on low-level emulation (LLE), which means the BIOS is absolutely required.
Upon attempting to load a GBA game in higan for the first time, you will receive a dialog message informing you that the GBA BIOS is missing, and where to place the file. Once you have done this, higan will be able to play GBA games.
Game firmware is present in components such as the SNES coprocessors (DSP-x, Cx4, ST-01x, SGB, etc.)
When importing games, icarus will first look for firmware appended to games, and failing that, scan the same directory of the game to locate external firmware files. If it cannot find them, then you will receive a dialog message informing you of the missing file and where to place it.
Only when firmware is appended to game ROMs will icarus be able to locate games in its internal database to provide bit-perfect memory mapping. The reason for that limitation is explained below.
As game firmware is part of game cartridges themselves, they should be included with the game ROM images they apply to.
Unfortunately, the groups responsible for such things (eg No-Intro) do not agree, and they split the firmware files into separate archives. This causes a lot of pain for anyone who cares about accuracy.
But here are some facts about game firmware:
The DSP-n firmware weighs in at 8KiB. The Cx4 firmware at 3KiB.
With the exception of the 8KiB DSP-1 (used in about ten games) and the 3KiB Cx4 (used in two games), all of the SNES game firmware is unique.
For instance, the ST-010 firmware is only used in F1 Race of Champions II. The ST-011 firmware is only used in Hayazashi Nidan Morita Shougi. The ST-018 firmware is only used in Hayazashi Nidan Morita Shougi 2. The Super Game Boy boot ROM is used only by the Super Game Boy.
This is because the actual firmware code is part of the game code itself: it often has code that is exclusive to that specific game. Without the firmware, the game ROM is thus incomplete.
As unique firmware only exists within a single game, there are thus no space savings to be had by separating firmware from game ROMs.
Take the case of the DSP-1. There were two revisions to this firmware. The original, and the DSP-1B.
SNES ROM images contain no indication of which revision of the DSP-1 to use. And this is a real problem: Pilotwings requires the DSP-1. Without it, the plane in the opening will crash. Ballz 3D requires the DSP-1B. Without it, the game will lock up once a battle begins.
But it gets even worse: Super Mario Kart was released with both the DSP-1, and later on, with the DSP-1B. But the main game ROM was not modified to reflect any change.
The end result is that there exist two revisions of Super Mario Kart. If the firmware is not included, then it is impossible to distinguish between these two versions; and thus, it is impossible to preserve both revisions of this game.
Very early versions of the SNES coprocessor extractions were created with unnecessary padding bytes in the program ROM. After that, the earliest NEC uPD firmware files were stored in big endian format.
For consistency and simplicity, the current NEC uPD firmware is stored in little endian format with no padding bytes. Yet the old files still circulate online.
SNES coprocessors often have multiple pieces of firmware: for instance, the SNES DSP-n and ST-018 firmware contains both a program ROM and data ROM. Sometimes, the firmware is distributed with these two files merged into one. Other times, it is split into separate files.
Merged coprocessor firmware contains names such as dsp1.rom
Split coprocessor firmware contains names such as dsp1.program.rom and dsp1.data.rom
No-Intro stores the firmware as [BIOS] DSP1 (World).zip/[BIOS] DSP1 (World).bin
Yes, the 8KiB firmware is compressed, the name is needlessly repeated inside the archive file, and for reasons that defy sanity — region codes are appended to the names.
MAME… we won’t even talk about MAME. Suffice to say, they do things differently as well.
And this is just going to continue on like this, every time someone else comes along and decides to name things differently. It’s impossible to predict all the endless variations that will eventually result if things continue this way. And without predictability, emulators can’t utilize these files to provide better emulation.
Due to all of the issues mentioned above, the best course of action for storing game ROMs for preservation is to append the firmware to the end of the primary game ROM files into one single image file. By doing this:
The fears of doing this are overplayed:
So for these reasons, I would strongly advocate for groups like No-Intro to reconsider their position and move to appending game firmware to game ROM images instead.
I would also encourage any future SNES emulator authors to adopt this format. To that aim, higan already supports (and works best with) this merged ROM format.