summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/pce/pce_rom.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/pce/pce_rom.cpp')
-rw-r--r--src/devices/bus/pce/pce_rom.cpp153
1 files changed, 57 insertions, 96 deletions
diff --git a/src/devices/bus/pce/pce_rom.cpp b/src/devices/bus/pce/pce_rom.cpp
index cb4070d14a1..374fedf595b 100644
--- a/src/devices/bus/pce/pce_rom.cpp
+++ b/src/devices/bus/pce/pce_rom.cpp
@@ -3,7 +3,7 @@
/***********************************************************************************************************
- PC-Engine & Turbografx-16 cart emulation
+ PC-Engine & Turbografx-16 HuCard emulation
***********************************************************************************************************/
@@ -13,20 +13,20 @@
#include "pce_rom.h"
+
//-------------------------------------------------
// pce_rom_device - constructor
//-------------------------------------------------
-DEFINE_DEVICE_TYPE(PCE_ROM_STD, pce_rom_device, "pce_rom", "PCE/TG16 Carts")
-DEFINE_DEVICE_TYPE(PCE_ROM_CDSYS3, pce_cdsys3_device, "pce_cdsys3", "PCE/TG16 CD-System Cart v3.00")
-DEFINE_DEVICE_TYPE(PCE_ROM_POPULOUS, pce_populous_device, "pce_populous", "PCE Populous Cart")
-DEFINE_DEVICE_TYPE(PCE_ROM_SF2, pce_sf2_device, "pce_sf2", "PCE Street Fighter 2 CE Cart")
-DEFINE_DEVICE_TYPE(PCE_ROM_TENNOKOE, pce_tennokoe_device, "pce_tennokoe", "PCE Tennokoe Bank Cart")
+DEFINE_DEVICE_TYPE(PCE_ROM_STD, pce_rom_device, "pce_rom", "PCE/TG16 HuCards")
+DEFINE_DEVICE_TYPE(PCE_ROM_POPULOUS, pce_populous_device, "pce_populous", "PCE Populous HuCard")
+DEFINE_DEVICE_TYPE(PCE_ROM_SF2, pce_sf2_device, "pce_sf2", "PCE Street Fighter 2 CE HuCard")
+DEFINE_DEVICE_TYPE(PCE_ROM_TENNOKOE, pce_tennokoe_device, "pce_tennokoe", "PCE Tennokoe Bank HuCard")
pce_rom_device::pce_rom_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_pce_cart_interface( mconfig, *this )
+ , device_pce_cart_interface(mconfig, *this)
{
}
@@ -35,24 +35,20 @@ pce_rom_device::pce_rom_device(const machine_config &mconfig, const char *tag, d
{
}
-pce_cdsys3_device::pce_cdsys3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : pce_rom_device(mconfig, PCE_ROM_CDSYS3, tag, owner, clock)
-{
-}
-
pce_populous_device::pce_populous_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: pce_rom_device(mconfig, PCE_ROM_POPULOUS, tag, owner, clock)
{
}
pce_sf2_device::pce_sf2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : pce_rom_device(mconfig, PCE_ROM_SF2, tag, owner, clock), m_bank_base(0)
+ : pce_rom_device(mconfig, PCE_ROM_SF2, tag, owner, clock)
+ , m_rom_bank(*this, "rom_bank")
{
}
pce_tennokoe_device::pce_tennokoe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : pce_rom_device(mconfig, PCE_ROM_TENNOKOE, tag, owner, clock),
- device_nvram_interface(mconfig, *this)
+ : pce_rom_device(mconfig, PCE_ROM_TENNOKOE, tag, owner, clock)
+ , device_nvram_interface(mconfig, *this)
{
}
@@ -62,14 +58,9 @@ pce_tennokoe_device::pce_tennokoe_device(const machine_config &mconfig, const ch
//-------------------------------------------------
-void pce_sf2_device::device_start()
-{
- save_item(NAME(m_bank_base));
-}
-
void pce_sf2_device::device_reset()
{
- m_bank_base = 0;
+ m_rom_bank->set_entry(0);
}
void pce_tennokoe_device::device_start()
@@ -111,111 +102,81 @@ void pce_tennokoe_device::nvram_default()
memcpy(m_bram + 0x1800, m_rom + 0x8800, 0x800);
}
-void pce_tennokoe_device::nvram_read(emu_file &file)
+bool pce_tennokoe_device::nvram_read(util::read_stream &file)
{
- file.read(m_bram, m_bram_size);
+ auto const [err, actual] = read(file, m_bram, m_bram_size);
+ return !err && (actual == m_bram_size);
}
-void pce_tennokoe_device::nvram_write(emu_file &file)
+bool pce_tennokoe_device::nvram_write(util::write_stream &file)
{
- file.write(m_bram, m_bram_size);
+ auto const [err, actual] = write(file, m_bram, m_bram_size);
+ return !err;
}
/*-------------------------------------------------
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(pce_rom_device::read_cart)
+uint8_t pce_rom_device::rom_r(offs_t offset)
{
int bank = offset / 0x20000;
return m_rom[rom_bank_map[bank] * 0x20000 + (offset & 0x1ffff)];
}
-
-READ8_MEMBER(pce_cdsys3_device::read_cart)
+void pce_rom_device::install_memory_handlers(address_space &space)
{
- int bank = offset / 0x20000;
- if (!m_ram.empty() && offset >= 0xd0000)
- return m_ram[offset - 0xd0000];
+ space.install_read_handler(0x00000, 0xfffff, emu::rw_delegate(*this, FUNC(pce_rom_device::rom_r)));
+}
- return m_rom[rom_bank_map[bank] * 0x20000 + (offset & 0x1ffff)];
+
+void pce_populous_device::install_memory_handlers(address_space &space)
+{
+ pce_rom_device::install_memory_handlers(space);
+ space.install_ram(0x80000, 0x87fff, &m_ram[0]);
}
-WRITE8_MEMBER(pce_cdsys3_device::write_cart)
+
+void pce_sf2_device::bank_w(offs_t offset, uint8_t data)
{
- if (!m_ram.empty() && offset >= 0xd0000)
- m_ram[offset - 0xd0000] = data;
+ m_rom_bank->set_entry(offset & 3);
}
-READ8_MEMBER(pce_populous_device::read_cart)
+void pce_sf2_device::install_memory_handlers(address_space &space)
{
- int bank = offset / 0x20000;
- if (!m_ram.empty() && offset >= 0x80000 && offset < 0x88000)
- return m_ram[offset & 0x7fff];
+ m_rom_bank->configure_entries(0, 4, m_rom + 0x80000, 0x80000);
+ space.install_rom(0x000000, 0x07ffff, m_rom);
+ space.install_read_bank(0x080000, 0x0fffff, m_rom_bank);
+ space.install_write_handler(0x001ff0, 0x001ff3, emu::rw_delegate(*this, FUNC(pce_sf2_device::bank_w)));
+}
- return m_rom[rom_bank_map[bank] * 0x20000 + (offset & 0x1ffff)];
+
+uint8_t pce_tennokoe_device::bram_r(offs_t offset)
+{
+ if (m_bram_locked)
+ return 0xff;
+ else
+ return m_bram[offset & (m_bram_size-1)];
}
-WRITE8_MEMBER(pce_populous_device::write_cart)
+void pce_tennokoe_device::bram_w(offs_t offset, uint8_t data)
{
- if (!m_ram.empty() && offset >= 0x80000 && offset < 0x88000)
- m_ram[offset & 0x7fff] = data;
+ if (!m_bram_locked)
+ m_bram[offset & (m_bram_size-1)] = data;
}
+void pce_tennokoe_device::bram_lock_w(offs_t offset, uint8_t data)
+{
+ // TODO: lock/unlock mechanism is a complete guess, needs real HW study
+ m_bram_locked = (data == 0);
+}
-READ8_MEMBER(pce_sf2_device::read_cart)
+void pce_tennokoe_device::install_memory_handlers(address_space &space)
{
- if (offset < 0x80000)
- return m_rom[offset];
- else
- return m_rom[0x80000 + m_bank_base * 0x80000 + (offset & 0x7ffff)];
-}
-
-WRITE8_MEMBER(pce_sf2_device::write_cart)
-{
- if (offset >= 0x1ff0 && offset < 0x1ff4)
- m_bank_base = offset & 3;
-}
-
-READ8_MEMBER(pce_tennokoe_device::read_cart)
-{
- switch((offset & 0xf0000) >> 16)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- return m_rom[offset];
- case 8:
- if (m_bram_locked)
- return 0xff;
- else
- return m_bram[offset & (m_bram_size-1)];
- }
-
- logerror("tennokoe: ROM reading at %06x\n",offset);
- return 0xff;
-}
-
-WRITE8_MEMBER(pce_tennokoe_device::write_cart)
-{
- switch((offset & 0xf0000) >> 16)
- {
- case 8:
- if(!m_bram_locked)
- m_bram[offset & (m_bram_size-1)] = data;
- break;
- case 0xf:
- // TODO: lock/unlock mechanism is a complete guess, needs real HW study
- // (writes to ports $c0000, $d0000, $f0000)
- m_bram_locked = (data == 0);
- default:
- logerror("tennokoe: ROM writing at %06x %02x\n",offset,data);
- break;
- }
+ space.install_rom(0x000000, 0x07ffff, m_rom);
+ space.install_readwrite_handler(0x080000, 0x081fff, 0, 0x00e000, 0, emu::rw_delegate(*this, FUNC(pce_tennokoe_device::bram_r)), emu::rw_delegate(*this, FUNC(pce_tennokoe_device::bram_w)));
+ // (writes to ports $c0000, $d0000, $f0000)
+ space.install_write_handler(0x0f0000, 0x0f0000, 0, 0x00ffff, 0, emu::rw_delegate(*this, FUNC(pce_tennokoe_device::bram_lock_w)));
}
+