From 604b21c85adb7d313565446b911c2e58ba2d3307 Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:23:58 -0500 Subject: [PATCH] this fixes stuff --- src/CP15.cpp | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/CP15.cpp b/src/CP15.cpp index d650a6cc..993e60d3 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -535,7 +535,9 @@ u32 ARMv5::ICacheLookup(const u32 addr) { if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp + ((1<>14] == DataRegion && Store) NDS.ARM9Timestamp += (1<>14] == WBLastRegion)) // check write buffer + || (Store && (NDS.ARM9Regions[addr>>14] == DataRegion))) //check the actual store + NDS.ARM9Timestamp += 1<>14] == WBLastRegion)) // check write buffer - || (Store && (NDS.ARM9Regions[addr>>14] == DataRegion))) //check the actual store - NDS.ARM9Timestamp += 1<> 61) { @@ -1217,12 +1216,12 @@ inline bool ARMv5::WriteBufferHandle() // get the current timestamp u64 ts; - if (NDS.ARM9Regions[WBCurAddr>>14] == Mem9_MainRAM) + if (((WBCurVal >> 61) != 3) && (NDS.ARM9Regions[WBCurAddr>>14] == Mem9_MainRAM)) ts = std::max(WBTimestamp, MainRAMTimestamp); else ts = WBTimestamp; - ts = (ts + ((1<> 61) != 3) ts = (ts + ((1<>14] == Mem9_MainRAM) MainRAMTimestamp = ts; + WBTimestamp = ts; + if (NDS.ARM9Regions[WBCurAddr>>14] == Mem9_MainRAM) MainRAMTimestamp += 2 << NDS.ARM9ClockShift; } switch (WBCurVal >> 61) @@ -1264,7 +1263,7 @@ inline bool ARMv5::WriteBufferHandle() WBLastRegion = NDS.ARM9Regions[WBCurAddr>>14]; //printf("writing: adr: %i, val: %lli, cyl: %i", WBCurAddr, WBCurVal, WBCurCycles); WBWriting = false; - if constexpr (force == 2) return true; + if ((force == 2) && ((WriteBufferFifo[WBWritePointer] >> 61) != 3)) return true; } // check if write buffer is empty @@ -1304,7 +1303,7 @@ void ARMv5::WriteBufferCheck() if constexpr (next == 1) // check if the next write is occuring { - if (NDS.ARM9Timestamp >= WBTimestamp) + if (WBWriting) { while(!WriteBufferHandle<2>()); } @@ -1328,7 +1327,7 @@ void ARMv5::WriteBufferWrite(u32 val, u8 flag, u32 addr) else if (WBWritePointer == 16) // indicates empty write buffer { WBWritePointer = 0; - if (WBTimestamp < (NDS.ARM9Timestamp + 1)) WBTimestamp = (NDS.ARM9Timestamp + 1 + ((1<>14]; + WBTimestamp = NDS.ARM9Timestamp; BusWrite8(addr, val); } else @@ -2562,6 +2567,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val) WriteBufferWrite(addr, 4); WriteBufferWrite(val, 0, addr); + DataRegion = Mem9_Null; DataCycles = 1; WBDelay = NDS.ARM9Timestamp + 2; } @@ -2644,6 +2650,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val) } else DataRegion = NDS.ARM9Regions[addr>>14]; + WBTimestamp = NDS.ARM9Timestamp; BusWrite16(addr, val); } else @@ -2652,6 +2659,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val) WriteBufferWrite(addr, 4); WriteBufferWrite(val, 1, addr); + DataRegion = Mem9_Null; DataCycles = 1; WBDelay = NDS.ARM9Timestamp + 2; } @@ -2733,7 +2741,8 @@ bool ARMv5::DataWrite32(u32 addr, u32 val) DataCycles -= 2<>14]; - + + WBTimestamp = NDS.ARM9Timestamp; BusWrite32(addr, val); } else @@ -2742,6 +2751,7 @@ bool ARMv5::DataWrite32(u32 addr, u32 val) WriteBufferWrite(addr, 4); WriteBufferWrite(val, 2, addr); + DataRegion = Mem9_Null; DataCycles = 1; WBDelay = NDS.ARM9Timestamp + 2; } @@ -2839,11 +2849,13 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val) else DataRegion = NDS.ARM9Regions[addr>>14]; } + WBTimestamp = NDS.ARM9Timestamp; BusWrite32(addr, val); } else { WriteBufferWrite(val, 3, addr); + DataRegion = Mem9_Null; DataCycles = 1; WBDelay = NDS.ARM9Timestamp + 2; }