From bf378e22f4bfff2c27f6bedfcea44c6feb6ac420 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 10 Jun 2021 09:35:16 -0400 Subject: emumem: Correct logic in populate_mismatched_nomirror and populate_passthrough_nomirror. This fixes a bug causing watchpoints set on portions of the address space exceeding 16K to sometimes not fully cover the range. --- src/emu/emumem_hedr.ipp | 54 ++++++++++++++++++++++++------------------------- src/emu/emumem_hedw.ipp | 48 ++++++++++++++++++++----------------------- 2 files changed, 49 insertions(+), 53 deletions(-) diff --git a/src/emu/emumem_hedr.ipp b/src/emu/emumem_hedr.ipp index 5af8664932b..460735a2f63 100644 --- a/src/emu/emumem_hedr.ipp +++ b/src/emu/emumem_hedr.ipp @@ -183,7 +183,7 @@ template void handl range_cut_before(ostart-1, start_entry); range_cut_after(oend+1, end_entry); - if(LowBits <= Width + AddrShift) { + if constexpr(LowBits <= Width + AddrShift) { if(handler->is_view()) handler->init_handlers(start_entry, end_entry, LowBits, m_u_dispatch, m_u_ranges); handler->ref(end_entry - start_entry); @@ -317,7 +317,7 @@ template void handl range_cut_before(ostart-1, start_entry); range_cut_after(oend+1, end_entry); - if(LowBits <= Width + AddrShift) { + if constexpr(LowBits <= Width + AddrShift) { for(offs_t ent = start_entry; ent <= end_entry; ent++) { u8 rkey1 = rkey; if(ent != start_entry) @@ -331,7 +331,7 @@ template void handl } else if(start_entry == end_entry) { if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) { if(m_u_dispatch[start_entry]->is_dispatch()) - m_u_dispatch[start_entry]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey, mappings); + m_u_dispatch[start_entry]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey, mappings); else { mismatched_patch(descriptor, rkey, mappings, m_u_dispatch[start_entry]); m_u_ranges[start_entry].set(ostart, oend); @@ -351,19 +351,17 @@ template void handl rkey &= ~handler_entry::END; } - if(start_entry <= end_entry) { - for(offs_t ent = start_entry; ent <= end_entry; ent++) { - u8 rkey1 = rkey; - if(ent != start_entry) - rkey1 &= ~handler_entry::START; - if(ent != end_entry) - rkey1 &= ~handler_entry::END; - if(m_u_dispatch[ent]->is_dispatch()) - m_u_dispatch[ent]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey1, mappings); - else { - mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]); - m_u_ranges[ent].set(ostart, oend); - } + for(offs_t ent = start_entry; ent <= end_entry; ent++) { + u8 rkey1 = rkey; + if(ent != start_entry) + rkey1 &= ~handler_entry::START; + if(ent != end_entry) + rkey1 &= ~handler_entry::END; + if(m_u_dispatch[ent]->is_dispatch()) + m_u_dispatch[ent]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey1, mappings); + else { + mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]); + m_u_ranges[ent].set(ostart, oend); } } } @@ -448,7 +446,7 @@ template void handl range_cut_before(ostart-1, start_entry); range_cut_after(oend+1, end_entry); - if(LowBits <= Width + AddrShift) { + if constexpr(LowBits <= Width + AddrShift) { for(offs_t ent = start_entry; ent <= end_entry; ent++) { passthrough_patch(handler, mappings, m_u_dispatch[ent]); m_u_ranges[ent].intersect(ostart, oend); @@ -456,8 +454,12 @@ template void handl } else if(start_entry == end_entry) { if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) { - passthrough_patch(handler, mappings, m_u_dispatch[start_entry]); - m_u_ranges[start_entry].intersect(ostart, oend); + if(m_u_dispatch[start_entry]->is_dispatch()) + m_u_dispatch[start_entry]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings); + else { + passthrough_patch(handler, mappings, m_u_dispatch[start_entry]); + m_u_ranges[start_entry].intersect(ostart, oend); + } } else populate_passthrough_nomirror_subdispatch(start_entry, start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings); @@ -471,14 +473,12 @@ template void handl end_entry--; } - if(start_entry <= end_entry) { - for(offs_t ent = start_entry; ent <= end_entry; ent++) { - if(m_u_dispatch[ent]->is_dispatch()) - m_u_dispatch[ent]->populate_passthrough_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings); - else { - passthrough_patch(handler, mappings, m_u_dispatch[ent]); - m_u_ranges[ent].intersect(ostart, oend); - } + for(offs_t ent = start_entry; ent <= end_entry; ent++) { + if(m_u_dispatch[ent]->is_dispatch()) + m_u_dispatch[ent]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings); + else { + passthrough_patch(handler, mappings, m_u_dispatch[ent]); + m_u_ranges[ent].intersect(ostart, oend); } } } diff --git a/src/emu/emumem_hedw.ipp b/src/emu/emumem_hedw.ipp index 1c0a791c569..43ba5768b55 100644 --- a/src/emu/emumem_hedw.ipp +++ b/src/emu/emumem_hedw.ipp @@ -185,7 +185,7 @@ template void handl range_cut_before(ostart-1, start_entry); range_cut_after(oend+1, end_entry); - if(LowBits <= Width + AddrShift) { + if constexpr(LowBits <= Width + AddrShift) { if(handler->is_view()) handler->init_handlers(start_entry, end_entry, LowBits, m_u_dispatch, m_u_ranges); handler->ref(end_entry - start_entry); @@ -319,7 +319,7 @@ template void handl range_cut_before(ostart-1, start_entry); range_cut_after(oend+1, end_entry); - if(LowBits <= Width + AddrShift) { + if constexpr(LowBits <= Width + AddrShift) { for(offs_t ent = start_entry; ent <= end_entry; ent++) { u8 rkey1 = rkey; if(ent != start_entry) @@ -333,7 +333,7 @@ template void handl } else if(start_entry == end_entry) { if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) { if(m_u_dispatch[start_entry]->is_dispatch()) - m_u_dispatch[start_entry]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey, mappings); + m_u_dispatch[start_entry]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey, mappings); else { mismatched_patch(descriptor, rkey, mappings, m_u_dispatch[start_entry]); m_u_ranges[start_entry].intersect(ostart, oend); @@ -353,19 +353,17 @@ template void handl rkey &= ~handler_entry::END; } - if(start_entry <= end_entry) { - for(offs_t ent = start_entry; ent <= end_entry; ent++) { - u8 rkey1 = rkey; - if(ent != start_entry) - rkey1 &= ~handler_entry::START; - if(ent != end_entry) - rkey1 &= ~handler_entry::END; - if(m_u_dispatch[ent]->is_dispatch()) - m_u_dispatch[ent]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey1, mappings); - else { - mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]); - m_u_ranges[ent].intersect(ostart, oend); - } + for(offs_t ent = start_entry; ent <= end_entry; ent++) { + u8 rkey1 = rkey; + if(ent != start_entry) + rkey1 &= ~handler_entry::START; + if(ent != end_entry) + rkey1 &= ~handler_entry::END; + if(m_u_dispatch[ent]->is_dispatch()) + m_u_dispatch[ent]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey1, mappings); + else { + mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]); + m_u_ranges[ent].intersect(ostart, oend); } } } @@ -450,7 +448,7 @@ template void handl range_cut_before(ostart-1, start_entry); range_cut_after(oend+1, end_entry); - if(LowBits <= Width + AddrShift) { + if constexpr(LowBits <= Width + AddrShift) { for(offs_t ent = start_entry; ent <= end_entry; ent++) { passthrough_patch(handler, mappings, m_u_dispatch[ent]); m_u_ranges[ent].intersect(ostart, oend); @@ -459,7 +457,7 @@ template void handl } else if(start_entry == end_entry) { if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) { if(m_u_dispatch[start_entry]->is_dispatch()) - m_u_dispatch[start_entry]->populate_passthrough_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings); + m_u_dispatch[start_entry]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings); else { passthrough_patch(handler, mappings, m_u_dispatch[start_entry]); m_u_ranges[start_entry].intersect(ostart, oend); @@ -477,14 +475,12 @@ template void handl end_entry--; } - if(start_entry <= end_entry) { - for(offs_t ent = start_entry; ent <= end_entry; ent++) { - if(m_u_dispatch[ent]->is_dispatch()) - m_u_dispatch[ent]->populate_passthrough_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings); - else { - passthrough_patch(handler, mappings, m_u_dispatch[ent]); - m_u_ranges[ent].intersect(ostart, oend); - } + for(offs_t ent = start_entry; ent <= end_entry; ent++) { + if(m_u_dispatch[ent]->is_dispatch()) + m_u_dispatch[ent]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings); + else { + passthrough_patch(handler, mappings, m_u_dispatch[ent]); + m_u_ranges[ent].intersect(ostart, oend); } } } -- cgit v1.2.3