/* mapper 33: Taito TC0190*/ static void map33_write(uint32 address, uint8 value) { int page = (address >> 13) & 3; int reg = address & 3; switch (page) { case 0: /* $800X */ switch (reg) { case 0: mmc_bankrom(8, 0x8000, value); break; case 1: mmc_bankrom(8, 0xA000, value); break; case 2: mmc_bankvrom(2, 0x0000, value); break; case 3: mmc_bankvrom(2, 0x0800, value); break; } break; case 1: /* $A00X */ { int loc = 0x1000 + (reg << 10); mmc_bankvrom(1, loc, value); } break; case 2: /* $C00X */ case 3: /* $E00X */ switch (reg) { case 0: /* irqs maybe ? */ //break; case 1: /* this doesn't seem to work just right */ if (value & 1) ppu_mirror(0, 0, 1, 1); /* horizontal */ else ppu_mirror(0, 1, 0, 1); break; default: break; } break; } }
/* mapper 40: SMB 2j (hack) */ static void map40_init(void) { mmc_bankrom(8, 0x6000, 6); mmc_bankrom(8, 0x8000, 4); mmc_bankrom(8, 0xA000, 5); mmc_bankrom(8, 0xE000, 7); irq.enabled = false; irq.counter = (int) MAP40_IRQ_PERIOD; }
/* mapper 11: Color Dreams, Wisdom Tree */ static void map11_write(uint32 address, uint8 value) { UNUSED(address); mmc_bankrom(32, 0x8000, value & 0x0F); mmc_bankvrom(8, 0x0000, value >> 4); }
static void map40_write(uint32 address, uint8 value) { int range = (address >> 13) - 4; switch (range) { case 0: /* 0x8000-0x9FFF */ irq.enabled = false; irq.counter = (int) MAP40_IRQ_PERIOD; break; case 1: /* 0xA000-0xBFFF */ irq.enabled = true; break; case 3: /* 0xE000-0xFFFF */ mmc_bankrom(8, 0xC000, value & 7); break; default: break; } }
static void map66_init(void) { mmc_bankrom(32, 0x8000, 0); mmc_bankvrom(8, 0x0000, 0); }
static void map15_init(void) { mmc_bankrom(32, 0x8000, 0); }
/* mapper 15: Contra 100-in-1 */ static void map15_write(uint32 address, uint8 value) { int bank = value & 0x3F; uint8 swap = (value & 0x80) >> 7; switch (address & 0x3) { case 0: mmc_bankrom(8, 0x8000, (bank << 1) + swap); mmc_bankrom(8, 0xA000, (bank << 1) + (swap ^ 1)); mmc_bankrom(8, 0xC000, ((bank + 1) << 1) + swap); mmc_bankrom(8, 0xE000, ((bank + 1) << 1) + (swap ^ 1)); if (value & 0x40) ppu_mirror(0, 0, 1, 1); /* horizontal */ else ppu_mirror(0, 1, 0, 1); /* vertical */ break; case 1: mmc_bankrom(8, 0xC000, (bank << 1) + swap); mmc_bankrom(8, 0xE000, (bank << 1) + (swap ^ 1)); break; case 2: if (swap) { mmc_bankrom(8, 0x8000, (bank << 1) + 1); mmc_bankrom(8, 0xA000, (bank << 1) + 1); mmc_bankrom(8, 0xC000, (bank << 1) + 1); mmc_bankrom(8, 0xE000, (bank << 1) + 1); } else { mmc_bankrom(8, 0x8000, (bank << 1)); mmc_bankrom(8, 0xA000, (bank << 1)); mmc_bankrom(8, 0xC000, (bank << 1)); mmc_bankrom(8, 0xE000, (bank << 1)); } break; case 3: mmc_bankrom(8, 0xC000, (bank << 1) + swap); mmc_bankrom(8, 0xE000, (bank << 1) + (swap ^ 1)); if (value & 0x40) ppu_mirror(0, 0, 1, 1); /* horizontal */ else ppu_mirror(0, 1, 0, 1); /* vertical */ break; default: break; } }