In this post, byuu wrote:
It seems so obvious, but I've seen fan translations that prided themselves on packing everything into unexpanded ROMs, like some sort of demoscene challenge.
I wonder if the preference to fit a translation into an unexpanded ROM has a root in lack of support in NES emulators for bps or xdelta3 patches.
NES game data generally appears in a fixed order in the ROM: switchable PRG ROM banks, then fixed PRG ROM banks, then CHR ROM. Any addition to the switchable PRG ROM banks will move fixed PRG ROM banks and/or CHR banks to a different part of the file. Only for a few NES mappers does expansion not cause movement: BxROM (#34), AxROM (#7), and the Crazy Climber variant of UxROM (#180), because they have no fixed PRG ROM bank (or an initial fixed bank) and no CHR ROM.
Moving things around in the ROM image wouldn't be a problem except that IPS, the most common format for binary patches in the retro game hacking community, has to include a copy of everything moved in the patch. In fact, this has often resulted in a patch that produces a working ROM from a blank file with the correct header. *cough*Balloon Fight*cough*
The other problem is that the original mappers have limited address output. UxROM (#2 and #180), AxROM, and SxROM (#1) with CHR ROM all top out at 256 KiB (2 Mbit) of PRG ROM. MMC3 (#4) and FME-7 (#69) are limited to 512 KiB (4 Mbit). Expanding the ROM past the mapper's limit and playing it on hardware would require a lot of discrete logic to extend the mapper's address bus, or possibly even replacing the whole mapper IC with a CPLD.