diff options
Diffstat (limited to 'src/devices/bus/vtech/memexp/memexp.cpp')
-rw-r--r-- | src/devices/bus/vtech/memexp/memexp.cpp | 135 |
1 files changed, 100 insertions, 35 deletions
diff --git a/src/devices/bus/vtech/memexp/memexp.cpp b/src/devices/bus/vtech/memexp/memexp.cpp index 90f51da7345..984849fe9ab 100644 --- a/src/devices/bus/vtech/memexp/memexp.cpp +++ b/src/devices/bus/vtech/memexp/memexp.cpp @@ -1,5 +1,5 @@ -// license:GPL-2.0+ -// copyright-holders:Dirk Best +// license: GPL-2.0+ +// copyright-holders: Dirk Best /*************************************************************************** VTech Laser/VZ Memory Expansion Slot @@ -29,10 +29,9 @@ DEFINE_DEVICE_TYPE(VTECH_MEMEXP_SLOT, vtech_memexp_slot_device, "vtech_memexp_sl vtech_memexp_slot_device::vtech_memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, VTECH_MEMEXP_SLOT, tag, owner, clock), - device_slot_interface(mconfig, *this), - m_program(*this, finder_base::DUMMY_TAG, -1), - m_io(*this, finder_base::DUMMY_TAG, -1), - m_cart(nullptr), + device_single_card_slot_interface<device_vtech_memexp_interface>(mconfig, *this), + m_memspace(*this, finder_base::DUMMY_TAG, -1), + m_iospace(*this, finder_base::DUMMY_TAG, -1), m_int_handler(*this), m_nmi_handler(*this), m_reset_handler(*this) @@ -48,66 +47,132 @@ vtech_memexp_slot_device::~vtech_memexp_slot_device() } //------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete +// device_start - device-specific startup //------------------------------------------------- -void vtech_memexp_slot_device::device_config_complete() +void vtech_memexp_slot_device::device_start() { - // for passthrough connectors, use the parent slot's spaces - if (dynamic_cast<device_vtech_memexp_interface *>(owner()) != nullptr) - { - auto parent = dynamic_cast<vtech_memexp_slot_device *>(owner()->owner()); - if (parent != nullptr) + // get inserted module + m_module = get_card_device(); + + // install memory access taps + m_memspace->install_readwrite_tap + ( + 0x0000, 0xffff, "mem_tap", + [this](offs_t offset, uint8_t &data, uint8_t mem_mask) + { + if (m_module) + data &= m_module->mreq_r(offset); + }, + [this](offs_t offset, uint8_t &data, uint8_t mem_mask) { - if (m_program.finder_tag() == finder_base::DUMMY_TAG) - m_program.set_tag(parent->m_program, parent->m_program.spacenum()); - if (m_io.finder_tag() == finder_base::DUMMY_TAG) - m_io.set_tag(parent->m_io, parent->m_io.spacenum()); + if (m_module) + m_module->mreq_w(offset, data); } - } + ); + + // install io access taps + m_iospace->install_readwrite_tap + ( + 0x00, 0xff, "io_tap", + [this](offs_t offset, uint8_t &data, uint8_t mem_mask) + { + if (m_module) + data &= m_module->iorq_r(offset); + }, + [this](offs_t offset, uint8_t &data, uint8_t mem_mask) + { + if (m_module) + m_module->iorq_w(offset, data); + } + ); } + +//************************************************************************** +// CARTRIDGE INTERFACE +//************************************************************************** + //------------------------------------------------- -// device_start - device-specific startup +// device_vtech_memexp_interface - constructor //------------------------------------------------- -void vtech_memexp_slot_device::device_start() +device_vtech_memexp_interface::device_vtech_memexp_interface(const machine_config &mconfig, device_t &device) : + device_interface(device, "vtechmemexp") { - // resolve callbacks - m_int_handler.resolve_safe(); - m_nmi_handler.resolve_safe(); - m_reset_handler.resolve_safe(); + m_slot = dynamic_cast<vtech_memexp_slot_device *>(device.owner()); } //------------------------------------------------- -// device_reset - device-specific reset +// ~device_vtech_memexp_interface - destructor //------------------------------------------------- -void vtech_memexp_slot_device::device_reset() +device_vtech_memexp_interface::~device_vtech_memexp_interface() { } //************************************************************************** -// CARTRIDGE INTERFACE +// BASE DEVICE //************************************************************************** //------------------------------------------------- -// device_vtech_memexp_interface - constructor +// vtech_memexp_device - constructor //------------------------------------------------- -device_vtech_memexp_interface::device_vtech_memexp_interface(const machine_config &mconfig, device_t &device) : - device_slot_card_interface(mconfig, device) +vtech_memexp_device::vtech_memexp_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_vtech_memexp_interface(mconfig, *this), + m_mem(*this, "memspace"), + m_io(*this, "iospace") { - m_slot = dynamic_cast<vtech_memexp_slot_device *>(device.owner()); } //------------------------------------------------- -// ~device_vtech_memexp_interface - destructor +// device_add_mconfig - add device configuration //------------------------------------------------- -device_vtech_memexp_interface::~device_vtech_memexp_interface() +void vtech_memexp_device::device_add_mconfig(machine_config &config) +{ + ADDRESS_MAP_BANK(config, m_mem); + m_mem->set_addrmap(AS_PROGRAM, &vtech_memexp_device::mem_map); + m_mem->set_data_width(8); + m_mem->set_addr_width(16); + + ADDRESS_MAP_BANK(config, m_io); + m_io->set_addrmap(AS_PROGRAM, &vtech_memexp_device::io_map); + m_io->set_data_width(8); + m_io->set_addr_width(16); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void vtech_memexp_device::device_start() +{ + // silence unmapped warnings, or we'll get them for everything the + // expansion device doesn't handle + m_mem->set_log_unmap(false); + m_io->set_log_unmap(false); +} + +uint8_t vtech_memexp_device::mreq_r(offs_t offset) +{ + return m_mem->read8(offset); +} + +void vtech_memexp_device::mreq_w(offs_t offset, uint8_t data) +{ + m_mem->write8(offset, data); +} + +uint8_t vtech_memexp_device::iorq_r(offs_t offset) +{ + return m_io->read8(offset); +} + +void vtech_memexp_device::iorq_w(offs_t offset, uint8_t data) { + m_io->write8(offset, data); } |