summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/devfind.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/devfind.cpp')
-rw-r--r--src/emu/devfind.cpp55
1 files changed, 52 insertions, 3 deletions
diff --git a/src/emu/devfind.cpp b/src/emu/devfind.cpp
index d251e56ce0b..7669b331832 100644
--- a/src/emu/devfind.cpp
+++ b/src/emu/devfind.cpp
@@ -45,27 +45,76 @@ void *finder_base::find_memregion(UINT8 width, size_t &length, bool required) co
// look up the region and return NULL if not found
memory_region *region = m_base.memregion(m_tag);
if (region == nullptr)
+ {
+ length = 0;
return nullptr;
+ }
// check the width and warn if not correct
if (region->bytewidth() != width)
{
if (required)
osd_printf_warning("Region '%s' found but is width %d, not %d as requested\n", m_tag, region->bitwidth(), width*8);
+ length = 0;
+ return nullptr;
+ }
+
+ // check the length and warn if other than specified
+ size_t length_found = region->bytes() / width;
+ if (length != 0 && length != length_found)
+ {
+ if (required)
+ osd_printf_warning("Region '%s' found but has %d bytes, not %d as requested\n", m_tag, region->bytes(), (int)length*width);
+ length = 0;
return nullptr;
}
// return results
- length = region->bytes() / width;
+ length = length_found;
return region->base();
}
//-------------------------------------------------
+// validate_memregion - find memory region
+//-------------------------------------------------
+
+bool finder_base::validate_memregion(size_t bytes, bool required) const
+{
+ // make sure we can resolve the full path to the region
+ size_t bytes_found = 0;
+ std::string region_fulltag = m_base.subtag(m_tag);
+
+ // look for the region
+ device_iterator deviter(m_base.mconfig().root_device());
+ for (device_t *dev = deviter.first(); dev != nullptr && bytes_found == 0; dev = deviter.next())
+ for (const rom_entry *romp = rom_first_region(*dev); romp != nullptr; romp = rom_next_region(romp))
+ {
+ if (rom_region_name(*dev, romp) == region_fulltag)
+ {
+ bytes_found = ROMREGION_GETLENGTH(romp);
+ break;
+ }
+ }
+
+ if (bytes_found != 0)
+ {
+ // check the length and warn if other than specified
+ if (bytes != 0 && bytes != bytes_found)
+ {
+ osd_printf_warning("Region '%s' found but has %d bytes, not %d as requested\n", m_tag, (int)bytes_found, (int)bytes);
+ bytes_found = 0;
+ }
+ }
+ return report_missing(bytes_found != 0, "memory region", required);
+}
+
+
+//-------------------------------------------------
// find_memshare - find memory share
//-------------------------------------------------
-void *finder_base::find_memshare(UINT8 width, size_t &bytes, bool required)
+void *finder_base::find_memshare(UINT8 width, size_t &bytes, bool required) const
{
// look up the share and return NULL if not found
memory_share *share = m_base.memshare(m_tag);
@@ -91,7 +140,7 @@ void *finder_base::find_memshare(UINT8 width, size_t &bytes, bool required)
// return true if it's ok
//-------------------------------------------------
-bool finder_base::report_missing(bool found, const char *objname, bool required)
+bool finder_base::report_missing(bool found, const char *objname, bool required) const
{
if (required && strcmp(m_tag, FINDER_DUMMY_TAG)==0)
{