From a662af908df04e48f0bd041b26958b5905629fdd Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Sun, 3 Nov 2024 11:24:58 -0500 Subject: [PATCH] improved...? --- src/ARM.h | 2 +- src/CP15.cpp | 43 ++++++++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/ARM.h b/src/ARM.h index a36009fb..efdf9eba 100644 --- a/src/ARM.h +++ b/src/ARM.h @@ -393,7 +393,7 @@ public: void ICacheInvalidateAll(); template inline bool WriteBufferHandle(); - template void WriteBufferCheck(); + template void WriteBufferCheck(); void WriteBufferWrite(u32 val, u8 flag, u32 addr = 0); void WriteBufferDrain(); diff --git a/src/CP15.cpp b/src/CP15.cpp index 8bff685c..e0019e7e 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -1217,7 +1217,7 @@ inline bool ARMv5::WriteBufferHandle() NDS.ARM9Timestamp = ts; } - WBTimestamp = ts; + WBTimestamp = (ts + ((1<>14] == Mem9_MainRAM) MainRAMTimestamp = ts + ((((WBCurVal >> 61) == 0) ? 4 : 5) << NDS.ARM9ClockShift); else WBTimestamp += 2; // todo: twl timings @@ -1274,32 +1274,37 @@ inline bool ARMv5::WriteBufferHandle() return false; } -template +template void ARMv5::WriteBufferCheck() { - while (!WriteBufferHandle()); // loop until we've cleared out all writeable entries + while (!WriteBufferHandle<0>()); // loop until we've cleared out all writeable entries - if constexpr (next) // check if the next write is occuring + if constexpr (next == 1) // check if the next write is occuring { if (NDS.ARM9Timestamp >= WBTimestamp) { while(!WriteBufferHandle<2>()); } } + else if constexpr (next == 2) + { + while(!WriteBufferHandle<2>()); + } } -template void ARMv5::WriteBufferCheck(); -template void ARMv5::WriteBufferCheck(); +template void ARMv5::WriteBufferCheck<2>(); +template void ARMv5::WriteBufferCheck<1>(); +template void ARMv5::WriteBufferCheck<0>(); void ARMv5::WriteBufferWrite(u32 val, u8 flag, u32 addr) { - WriteBufferCheck(); + WriteBufferCheck<0>(); if (WBFillPointer == WBWritePointer) // if the write buffer is full then we stall the cpu until room is made - WriteBufferHandle(); + WriteBufferHandle<1>(); else if (WBWritePointer == 16) // indicates empty write buffer { WBWritePointer = 0; - if (WBTimestamp < (NDS.ARM9Timestamp + 1)) WBTimestamp = NDS.ARM9Timestamp + 1; + if (WBTimestamp < (NDS.ARM9Timestamp + 1)) WBTimestamp = (NDS.ARM9Timestamp + 1 + ((1<()); // loop until drained fully + while (!WriteBufferHandle<1>()); // loop until drained fully } void ARMv5::CP15Write(u32 id, u32 val) @@ -2074,7 +2079,7 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch) if (PU_Map[addr>>12] & 0x30) WriteBufferDrain(); else - WriteBufferCheck(); + WriteBufferCheck<1>(); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<>12] & 0x30) WriteBufferDrain(); else - WriteBufferCheck(); + WriteBufferCheck<1>(); NDS.ARM9Timestamp = (NDS.ARM9Timestamp + ((1<>12] & 0x30) WriteBufferDrain(); else - WriteBufferCheck(); + WriteBufferCheck<1>(); NDS.ARM9Timestamp = (NDS.ARM9Timestamp + ((1<>12] & 0x30) WriteBufferDrain(); else - WriteBufferCheck(); + WriteBufferCheck<1>(); NDS.ARM9Timestamp = (NDS.ARM9Timestamp + ((1<>12] & 0x30) // checkme WriteBufferDrain(); else - WriteBufferCheck(); + WriteBufferCheck<1>(); // bursts cannot cross a 1kb boundary if (addr & 0x3FF) // s @@ -2510,7 +2515,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val) if (!(PU_Map[addr>>12] & (0x30))) { - WriteBufferCheck(); + WriteBufferCheck<2>(); NDS.ARM9Timestamp = (NDS.ARM9Timestamp + ((1<>12] & 0x30)) { - WriteBufferCheck(); + WriteBufferCheck<2>(); NDS.ARM9Timestamp = (NDS.ARM9Timestamp + ((1<>12] & 0x30)) { - WriteBufferCheck(); + WriteBufferCheck<2>(); NDS.ARM9Timestamp = (NDS.ARM9Timestamp + ((1<>12] & 0x30)) // non-bufferable { - WriteBufferCheck(); + WriteBufferCheck<2>(); // bursts cannot cross a 1kb boundary if (addr & 0x3FF) // s