INES Mapper 108
NES 2.0 Mapper 108 denotes at least four different PCBs used for FDS-to-cartridge conversions. All have nametable mirroring hard-wired.
Submapper 1: DH-08
Used by Whirlwind Manu's first release of Taito's Bubble Bobble (LH31), and is a modified version of Kaiser's cartridge conversion, originally for INES Mapper 142.
Banks:
- CPU $6000-$7FFF: Switchable 8 KiB bank
- CPU $8000-$FFFF: Fixed to last 32 KiB of PRG-ROM
- PPU $0000-$1FFF: Unbanked 8 KiB CHR-RAM
Registers:
- CPU $F000-$FFFF: Select 8 KiB PRG-ROM bank at CPU $6000-$7FFF. The game retains writes outside this address range, which must be ignored for the game not to crash.
Submapper 2
Used by Whirlwind Manu's later release of Taito's Bubble Bobble (LH31) that replaces CHR-RAM with CHR-ROM. UNIF board name is UNL-BB.
Banks:
- CPU $6000-$7FFF: Switchable 8 KiB bank
- CPU $8000-$FFFF: Fixed to last 32 KiB of PRG-ROM
- PPU $0000-$1FFF: Switchable 8 KiB CHR-ROM bank
Registers:
- CPU $E000-$FFFF: Select 8 KiB PRG-ROM bank at CPU $6000-$7FFF *and* 8 KiB CHR-ROM bank at PPU $0000-$1FFF. The game retains writes outside this address range, which must be ignored for the game not to crash.
Submapper 3
Submapper 1 but with the PRG-ROM switch responding in the full CPU $8000-$FFFF address range, which is required for both games to function:
- Falsion (LH54)
- Meikyuu Jiin Dababa (LH28)
Banks:
- CPU $6000-$7FFF: Switchable 8 KiB bank
- CPU $8000-$FFFF: Fixed to last 32 KiB of PRG-ROM
- PPU $0000-$1FFF: Unbanked 8 KiB CHR-RAM
Registers:
- CPU $8000-$FFFF: Select 8 KiB PRG-ROM bank at CPU $6000-$7FFF
Submapper 4
Like Submapper 2, but with the CHR-ROM switch responding in the full CPU $8000-$FFFF address range, and PRG-ROM banks being fixed. UNIF board name is also UNL-BB.
- Pro Wrestling (LE05)
Banks:
- CPU $6000-$7FFF: 8 KiB bank, fixed to last 8 KiB
- CPU $8000-$FFFF: Fixed to last 32 KiB of PRG-ROM
- PPU $0000-$1FFF: Switchable 8 KiB CHR-ROM bank
Registers:
- CPU $8000-$FFFF: Select 8 KiB CHR-ROM bank at PPU $0000-$1FFF
Heuristics
FCEUX and Mesen manage to emulate all four PCBs without disambiguation by heuristically considering the addresses that all games write to:
if((addr & 0x9000) == 0x8000 || addr >= 0xF000){ //A version of Bubble Bobble expects writes to $F000+ to switch the PRG banks _prgReg = _chrReg = value; } else { //For ProWres _chrReg = value & 0x01; }
To disambiguate the four different PCBs in advance:
- CHR-RAM -> Submappers 1 or 3
- Horizontal Mirroring -> Submapper 1, otherwise 3
- CHR-ROM -> Submappers 2 or 4
- More than 16 KiB of CHR-ROM -> Submapper 2, otherwise 4