From 7bc00fc17ef961494e276060aed3b5333e4ce993 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Wed, 28 Mar 2018 14:47:39 +0200 Subject: bankdev: Allow for an address shift [O. Galibert] --- src/devices/machine/bankdev.cpp | 17 +++++++++-------- src/devices/machine/bankdev.h | 5 +++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/devices/machine/bankdev.cpp b/src/devices/machine/bankdev.cpp index 27c3dc68449..a55e305ae7a 100644 --- a/src/devices/machine/bankdev.cpp +++ b/src/devices/machine/bankdev.cpp @@ -14,7 +14,8 @@ address_map_bank_device::address_map_bank_device( const machine_config &mconfig, m_addr_width(32), m_stride(1), m_program(nullptr), - m_offset(0) + m_offset(0), + m_shift(0) { } @@ -48,17 +49,17 @@ WRITE8_MEMBER(address_map_bank_device::write8) WRITE16_MEMBER(address_map_bank_device::write16) { - m_program->write_word(m_offset + (offset * 2), data, mem_mask); + m_program->write_word(m_offset + (offset << (m_shift+1)), data, mem_mask); } WRITE32_MEMBER(address_map_bank_device::write32) { - m_program->write_dword(m_offset + (offset * 4), data, mem_mask); + m_program->write_dword(m_offset + (offset << (m_shift+2)), data, mem_mask); } WRITE64_MEMBER(address_map_bank_device::write64) { - m_program->write_qword(m_offset + (offset * 8), data, mem_mask); + m_program->write_qword(m_offset + (offset << (m_shift+3)), data, mem_mask); } READ8_MEMBER(address_map_bank_device::read8) @@ -68,22 +69,22 @@ READ8_MEMBER(address_map_bank_device::read8) READ16_MEMBER(address_map_bank_device::read16) { - return m_program->read_word(m_offset + (offset * 2), mem_mask); + return m_program->read_word(m_offset + (offset << (m_shift+1)), mem_mask); } READ32_MEMBER(address_map_bank_device::read32) { - return m_program->read_dword(m_offset + (offset * 4), mem_mask); + return m_program->read_dword(m_offset + (offset << (m_shift+2)), mem_mask); } READ64_MEMBER(address_map_bank_device::read64) { - return m_program->read_qword(m_offset + (offset * 8), mem_mask); + return m_program->read_qword(m_offset + (offset << (m_shift+3)), mem_mask); } void address_map_bank_device::device_config_complete() { - m_program_config = address_space_config( "program", m_endianness, m_data_width, m_addr_width ); + m_program_config = address_space_config( "program", m_endianness, m_data_width, m_addr_width, m_shift ); } void address_map_bank_device::device_start() diff --git a/src/devices/machine/bankdev.h b/src/devices/machine/bankdev.h index 1a40a8f390d..14a14b56779 100644 --- a/src/devices/machine/bankdev.h +++ b/src/devices/machine/bankdev.h @@ -18,6 +18,9 @@ #define MCFG_ADDRESS_MAP_BANK_STRIDE(_stride) \ downcast(*device).set_stride(_stride); +#define MCFG_ADDRESS_MAP_BANK_SHIFT(_shift) \ + downcast(*device).set_shift(_shift); + class address_map_bank_device : public device_t, public device_memory_interface @@ -31,6 +34,7 @@ public: void set_data_width(uint8_t data_width) { m_data_width = data_width; } void set_addr_width(uint8_t addr_width) { m_addr_width = addr_width; } void set_stride(uint32_t stride) { m_stride = stride; } + void set_shift(uint32_t shift) { m_shift = shift; } void amap8(address_map &map); void amap16(address_map &map); @@ -65,6 +69,7 @@ private: address_space_config m_program_config; address_space *m_program; offs_t m_offset; + int m_shift; }; -- cgit v1.2.3