diff options
author | 2018-03-28 14:47:39 +0200 | |
---|---|---|
committer | 2018-04-05 15:01:25 +0200 | |
commit | 7bc00fc17ef961494e276060aed3b5333e4ce993 (patch) | |
tree | a8597d870b81706a4cc827e226a3cb8e01143151 | |
parent | 1f4f0e19edfc9fb66bf228d9271396ab7cb6c200 (diff) |
bankdev: Allow for an address shift [O. Galibert]
-rw-r--r-- | src/devices/machine/bankdev.cpp | 17 | ||||
-rw-r--r-- | 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<address_map_bank_device &>(*device).set_stride(_stride); +#define MCFG_ADDRESS_MAP_BANK_SHIFT(_shift) \ + downcast<address_map_bank_device &>(*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; }; |