diff options
Diffstat (limited to 'src/emu/addrmap.cpp')
-rw-r--r-- | src/emu/addrmap.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp index 679e9e926bf..ccf56f56a83 100644 --- a/src/emu/addrmap.cpp +++ b/src/emu/addrmap.cpp @@ -498,12 +498,17 @@ void address_map::import_submaps(running_machine &machine, device_t &owner, int // Recursively import if needed submap.import_submaps(machine, *mapdevice, data_width, endian); + offs_t max_end = entry->m_addrend - entry->m_addrstart; + if(!entry->m_mask || (entry->m_mask & base_unitmask) == base_unitmask) { // Easy case, no unitmask at mapping level - Merge in all the map contents in order while (submap.m_entrylist.count()) { address_map_entry *subentry = submap.m_entrylist.detach_head(); + if (subentry->m_addrend > max_end) + subentry->m_addrend = max_end; + subentry->m_addrstart += entry->m_addrstart; subentry->m_addrend += entry->m_addrstart; subentry->m_addrmirror |= entry->m_addrmirror; @@ -516,9 +521,6 @@ void address_map::import_submaps(running_machine &machine, device_t &owner, int continue; } - if (subentry->m_addrend > entry->m_addrend) - subentry->m_addrend = entry->m_addrend; - // Insert the entry in the map m_entrylist.insert_after(*subentry, prev); prev = subentry; @@ -532,6 +534,7 @@ void address_map::import_submaps(running_machine &machine, device_t &owner, int if ((entry->m_mask >> i) & 1) ratio ++; ratio = data_width / ratio; + max_end = (max_end + 1) / ratio - 1; // Then merge the contents taking the ratio into account while (submap.m_entrylist.count()) @@ -564,6 +567,9 @@ void address_map::import_submaps(running_machine &machine, device_t &owner, int else subentry->m_mask = entry->m_mask; + if (subentry->m_addrend > max_end) + subentry->m_addrend = max_end; + subentry->m_addrstart = subentry->m_addrstart * ratio + entry->m_addrstart; subentry->m_addrend = (subentry->m_addrend + 1) * ratio - 1 + entry->m_addrstart; subentry->m_addrmirror = (subentry->m_addrmirror / ratio) | entry->m_addrmirror; @@ -576,9 +582,6 @@ void address_map::import_submaps(running_machine &machine, device_t &owner, int continue; } - if (subentry->m_addrend > entry->m_addrend) - subentry->m_addrend = entry->m_addrend; - // Insert the entry in the map m_entrylist.insert_after(*subentry, prev); prev = subentry; |