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.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp
index c1ba4545492..97f46511237 100644
--- a/src/emu/addrmap.cpp
+++ b/src/emu/addrmap.cpp
@@ -1176,6 +1176,39 @@ void address_map::map_validity_check(validity_checker &valid, int spacenum) cons
offs_t const length = region.get_length();
if (entry.m_rgnoffs + spaceconfig.addr2byte(entry.m_addrend - entry.m_addrstart + 1) > length)
osd_printf_error("%s space memory map entry %X-%X extends beyond region '%s' size (%X)\n", spaceconfig.m_name, entry.m_addrstart, entry.m_addrend, entry.m_region, length);
+
+ device_t *rgndev = dev.subdevice(region.get_tag());
+ if (rgndev != m_device)
+ {
+ int rgnwidth = region.get_width();
+ bool rgnisbe = region.is_bigendian();
+
+ // memory interface sets region width when tags are the same
+ device_memory_interface *memintf;
+ if (rgndev != nullptr && rgndev->interface(memintf))
+ {
+ const address_space_config *rgncfg = memintf->space_config(0);
+ if (rgncfg != nullptr)
+ {
+ rgnwidth = rgncfg->data_width();
+ rgnisbe = rgncfg->endianness() == ENDIANNESS_BIG;
+ }
+ }
+
+ // verify data width
+ if (rgnwidth != spaceconfig.data_width())
+ osd_printf_error("%s space is %d-bit but references %d-bit region '%s'\n", spaceconfig.m_name, spaceconfig.data_width(), rgnwidth, dev.subtag(region.get_tag()));
+
+ // verify endianness
+ if (rgnwidth != 8)
+ {
+ if (!rgnisbe && spaceconfig.endianness() == ENDIANNESS_BIG)
+ osd_printf_error("%s space is big-endian but references little-endian region '%s'\n", spaceconfig.m_name, dev.subtag(region.get_tag()));
+ else if (rgnisbe && spaceconfig.endianness() == ENDIANNESS_LITTLE)
+ osd_printf_error("%s space is little-endian but references big-endian region '%s'\n", spaceconfig.m_name, dev.subtag(region.get_tag()));
+ }
+ }
+
found = true;
}
}