INES Mapper 185: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (add othello)
 
(18 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:iNES Mappers|185]][[Category:in NesCartDB|185]][[Category:Discrete logic mappers|185]]
{{DEFAULTSORT:185}}[[Category:iNES Mappers]][[Category:in NesCartDB]][[Category:Discrete logic mappers]][[Category:Nintendo licensed mappers]][[Category:NES 2.0 mappers with submappers]]
'''iNES Mapper 185''' is used for games that use the [[CNROM]] board with weak copy protection measures.
'''iNES Mapper 185''' denotes the [[CNROM]] circuit board with only 8 KiB of CHR-ROM. The particular ROM chip model (Sharp LH2367 or equivalent) changes the functionality of pins 26 (normally A13) and 27 (normally A14) into two programmable (during manufacturing) Chip Select inputs, effectively disabling CHR-ROM and tri-stating its data outputs when the one correct bank of four possible CHR-ROM banks is not selected.


  ========================
While the original purpose of these two chip select pins was to allow four chips to sit on the same bus selected by a two-bit chip select number that does not have to be demultiplexed into four chip enable signals, Mapper 185 uses them as a second (and equally weak) copy protection mechanism, in addition to the [[CNROM#Security diodes|security diodes]].
  =  Mapper 185          =
  ========================
 
  Example Games:
  --------------------------
  Spy Vs. Spy (J)
  Mighty Bomb Jack (J)
 
  Registers: (**BUS CONFLICTS**)
  ---------------------------
    $8000-FFFF:  [..CC ..CC]
      CHR Reg
 
 
  Notes:
  ---------------------------
  This mapper is retarded.  These games only have 8k of CHR, and they attempt to disable CHR by writing
  a specific value to the CHR Reg, then VERIFY that garbage is read back, then they swap back to the
  actual CHR.  If they don't get the expected garbage, they lock up.
 
  Perhaps this was some sort of copy protection?
 
  Each game has their own value that enables/disables CHR.  Rather than failing to attempt to list all the
  exact values used here (I don't know what all of them are), I can provide some logic:
 
  if C AND $0F is nonzero, and if C does not equal $13:  CHR is enabled
  otherwise CHR is disabled
 
  When CHR is disabled, the pattern tables are open bus. Theoretically, this should
  return the LSB of the address read, but real-world behavior may vary.


This table has been assembled from nocash and the sources of MESS, Nestopia, and FCEUX.
==Overview==
{| class="datatable"
* PRG ROM size: 16 KiB or 32 KiB
! !! colspan=2|if this value is written
* PRG ROM bank size: Not bankswitched
* PRG RAM: None
* CHR capacity: 8 KiB ROM (copy protected)
* Nametable [[mirroring]]: Solder pads select vertical or horizontal mirroring
* Subject to [[bus conflict]]s: Yes [[Category:Mappers with bus conflicts]]
 
==Banks==
* PPU $0000-$1FFF: 8 KB switchable CHR ROM bank
 
==Registers==
=== Bank select ($8000-$FFFF) ===
7  bit  0
---- ----
..DC ..BA
  ||  ||
  ||  |+- Chip Select 2 (CS2)
  ||  +-- Chip Select 1 (CS1)
  |+------ Output to Diode 2 (D2)
  +------- Output to Diode 1 (D1)
 
The games verify the functionality of the Chip Select bits by writing the wrong CS1/CS2 value, thereby disabling CHR-ROM, verify that reading CHR-ROM does not return the correct value, then write the correct CS1/CS2 bits to enable CHR-ROM so that graphics can be displayed. A few titles additionally verify that reading CHR-ROM ''now'' does return the correct value. If either check fails, the game is either reset or freezes. The correct CS1/CS2 value that enables CHR-ROM is game-specific and specified in the Submapper field of the [[NES 2.0]] header with a base of 4:
Submapper  Meaning
  4        CS1/CS2=0 enables CHR-ROM, all other values disable CHR-ROM
  5        CS1/CS2=1 enables CHR-ROM, all other values disable CHR-ROM
  6        CS1/CS2=2 enables CHR-ROM, all other values disable CHR-ROM
  7        CS1/CS2=3 enables CHR-ROM, all other values disable CHR-ROM
The base of 4 allows distinguishing "CS1/CS2=0" and a Submapper of "0" meaning "Unknown": Any Submapper other than 4-7 means that the correct CS1/CS2 value is unknown and one of two heuristics must be used instead to allow the game to run:
* Enable CHR-ROM only if the "(latch data &0xF) != 0 && (latch data) != 0x13". This heuristic fails for ''Seicross'' and is therefore discouraged.
* Disable CHR-ROM for the first two reads $2007 after a reset and then enable it. This works with all games, as they all test for the bad value first, and the correct value (if at all) second.
 
When CHR is disabled, the pattern tables are [[open bus]]. Theoretically, this should return the LSB of the address read, but real-world behavior varies, and the earlier revision of ''Mighty Bomb Jack'' in fact relies on open bus at PPU address $0000 being something other than $00.
 
This table has been assembled from nocash and the sources of MESS, Nestopia, and FCEUX; the specific tests were traced from dumps in GoodNES.
{| class="datatable sortable"
! || bank || PPU addr || test || bank || PPU addr || test
|-
|-
! Game !! Must work !! Mustn't work <!-- possible submapper number -->
! Game !! colspan=3|Incorrect bank !! colspan=3|Must work <!-- specific test -->
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1262 Bird Week] || 0x0F || 0xF0 <!-- 3 -->
| [//nescartdb.com/profile/view/1262 Bird Week] || $F0 || $1FF0 || ≠ $0C || $0F || $1FF0 || = $0C
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1264 B-Wings] || 0x33 || 0x00 <!-- F -->
| [//nescartdb.com/profile/view/1264 B-Wings] || $00 || $0000 || ≠ $3C || $33 || $0000 || = $3C
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1261 Mighty Bomb Jack] || 0x11 || 0x00 <!-- 5 -->
| [//nescartdb.com/profile/view/1261 Mighty Bomb Jack (J, PRG0)] || $00 || $0000 || ≠ $00 || $11 || colspan=2|untested
|-
|-
| Sansuu 1 Nen, [http://bootgod.dyndns.org:7777/profile.php?id=1263 Sansuu 2 Nen], and [http://bootgod.dyndns.org:7777/profile.php?id=4061 Othello] || 0x22 || 0x20 <!-- A -->
| Mighty Bomb Jack (J, PRG1) || $00 || $0001 || ≠ $3C || $11 || colspan=2|untested
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=3791 Sansuu 3 Nen] || 0xFF || 0x00 <!-- F -->
| Sansuu 1 Nen || $20 || $000C || ≠ $BC || $22 || $000C || = $BC
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=3592 Spy vs Spy] || 0x21 || 0x13 <!-- 9 -->
| [//nescartdb.com/profile/view/1263 Sansuu 2 Nen] || $20 || $0003 || ≠ $42 || $22 || $0003 || = $42
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=2332 Seicross (v2)] || 0x20 || 0x21 <!-- 8 -->
| [//nescartdb.com/profile/view/4061 Othello] || $20 || $0006 || ≠ $3F || $22 || $0006 || = $3F
|-
| [//nescartdb.com/profile/view/3791 Sansuu 3 Nen] || $00 || $0006 || ≠ $34 || $2A || $0006 || = $34
|-
| [//nescartdb.com/profile/view/3592 Spy vs Spy] || $13 || $1F20 || ≠ $55 || $21 || colspan=2|untested
|-
| [//nescartdb.com/profile/view/2332 Seicross] || $21 || $0700…$0707 || ≠ $20,$60,$70,$70,$70,$40,$08,$38 || $20 || colspan=2|untested
|}
|}
The North American and PAL versions of ''Mighty Bomb Jack'' mount 32 KiB of CHR-ROM instead and so use normal [[INES Mapper 003|mapper 3]].
==References==
* [http://www.romhacking.net/documents/362/ Disch's Mapper Notes]

Latest revision as of 18:33, 6 November 2024

iNES Mapper 185 denotes the CNROM circuit board with only 8 KiB of CHR-ROM. The particular ROM chip model (Sharp LH2367 or equivalent) changes the functionality of pins 26 (normally A13) and 27 (normally A14) into two programmable (during manufacturing) Chip Select inputs, effectively disabling CHR-ROM and tri-stating its data outputs when the one correct bank of four possible CHR-ROM banks is not selected.

While the original purpose of these two chip select pins was to allow four chips to sit on the same bus selected by a two-bit chip select number that does not have to be demultiplexed into four chip enable signals, Mapper 185 uses them as a second (and equally weak) copy protection mechanism, in addition to the security diodes.

Overview

  • PRG ROM size: 16 KiB or 32 KiB
  • PRG ROM bank size: Not bankswitched
  • PRG RAM: None
  • CHR capacity: 8 KiB ROM (copy protected)
  • Nametable mirroring: Solder pads select vertical or horizontal mirroring
  • Subject to bus conflicts: Yes

Banks

  • PPU $0000-$1FFF: 8 KB switchable CHR ROM bank

Registers

Bank select ($8000-$FFFF)

7  bit  0
---- ----
..DC ..BA
  ||   ||
  ||   |+- Chip Select 2 (CS2)
  ||   +-- Chip Select 1 (CS1)
  |+------ Output to Diode 2 (D2)
  +------- Output to Diode 1 (D1)

The games verify the functionality of the Chip Select bits by writing the wrong CS1/CS2 value, thereby disabling CHR-ROM, verify that reading CHR-ROM does not return the correct value, then write the correct CS1/CS2 bits to enable CHR-ROM so that graphics can be displayed. A few titles additionally verify that reading CHR-ROM now does return the correct value. If either check fails, the game is either reset or freezes. The correct CS1/CS2 value that enables CHR-ROM is game-specific and specified in the Submapper field of the NES 2.0 header with a base of 4:

Submapper  Meaning
  4        CS1/CS2=0 enables CHR-ROM, all other values disable CHR-ROM
  5        CS1/CS2=1 enables CHR-ROM, all other values disable CHR-ROM
  6        CS1/CS2=2 enables CHR-ROM, all other values disable CHR-ROM
  7        CS1/CS2=3 enables CHR-ROM, all other values disable CHR-ROM

The base of 4 allows distinguishing "CS1/CS2=0" and a Submapper of "0" meaning "Unknown": Any Submapper other than 4-7 means that the correct CS1/CS2 value is unknown and one of two heuristics must be used instead to allow the game to run:

  • Enable CHR-ROM only if the "(latch data &0xF) != 0 && (latch data) != 0x13". This heuristic fails for Seicross and is therefore discouraged.
  • Disable CHR-ROM for the first two reads $2007 after a reset and then enable it. This works with all games, as they all test for the bad value first, and the correct value (if at all) second.

When CHR is disabled, the pattern tables are open bus. Theoretically, this should return the LSB of the address read, but real-world behavior varies, and the earlier revision of Mighty Bomb Jack in fact relies on open bus at PPU address $0000 being something other than $00.

This table has been assembled from nocash and the sources of MESS, Nestopia, and FCEUX; the specific tests were traced from dumps in GoodNES.

bank PPU addr test bank PPU addr test
Game Incorrect bank Must work
Bird Week $F0 $1FF0 ≠ $0C $0F $1FF0 = $0C
B-Wings $00 $0000 ≠ $3C $33 $0000 = $3C
Mighty Bomb Jack (J, PRG0) $00 $0000 ≠ $00 $11 untested
Mighty Bomb Jack (J, PRG1) $00 $0001 ≠ $3C $11 untested
Sansuu 1 Nen $20 $000C ≠ $BC $22 $000C = $BC
Sansuu 2 Nen $20 $0003 ≠ $42 $22 $0003 = $42
Othello $20 $0006 ≠ $3F $22 $0006 = $3F
Sansuu 3 Nen $00 $0006 ≠ $34 $2A $0006 = $34
Spy vs Spy $13 $1F20 ≠ $55 $21 untested
Seicross $21 $0700…$0707 ≠ $20,$60,$70,$70,$70,$40,$08,$38 $20 untested

The North American and PAL versions of Mighty Bomb Jack mount 32 KiB of CHR-ROM instead and so use normal mapper 3.

References