INES Mapper 185: Difference between revisions
NewRisingSun (talk | contribs) (The previous value came from a bad dump of the game. The correct dump uses value 2A, not FF.) |
NewRisingSun (talk | contribs) (Reference the submapper page; reorder the description of the heuristics.) |
||
Line 23: | Line 23: | ||
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. | 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 [https://wiki.nesdev.org/w/index.php/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 ''[http://bootgod.dyndns.org:7777/profile.php?id=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. | 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. | This table has been assembled from nocash and the sources of MESS, Nestopia, and FCEUX; the specific tests were traced from dumps in GoodNES. |
Revision as of 20:50, 23 November 2017
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 |