diff options
Diffstat (limited to 'src/devices/bus/vtech/memexp/memory.cpp')
-rw-r--r-- | src/devices/bus/vtech/memexp/memory.cpp | 112 |
1 files changed, 61 insertions, 51 deletions
diff --git a/src/devices/bus/vtech/memexp/memory.cpp b/src/devices/bus/vtech/memexp/memory.cpp index 15ccbeb949e..bfac5f06b4c 100644 --- a/src/devices/bus/vtech/memexp/memory.cpp +++ b/src/devices/bus/vtech/memexp/memory.cpp @@ -25,31 +25,31 @@ DEFINE_DEVICE_TYPE(VTECH_LASER_64K, vtech_laser_64k_device, "vtech_laser_6 //************************************************************************** //------------------------------------------------- -// laser110_16k_device - constructor +// mem_map - memory space address map //------------------------------------------------- -vtech_laser110_16k_device::vtech_laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, VTECH_LASER110_16K, tag, owner, clock), - device_vtech_memexp_interface(mconfig, *this) +void vtech_laser110_16k_device::mem_map(address_map &map) { + map.unmap_value_high(); + map(0x8000, 0xbfff).ram(); } //------------------------------------------------- -// device_start - device-specific startup +// laser110_16k_device - constructor //------------------------------------------------- -void vtech_laser110_16k_device::device_start() +vtech_laser110_16k_device::vtech_laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + vtech_memexp_device(mconfig, VTECH_LASER110_16K, tag, owner, clock) { - m_ram.resize(16 * 1024); } //------------------------------------------------- -// device_reset - device-specific reset +// device_start - device-specific startup //------------------------------------------------- -void vtech_laser110_16k_device::device_reset() +void vtech_laser110_16k_device::device_start() { - program_space().install_ram(0x8000, 0xbfff, &m_ram[0]); + vtech_memexp_device::device_start(); } @@ -58,31 +58,31 @@ void vtech_laser110_16k_device::device_reset() //************************************************************************** //------------------------------------------------- -// vtech_laser210_16k_device - constructor +// mem_map - memory space address map //------------------------------------------------- -vtech_laser210_16k_device::vtech_laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, VTECH_LASER210_16K, tag, owner, clock), - device_vtech_memexp_interface(mconfig, *this) +void vtech_laser210_16k_device::mem_map(address_map &map) { + map.unmap_value_high(); + map(0x9000, 0xcfff).ram(); } //------------------------------------------------- -// device_start - device-specific startup +// vtech_laser210_16k_device - constructor //------------------------------------------------- -void vtech_laser210_16k_device::device_start() +vtech_laser210_16k_device::vtech_laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + vtech_memexp_device(mconfig, VTECH_LASER210_16K, tag, owner, clock) { - m_ram.resize(16 * 1024); } //------------------------------------------------- -// device_reset - device-specific reset +// device_start - device-specific startup //------------------------------------------------- -void vtech_laser210_16k_device::device_reset() +void vtech_laser210_16k_device::device_start() { - program_space().install_ram(0x9000, 0xcfff, &m_ram[0]); + vtech_memexp_device::device_start(); } @@ -91,31 +91,31 @@ void vtech_laser210_16k_device::device_reset() //************************************************************************** //------------------------------------------------- -// vtech_laser310_16k_device - constructor +// mem_map - memory space address map //------------------------------------------------- -vtech_laser310_16k_device::vtech_laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, VTECH_LASER310_16K, tag, owner, clock), - device_vtech_memexp_interface(mconfig, *this) +void vtech_laser310_16k_device::mem_map(address_map &map) { + map.unmap_value_high(); + map(0xb800, 0xf7ff).ram(); } //------------------------------------------------- -// device_start - device-specific startup +// vtech_laser310_16k_device - constructor //------------------------------------------------- -void vtech_laser310_16k_device::device_start() +vtech_laser310_16k_device::vtech_laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + vtech_memexp_device(mconfig, VTECH_LASER310_16K, tag, owner, clock) { - m_ram.resize(16 * 1024); } //------------------------------------------------- -// device_reset - device-specific reset +// device_start - device-specific startup //------------------------------------------------- -void vtech_laser310_16k_device::device_reset() +void vtech_laser310_16k_device::device_start() { - program_space().install_ram(0xb800, 0xf7ff, &m_ram[0]); + vtech_memexp_device::device_start(); } @@ -124,44 +124,54 @@ void vtech_laser310_16k_device::device_reset() //************************************************************************** //------------------------------------------------- -// vtech_laser_64k_device - constructor +// mem_map - memory space address map //------------------------------------------------- -vtech_laser_64k_device::vtech_laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, VTECH_LASER_64K, tag, owner, clock), - device_vtech_memexp_interface(mconfig, *this) +void vtech_laser_64k_device::mem_map(address_map &map) { + map.unmap_value_high(); + map(0x8000, 0xbfff).bankrw(m_fixed_bank); + map(0xc000, 0xffff).bankrw(m_bank); } //------------------------------------------------- -// device_start - device-specific startup +// io_map - memory space address map //------------------------------------------------- -void vtech_laser_64k_device::device_start() +void vtech_laser_64k_device::io_map(address_map &map) +{ + map.unmap_value_high(); + map(0x70, 0x70).mirror(0x0f).lw8(NAME([this] (uint8_t data) { m_bank->set_entry(data & 0x03); })); +} + +//------------------------------------------------- +// vtech_laser_64k_device - constructor +//------------------------------------------------- + +vtech_laser_64k_device::vtech_laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + vtech_memexp_device(mconfig, VTECH_LASER_64K, tag, owner, clock), + m_fixed_bank(*this, "fixed_bank"), + m_bank(*this, "bank") { - m_ram.resize(64 * 1024); } //------------------------------------------------- -// device_reset - device-specific reset +// device_start - device-specific startup //------------------------------------------------- -void vtech_laser_64k_device::device_reset() +void vtech_laser_64k_device::device_start() { - // fixed first bank - program_space().install_ram(0x8000, 0xbfff, &m_ram[0]); + vtech_memexp_device::device_start(); - // other banks - program_space().install_readwrite_bank(0xc000, 0xffff, tag()); + // init ram + m_ram = std::make_unique<uint8_t[]>(0x10000); - membank(tag())->configure_entries(0, 4, &m_ram[0], 0x4000); - membank(tag())->set_entry(1); + // configure banking + m_fixed_bank->set_base(m_ram.get()); - // bank switch - io_space().install_write_handler(0x70, 0x7f, write8_delegate(FUNC(vtech_laser_64k_device::bankswitch_w), this)); -} + m_bank->configure_entries(0, 4, m_ram.get(), 0x4000); + m_bank->set_entry(1); -WRITE8_MEMBER( vtech_laser_64k_device::bankswitch_w ) -{ - membank(tag())->set_entry(data & 0x03); + // register for savestates + save_pointer(NAME(m_ram), 0x10000); } |