INES Mapper 185: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(list of known m185 games)
(→‎Bank select ($8000-$FFFF): link to CNROM page to explain the upper two bits)
 
(13 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''' is used for games that use the [[CNROM]] board with weak copy protection measures.


  ========================
==Overview==
  =  Mapper 185          =
* PRG ROM size: 16 KiB or 32 KiB
  ========================
* PRG ROM bank size: Not bankswitched
 
* PRG RAM: None
  Example Games:
* CHR capacity: 8 KiB ROM (copy protected)
  --------------------------
* Nametable [[mirroring]]: Solder pads select vertical or horizontal mirroring
  Spy Vs. Spy (J)
* Subject to [[bus conflict]]s: Yes [[Category:Mappers with bus conflicts]]
  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.
==Banks==
{| class="datatable"
* PPU $0000-$1FFF: 8 KB switchable CHR ROM bank
! !! colspan=2|if this value is written
 
==Registers==
=== Bank select ($8000-$FFFF) ===
7  bit  0
---- ----
..CC ..CC
  ||  ||
  ++---++- Used for CHR copy protection.
 
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.
 
Each game has their own value that enables/disables CHR. The correct value may be specified using the [[NES_2.0_submappers#185:_CNROM_used_to_selectively_disable_CHR-ROM|submapper field in the NES 2.0 header]]. If an iNES image's header does not specify a submapper, then a heuristic must be used to allow these games to run. Two heuristics are commonly used by emulators:
* If C AND $0F is nonzero, and if C does not equal $13, then CHR is enabled, otherwise CHR is disabled. This works with all games except for ''[//nescartdb.com/profile/view/2332 Seicross (v2)]''.
* Return garbage for the first two reads from $2007 after a reset. 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.
 
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 !! colspan=3|Incorrect bank !! colspan=3|Must work <!-- specific test -->
|-
|-
! Game !! Must work !! Mustn't work <!-- possible submapper number -->
| [//nescartdb.com/profile/view/1262 Bird Week] || $F0 || $1FF0 || ≠ $0C || $0F || $1FF0 || = $0C
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1262 Bird Week] || 0x0F || 0xF0 <!-- 3 -->
| [//nescartdb.com/profile/view/1264 B-Wings] || $00 || $0000 || ≠ $3C || $33 || $0000 || = $3C
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1264 B-Wings] || 0x33 || 0x00 <!-- F -->
| [//nescartdb.com/profile/view/1261 Mighty Bomb Jack (J)] || $00 || $0000 || ≠ $00 || $11 || colspan=2|untested
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1261 Mighty Bomb Jack] || 0x11 || 0x00 <!-- 5 -->
| Mighty Bomb Jack [//nescartdb.com/profile/view/202 (U)], [//nescartdb.com/profile/view/2143 (E)] || $00 || $0001 || ≠ $3C || $11 || colspan=2|untested
|-
|-
| Sansuu 1 Nen and [http://bootgod.dyndns.org:7777/profile.php?id=1263 Sansuu 2 Nen] || 0x22 || 0x20 <!-- A -->
| Sansuu 1 Nen || $20 || $000C || ≠ $BC || $22 || $000C || = $BC
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=3791 Sansuu 3 Nen] || 0xFF || 0x00 <!-- F -->
| [//nescartdb.com/profile/view/1263 Sansuu 2 Nen] || $20 || $0003 || ≠ $42 || $22 || $0003 || = $42
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=3592 Spy vs Spy] || 0x21 || 0x13 <!-- 9 -->
| [//nescartdb.com/profile/view/4061 Othello] || $20 || $0006 || ≠ $3F || $22 || $0006 || = $3F
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=2332 Seicross (v2)] || 0x20 || 0x21 <!-- 8 -->
| [//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 (v2)] || $21 || $0700…$0707 || ≠ $20,$60,$70,$70,$70,$40,$08,$38 || $20 || colspan=2|untested
|}
|}
It is true, but trivia, that the upper two bits of the latch are actually connected to diodes on the PCB. These are described [[CNROM#Solder_Pad_Config|here]].
==References==
* [http://www.romhacking.net/documents/362/ Disch's Mapper Notes]

Latest revision as of 23:57, 1 November 2023

iNES Mapper 185 is used for games that use the CNROM board with weak copy protection measures.

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
---- ----
..CC ..CC
  ||   ||
  ++---++- Used for CHR copy protection.

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.

Each game has their own value that enables/disables CHR. The correct value may be specified using the submapper field in the NES 2.0 header. If an iNES image's header does not specify a submapper, then a heuristic must be used to allow these games to run. Two heuristics are commonly used by emulators:

  • If C AND $0F is nonzero, and if C does not equal $13, then CHR is enabled, otherwise CHR is disabled. This works with all games except for Seicross (v2).
  • Return garbage for the first two reads from $2007 after a reset. 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.

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) $00 $0000 ≠ $00 $11 untested
Mighty Bomb Jack (U), (E) $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 (v2) $21 $0700…$0707 ≠ $20,$60,$70,$70,$70,$40,$08,$38 $20 untested

It is true, but trivia, that the upper two bits of the latch are actually connected to diodes on the PCB. These are described here.

References