diff options
Diffstat (limited to 'src/devices/machine/bankdev.c')
-rw-r--r-- | src/devices/machine/bankdev.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/devices/machine/bankdev.c b/src/devices/machine/bankdev.c new file mode 100644 index 00000000000..1a600527511 --- /dev/null +++ b/src/devices/machine/bankdev.c @@ -0,0 +1,90 @@ +// license:BSD-3-Clause +// copyright-holders:smf +#include "bankdev.h" + +// device type definition +const device_type ADDRESS_MAP_BANK = &device_creator<address_map_bank_device>; + +address_map_bank_device::address_map_bank_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ) + : device_t(mconfig, ADDRESS_MAP_BANK, "Address Map Bank", tag, owner, clock, "address_map_bank", __FILE__), + device_memory_interface(mconfig, *this), + m_endianness(ENDIANNESS_NATIVE), + m_databus_width(0), + m_addrbus_width(32), + m_stride(1), + m_offset(0) +{ +} + +DEVICE_ADDRESS_MAP_START(amap8, 8, address_map_bank_device) + AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE(read8, write8) +ADDRESS_MAP_END + +DEVICE_ADDRESS_MAP_START(amap16, 16, address_map_bank_device) + AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE(read16, write16) +ADDRESS_MAP_END + +DEVICE_ADDRESS_MAP_START(amap32, 32, address_map_bank_device) + AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE(read32, write32) +ADDRESS_MAP_END + +DEVICE_ADDRESS_MAP_START(amap64, 64, address_map_bank_device) + AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE(read64, write64) +ADDRESS_MAP_END + +WRITE8_MEMBER(address_map_bank_device::write8) +{ + m_program->write_byte(m_offset + offset, data); +} + +WRITE16_MEMBER(address_map_bank_device::write16) +{ + m_program->write_word(m_offset + (offset * 2), data, mem_mask); +} + +WRITE32_MEMBER(address_map_bank_device::write32) +{ + m_program->write_dword(m_offset + (offset * 4), data, mem_mask); +} + +WRITE64_MEMBER(address_map_bank_device::write64) +{ + m_program->write_qword(m_offset + (offset * 8), data, mem_mask); +} + +READ8_MEMBER(address_map_bank_device::read8) +{ + return m_program->read_byte(m_offset + offset); +} + +READ16_MEMBER(address_map_bank_device::read16) +{ + return m_program->read_word(m_offset + (offset * 2), mem_mask); +} + +READ32_MEMBER(address_map_bank_device::read32) +{ + return m_program->read_dword(m_offset + (offset * 4), mem_mask); +} + +READ64_MEMBER(address_map_bank_device::read64) +{ + return m_program->read_qword(m_offset + (offset * 8), mem_mask); +} + +void address_map_bank_device::device_config_complete() +{ + m_program_config = address_space_config( "program", m_endianness, m_databus_width, m_addrbus_width ); +} + +void address_map_bank_device::device_start() +{ + m_program = &space(AS_PROGRAM); + + save_item(NAME(m_offset)); +} + +void address_map_bank_device::set_bank(offs_t bank) +{ + m_offset = bank * m_stride; +} |