INES Mapper 215

From Nesdev wiki
Jump to: navigation, search

The MMC3-based Sugar Softec Type 2 mapper enhances the Sugar Softec Type 1 with greater PRG and CHR ROM sizes and a more complicated protection scheme: while Sugar Softec Type 1 scrambles register addresses and MMC3 bank register numbers according to a fixed pattern, Type 2 allows the pattern to be changed during run-time. To make life difficult for potential hackers, some of these games write to nonexistent registers; these writes should be ignored.

If implemented correctly, the following games developed, or rather ported, by SuperGame should all run under the same mapper number without the need for submappers or ROM-hash-value-specific behavior:

  • Boogerman
  • Earthworm Jim 2
  • Mortal Kombat 3
  • Mortal Kombat 3 Extra 60
  • Pocahontas Part 2

It will also run the following multicarts:

  • 2-in-1: Aladdin, EarthWorm Jim 2
  • 2-in-1: EarthWorm Jim 2, Boogerman
  • 2-in-1: Mortal Kombat 3 Extra 60, The Super Shinobi
  • 3-in-1: Boogerman, Adventure Island 3, Double Dragon 3
  • 5-in-1: Aladdin, EarthWorm Jim 2, Garo Densetsu Special, Silkworm, Contra Force
  • 6-in-1: EarthWorm Jim 2, Mortal Kombat 3, Double Dragon 3, Contra 3, The Jungle Book, Turtles Tournament Fighters

The 9-in-1: The Lion King, EarthWorm Jim 2, Aladdin, Boogerman, Somari, Turtles Tournament Fighters, Mortal Kombat 3, Captain Tsubasa 2, Taito Basketball multicart holds 2 MiB of PRG and CHR data each and assigns the pins of the Extra Banking Register differently to accomodate these larger sizes. No submapper has been assigned for this cartridge, but it can be detected by checking that the PRG ROM size is 2 MiB.

This description is based on FCEUX's implementation, with the exception that FCEUX does not mirror the $5000 register at $6000 and therefore cannot run Boogerman.

Registers

Extra Banking Register Low Byte ($5xx0 and $6xx0, write-only)

Sets the low byte of the 16-bit-wide extra bank register. The default value at startup is $00.

Note that this register exists at both $5xx0 and $6xx0, the latter address being necessary for Boogerman.

Extra Banking Register High Byte ($5xx1 only, write-only)

Sets the high byte of the 16-bit-wide extra bank register. The default value at startup is $FF.

Note that this register does not exist at $6xx1, even though Mortal Kombat 3 Extra 60 pretends that it does.

Set Scramble Pattern ($5xx7, write-only)

Selects one of eight arrays that define how the MMC3-compatible register addresses are scrambled. The default value at startup is $04.

Note that this register does not exist at $6xx7, even though Mortal Kombat 3 Extra 60 pretends that it does.

MMC3-compatible registers ($8000-$FFFF, write-only)

After unscrambling the address and the data written, these registers function the same as the MMC3's, unless overriden by the Extra Banking Register.

The scrambled addresses correspond to the real address as follows:

$5007	-------------address written-----------
value	8000 8001 A000 A001 C000 C001 E000 E001
-----------------------------------------------	
0	8000 8001 A000 A001 C000 C001 E000 E001
1	A001 A000 8000 C000 8001 C001 E000 E001
2?	8000 8001 A000 A001 C000 C001 E000 E001
3	C001 8000 8001 A000 A001 E001 E000 C000
4	A001 8001 8000 C001 A000 C000 E000 E001
5?	8000 8001 A000 A001 C000 C001 E000 E001
6?	8000 8001 A000 A001 C000 C001 E000 E001
7?	8000 8001 A000 A001 C000 C001 E000 E001

? denotes $5xx7 values that according to the FCEUX source code are unused by all known games.

The data that is written to the low three bits of register $8000 corresponds to the real data as follows:

$5007	-value written-
value	0 1 2 3 4 5 6 7
-----------------------
0	0 1 2 3 4 5 6 7
1	0 2 6 1 7 3 4 5
2?	0 5 4 1 7 2 6 3
3	0 6 3 7 5 2 4 1
4	0 2 5 3 6 1 7 4
5?	0 1 2 3 4 5 6 7
6?	0 1 2 3 4 5 6 7
7?	0 1 2 3 4 5 6 7 

? denotes $5007 values that according to the FCEUX source code are unused by all known games. Note that bits 6 and 7 of register $8000 are kept as they are. The data written to $8001 and $A000-$FFFF is never scrambled.

Extra Banking register (all cartridges except 9-in-1)

FEDC BA98 7654 3210
---- ---- ---- ----
..cp CCPP MSK. PPPP
  || |||| |||  ||||
  || |||| |||  ++++- Lower four bits of PRG bank number in Extra Banking Register PRG Banking Mode. Ignored in MMC3 PRG Banking Mode.
  || |||| ||+------- Select PRG Bank Size in Extra Banking Register PRG Banking Mode. Ignored in MMC3 PRG Banking Mode.
  || |||| ||           0: 16K, 8000 and C000 mapped to the same selected bank number
  || |||| ||           1: 32K, 8000 mapped to selected bank number SHR 1
  || |||| |+-------- Select Inner Bank Number MSB Substitution
  || |||| |            0: Leave highest inner bank number bit as it is
  || |||| |            1: Substitute highest inner bank number bit with bit 12 (PRG)/bit 13 (CHR) of Extra Banking Register
  || |||| +--------- PRG Banking Mode
  || ||||              0: MMC3 Mode
  || ||||              1: Extra Banking Register Mode
  || ||++----------- Outer PRG bank number
  || ++------------- Outer CHR bank number
  |+---------------- Highest bit of inner PRG bank number if Inner Bank Number MSB Substitution is enabled   
  +----------------- Highest bit of inner CHR bank number if Inner Bank Number MSB Substitution is enabled
  

Bit 7 determines the source of the inner PRG bank. It can be five bits from the MMC3 bank registers 6 and 7, or the four lowest bits of the Extra Banking Register. If the source is the Extra Banking Register, then Bit 5 determines whether the selected PRG bank number is a 16K bank mapped to both CPU $8000 and $C000, or a 32K PRG bank number mapped to CPU $8000.

The inner CHR bank always comes from the MMC3's bank registers 0 to 5 (all eight bits each).

Bits 8 and 9 provide the outer PRG Bank number, bits 10 and 11 the outer CHR bank number.

Bit 6, if set, causes both PRG and CHR inner bank numbers' highest bit to be chopped off and substituted with bit 12 (inner PRG bank) and bit 13 (inner CHR bank) from the Extra Banking Register, respectively. This is used by some of the multicarts to put two MMC3 games into one outer PRG/CHR bank.

Extra Banking register (9-in-1 multicart)

FEDC BA98 7654 3210
---- ---- ---- ----
..cp P.PP MSK. PPPP
     CCC.
  || |||| |||  ||||
  || |||| |||  ++++- Lower four bits of PRG bank number in Extra Banking Register PRG Banking Mode. Ignored in MMC3 PRG Banking Mode.
  || |||| ||+------- Select PRG Bank Size in Extra Banking Register PRG Banking Mode. Ignored in MMC3 PRG Banking Mode.
  || |||| ||           0: 16K, 8000 and C000 mapped to the same selected bank number
  || |||| ||           1: 32K, 8000 mapped to selected bank number SHR 1
  || |||| |+-------- Select Inner Bank Number MSB Substitution
  || |||| |            0: Leave highest inner bank number bit as it is
  || |||| |            1: Substitute highest inner bank number bit with bit 12 (PRG)/bit 13 (CHR) of Extra Banking Register
  || |||| +--------- PRG Banking Mode
  || ||||              0: MMC3 Mode
  || ||||              1: Extra Banking Register Mode
  || |||+----------- Outer PRG bank number bit 0
  || ||+------------ Outer PRG bank number bit 1 and Outer CHR bank number bit 0
  || |+------------- Outer CHR bank number bit 1
  || +-------------- Outer PRG bank number bit 2 and Outer CHR bank number bit 2
  |+---------------- Highest bit of inner PRG bank number if Inner Bank Number MSB Substitution is enabled   
  +----------------- Highest bit of inner CHR bank number if Inner Bank Number MSB Substitution is enabled

In the 9-in-1 multicart, the outer PRG and CHR number have three rather than two bits each, two of them overlapping with each other.

Notes

Several ROM images using this mapper are overdumped in the sense that they contain additional PRG or CHR banks from other games. That data is in the actual cartridges' ROM chips; apparently Sugar Softec used larger ROM chips than they needed, because they had them in stock, and the unused space in the master file still contained data from previous runs.

Example implementations