diff options
Diffstat (limited to 'src/devices/bus/gamate/rom.cpp')
-rw-r--r-- | src/devices/bus/gamate/rom.cpp | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/src/devices/bus/gamate/rom.cpp b/src/devices/bus/gamate/rom.cpp new file mode 100644 index 00000000000..59a70b3a9a9 --- /dev/null +++ b/src/devices/bus/gamate/rom.cpp @@ -0,0 +1,184 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +// this assumes that the regular banked carts don't also have the 4-in-1 logic. + +#include "emu.h" +#include "rom.h" + +//------------------------------------------------- +// gamate_rom_device - constructor +//------------------------------------------------- + +DEFINE_DEVICE_TYPE(GAMATE_ROM_PLAIN, gamate_rom_plain_device, "gamate_rom_plain", "GAMATE Cartridge") +DEFINE_DEVICE_TYPE(GAMATE_ROM_BANKED, gamate_rom_banked_device, "gamate_rom_banked", "GAMATE Cartridge with banking") +DEFINE_DEVICE_TYPE(GAMATE_ROM_4IN1, gamate_rom_4in1_device, "gamate_rom_4in1", "GAMATE 4-in-1 Cartridge") + + +gamate_rom_plain_device::gamate_rom_plain_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), device_gamate_cart_interface(mconfig, *this), + m_protection(*this, "protection") +{ +} + +gamate_rom_plain_device::gamate_rom_plain_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + gamate_rom_plain_device(mconfig, GAMATE_ROM_PLAIN, tag, owner, clock) +{ +} + +gamate_rom_banked_device::gamate_rom_banked_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + gamate_rom_plain_device(mconfig, GAMATE_ROM_BANKED, tag, owner, clock), + m_bank(0) +{ +} + +gamate_rom_banked_device::gamate_rom_banked_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + gamate_rom_plain_device(mconfig, type, tag, owner, clock), + m_bank(0) +{ +} + + +gamate_rom_4in1_device::gamate_rom_4in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + gamate_rom_banked_device(mconfig, GAMATE_ROM_4IN1, tag, owner, clock), + m_multibank(0) +{ +} + +//------------------------------------------------- +// mapper specific start/reset +//------------------------------------------------- + +void gamate_rom_banked_device::device_start() +{ + save_item(NAME(m_bank)); +} + +void gamate_rom_4in1_device::device_start() +{ + gamate_rom_banked_device::device_start(); + save_item(NAME(m_multibank)); +} + + +void gamate_rom_banked_device::device_reset() +{ + m_bank = 0; +} + +void gamate_rom_4in1_device::device_reset() +{ + gamate_rom_banked_device::device_reset(); + m_multibank = 0; +} + +/*------------------------------------------------- + mapper specific handlers + -------------------------------------------------*/ + + +READ8_MEMBER(gamate_rom_plain_device::read_cart) +{ + if (m_protection->is_protection_passed()) + { + return read_rom(space, offset, mem_mask); + } + else + { + return m_protection->prot_r() << 1; + } + + return 0xff; +} + +READ8_MEMBER(gamate_rom_plain_device::read_rom) +{ + return m_rom[offset & (m_rom_size-1)]; +} + +READ8_MEMBER(gamate_rom_banked_device::read_rom) +{ + if (offset < 0x4000) + { + return m_rom[offset & (m_rom_size - 1)]; + } + else + { + return m_rom[((m_bank * 0x4000) + (offset & 0x3fff)) & (m_rom_size - 1)]; + } + + return 0xff; +} + +READ8_MEMBER(gamate_rom_4in1_device::read_rom) +{ + if (offset < 0x4000) + { + return m_rom[((m_multibank * 0x4000) + (offset & 0x3fff)) & (m_rom_size - 1)]; + } + else + { + return m_rom[((m_bank * 0x4000) + (offset & 0x3fff)) & (m_rom_size - 1)]; + } +} + +WRITE8_MEMBER(gamate_rom_plain_device::write_cart) +{ + if (m_protection->is_protection_passed()) + { + write_rom(space, offset, data, mem_mask); + } + else + { + m_protection->prot_w((data & 0x04) >> 2); + } +} + +WRITE8_MEMBER(gamate_rom_plain_device::write_rom) +{ + // shouldn't be any write on an unbanked game + logerror("gamate_rom_plain_device::write_rom %04x %02x\n", offset, data); +} + +WRITE8_MEMBER(gamate_rom_banked_device::write_rom) +{ + if (offset == 0x6000) + { + m_bank = data; + } + else + { + logerror("gamate_rom_banked_device::write_rom %04x %02x\n", offset, data); + } +} + +WRITE8_MEMBER(gamate_rom_4in1_device::write_rom) +{ + if (offset == 0x2000) + { + m_multibank = data; + } + else if (offset == 0x6000) + { + m_bank = data; + } + else + { + logerror("gamate_rom_4in1_device::write_rom %04x %02x\n", offset, data); + } +} + +MACHINE_CONFIG_MEMBER( gamate_rom_plain_device::device_add_mconfig ) + MCFG_DEVICE_ADD("protection", GAMATE_PROT, 0) +MACHINE_CONFIG_END + + +/*------------------------------------------------- + slot interface + -------------------------------------------------*/ + +SLOT_INTERFACE_START(gamate_cart) + SLOT_INTERFACE_INTERNAL("plain", GAMATE_ROM_PLAIN) + SLOT_INTERFACE_INTERNAL("banked", GAMATE_ROM_BANKED) + SLOT_INTERFACE_INTERNAL("4in1", GAMATE_ROM_4IN1) +SLOT_INTERFACE_END |