From 34bba2589e3ddbe94642dd3325a49179cdf27f82 Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Thu, 10 Oct 2024 20:51:52 -0400 Subject: [PATCH] tcm (and cache?) reads dont trigger write buffer drains additionally drains are triggered even in no cache + no buffer regions despite documentation not specifying such --- src/CP15.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/CP15.cpp b/src/CP15.cpp index 1d082f04..3ea67f3f 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -1014,9 +1014,6 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch) return 0; } - if ((PU_Map[addr>>12] & 0x30)) - WriteBufferDrain(); - if (addr < ITCMSize) { CodeCycles = 1; @@ -1039,6 +1036,8 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch) //return *(u32*)&CurICacheLine[addr & 0x1C]; } + WriteBufferDrain(); + NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<> 24) == 0x02) @@ -1066,9 +1065,6 @@ bool ARMv5::DataRead8(u32 addr, u32* val) DataCycles = 1; return false; } - - if ((PU_Map[addr>>12] & 0x30)) - WriteBufferDrain(); if (addr < ITCMSize) { @@ -1085,6 +1081,8 @@ bool ARMv5::DataRead8(u32 addr, u32* val) *val = *(u8*)&DTCM[addr & (DTCMPhysicalSize - 1)]; return true; } + + WriteBufferDrain(); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<>12] & 0x30)) - WriteBufferDrain(); if (addr < ITCMSize) { @@ -1133,6 +1129,8 @@ bool ARMv5::DataRead16(u32 addr, u32* val) return true; } + WriteBufferDrain(); + NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<> 12][1]; @@ -1162,9 +1160,6 @@ bool ARMv5::DataRead32(u32 addr, u32* val) addr &= ~3; - if ((PU_Map[addr>>12] & 0x30)) - WriteBufferDrain(); - if (addr < ITCMSize) { DataCycles = 1; @@ -1181,6 +1176,8 @@ bool ARMv5::DataRead32(u32 addr, u32* val) return true; } + WriteBufferDrain(); + NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<> 12][2]; @@ -1209,9 +1206,6 @@ bool ARMv5::DataRead32S(u32 addr, u32* val) addr &= ~3; - if ((PU_Map[addr>>12] & 0x30)) - WriteBufferDrain(); - if (addr < ITCMSize) { DataCycles += 1; @@ -1228,6 +1222,8 @@ bool ARMv5::DataRead32S(u32 addr, u32* val) return true; } + WriteBufferDrain(); + NDS.ARM9Timestamp += DataCycles; if (!(addr & 0x3FF)) return DataRead32(addr, val); // bursts cannot cross a 1kb boundary