summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/addrmap.cpp
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2016-06-17 10:36:52 -0400
committer AJR <ajrhacker@users.noreply.github.com>2016-06-17 14:05:34 -0400
commit0d6f7bc4b0b78c41d51aad2f9e8a1fdb364cb851 (patch)
treee9c4ddde12454901b382c3d25d4fdfb47919219b /src/emu/addrmap.cpp
parent19dee7dd9b64f89ea9d3ba29c0befce67b8786eb (diff)
Validity checking for AM_MASK/AM_MIRROR/AM_SELECT, based on OG's recent restrictions (nw)
- Update address maps so all drivers pass checks - Comment out some irregularly-patterned mirrors on RAM areas (needs better solution)
Diffstat (limited to 'src/emu/addrmap.cpp')
-rw-r--r--src/emu/addrmap.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp
index e3c6810e867..2b3f45b1795 100644
--- a/src/emu/addrmap.cpp
+++ b/src/emu/addrmap.cpp
@@ -685,6 +685,28 @@ void address_map::map_validity_check(validity_checker &valid, const device_t &de
if ((bytestart & (alignunit - 1)) != 0 || (byteend & (alignunit - 1)) != (alignunit - 1))
osd_printf_error("Wrong %s memory read handler start = %08x, end = %08x ALIGN = %d\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, alignunit);
+ // verify mask/mirror/select
+ offs_t set_bits = entry.m_addrstart | entry.m_addrend;
+ offs_t changing_bits = entry.m_addrstart ^ entry.m_addrend;
+ changing_bits |= changing_bits >> 1;
+ changing_bits |= changing_bits >> 2;
+ changing_bits |= changing_bits >> 4;
+ changing_bits |= changing_bits >> 8;
+ changing_bits |= changing_bits >> 16;
+
+ if (entry.m_addrmask & ~changing_bits)
+ osd_printf_error("In %s memory range %x-%x, mask %x is trying to unmask an unchanging address bit (%x)\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmask & ~changing_bits);
+ if (entry.m_addrmirror & changing_bits)
+ osd_printf_error("In %s memory range %x-%x, mirror %x touches a changing address bit (%x)\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, entry.m_addrmirror, entry.m_addrmirror & changing_bits);
+ if (entry.m_addrselect & changing_bits)
+ osd_printf_error("In %s memory range %x-%x, select %x touches a changing address bit (%x)\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, entry.m_addrselect, entry.m_addrselect & changing_bits);
+ if (entry.m_addrmirror & set_bits)
+ osd_printf_error("In %s memory range %x-%x, mirror %x touches a set address bit (%x)\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, entry.m_addrmirror, entry.m_addrmirror & set_bits);
+ if (entry.m_addrselect & set_bits)
+ osd_printf_error("In %s memory range %x-%x, select %x touches a set address bit (%x)\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, entry.m_addrselect, entry.m_addrselect & set_bits);
+ if (entry.m_addrmirror & entry.m_addrselect)
+ osd_printf_error("In %s memory range %x-%x, mirror %x touches a select bit (%x)\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, entry.m_addrmirror, entry.m_addrmirror & entry.m_addrselect);
+
// if this is a program space, auto-assign implicit ROM entries
if (entry.m_read.m_type == AMH_ROM && entry.m_region == nullptr)
{