INES Mapper 045: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (iNES category sorting)
(Rewrite and additions.)
Line 1: Line 1:
[[Category:iNES Mappers|045]][[Category:MMC3-like mappers|045]]
{{DEFAULTSORT:045}}[[Category:iNES Mappers]][[Category:MMC3-like mappers]][[Category:Multicart mappers]][[Category:Mappers with scanline IRQs]]
  Here are Disch's original notes: 
iNES Mapper 045 denotes multicart PCBs using the GA23C ASIC in its standard configuration. It is an [[MMC3]] clone with four outer bank registers.
  ========================
 
  = Mapper 045          =
=Registers=
  ========================
There are four outer bank registers, accessed at address $6000. The first write goes to the first register, the second write to the second, and so on; the fifth write goes to the first register again. The outer bank registers function regardless of the MMC3's WRAM bits' setting.
 
==MMC3-compatible registers==
* Bank select ($8000-$9FFE, even)
* Bank data ($8001-$9FFF, odd)
* Mirroring ($A000-$BFFE, even)
* PRG RAM protect ($A001-$BFFF, odd)
* IRQ latch ($C000-$DFFE, even)
* IRQ reload ($C001-$DFFF, odd)
* IRQ disable ($E000-$FFFE, even)
* IRQ enable ($E001-$FFFF, odd)
These registers function identically to the [[MMC3]], with the PRG/CHR bank registers subject to masking by the outer bank registers.
 
==CHR-OR LSB ($6000 #0, write)==
Mask: $F001
D~7654 3210
  ---------
  CCCC CCCC
  ++++-++++- Select CHR A10-A17, OR'd with MMC3's CHR A10-A17
 
==PRG-OR LSB ($6000 #1, write)==
Mask: $F001
D~7654 3210
  ---------
  ppPP PPPP
  ||++-++++- Select PRG A13-A18, OR'd with MMC3's PRG A13-A18
  ++-------- Select PRG A19-A20
 
==CHR-AND, CHR-OR/PRG-OR MSB ($6000 #2, write)==
Mask: $F001
D~7654 3210
  ---------
  PPCC cccc
  |||| ++++- Select number of CHR bits from MMC3
  ||||      ($F: 256 KiB, $E: 128 KiB ... $7-$0: 1 KiB)
  ||++------ Select CHR A18-A19
  ++-------- Select CHR A20-A21 and PRG A22-23
 
==PRG-AND, register lock ($6000 #3, write)==
  Mask: $F001
D~7654 3210
  ---------
  1LPP PPPP
    |++ ++++- Select PRG-AND mask (inverted)
    |||      ($00: 512 KiB, $20: 256 KiB...)
    +-------- 1=Lock outer bank registers
 
==Reset outer bank registers and release lock ($6001, write)==
Writing any value to $6001 (mask: $F001) resets the outer bank registers as a soft reset would, clearing the "Lock" bit.
    
    
  Example Games:
=Notes=
  --------------------------
* Some games write to the outer bank registers multiple times. Experiments during dumping do not suggest that this is necessary.
  Super 8-in-1
* NES 2.0 Mappers [[NES 2.0 Mapper 356|356]], [[NES 2.0 Mapper 372|372]] and [[NES 2.0 Mapper 373|373]] repurpose bits from outer bank register #2 for other things.
  Super 4-in-1
* [[NES 2.0 Mapper 269]] is an enhanced plug-and-play console variant of this mapper.
  Super 1000000-in-1
 
 
  Notes:
  ---------------------------
 
  This mapper is another [[MMC3]] multicart, only it works a bit strangely. The multicart selects PRG/CHR blocks
  independently through 4 internal registers (accessed via $6000-7FFF). MMC3 registers then operate normally
  within the current block.
 
  For info on MMC3, see [[INES Mapper 004|mapper 004]].
 
 
  Registers:
  ---------------------------
 
    $6000-7FFF:  Multicart regs
    $8000-FFFF:  Same as MMC3 for selected blocks
 
  When Multicart regs are locked, writes to $6000-7FFF proceed to PRG-RAM, as normal.
 
  Where the game writes in the $6000-7FFF range doesn't matter.  An internal counter selects which reg gets
  written to. ie:
 
    LDA #$00
    STA $6000 ; first write, goes to reg 0
    STA $6000 ; second write, goes to reg 1
    STA $6000 ; reg 2
    STA $6000 ; reg 3
    STA $6000 ; back to reg 0, etc
 
 
    Reg 0:  [CCCC CCCC]   Low 8 bits of CHR-OR
    Reg 1:  [PPPP PPPP]   PRG-OR
    Reg 2:  [CCCC SSSS]
            S = CHR-AND block size
            C = High 4 bits of CHR-OR
    Reg 3:  [.LAA AAAA]
            L = Lock Multicart regs (1=locked)
            A = Inverted PRG-AND
 
  Once multicart regs are locked, the only way to unlock is to Reset the system.
 
 
  CHR Setup:
  --------------------------
 
  'S' bits are somewhat strange. They seem to select the size of the CHR block to mask out:
    'S'  Block size    CHR-AND
    ----------------------------
    $F      256k          $FF
    $E      128k          $7F
    $D        64k          $3F
        ...
    $8        2k          $01
    7-0       1k          $00
 
 
  An easy way to emulate this:
 
    chr_and = 0xFF >> ~S_bits;
 
  CHR-OR is straightforward
 
 
 
  PRG Setup:
  -------------------------
 
  PRG-OR is straightforward.
 
  PRG-AND is inverted.  XOR written value with $3F for actual PRG-AND.
 
 
 
  Odd game behavior:
  -------------------------
 
  Games seem to set the multicart registers in a loop that runs 256 times.  Why it does this isn't known,
  neither is whether or not it is actually necessary.
 
 
 
  Powerup and reset:
  -------------------------
 
  Block 0 must be selected on powerup and reset.  Regs must be unlocked, as well... and they must be reset so
  that the next write will write to reg 0.

Revision as of 05:41, 4 July 2019

iNES Mapper 045 denotes multicart PCBs using the GA23C ASIC in its standard configuration. It is an MMC3 clone with four outer bank registers.

Registers

There are four outer bank registers, accessed at address $6000. The first write goes to the first register, the second write to the second, and so on; the fifth write goes to the first register again. The outer bank registers function regardless of the MMC3's WRAM bits' setting.

MMC3-compatible registers

  • Bank select ($8000-$9FFE, even)
  • Bank data ($8001-$9FFF, odd)
  • Mirroring ($A000-$BFFE, even)
  • PRG RAM protect ($A001-$BFFF, odd)
  • IRQ latch ($C000-$DFFE, even)
  • IRQ reload ($C001-$DFFF, odd)
  • IRQ disable ($E000-$FFFE, even)
  • IRQ enable ($E001-$FFFF, odd)

These registers function identically to the MMC3, with the PRG/CHR bank registers subject to masking by the outer bank registers.

CHR-OR LSB ($6000 #0, write)

Mask: $F001

D~7654 3210
  ---------
  CCCC CCCC
  ++++-++++- Select CHR A10-A17, OR'd with MMC3's CHR A10-A17

PRG-OR LSB ($6000 #1, write)

Mask: $F001

D~7654 3210
  ---------
  ppPP PPPP
  ||++-++++- Select PRG A13-A18, OR'd with MMC3's PRG A13-A18
  ++-------- Select PRG A19-A20

CHR-AND, CHR-OR/PRG-OR MSB ($6000 #2, write)

Mask: $F001

D~7654 3210
  ---------
  PPCC cccc
  |||| ++++- Select number of CHR bits from MMC3
  ||||       ($F: 256 KiB, $E: 128 KiB ... $7-$0: 1 KiB)
  ||++------ Select CHR A18-A19
  ++-------- Select CHR A20-A21 and PRG A22-23

PRG-AND, register lock ($6000 #3, write)

Mask: $F001

D~7654 3210
  ---------
  1LPP PPPP
   |++ ++++- Select PRG-AND mask (inverted)
   |||       ($00: 512 KiB, $20: 256 KiB...)
   +-------- 1=Lock outer bank registers

Reset outer bank registers and release lock ($6001, write)

Writing any value to $6001 (mask: $F001) resets the outer bank registers as a soft reset would, clearing the "Lock" bit.

Notes

  • Some games write to the outer bank registers multiple times. Experiments during dumping do not suggest that this is necessary.
  • NES 2.0 Mappers 356, 372 and 373 repurpose bits from outer bank register #2 for other things.
  • NES 2.0 Mapper 269 is an enhanced plug-and-play console variant of this mapper.