From a00cb49035f7684602f3bc313d8bc77ec6270fb3 Mon Sep 17 00:00:00 2001 From: Ty Lamontagne Date: Sat, 22 Jun 2024 10:14:37 -0400 Subject: [PATCH] COP0 TLB: Fix mapping ScratchpadRam Entries Unsure why that was there. It would vtlbVMapBuffer if the mapping was for SPR (correct) but then continue and map on top of that as if it were a normal mapping. --- pcsx2/COP0.cpp | 57 ++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/pcsx2/COP0.cpp b/pcsx2/COP0.cpp index de487eba07808..491dcf528a871 100644 --- a/pcsx2/COP0.cpp +++ b/pcsx2/COP0.cpp @@ -233,41 +233,48 @@ void MapTLB(const tlbs& t, int i) i, t.VPN2, t.PFN0, t.PFN1, t.S >> 31, t.G, t.ASID, t.Mask, t.EntryLo0 >> 6, (t.EntryLo0 & 0x38) >> 3, t.EntryLo1 >> 6, (t.EntryLo1 & 0x38) >> 3, t.VPN2); + // According to the manual + // 'It [SPR] must be mapped into a contiguous 16 KB of virtual address space that is + // aligned on a 16KB boundary.Results are not guaranteed if this restriction is not followed.' + // Assume that the game isn't doing anything less-than-ideal with the scratchpad mapping and map it directly to eeMem->Scratch. if (t.S) { + if (t.VPN2 != 0x70000000) + Console.Warning("COP0: Mapping Scratchpad to non-default address 0x%08X", t.VPN2); + vtlb_VMapBuffer(t.VPN2, eeMem->Scratch, Ps2MemSize::Scratch); } - - if (t.VPN2 == 0x70000000) - return; //uh uhh right ... - if (t.EntryLo0 & 0x2) + else { - mask = ((~t.Mask) << 1) & 0xfffff; - saddr = t.VPN2 >> 12; - eaddr = saddr + t.Mask + 1; - - for (addr = saddr; addr < eaddr; addr++) + if (t.EntryLo0 & 0x2) { - if ((addr & mask) == ((t.VPN2 >> 12) & mask)) - { //match - memSetPageAddr(addr << 12, t.PFN0 + ((addr - saddr) << 12)); - Cpu->Clear(addr << 12, 0x400); + mask = ((~t.Mask) << 1) & 0xfffff; + saddr = t.VPN2 >> 12; + eaddr = saddr + t.Mask + 1; + + for (addr = saddr; addr < eaddr; addr++) + { + if ((addr & mask) == ((t.VPN2 >> 12) & mask)) + { //match + memSetPageAddr(addr << 12, t.PFN0 + ((addr - saddr) << 12)); + Cpu->Clear(addr << 12, 0x400); + } } } - } - - if (t.EntryLo1 & 0x2) - { - mask = ((~t.Mask) << 1) & 0xfffff; - saddr = (t.VPN2 >> 12) + t.Mask + 1; - eaddr = saddr + t.Mask + 1; - for (addr = saddr; addr < eaddr; addr++) + if (t.EntryLo1 & 0x2) { - if ((addr & mask) == ((t.VPN2 >> 12) & mask)) - { //match - memSetPageAddr(addr << 12, t.PFN1 + ((addr - saddr) << 12)); - Cpu->Clear(addr << 12, 0x400); + mask = ((~t.Mask) << 1) & 0xfffff; + saddr = (t.VPN2 >> 12) + t.Mask + 1; + eaddr = saddr + t.Mask + 1; + + for (addr = saddr; addr < eaddr; addr++) + { + if ((addr & mask) == ((t.VPN2 >> 12) & mask)) + { //match + memSetPageAddr(addr << 12, t.PFN1 + ((addr - saddr) << 12)); + Cpu->Clear(addr << 12, 0x400); + } } } }