summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2018-03-28 14:47:39 +0200
committer Olivier Galibert <galibert@pobox.com>2018-04-05 15:01:25 +0200
commit7bc00fc17ef961494e276060aed3b5333e4ce993 (patch)
treea8597d870b81706a4cc827e226a3cb8e01143151
parent1f4f0e19edfc9fb66bf228d9271396ab7cb6c200 (diff)
bankdev: Allow for an address shift [O. Galibert]
-rw-r--r--src/devices/machine/bankdev.cpp17
-rw-r--r--src/devices/machine/bankdev.h5
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;
};