INES Mapper 004: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(Remove Dish' notes, (they are available at http://www.romhacking.net/documents/362/ so it's not like they're lost, they just don't belong to here), added link to Dish' notes)
Line 1: Line 1:
[[Category:iNES Mappers|004]][[Category:MMC3-like mappers|004]][[Category:in NesCartDB|004]][[Category:Nintendo licensed mappers]]
[[iNES Mapper 004]] is a wide abstraction that can represent boards using the Nintendo [[MMC3]], Nintendo [[MMC6]], or functional clones of any of the above. Most games utilizing [[TxROM]], [[DxROM]], and '''HKROM''' boards use this designation.
[[iNES Mapper 004]] is a wide abstraction that can represent boards using the Nintendo [[MMC3]], Nintendo [[MMC6]], or functional clones of any of the above. Most games utilizing [[TxROM]], [[DxROM]], and '''HKROM''' boards use this designation.


Line 28: Line 29:
*[[iNES Mapper 206]] covers Tengen MIMIC-1 or Namco 109 chip, the MMC3's predecessor with no mirroring control or IRQ
*[[iNES Mapper 206]] covers Tengen MIMIC-1 or Namco 109 chip, the MMC3's predecessor with no mirroring control or IRQ
* NES mapper list by Dish : [http://www.romhacking.net/documents/362/]
* NES mapper list by Dish : [http://www.romhacking.net/documents/362/]
[[Category:iNES Mappers|004]][[Category:MMC3-like mappers|004]][[Category:in NesCartDB|004]]

Revision as of 21:31, 21 April 2015

iNES Mapper 004 is a wide abstraction that can represent boards using the Nintendo MMC3, Nintendo MMC6, or functional clones of any of the above. Most games utilizing TxROM, DxROM, and HKROM boards use this designation.

A few specific TxROM boards handle the PPU bus differently and thus have separate mapper numbers:

Some MMC3-like mappers have different behaviors and thus their own mapper numbers.

HKROM does not have its own mapper number. It can be identified in NES 2.0 images by having 1024 bytes of battery-backed PRG RAM or in traditional iNES images by comparing the hash of the PRG ROM to the PRG hashes of the two distinct licensed games that use this board].

As with any iNES mapper, there is no exact "strict" interpretation of a hardware reality to be had. This is significant for example with the case of roms that exceed normal 512KB PRG limits, such as this significant rom hack: http://www.romhacking.net/translations/1590/ ; where you may have to consider mapper 4 as defining a fake MMC3 chip that contains full 8 bit registers capable of fully addressing the expanded PRG.

Consulting PPU rendering, which includes a frame timing diagram and details on PPU address bus contents, might help in understanding the IRQ scanline counting logic.

MMC3 + MMC6 implementation

The unfortunate conflation of MMC3 and MMC6 into the same iNES mapper can be resolved by the use of an NES 2.0 header, but since the new header is not yet well adopted among emulators or ROM sets, an approach that supports both MMC3 and MMC6 may be desired when an NES 2.0 header is not used.

The difference between the MMC3 and MMC6 mostly has to do with a smaller PRG-RAM size on the MMC6, along with a different register scheme for write protecting it.

Because write protection is generally only used to guard against corruption during power off, many implementations of iNES Mapper 004 simply omit the write protection. Leaving PRG-RAM always write-enabled removes most of the incompatibility between MMC3 and MMC6, and is sufficient to support the popular MMC6 games StarTropics and StarTropics II. These games do not rely on the smaller PRG-RAM size of the MMC6, so the larger 8k RAM addressed by the MMC3 is not a problem.

The less well known game Low-G Man is problematic. It used an MMC3 with no PRG-RAM. Because of a bug in its music code, it relies on open-bus behaviour in the RAM's address range to function correctly. The game does use the MMC3 mechanism to disable RAM, so it could function on an MMC3 board that had PRG-RAM, but implementing the MMC3 RAM disable may conflict with the effort to support MMC6 games. Alternatively, NES 2.0 can be used to specify a PRG-RAM size of 0.

See also