mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
emumem: Fix some issues [O. Galibert]
It's actually a very old bug that was uncovered. Direct access update mistaked the per-handler mask and the global mask. As it happened the per-handler mask was often the global mask, but I made the frontend *way* more agressive w.r.t masks now. So the bug became way more visible.
This commit is contained in:
parent
b24b54ccbf
commit
1c3a6595ff
@ -3922,9 +3922,6 @@ bool direct_read_data::set_direct_region(offs_t &byteaddress)
|
||||
byteaddress = overrideaddress;
|
||||
}
|
||||
|
||||
// remove the masked bits (we'll put them back later)
|
||||
offs_t maskedbits = overrideaddress & ~m_bytemask;
|
||||
|
||||
// find or allocate a matching range
|
||||
direct_range *range = find_range(overrideaddress, m_entry);
|
||||
|
||||
@ -3940,6 +3937,7 @@ bool direct_read_data::set_direct_region(offs_t &byteaddress)
|
||||
UINT8 *base = *m_space.manager().bank_pointer_addr(m_entry);
|
||||
|
||||
// compute the adjusted base
|
||||
offs_t maskedbits = overrideaddress & ~m_space.bytemask();
|
||||
const handler_entry_read &handler = m_space.read().handler_read(m_entry);
|
||||
m_bytemask = handler.bytemask();
|
||||
m_ptr = base - (handler.bytestart() & m_bytemask);
|
||||
@ -3964,15 +3962,8 @@ direct_read_data::direct_range *direct_read_data::find_range(offs_t byteaddress,
|
||||
if (byteaddress >= range.m_bytestart && byteaddress <= range.m_byteend)
|
||||
return ⦥
|
||||
|
||||
// didn't find out; allocate a new one
|
||||
// didn't find out; create a new one
|
||||
direct_range range;
|
||||
if (m_freerangelist.size() > 0)
|
||||
{
|
||||
range = m_freerangelist.front();
|
||||
m_freerangelist.pop_front();
|
||||
}
|
||||
|
||||
// fill in the range
|
||||
m_space.read().derive_range(byteaddress, range.m_bytestart, range.m_byteend);
|
||||
m_rangelist[entry].push_front(range);
|
||||
|
||||
@ -3991,14 +3982,13 @@ void direct_read_data::remove_intersecting_ranges(offs_t bytestart, offs_t bytee
|
||||
for (auto & elem : m_rangelist)
|
||||
{
|
||||
// loop over all ranges in this entry's list
|
||||
for (std::list<direct_range>::iterator range = elem.begin(); range!=elem.end();++range)
|
||||
for (auto range = elem.begin(); range!=elem.end();)
|
||||
{
|
||||
// if we intersect, remove and add to the free range list
|
||||
// if we intersect, remove
|
||||
if (bytestart <= range->m_byteend && byteend >= range->m_bytestart)
|
||||
{
|
||||
m_freerangelist.push_front(*range);
|
||||
elem.erase(range);
|
||||
}
|
||||
range = elem.erase(range);
|
||||
else
|
||||
range ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -199,7 +199,6 @@ private:
|
||||
offs_t m_byteend; // maximum valid byte address
|
||||
UINT16 m_entry; // live entry
|
||||
std::list<direct_range> m_rangelist[TOTAL_MEMORY_BANKS]; // list of ranges for each entry
|
||||
std::list<direct_range> m_freerangelist; // list of recycled range entries
|
||||
direct_update_delegate m_directupdate; // fast direct-access update callback
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user