INES Mapper 185: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(→‎Bank select ($8000-$FFFF): alternative workaround, plus a list of the specific tests done by each game (commented out))
(Reformat the table. It feels Comprehensive now, and maybe someone can think of another clever emulation handler.)
Line 1: Line 1:
{{DEFAULTSORT:185}}[[Category:iNES Mappers]][[Category:in NesCartDB]][[Category:Discrete logic mappers]][[Category:Nintendo licensed mappers]][[Category:NES 2.0 mappers with submappers]]
{{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.
Example Games:
* ''Spy Vs. Spy (J)''
* ''Mighty Bomb Jack (J)''


==Overview==
==Overview==
Line 32: Line 28:
* otherwise CHR is disabled
* 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 varies.
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.
''Seicross (v2)'' does not work with this heuristic.




Line 37: Line 35:




This table has been assembled from nocash and the sources of MESS, Nestopia, and FCEUX.
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"
{| class="datatable sortable"
! !! colspan=2|if this value is written
! || bank || PPU addr || test || bank || PPU addr || test
|-
! Game !! colspan=3|Incorrect bank !! colspan=3|Must work <!-- specific test -->
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1262 Bird Week] || $F0 || $1FF0 || ≠ $0C || $0F || $1FF0 || = $0C
|-
|-
! Game !! Must work !! Mustn't work <!-- specific test -->
| [http://bootgod.dyndns.org:7777/profile.php?id=1264 B-Wings] || $00 || $0000 || ≠ $3C || $33 || $0000 || = $3C
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1262 Bird Week] || 0x0F || 0xF0 <!-- PPU $1FF0 is NOT $0C with the wrong bank, then IS $0C with the right bank -->
| [http://bootgod.dyndns.org:7777/profile.php?id=1261 Mighty Bomb Jack (J)] || $00 || $0000 || ≠ $00 || $11 || colspan=2|untested
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1264 B-Wings] || 0x33 || 0x00 <!-- PPU $0000 is NOT $3C with the wrong bank, then IS $3C with the right bank -->
| Mighty Bomb Jack [http://bootgod.dyndns.org:7777/profile.php?id=202 (U)], [http://bootgod.dyndns.org:7777/profile.php?id=2143 (E)] || $00 || $0001 || ≠ $3C || $11 || colspan=2|untested
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=1261 Mighty Bomb Jack] || 0x11 || 0x00 <!-- J: PPU $0000 is NOT $00 with the wrong bank; E&U: PPU $0001 is not $3C -->
| Sansuu 1 Nen || $20 || $000C || $BC || $22 || $000C || = $BC
|-
|-
| 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 <!--
| [http://bootgod.dyndns.org:7777/profile.php?id=1263 Sansuu 2 Nen] || $20 || $0003 || ≠ $42 || $22 || $0003 || = $42
  S1N: PPU $000C is NOT $BC with wrong bank, then IS $BC in right bank ;
  S2N: PPU $0003 is NOT $42 with wrong bank, then IS $42 in right bank ;
  Othello: PPU $0006 is NOT $3F with wrong bank, then IS $3F in right bank-->
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=3791 Sansuu 3 Nen] || 0xFF || 0x00 <!-- PPU $0006 is NOT $34 with the wrong bank, then IS $34 with the right bank -->
| [http://bootgod.dyndns.org:7777/profile.php?id=4061 Othello] || $20 || $0006 || ≠ $3F || $22 || $0006 || = $3F
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=3592 Spy vs Spy] || 0x21 || 0x13 <!-- PPU $1F20 is NOT $55 with the wrong bank -->
| [http://bootgod.dyndns.org:7777/profile.php?id=3791 Sansuu 3 Nen] || $00 || $0006 || ≠ $34 || $FF || $0006 || = $34
|-
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=2332 Seicross (v2)] || 0x20 || 0x21 <!-- PPU $0700 are NOT $20,$60,$70,$70,$70,$40,$08,$38 with the wrong bank -->
| [http://bootgod.dyndns.org:7777/profile.php?id=3592 Spy vs Spy] || $13 || $1F20 || ≠ $55 || $21 || colspan=2|untested
|-
| [http://bootgod.dyndns.org:7777/profile.php?id=2332 Seicross (v2)] || $21 || $0700…$0707 || ≠ $20,$60,$70,$70,$70,$40,$08,$38 || $20 || colspan=2|untested
|}
|}
''Seicross (v2)'' does not work with the above heuristic.
However, the only difference between v1 and v2 of this game is the addition of this copy protection.
Additionally, [[NES 2.0 submappers]] would handle it.


==References==
==References==
* [http://www.romhacking.net/documents/362/ Disch's Mapper Notes]
* [http://www.romhacking.net/documents/362/ Disch's Mapper Notes]

Revision as of 22:45, 17 April 2016

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. However, a simple heuristic obviates the need to detect each game individually:

  • 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 varies.

Seicross (v2) does not work with this heuristic.


All of these games test for the bad value first, and the correct value (if at all) second; returning garbage for the first two reads from the PPU after reboot should also work.


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 $FF $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

References