From 6455bedb9cf8a5d71098676bb72e4d3e304f95aa Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Wed, 8 Apr 2020 23:05:41 +0200 Subject: [PATCH] Fix MT7560 [O. Galibert] --- src/emu/emumem.h | 11 ++++++++++- src/emu/emumem_hea.h | 6 ++++-- src/emu/emumem_hedw.ipp | 4 +++- src/emu/emumem_mud.cpp | 3 +-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/emu/emumem.h b/src/emu/emumem.h index 4e0cf858bb4..98969c9f97c 100644 --- a/src/emu/emumem.h +++ b/src/emu/emumem.h @@ -542,6 +542,8 @@ template class handler_entry_read : public public: using uX = typename emu::detail::handler_entry_size::uX; + static constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask(Width + AddrShift) : 0; + struct mapping { handler_entry_read *original; handler_entry_read *patched; @@ -603,6 +605,8 @@ template class handler_entry_write : publi public: using uX = typename emu::detail::handler_entry_size::uX; + static constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask(Width + AddrShift) : 0; + struct mapping { handler_entry_write *original; handler_entry_write *patched; @@ -617,6 +621,8 @@ public: virtual void lookup(offs_t address, offs_t &start, offs_t &end, handler_entry_write *&handler) const; inline void populate(offs_t start, offs_t end, offs_t mirror, handler_entry_write *handler) { + start &= ~NATIVE_MASK; + end |= ~NATIVE_MASK; if(mirror) populate_mirror(start, end, start, end, mirror, handler); else @@ -627,6 +633,9 @@ public: virtual void populate_mirror(offs_t start, offs_t end, offs_t ostart, offs_t oend, offs_t mirror, handler_entry_write *handler); inline void populate_mismatched(offs_t start, offs_t end, offs_t mirror, const memory_units_descriptor &descriptor) { + start &= ~NATIVE_MASK; + end |= ~NATIVE_MASK; + std::vector mappings; if(mirror) populate_mismatched_mirror(start, end, start, end, mirror, descriptor, mappings); @@ -693,7 +702,7 @@ template= 0 ? NATIVE_BYTES << iabs(AddrShift) : NATIVE_BYTES >> iabs(AddrShift); - constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? (1 << (Width + AddrShift)) - 1 : 0; + constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask(Width + AddrShift) : 0; // equal to native size and aligned; simple pass-through to the native reader if (NATIVE_BYTES == TARGET_BYTES && (Aligned || (address & NATIVE_MASK) == 0)) diff --git a/src/emu/emumem_hea.h b/src/emu/emumem_hea.h index e19a04b4613..2dfb4eb2426 100644 --- a/src/emu/emumem_hea.h +++ b/src/emu/emumem_hea.h @@ -14,7 +14,7 @@ public: ~handler_entry_read_address() = default; inline void set_address_info(offs_t base, offs_t mask) { - m_address_base = base; + m_address_base = base & ~handler_entry_read::NATIVE_MASK; m_address_mask = mask; } @@ -27,11 +27,13 @@ template class handler_entry_write_address public: using uX = typename emu::detail::handler_entry_size::uX; + static constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? (1 << (Width + AddrShift)) - 1 : 0; + handler_entry_write_address(address_space *space, u32 flags) : handler_entry_write(space, flags) {} ~handler_entry_write_address() = default; inline void set_address_info(offs_t base, offs_t mask) { - m_address_base = base; + m_address_base = base & ~handler_entry_write::NATIVE_MASK; m_address_mask = mask; } diff --git a/src/emu/emumem_hedw.ipp b/src/emu/emumem_hedw.ipp index 1496521d094..871d7b20a16 100644 --- a/src/emu/emumem_hedw.ipp +++ b/src/emu/emumem_hedw.ipp @@ -41,8 +41,10 @@ template void handler_entry_ offs_t entry = (cur >> LowBits) & BITMASK; if(m_dispatch[entry]->is_dispatch()) m_dispatch[entry]->dump_map(map); - else + else { + fprintf(stderr, "add range %08x %08x\n", m_ranges[entry].start, m_ranges[entry].end); map.emplace_back(memory_entry{ m_ranges[entry].start, m_ranges[entry].end, m_dispatch[entry] }); + } cur = map.back().end + 1; } while(cur && !((cur ^ base) & UPMASK)); } diff --git a/src/emu/emumem_mud.cpp b/src/emu/emumem_mud.cpp index d1583b58366..2fff5649b62 100644 --- a/src/emu/emumem_mud.cpp +++ b/src/emu/emumem_mud.cpp @@ -37,14 +37,13 @@ template<> u8 mask_to_ukey(u64 mask) template memory_units_descriptor::memory_units_descriptor(u8 access_width, u8 access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, typename emu::detail::handler_entry_size::uX unitmask, int cswidth) : m_handler(handler), m_access_width(access_width), m_access_endian(access_endian) { - constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask(Width + AddrShift) : 0; u32 bits_per_access = 8 << access_width; + constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask(Width + AddrShift) : 0; // Compute the real base addresses m_addrstart = addrstart & ~NATIVE_MASK; m_addrend = addrend & ~NATIVE_MASK; - // Compute the masks and the keys std::array umasks; umasks.fill(unitmask);