diff options
Diffstat (limited to 'src/devices/bus/scv/rom.cpp')
-rw-r--r-- | src/devices/bus/scv/rom.cpp | 260 |
1 files changed, 150 insertions, 110 deletions
diff --git a/src/devices/bus/scv/rom.cpp b/src/devices/bus/scv/rom.cpp index be0dc7aea2c..d430b6de04a 100644 --- a/src/devices/bus/scv/rom.cpp +++ b/src/devices/bus/scv/rom.cpp @@ -13,191 +13,231 @@ #include "rom.h" -//------------------------------------------------- -// scv_rom_device - constructor -//------------------------------------------------- +namespace { -DEFINE_DEVICE_TYPE(SCV_ROM8K, scv_rom8_device, "scv_rom8", "SCV 8K Carts") -DEFINE_DEVICE_TYPE(SCV_ROM16K, scv_rom16_device, "scv_rom16", "SCV 16K Carts") -DEFINE_DEVICE_TYPE(SCV_ROM32K, scv_rom32_device, "scv_rom32", "SCV 32K Carts") -DEFINE_DEVICE_TYPE(SCV_ROM32K_RAM8K, scv_rom32ram8_device, "scv_rom32_ram8", "SCV 32K + RAM 8K Carts") -DEFINE_DEVICE_TYPE(SCV_ROM64K, scv_rom64_device, "scv_rom64", "SCV 64K Carts") -DEFINE_DEVICE_TYPE(SCV_ROM128K, scv_rom128_device, "scv_rom128", "SCV 128K Carts") -DEFINE_DEVICE_TYPE(SCV_ROM128K_RAM4K, scv_rom128ram4_device, "scv_rom128_ram4", "SCV 128K + RAM 4K Carts") +class scv_rom8_device : public device_t, + public device_scv_cart_interface +{ +public: + scv_rom8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : scv_rom8_device(mconfig, SCV_ROM8K, tag, owner, clock) + { } + virtual void install_memory_handlers(address_space *space) override; -scv_rom8_device::scv_rom8_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_scv_cart_interface(mconfig, *this) -{ -} +protected: + scv_rom8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock), device_scv_cart_interface(mconfig, *this) + { } -scv_rom8_device::scv_rom8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : scv_rom8_device(mconfig, SCV_ROM8K, tag, owner, clock) -{ -} + virtual void device_start() override { } + virtual void device_reset() override { } -scv_rom16_device::scv_rom16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : scv_rom8_device(mconfig, SCV_ROM16K, tag, owner, clock) -{ -} + static constexpr u16 CARTRIDGE_ADDRESS_END = 0xff7f; +}; -scv_rom32_device::scv_rom32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : scv_rom8_device(mconfig, SCV_ROM32K, tag, owner, clock) +void scv_rom8_device::install_memory_handlers(address_space *space) { + space->install_rom(0x8000, 0x9fff, cart_rom_region()->base()); + space->install_rom(0xa000, 0xbfff, cart_rom_region()->base()); + space->install_rom(0xc000, 0xdfff, cart_rom_region()->base()); + space->install_rom(0xe000, CARTRIDGE_ADDRESS_END, cart_rom_region()->base()); } -scv_rom32ram8_device::scv_rom32ram8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : scv_rom8_device(mconfig, SCV_ROM32K_RAM8K, tag, owner, clock), m_ram_enabled(0) -{ -} -scv_rom64_device::scv_rom64_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : scv_rom8_device(mconfig, SCV_ROM64K, tag, owner, clock), m_bank_base(0) -{ -} -scv_rom128_device::scv_rom128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : scv_rom8_device(mconfig, SCV_ROM128K, tag, owner, clock), m_bank_base(0) +class scv_rom16_device : public scv_rom8_device { -} +public: + scv_rom16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : scv_rom8_device(mconfig, SCV_ROM16K, tag, owner, clock) + { } -scv_rom128ram4_device::scv_rom128ram4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : scv_rom8_device(mconfig, SCV_ROM128K_RAM4K, tag, owner, clock), m_bank_base(0), m_ram_enabled(0) + virtual void install_memory_handlers(address_space *space) override; +}; + +void scv_rom16_device::install_memory_handlers(address_space *space) { + space->install_rom(0x8000, 0xbfff, cart_rom_region()->base()); + space->install_rom(0xc000, CARTRIDGE_ADDRESS_END, cart_rom_region()->base()); } -//------------------------------------------------- -// mapper specific start/reset -//------------------------------------------------- -void scv_rom32ram8_device::device_start() +class scv_rom32_device : public scv_rom8_device { - save_item(NAME(m_ram_enabled)); -} +public: + scv_rom32_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : scv_rom8_device(mconfig, SCV_ROM32K, tag, owner, clock) + { } -void scv_rom32ram8_device::device_reset() + virtual void install_memory_handlers(address_space *space) override; +}; + +void scv_rom32_device::install_memory_handlers(address_space *space) { - m_ram_enabled = 1; + space->install_rom(0x8000, CARTRIDGE_ADDRESS_END, cart_rom_region()->base()); } -void scv_rom64_device::device_start() -{ - save_item(NAME(m_bank_base)); -} -void scv_rom64_device::device_reset() +class scv_rom32ram8_device : public scv_rom8_device { - m_bank_base = 0; -} +public: + scv_rom32ram8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : scv_rom8_device(mconfig, SCV_ROM32K_RAM8K, tag, owner, clock) + , m_view(*this, "view") + { } + + virtual void install_memory_handlers(address_space *space) override; + virtual void write_bank(uint8_t data) override; +protected: + virtual void device_reset() override ATTR_COLD; -void scv_rom128_device::device_start() +private: + memory_view m_view; +}; + +void scv_rom32ram8_device::device_reset() { - save_item(NAME(m_bank_base)); + m_view.select(1); } -void scv_rom128_device::device_reset() +void scv_rom32ram8_device::install_memory_handlers(address_space *space) { - m_bank_base = 0; + space->install_rom(0x8000, CARTRIDGE_ADDRESS_END, cart_rom_region()->base()); + space->install_view(0xe000, CARTRIDGE_ADDRESS_END, m_view); + m_view[0]; + m_view[1].install_ram(0xe000, CARTRIDGE_ADDRESS_END, cart_ram_region()->base()); } - -void scv_rom128ram4_device::device_start() +void scv_rom32ram8_device::write_bank(uint8_t data) { - save_item(NAME(m_bank_base)); - save_item(NAME(m_ram_enabled)); + m_view.select(BIT(data, 5)); } -void scv_rom128ram4_device::device_reset() + + +class scv_rom64_device : public scv_rom8_device { - m_bank_base = 0; - m_ram_enabled = 1; -} +public: + scv_rom64_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : scv_rom8_device(mconfig, SCV_ROM64K, tag, owner, clock) + , m_bank(*this, "bank") + { } + virtual void install_memory_handlers(address_space *space) override; + virtual void write_bank(uint8_t data) override; +protected: + virtual void device_reset() override ATTR_COLD; -/*------------------------------------------------- - mapper specific handlers - -------------------------------------------------*/ +private: + memory_bank_creator m_bank; +}; -READ8_MEMBER(scv_rom8_device::read_cart) +void scv_rom64_device::device_reset() { - return m_rom[offset & 0x1fff]; + m_bank->set_entry(0); } - -READ8_MEMBER(scv_rom16_device::read_cart) +void scv_rom64_device::install_memory_handlers(address_space *space) { - return m_rom[offset & 0x3fff]; + m_bank->configure_entries(0, 2, cart_rom_region()->base(), 0x8000); + space->install_read_bank(0x8000, CARTRIDGE_ADDRESS_END, m_bank); } - -READ8_MEMBER(scv_rom32_device::read_cart) +void scv_rom64_device::write_bank(uint8_t data) { - return m_rom[offset]; + m_bank->set_entry(BIT(data, 5)); } -READ8_MEMBER(scv_rom32ram8_device::read_cart) + +class scv_rom128_device : public scv_rom8_device { - if (m_ram_enabled && offset >= 0x6000) - return m_ram[offset & 0x1fff]; +public: + scv_rom128_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : scv_rom8_device(mconfig, SCV_ROM128K, tag, owner, clock) + , m_bank(*this, "bank") + { } - return m_rom[offset]; -} + virtual void install_memory_handlers(address_space *space) override; + virtual void write_bank(uint8_t data) override; -WRITE8_MEMBER(scv_rom32ram8_device::write_cart) -{ - if (m_ram_enabled && offset >= 0x6000) - m_ram[offset & 0x1fff] = data; -} +protected: + virtual void device_reset() override ATTR_COLD; -WRITE8_MEMBER(scv_rom32ram8_device::write_bank) +private: + memory_bank_creator m_bank; +}; + +void scv_rom128_device::device_reset() { - m_ram_enabled = BIT(data, 5); + m_bank->set_entry(0); } - -READ8_MEMBER(scv_rom64_device::read_cart) +void scv_rom128_device::install_memory_handlers(address_space *space) { - return m_rom[offset + (m_bank_base * 0x8000)]; + m_bank->configure_entries(0, 4, cart_rom_region()->base(), 0x8000); + space->install_read_bank(0x8000, CARTRIDGE_ADDRESS_END, m_bank); } -WRITE8_MEMBER(scv_rom64_device::write_bank) +void scv_rom128_device::write_bank(uint8_t data) { - m_bank_base = BIT(data, 5); + m_bank->set_entry((data >> 5) & 0x03); } -READ8_MEMBER(scv_rom128_device::read_cart) -{ - return m_rom[offset + (m_bank_base * 0x8000)]; -} -WRITE8_MEMBER(scv_rom128_device::write_bank) +class scv_rom128ram4_device : public scv_rom8_device { - m_bank_base = (data >> 5) & 0x03; -} +public: + scv_rom128ram4_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : scv_rom8_device(mconfig, SCV_ROM128K_RAM4K, tag, owner, clock) + , m_bank(*this, "bank") + , m_view(*this, "view") + { } + virtual void install_memory_handlers(address_space *space) override; + virtual void write_bank(uint8_t data) override; -READ8_MEMBER(scv_rom128ram4_device::read_cart) -{ - if (m_ram_enabled && offset >= 0x7000) - return m_ram[offset & 0xfff]; +protected: + virtual void device_reset() override ATTR_COLD; + +private: + memory_bank_creator m_bank; + memory_view m_view; +}; - return m_rom[offset + (m_bank_base * 0x8000)]; +void scv_rom128ram4_device::device_reset() +{ + m_bank->set_entry(0); + m_view.select(0); } -WRITE8_MEMBER(scv_rom128ram4_device::write_cart) +void scv_rom128ram4_device::install_memory_handlers(address_space *space) { - if (m_ram_enabled && offset >= 0x7000) - m_ram[offset & 0xfff] = data; + m_bank->configure_entries(0, 4, cart_rom_region()->base(), 0x8000); + space->install_read_bank(0x8000, CARTRIDGE_ADDRESS_END, m_bank); + space->install_view(0xf000, CARTRIDGE_ADDRESS_END, m_view); + m_view[0]; + m_view[1].install_ram(0xf000, CARTRIDGE_ADDRESS_END, cart_ram_region()->base()); } -WRITE8_MEMBER(scv_rom128ram4_device::write_bank) +void scv_rom128ram4_device::write_bank(uint8_t data) { - m_bank_base = (data >> 5) & 0x03; - m_ram_enabled = BIT(data, 6); + m_bank->set_entry((data >> 5) & 0x03); + m_view.select(BIT(data, 6)); } + +} // anonymous namespace + +DEFINE_DEVICE_TYPE_PRIVATE(SCV_ROM8K, device_scv_cart_interface, scv_rom8_device, "scv_rom8", "SCV 8K Cartridge") +DEFINE_DEVICE_TYPE_PRIVATE(SCV_ROM16K, device_scv_cart_interface, scv_rom16_device, "scv_rom16", "SCV 16K Cartridge") +DEFINE_DEVICE_TYPE_PRIVATE(SCV_ROM32K, device_scv_cart_interface, scv_rom32_device, "scv_rom32", "SCV 32K Cartridge") +DEFINE_DEVICE_TYPE_PRIVATE(SCV_ROM32K_RAM8K, device_scv_cart_interface, scv_rom32ram8_device, "scv_rom32_ram8", "SCV 32K + RAM 8K Cartridge") +DEFINE_DEVICE_TYPE_PRIVATE(SCV_ROM64K, device_scv_cart_interface, scv_rom64_device, "scv_rom64", "SCV 64K Cartridge") +DEFINE_DEVICE_TYPE_PRIVATE(SCV_ROM128K, device_scv_cart_interface, scv_rom128_device, "scv_rom128", "SCV 128K Cartridge") +DEFINE_DEVICE_TYPE_PRIVATE(SCV_ROM128K_RAM4K, device_scv_cart_interface, scv_rom128ram4_device, "scv_rom128_ram4", "SCV 128K + RAM 4K Cartridge") |