Company | Nintendo |
Games | 1 in NesCartDB |
Complexity | ASIC |
Boards | PNROM, PEEOROM |
Pinout | MMC2 pinout |
PRG ROM capacity | 128K |
PRG ROM window | 8K + 24K fixed |
PRG RAM capacity | 8K (PC10 ver.) |
PRG RAM window | Fixed |
CHR capacity | 128K |
CHR window | 4K + 4K (triggered) |
Nametable mirroring | H or V, switchable |
Bus conflicts | No |
IRQ | No |
Audio | No |
iNES mappers | 009 |
The Nintendo MMC2 is an ASIC mapper, used on the PNROM and PEEOROM Nintendo Game Pak boards for Mike Tyson's Punch Out!!. The iNES format assigns Mapper 009 to PxROM. This chip appeared in November 1987.
The two 4 KB PPU banks each have two 4 KB banks, which can be switched during rendering by using the special tiles $FD or $FE in either a sprite or the background. See CHR banking below.
7 bit 0 ---- ---- xxxx PPPP |||| ++++- Select 8 KB PRG ROM bank for CPU $8000-$9FFF
7 bit 0 ---- ---- xxxC CCCC | |||| +-++++- Select 4 KB CHR ROM bank for PPU $0000-$0FFF used when latch 0 = $FD
7 bit 0 ---- ---- xxxC CCCC | |||| +-++++- Select 4 KB CHR ROM bank for PPU $0000-$0FFF used when latch 0 = $FE
7 bit 0 ---- ---- xxxC CCCC | |||| +-++++- Select 4 KB CHR ROM bank for PPU $1000-$1FFF used when latch 1 = $FD
7 bit 0 ---- ---- xxxC CCCC | |||| +-++++- Select 4 KB CHR ROM bank for PPU $1000-$1FFF used when latch 1 = $FE
7 bit 0 ---- ---- xxxx xxxM | +- Select nametable mirroring (0: vertical; 1: horizontal)
The main interest of the MMC2 and MMC4 mappers is that they allow switching two pairs of 4 KB CHR-ROM banks at the same time, automatically alternating between banks within one pair during rendering. When the PPU reads from specific tiles ($FD or $FE) in the pattern tables, the MMC2/4 sets a latch that switches between two different 4 KB banks. This allows the tile limit to increase from 256 to 512 with bank splits, without involving the CPU or an IRQ.
Notice that latch 0 only responds to one address, but latch 1 responds to a range of addresses. This means that:
With this mapper, the left pattern table ($0000) is intended for use with sprites, and the right pattern ($1000) table for background. Backgrounds require a switch on every row. Because sprites aren't constrained to an 8x8 grid, triggering on only the first row allows switching sprites to be placed closer together if needed. This nuance is absent in the MMC4, where both pattern table switches from the entire tiles in a symmetrical fashion.
Note that the latch is updated after either pattern table byte is fetched, so the switching tiles $FD or $FE themselves are drawn using the old CHR-bank before the latch value is changed. As the PPU fetches 34 background tiles per scanline (and at most 33 are drawn), if vertical mirroring is used, background switching tiles can be placed past the edge of the screen where they will be unseen.
The MMC2 is implemented in a 40-pin shrink-DIP package. At least two revisions are known to exist, the MMC2 and the MMC2-L.
The PEEOROM board is used in the re-issue of Mike Tyson's Punch-Out!!. Unlike PNROM, and unlike most other boards used in NES Game Paks sold to the public, it can be configured to support EPROM memory through jumpers on the board.
A pirate clone that exclusively uses discrete logic has been found and reverse-engineered.[1]
Nintendo's MMC4, used in the FxROM board set, is a similar mapper with PRG RAM support and PRG bank sizes of 16kb instead of 8kb. It also suppresses the different banking behavior of the left pattern table.
Because of the extreme similarity between the MMC2 and MMC4, it is possible to make a circuit that simulates an MMC4 from an MMC2 with the help of a 7402 quad-NOR gate and a 7420 4-input NAND gate to decode PRG RAM.
The following circuit "tricks" the MMC2 into thinking the program is still in the $8000-$9fff range when reading from $A000-$BFFF, but doesn't affect mapper writes.
It also shifts all addresses left one bit so that it switches 16kB instead of 8kB banks, and it shortcuts around the different behavior for pattern tables at $0000 and $1000.
MMC2 A16 ---------------------------------- PRG A17 MMC2 A15 ---------------------------------- PRG A16 MMC2 A14 ---------------------------------- PRG A15 ____ ___ MMC2 A13 -----\ `. ,---\ `. ) )o-----+ ) )o--- PRG A14 CPU A14 -----/____,' `---/___,' CPU A13 ---+------------------------------ PRG A13 | ___ +---\ `. ___ | ) )o------\ `. `---/___,' ) )o----- MMC2 A13 ,----/___,' R/W ----------------' GND --------------------+------------- MMC2 PA2 | +------------- MMC2 PA1 | `------------- MMC2 PA0
Categories: Nintendo licensed mappers, Mappers triggering on reads, ASIC mappers, In NesCartDB