summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/emumem.cpp
diff options
context:
space:
mode:
author Firehawke <Firehawke@users.noreply.github.com>2017-12-13 21:31:27 -0700
committer Firehawke <Firehawke@users.noreply.github.com>2017-12-13 21:31:27 -0700
commit9ece34eb218c5c1960468294c733fd00ac7fa696 (patch)
tree7160ed8d2cbe2127aaaef0a21f8736403b0f8a7c /src/emu/emumem.cpp
parent54155441e9ba9941e85d80c4834a66376a11e791 (diff)
Revert "Revert "Merge branch 'master' of https://github.com/mamedev/mame""
This reverts commit 54155441e9ba9941e85d80c4834a66376a11e791.
Diffstat (limited to 'src/emu/emumem.cpp')
-rw-r--r--src/emu/emumem.cpp86
1 files changed, 68 insertions, 18 deletions
diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp
index 2b63aa4952b..bbbf3b59fda 100644
--- a/src/emu/emumem.cpp
+++ b/src/emu/emumem.cpp
@@ -738,18 +738,20 @@ private:
}
// internal watchpoint handler
- template<typename UintType>
+ template<typename UintType, int AddrShift>
UintType watchpoint_r(address_space &space, offs_t offset, UintType mask)
{
- m_space.device().debug()->memory_read_hook(m_space, offset * sizeof(UintType), mask);
+ int base_shift = sizeof(UintType) == 1 ? 0 : sizeof(UintType) == 2 ? 1 : sizeof(UintType) == 4 ? 2 : 3;
+ offset = offset << (AddrShift + base_shift);
+ m_space.device().debug()->memory_read_hook(m_space, offset, mask);
u16 *oldtable = m_live_lookup;
m_live_lookup = &m_table[0];
UintType result;
if (sizeof(UintType) == 1) result = m_space.read_byte(offset);
- if (sizeof(UintType) == 2) result = m_space.read_word(offset << 1, mask);
- if (sizeof(UintType) == 4) result = m_space.read_dword(offset << 2, mask);
- if (sizeof(UintType) == 8) result = m_space.read_qword(offset << 3, mask);
+ if (sizeof(UintType) == 2) result = m_space.read_word(offset, mask);
+ if (sizeof(UintType) == 4) result = m_space.read_dword(offset, mask);
+ if (sizeof(UintType) == 8) result = m_space.read_qword(offset, mask);
m_live_lookup = oldtable;
return result;
}
@@ -806,17 +808,19 @@ private:
{
}
- template<typename UintType>
+ template<typename UintType, int AddrShift>
void watchpoint_w(address_space &space, offs_t offset, UintType data, UintType mask)
{
- m_space.device().debug()->memory_write_hook(m_space, offset * sizeof(UintType), data, mask);
+ int base_shift = sizeof(UintType) == 1 ? 0 : sizeof(UintType) == 2 ? 1 : sizeof(UintType) == 4 ? 2 : 3;
+ offset = offset << (AddrShift + base_shift);
+ m_space.device().debug()->memory_write_hook(m_space, offset, data, mask);
u16 *oldtable = m_live_lookup;
m_live_lookup = &m_table[0];
if (sizeof(UintType) == 1) m_space.write_byte(offset, data);
- if (sizeof(UintType) == 2) m_space.write_word(offset << 1, data, mask);
- if (sizeof(UintType) == 4) m_space.write_dword(offset << 2, data, mask);
- if (sizeof(UintType) == 8) m_space.write_qword(offset << 3, data, mask);
+ if (sizeof(UintType) == 2) m_space.write_word(offset, data, mask);
+ if (sizeof(UintType) == 4) m_space.write_dword(offset, data, mask);
+ if (sizeof(UintType) == 8) m_space.write_qword(offset, data, mask);
m_live_lookup = oldtable;
}
@@ -3913,28 +3917,51 @@ address_table_read::address_table_read(address_space &space, bool large)
case 8:
m_handlers[STATIC_UNMAP]->set_delegate(read8_delegate(FUNC(address_table_read::unmap_r<u8>), this));
m_handlers[STATIC_NOP]->set_delegate(read8_delegate(FUNC(address_table_read::nop_r<u8>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(read8_delegate(FUNC(address_table_read::watchpoint_r<u8>), this));
+ switch (space.addr_shift())
+ {
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(read8_delegate (&address_table_read::watchpoint_r<u8, 0>, "watchpoint_r", this)); break;
+ default: abort();
+ }
break;
// 16-bit case
case 16:
m_handlers[STATIC_UNMAP]->set_delegate(read16_delegate(FUNC(address_table_read::unmap_r<u16>), this));
m_handlers[STATIC_NOP]->set_delegate(read16_delegate(FUNC(address_table_read::nop_r<u16>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(read16_delegate(FUNC(address_table_read::watchpoint_r<u16>), this));
+ switch (space.addr_shift())
+ {
+ case -1: m_handlers[STATIC_WATCHPOINT]->set_delegate(read16_delegate(&address_table_read::watchpoint_r<u16, -1>, "watchpoint_r", this)); break;
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(read16_delegate(&address_table_read::watchpoint_r<u16, 0>, "watchpoint_r", this)); break;
+ case 3: m_handlers[STATIC_WATCHPOINT]->set_delegate(read16_delegate(&address_table_read::watchpoint_r<u16, 3>, "watchpoint_r", this)); break;
+ default: abort();
+ }
break;
// 32-bit case
case 32:
m_handlers[STATIC_UNMAP]->set_delegate(read32_delegate(FUNC(address_table_read::unmap_r<u32>), this));
m_handlers[STATIC_NOP]->set_delegate(read32_delegate(FUNC(address_table_read::nop_r<u32>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(read32_delegate(FUNC(address_table_read::watchpoint_r<u32>), this));
+ switch (space.addr_shift())
+ {
+ case -2: m_handlers[STATIC_WATCHPOINT]->set_delegate(read32_delegate(&address_table_read::watchpoint_r<u32, -2>, "watchpoint_r", this)); break;
+ case -1: m_handlers[STATIC_WATCHPOINT]->set_delegate(read32_delegate(&address_table_read::watchpoint_r<u32, -1>, "watchpoint_r", this)); break;
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(read32_delegate(&address_table_read::watchpoint_r<u32, 0>, "watchpoint_r", this)); break;
+ default: abort();
+ }
break;
// 64-bit case
case 64:
m_handlers[STATIC_UNMAP]->set_delegate(read64_delegate(FUNC(address_table_read::unmap_r<u64>), this));
m_handlers[STATIC_NOP]->set_delegate(read64_delegate(FUNC(address_table_read::nop_r<u64>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(read64_delegate(FUNC(address_table_read::watchpoint_r<u64>), this));
+ switch (space.addr_shift())
+ {
+ case -3: m_handlers[STATIC_WATCHPOINT]->set_delegate(read64_delegate(&address_table_read::watchpoint_r<u64, -3>, "watchpoint_r", this)); break;
+ case -2: m_handlers[STATIC_WATCHPOINT]->set_delegate(read64_delegate(&address_table_read::watchpoint_r<u64, -2>, "watchpoint_r", this)); break;
+ case -1: m_handlers[STATIC_WATCHPOINT]->set_delegate(read64_delegate(&address_table_read::watchpoint_r<u64, -1>, "watchpoint_r", this)); break;
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(read64_delegate(&address_table_read::watchpoint_r<u64, 0>, "watchpoint_r", this)); break;
+ default: abort();
+ }
break;
}
@@ -3987,28 +4014,51 @@ address_table_write::address_table_write(address_space &space, bool large)
case 8:
m_handlers[STATIC_UNMAP]->set_delegate(write8_delegate(FUNC(address_table_write::unmap_w<u8>), this));
m_handlers[STATIC_NOP]->set_delegate(write8_delegate(FUNC(address_table_write::nop_w<u8>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(write8_delegate(FUNC(address_table_write::watchpoint_w<u8>), this));
+ switch (space.addr_shift())
+ {
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(write8_delegate (&address_table_write::watchpoint_w<u8, 0>, "watchpoint_w", this)); break;
+ default: abort();
+ }
break;
// 16-bit case
case 16:
m_handlers[STATIC_UNMAP]->set_delegate(write16_delegate(FUNC(address_table_write::unmap_w<u16>), this));
m_handlers[STATIC_NOP]->set_delegate(write16_delegate(FUNC(address_table_write::nop_w<u16>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(write16_delegate(FUNC(address_table_write::watchpoint_w<u16>), this));
+ switch (space.addr_shift())
+ {
+ case -1: m_handlers[STATIC_WATCHPOINT]->set_delegate(write16_delegate(&address_table_write::watchpoint_w<u16, -1>, "watchpoint_w", this)); break;
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(write16_delegate(&address_table_write::watchpoint_w<u16, 0>, "watchpoint_w", this)); break;
+ case 3: m_handlers[STATIC_WATCHPOINT]->set_delegate(write16_delegate(&address_table_write::watchpoint_w<u16, 3>, "watchpoint_w", this)); break;
+ default: abort();
+ }
break;
// 32-bit case
case 32:
m_handlers[STATIC_UNMAP]->set_delegate(write32_delegate(FUNC(address_table_write::unmap_w<u32>), this));
m_handlers[STATIC_NOP]->set_delegate(write32_delegate(FUNC(address_table_write::nop_w<u32>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(write32_delegate(FUNC(address_table_write::watchpoint_w<u32>), this));
+ switch (space.addr_shift())
+ {
+ case -2: m_handlers[STATIC_WATCHPOINT]->set_delegate(write32_delegate(&address_table_write::watchpoint_w<u32, -2>, "watchpoint_w", this)); break;
+ case -1: m_handlers[STATIC_WATCHPOINT]->set_delegate(write32_delegate(&address_table_write::watchpoint_w<u32, -1>, "watchpoint_w", this)); break;
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(write32_delegate(&address_table_write::watchpoint_w<u32, 0>, "watchpoint_w", this)); break;
+ default: abort();
+ }
break;
// 64-bit case
case 64:
m_handlers[STATIC_UNMAP]->set_delegate(write64_delegate(FUNC(address_table_write::unmap_w<u64>), this));
m_handlers[STATIC_NOP]->set_delegate(write64_delegate(FUNC(address_table_write::nop_w<u64>), this));
- m_handlers[STATIC_WATCHPOINT]->set_delegate(write64_delegate(FUNC(address_table_write::watchpoint_w<u64>), this));
+ switch (space.addr_shift())
+ {
+ case -3: m_handlers[STATIC_WATCHPOINT]->set_delegate(write64_delegate(&address_table_write::watchpoint_w<u64, -3>, "watchpoint_w", this)); break;
+ case -2: m_handlers[STATIC_WATCHPOINT]->set_delegate(write64_delegate(&address_table_write::watchpoint_w<u64, -2>, "watchpoint_w", this)); break;
+ case -1: m_handlers[STATIC_WATCHPOINT]->set_delegate(write64_delegate(&address_table_write::watchpoint_w<u64, -1>, "watchpoint_w", this)); break;
+ case 0: m_handlers[STATIC_WATCHPOINT]->set_delegate(write64_delegate(&address_table_write::watchpoint_w<u64, 0>, "watchpoint_w", this)); break;
+ default: abort();
+ }
break;
}