diff options
Diffstat (limited to 'src/emu/devfind.cpp')
-rw-r--r-- | src/emu/devfind.cpp | 55 |
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) { |