summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/addrmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/addrmap.cpp')
-rw-r--r--src/emu/addrmap.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp
index a7a510b56f7..2b3f45b1795 100644
--- a/src/emu/addrmap.cpp
+++ b/src/emu/addrmap.cpp
@@ -36,6 +36,7 @@ address_map_entry::address_map_entry(device_t &device, address_map &map, offs_t
m_addrend((map.m_globalmask == 0) ? end : end & map.m_globalmask),
m_addrmirror(0),
m_addrmask(0),
+ m_addrselect(0),
m_share(nullptr),
m_region(nullptr),
m_rgnoffs(0),
@@ -578,6 +579,9 @@ void address_map::uplift_submaps(running_machine &machine, device_t &device, dev
if (entry->m_addrmask || subentry->m_addrmask)
throw emu_fatalerror("uplift_submaps unhandled case: address masks.\n");
+ if (entry->m_addrselect || subentry->m_addrselect)
+ throw emu_fatalerror("uplift_submaps unhandled case: select masks.\n");
+
if (subentry->m_addrmirror & mirror_address_mask)
throw emu_fatalerror("uplift_submaps unhandled case: address mirror bit within subentry.\n");
@@ -681,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)
{