INES Mapper 068
iNES Mapper 068 is a mapper used by After Burner.
It has the unusual ability to map CHR ROM into the part of the PPU's address space used for nametables.
Registers
$8000-$8FFF: CHR bank at $0000
Map a 2 KiB CHR ROM bank into PPU $0000.
$9000-$9FFF: CHR bank at $0800
Map a 2 KiB CHR ROM bank into PPU $0800.
$A000-$AFFF: CHR bank at $1000
Map a 2 KiB CHR ROM bank into PPU $1000.
$B000-$BFFF: CHR bank at $1800
Map a 2 KiB CHR ROM bank into PPU $1800.
$C000-$CFFF: Nametable register 0
Map a 1 KiB CHR ROM bank in place of the lower nametable (CIRAM $000-$3FF). Only D6-D0 are used; D7 is ignored and treated as 1, so nametables must be in the last 128 KiB of CHR ROM.
$D000-$DFFF: Nametable register 1
Map a 1 KiB CHR ROM bank in place of the upper nametable (CIRAM $400-$7FF). Only D6-D0 are used; D7 is ignored and treated as 1.
$E000-$EFFF: Nametable control
7654 3210 | | | +- Mirroring | 0: vertical (0101); 1: horizontal (0011); | 2: 1-screen (0000); 3: 1-screen (1111) +------ Chip select for PPU $2000-$2FFF (nametables): 0 for CIRAM or 1 for CHR ROM
Nametable mirroring works the same way in both CIRAM and CHR ROM modes. Not all documents mention the single screen mirroring mode; its behavior should be verified against an authentic cartridge.
$F000-$FFFF: PRG bank at $8000
PRG bank switching works much like iNES Mapper 002. Writes map a 16 KiB PRG bank into $8000-$BFFF, leaving $C000-$FFFF fixed to the last 16 KiB in the PRG ROM.
Hardware
Boards using this mapper usually have CHR ROM split into two chips.
References
Here are Disch's original notes: ======================== = Mapper 068 = ======================== Example Games: -------------------------- After Burner 2 Maharaja Registers: --------------------------- Range,Mask: $8000-FFFF, $F000 $8000: CHR Reg 0 (2k @ $0000) $9000: CHR Reg 1 (2k @ $0800) $A000: CHR Reg 2 (2k @ $1000) $B000: CHR Reg 3 (2k @ $1800) $C000: [.NNN NNNN] NT-ROM Reg 0 $D000: [.NNN NNNN] NT-ROM Reg 1 $E000: [...R ...M] Mirroring (see section below) $F000: PRG Reg (16k @ $8000) CHR Setup: --------------------------- $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00 +---------------+---------------+---------------+---------------+ | $8000 | $9000 | $A000 | $B000 | +---------------+---------------+---------------+---------------+ PRG Setup: --------------------------- $8000 $A000 $C000 $E000 +---------------+---------------+ | $F000 | { -1} | +---------------+---------------+ Mirroring: --------------------------- The mirroring reg has two significant bits: $E000: [...R ...M] 'M' selects H/V: 0 = Vert 1 = Horz 'R' selects whether or not to use CHR-ROM as nametables. 0 = normal mirroring 1 = use CHR-ROM When 'R' is set, $C000 and $D000 are used to select 1k CHR-ROM pages to use as nametables. They are arranged in either Horz or Vert mirroring fashion depending on the 'M' bit ($C000 would be used in place of NTA, $D000 in place of NTB). R=1, M=0: [ $C000 ][ $D000 ] [ $C000 ][ $D000 ] R=1, M=1: [ $C000 ][ $C000 ] [ $D000 ][ $D000 ] Note that CHR-ROM for nametables is taken from the last 128k of CHR. This means you must effectively OR the value written to $C000/$D000 with $80.