NES 2.0 Mapper 269 is used for at least one plug-and-play console and two multicarts with an MMC3 clone and four additional outer bank registers:
PRG and CHR fetches are mapped to different areas of a single address space, similar to the VTxx consoles in OneBus mode. As the plug-and-play console's square wave duty cycles are not reversed however, the actual hardware cannot be VTxx.
Mask: probably $E001
$8000, $8001, $A000, $A001, $C000, $C001, $E000, $E001: As normal MMC3.
There are four outer bank registers, all of which are accessed at address $5000. 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.
Mask: unknown, but probably $F008, as a few games' writes to $5008 must be ignored
Register 0:
7654 3210 --------- CCCC CCCC ++++-++++- Bits 0-7 of the 1 KiB Outer CHR Bank number
Register 1:
7654 3210 --------- PPPP PPPP ++++-++++- Bits 0-7 of the 8 KiB Outer PRG Bank number
Register 2:
7654 3210 --------- CCCC MMMM |||| ++++- Outer CHR Bank mask in number of most significant bits, |||| e.g. 0=0x00, 1=0x80, 2=0xC0, 3=0xE0, 4=0xF0 ++++------ Bits 8-11 of the 1 KiB Outer CHR Bank number
Register 3:
7654 3210 --------- OOMM MMMM ||++-++++- Outer PRG Bank mask (bit mask, not number of bits) ++-------- Bits 8/9 of the 8 KiB Outer PRG Bank number, also Bits 12/13 of the 1 KiB Outer CHR Bank number
The final 8 KiB PRG and 1 KiB CHR bank number are therefore:
PRGBank := (MMC3PRGBank &~OuterPRGBankMask) | (OuterPRGBank &OuterPRGBankMask); CHRBank := (MMC3CHRBank &~OuterCHRBankMask) | (OuterCHRBank &OuterCHRBankMask);
The CHR data is scrambled by changing the bit order.
Stored bit 76543210 -------- Actual bit 70615243
Which means that to get from the stored data to the actual data, the following operation must be performed:
Val =((Val &1) <<6) | ((Val &2) <<3) | ((Val &4) <<0) | ((Val &8) >>3) | ((Val &16) >>3) | ((Val &32) >>2) | ((Val &64) >>1) | ((Val &128) <<0);
Categories: MMC3-like mappers, Multicart mappers