static WRITE8_HANDLER(multigm3_switch_gfx_rom) { multigam_state *state = space->machine().driver_data<multigam_state>(); set_videorom_bank(space->machine(), 0, 8, data & 0x3f, 8); set_mirroring(state, data & 0x40 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); state->m_game_gfx_bank = data; };
static WRITE8_HANDLER(multigm3_mapper2_w) { if (multigam_game_gfx_bank & 0x80) { set_videorom_bank(space->machine, 0, 8, (multigam_game_gfx_bank & 0x3c) + (data & 0x3), 8); } else { logerror("Unmapped multigam_mapper2_w: offset = %04X, data = %02X\n", offset, data); } };
static WRITE8_HANDLER(multigm3_mapper2_w) { multigam_state *state = space->machine().driver_data<multigam_state>(); if (state->m_game_gfx_bank & 0x80) { set_videorom_bank(space->machine(), 0, 8, (state->m_game_gfx_bank & 0x3c) + (data & 0x3), 8); } else { logerror("Unmapped multigam_mapper2_w: offset = %04X, data = %02X\n", offset, data); } };
static WRITE8_HANDLER( multigam3_mmc3_rom_switch_w ) { multigam_state *state = space->machine().driver_data<multigam_state>(); device_t *ppu = space->machine().device("ppu"); /* basically, a MMC3 mapper from the nes */ int bankmask = state->m_multigam3_mmc3_prg_size == 0x40000 ? 0x1f : 0x0f; switch(offset & 0x7001) { case 0x0000: state->m_multigam3_mmc3_command = data; if (state->m_multigam3_mmc3_last_bank != (data & 0xc0)) { int bank; UINT8 *prg = space->machine().region("maincpu")->base(); /* reset the banks */ if (state->m_multigam3_mmc3_command & 0x40) { /* high bank */ bank = (state->m_multigam3_mmc3_banks[0] & bankmask) * 0x2000; memcpy(&prg[0x0c000], &state->m_multigam3_mmc3_prg_base[bank], 0x2000); memcpy(&prg[0x08000], &state->m_multigam3_mmc3_prg_base[state->m_multigam3_mmc3_prg_size - 0x4000], 0x2000); } else { /* low bank */ bank = (state->m_multigam3_mmc3_banks[0] & bankmask) * 0x2000; memcpy(&prg[0x08000], &state->m_multigam3_mmc3_prg_base[bank], 0x2000); memcpy(&prg[0x0c000], &state->m_multigam3_mmc3_prg_base[state->m_multigam3_mmc3_prg_size - 0x4000], 0x2000); } /* mid bank */ bank = (state->m_multigam3_mmc3_banks[1] & bankmask) * 0x2000; memcpy(&prg[0x0a000], &state->m_multigam3_mmc3_prg_base[bank], 0x2000); state->m_multigam3_mmc3_last_bank = data & 0xc0; } break; case 0x0001: { UINT8 cmd = state->m_multigam3_mmc3_command & 0x07; int page = (state->m_multigam3_mmc3_command & 0x80) >> 5; int bank; switch (cmd) { case 0: /* char banking */ case 1: /* char banking */ data &= 0xfe; page ^= (cmd << 1); set_videorom_bank(space->machine(), page, 2, state->m_multigam3_mmc3_chr_bank_base + data, 1); break; case 2: /* char banking */ case 3: /* char banking */ case 4: /* char banking */ case 5: /* char banking */ page ^= cmd + 2; set_videorom_bank(space->machine(), page, 1, state->m_multigam3_mmc3_chr_bank_base + data, 1); break; case 6: /* program banking */ { UINT8 *prg = space->machine().region("maincpu")->base(); if (state->m_multigam3_mmc3_command & 0x40) { /* high bank */ state->m_multigam3_mmc3_banks[0] = data & bankmask; bank = (state->m_multigam3_mmc3_banks[0]) * 0x2000; memcpy(&prg[0x0c000], &state->m_multigam3_mmc3_prg_base[bank], 0x2000); memcpy(&prg[0x08000], &state->m_multigam3_mmc3_prg_base[state->m_multigam3_mmc3_prg_size - 0x4000], 0x2000); } else { /* low bank */ state->m_multigam3_mmc3_banks[0] = data & bankmask; bank = (state->m_multigam3_mmc3_banks[0]) * 0x2000; memcpy(&prg[0x08000], &state->m_multigam3_mmc3_prg_base[bank], 0x2000); memcpy(&prg[0x0c000], &state->m_multigam3_mmc3_prg_base[state->m_multigam3_mmc3_prg_size - 0x4000], 0x2000); } } break; case 7: /* program banking */ { /* mid bank */ UINT8 *prg = space->machine().region("maincpu")->base(); state->m_multigam3_mmc3_banks[1] = data & bankmask; bank = state->m_multigam3_mmc3_banks[1] * 0x2000; memcpy(&prg[0x0a000], &state->m_multigam3_mmc3_prg_base[bank], 0x2000); } break; } } break; case 0x2000: /* mirroring */ if (!state->m_multigam3_mmc3_4screen) { if (data & 0x40) set_mirroring(state, PPU_MIRROR_HIGH); else set_mirroring(state, (data & 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); } break; case 0x2001: /* enable ram at $6000 */ if (data & 0x80) { memory_set_bankptr(space->machine(), "bank10", state->m_multigmc_mmc3_6000_ram); } else { memory_set_bankptr(space->machine(), "bank10", space->machine().region("maincpu")->base() + 0x6000); } if (data & 0x40) { logerror("Write protect for 6000 enabled\n"); } break; case 0x4000: /* scanline counter */ state->m_multigam3_mmc3_scanline_counter = data; break; case 0x4001: /* scanline latch */ state->m_multigam3_mmc3_scanline_latch = data; break; case 0x6000: /* disable irqs */ ppu2c0x_set_scanline_callback(ppu, 0); break; case 0x6001: /* enable irqs */ ppu2c0x_set_scanline_callback(ppu, multigam3_mmc3_scanline_cb); break; } }
static WRITE8_HANDLER(multigm3_switch_gfx_rom) { set_videorom_bank(space->machine, 0, 8, data & 0x3f, 8); set_mirroring(data & 0x40 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); multigam_game_gfx_bank = data; };