Beispiel #1
0
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;
};
Beispiel #2
0
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);
	}
};
Beispiel #3
0
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);
	}
};
Beispiel #4
0
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;
	}
}
Beispiel #5
0
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;
};