INES Mapper 215: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
No edit summary
(Correction for S-Y2/king005)
 
(17 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Category:INES Mappers|215]][[Category:MMC3-like mappers|215]][[Category:Mappers using $4020-$5FFF|215]]
[[Category:INES Mappers|215]][[Category:MMC3-like mappers|215]][[Category:Mappers using $4020-$5FFF|215]][[Category:Mappers with scanline IRQs|215]][[Category:NES 2.0 mappers with submappers|215]]
The MMC3-based Sugar Softec Type 2 mapper enhances the [[INES Mapper 114|Sugar Softec Type 1]] with greater PRG and CHR ROM sizes and a more complicated
iNES Mapper 215 is used for later single-game as well as multicart releases from Sugar Softec. They use an MMC3 clone with a selectable scrambling pattern.
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
* '''Submapper 0''', UNIF board name '''UNL-8237''':
without the need for submappers or ROM-hash-value-specific behavior:
** ''Earthworm Jim 2''
** ''Mortal Kombat 3'' (SuperGame, not ''Extra 60'', not to be confused by similarly-named games from other developers)
** ''Mortal Kombat 3 Extra 60'' (both existing ROM images are just extracts of the 2-in-1 multicart containing this game)
** ''Pocahontas Part 2''
** ''2-in-1: Aladdin, EarthWorm Jim 2'' (Super 808)
** ''2-in-1: The Lion King, Bomber Boy'' (GD-103)
** ''2-in-1 Super Golden Card: EarthWorm Jim 2, Boogerman'' (king002)
** ''2-in-1: Mortal Kombat 3 Extra 60, The Super Shinobi'' (king005)
** ''3-in-1: Boogerman, Adventure Island 3, Double Dragon 3'' (Super 308)
** ''5-in-1 Golden Card: Aladdin, EarthWorm Jim 2, Garo Densetsu Special, Silkworm, Contra Force'' (SPC005)
** ''6-in-1 Golden Card: EarthWorm Jim 2, Mortal Kombat 3, Double Dragon 3, Contra 3, The Jungle Book, Turtles Tournament Fighters'' (SPC009)
* '''Submapper 1''', UNIF board name '''UNL-8237A''':
** ''9-in-1 High Standard Card: The Lion King, EarthWorm Jim 2, Aladdin, Boogerman, Somari, Turtles Tournament Fighters, Mortal Kombat 3, Captain Tsubasa 2, Taito Basketball'' (king001)
=Registers=
==NROM Override/Mode Register ($5000)==
Mask: $F007
D~7654 3210
  ---------
  MCS. BBBb
  |||  ++++- Select 16 KiB PRG-ROM bank at CPU
  |||        $8000-$BFFF and $C000-$FFFF
  ||+------- 0: Do not replace bit 0 (NROM-128)
  ||        1: Replace bit 0 with CPU A14 (NROM-256)
  |+-------- 0: Do not replace PRG A17 and CHR A17 from the MMC3 (256 KiB outer bank)
  |          1: Replace PRG A17 and CHR A17 with $5001 bits 4 and 5, respectively (128 KiB outer bank)
  +--------- 0: Use PRG bank from MMC3; ignore bits 0-3/5
              1: Ignore PRG bank from MMC3; apply bits 0-3/5
Power-up value: $00


* ''Boogerman''
==Outer Bank Register ($5001) - Submapper 0 (UNL-8237)==
* ''Earthworm Jim 2''
Mask: $F007
* ''Mortal Kombat 3''
* ''Mortal Kombat 3 Extra 60''
D~7654 3210
* ''Pocahontas Part 2''
  ---------
  ..cp CCPP
    || ||++- Select 256 KiB Outer PRG-ROM bank (PRG A18/A19)
    || ++--- Select 256 KiB Outer CHR-ROM bank (CHR A18/A19)
    |+------ Select 128 KiB Outer PRG-ROM bank (PRG A17) if $5000 bit 6=1
    +------- Select 128 KiB Outer CHR-ROM bank (CHR A17) if $5000 bit 6=1
Power-up value: $xF


It will also run the following multicarts:
==Outer Bank Register ($5001) - Submapper 1 (UNL-8237A)==
* ''2-in-1: Aladdin, EarthWorm Jim 2''
Mask: $F007
* ''2-in-1: EarthWorm Jim 2, Boogerman''
* ''2-in-1: Mortal Kombat 3 Extra 60, The Super Shinobi''
D~7654 3210
* ''3-in-1: Boogerman, Adventure Island 3, Double Dragon 3''
  ---------
* ''5-in-1: Aladdin, EarthWorm Jim 2, Garo Densetsu Special, Silkworm, Contra Force''
  ..cp P.PP
* ''6-in-1: EarthWorm Jim 2, Mortal Kombat 3, Double Dragon 3, Contra 3, The Jungle Book, Turtles Tournament Fighters''
        CCC.
    || +|++- Select 256 KiB Outer PRG-ROM bank (PRG A18-A20)
    || +++-- Select 256 KiB Outer CHR-ROM bank (CHR A18-A20)
    |+------ Select 128 KiB Outer PRG-ROM bank (PRG A17) if $5000 bit 6=1
    +------- Select 128 KiB Outer CHR-ROM bank (CHR A17) if $5000 bit 6=1
Power-up value: $xF


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.
==Scrambling Pattern Register ($5007)==
 
Mask: $F007
This description is based on [https://github.com/asfdfdfd/fceux/blob/master/src/boards/8237.cpp FCEUX's implementation],
with the exception that FCEUX does not mirror the $5000 register at $6000 and therefore cannot run ''Boogerman''.
D~7654 3210
 
  ---------
==Registers==
  .... .MMM
===Extra Banking Register Low Byte ($5xx0 and $6xx0, write-only)===
        +++- Select MMC3 register address and index scrambling mode (0-7)
Sets the low byte of the 16-bit-wide extra bank register. The default value at startup is $00.
 
Power-up value: $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.


==MMC3-compatible registers ($8000-$FFFF, write-only)==
The scrambled addresses correspond to the real address as follows:
The scrambled addresses correspond to the real address as follows:
  $5007 -------------address written-----------
  $5007 -------------address written-----------
Line 53: Line 78:
  0 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
  1 A001 A000 8000 C000 8001 C001 E000 E001
  2? 8000 8001 A000 A001 C000 C001 E000 E001
  2 8000 8001 A000 A001 C000 C001 E000 E001
  3 C001 8000 8001 A000 A001 E001 E000 C000
  3 C001 8000 8001 A000 A001 E001 E000 C000
  4 A001 8001 8000 C001 A000 C000 E000 E001
  4 A001 8001 8000 C000 A000 C001 E000 E001
  5? 8000 8001 A000 A001 C000 C001 E000 E001
  5 8000 8001 A000 A001 C000 C001 E000 E001
  6? 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
  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:
The data that is written to the low three bits of register $8000 corresponds to the real data as follows:
Line 67: Line 91:
  0 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
  1 0 2 6 1 7 3 4 5
  2? 0 5 4 1 7 2 6 3
  2 0 5 4 1 7 2 6 3
  3 0 6 3 7 5 2 4 1
  3 0 6 3 7 5 2 4 1
  4 0 2 5 3 6 1 7 4
  4 0 2 5 3 6 1 7 4
  5? 0 1 2 3 4 5 6 7
  5 0 1 2 3 4 5 6 7
  6? 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  
  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) ===
Bits 6 and 7 of register $8000 are kept as they are. The data written to $8001 and $A000-$FFFF is never scrambled. After unscrambling the address and the data written, these registers function the same as the MMC3's
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.
=Note=
* Several single-game cartridges that use this mapper are actually 2-in-1 multicarts that have PRG A18 forced to 0 or 1 via solder pad. A dump from these cartridges without changing the solder pad will therefore contain 256 KiB of PRG-ROM but 512 KiB of CHR-ROM, since CHR A18 is not forced in a similar fashion, with one 256 KiB half containing data from the other inaccessible game.
* The Outer Bank Register is reset to its power-up value if a Reset has been detected via an interruption of the M2 signal. This makes it difficult to dump these cartridges using a Kazzo device.
* ''Boogerman'' ([[INES Mapper 114]] Submapper 1) was originally assigned by CaH4e3 to Mapper 215; he later reassigned '''UNL-8237''' to Mapper 215 instead.
* Some multicarts may have alternative outer bank registers in the $6xxx range; since they all contain compatibility code that writes to the $5xxx range, they are assigned to Mapper 215 as well.


==Example implementations==
=Similar Mappers=
* [https://github.com/asfdfdfd/fceux/blob/master/src/boards/8237.cpp FCEUX implementation]
* [[NES 2.0 Mapper 258]] adds readable protection registers in the $5000-$5007 range.
* [https://github.com/rdanbrook/nestopia/blob/master/source/core/board/NstBoardSuperGameBoogerman.cpp Nestopia implementation (Boogerman)]
* [https://github.com/rdanbrook/nestopia/blob/master/source/core/board/NstBoardSuperGamePocahontas2.cpp Nestopia implementation (Pocahontas 2)]

Latest revision as of 21:16, 8 June 2019

iNES Mapper 215 is used for later single-game as well as multicart releases from Sugar Softec. They use an MMC3 clone with a selectable scrambling pattern.

  • Submapper 0, UNIF board name UNL-8237:
    • Earthworm Jim 2
    • Mortal Kombat 3 (SuperGame, not Extra 60, not to be confused by similarly-named games from other developers)
    • Mortal Kombat 3 Extra 60 (both existing ROM images are just extracts of the 2-in-1 multicart containing this game)
    • Pocahontas Part 2
    • 2-in-1: Aladdin, EarthWorm Jim 2 (Super 808)
    • 2-in-1: The Lion King, Bomber Boy (GD-103)
    • 2-in-1 Super Golden Card: EarthWorm Jim 2, Boogerman (king002)
    • 2-in-1: Mortal Kombat 3 Extra 60, The Super Shinobi (king005)
    • 3-in-1: Boogerman, Adventure Island 3, Double Dragon 3 (Super 308)
    • 5-in-1 Golden Card: Aladdin, EarthWorm Jim 2, Garo Densetsu Special, Silkworm, Contra Force (SPC005)
    • 6-in-1 Golden Card: EarthWorm Jim 2, Mortal Kombat 3, Double Dragon 3, Contra 3, The Jungle Book, Turtles Tournament Fighters (SPC009)
  • Submapper 1, UNIF board name UNL-8237A:
    • 9-in-1 High Standard Card: The Lion King, EarthWorm Jim 2, Aladdin, Boogerman, Somari, Turtles Tournament Fighters, Mortal Kombat 3, Captain Tsubasa 2, Taito Basketball (king001)

Registers

NROM Override/Mode Register ($5000)

Mask: $F007

D~7654 3210
  ---------
  MCS. BBBb
  |||  ++++- Select 16 KiB PRG-ROM bank at CPU
  |||        $8000-$BFFF and $C000-$FFFF
  ||+------- 0: Do not replace bit 0 (NROM-128)
  ||         1: Replace bit 0 with CPU A14 (NROM-256)
  |+-------- 0: Do not replace PRG A17 and CHR A17 from the MMC3 (256 KiB outer bank)
  |          1: Replace PRG A17 and CHR A17 with $5001 bits 4 and 5, respectively (128 KiB outer bank)
  +--------- 0: Use PRG bank from MMC3; ignore bits 0-3/5
             1: Ignore PRG bank from MMC3; apply bits 0-3/5

Power-up value: $00

Outer Bank Register ($5001) - Submapper 0 (UNL-8237)

Mask: $F007

D~7654 3210
  ---------
  ..cp CCPP
    || ||++- Select 256 KiB Outer PRG-ROM bank (PRG A18/A19)
    || ++--- Select 256 KiB Outer CHR-ROM bank (CHR A18/A19)
    |+------ Select 128 KiB Outer PRG-ROM bank (PRG A17) if $5000 bit 6=1
    +------- Select 128 KiB Outer CHR-ROM bank (CHR A17) if $5000 bit 6=1

Power-up value: $xF

Outer Bank Register ($5001) - Submapper 1 (UNL-8237A)

Mask: $F007

D~7654 3210
  ---------
  ..cp P.PP
       CCC.
    || +|++- Select 256 KiB Outer PRG-ROM bank (PRG A18-A20)
    || +++-- Select 256 KiB Outer CHR-ROM bank (CHR A18-A20)
    |+------ Select 128 KiB Outer PRG-ROM bank (PRG A17) if $5000 bit 6=1
    +------- Select 128 KiB Outer CHR-ROM bank (CHR A17) if $5000 bit 6=1

Power-up value: $xF

Scrambling Pattern Register ($5007)

Mask: $F007

D~7654 3210
  ---------
  .... .MMM
        +++- Select MMC3 register address and index scrambling mode (0-7)

Power-up value: $00

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

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 C000 A000 C001 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

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 

Bits 6 and 7 of register $8000 are kept as they are. The data written to $8001 and $A000-$FFFF is never scrambled. After unscrambling the address and the data written, these registers function the same as the MMC3's

Note

  • Several single-game cartridges that use this mapper are actually 2-in-1 multicarts that have PRG A18 forced to 0 or 1 via solder pad. A dump from these cartridges without changing the solder pad will therefore contain 256 KiB of PRG-ROM but 512 KiB of CHR-ROM, since CHR A18 is not forced in a similar fashion, with one 256 KiB half containing data from the other inaccessible game.
  • The Outer Bank Register is reset to its power-up value if a Reset has been detected via an interruption of the M2 signal. This makes it difficult to dump these cartridges using a Kazzo device.
  • Boogerman (INES Mapper 114 Submapper 1) was originally assigned by CaH4e3 to Mapper 215; he later reassigned UNL-8237 to Mapper 215 instead.
  • Some multicarts may have alternative outer bank registers in the $6xxx range; since they all contain compatibility code that writes to the $5xxx range, they are assigned to Mapper 215 as well.

Similar Mappers