From 21763ceed3fb95fbf73ac55b4ae3ec0cda63dac8 Mon Sep 17 00:00:00 2001
From: Jaklyy <102590697+Jaklyy@users.noreply.github.com>
Date: Tue, 15 Oct 2024 21:20:10 -0400
Subject: [PATCH] reduce memtimings lut granularity

---
 src/ARM.h    |  2 +-
 src/CP15.cpp | 33 ++++++++++++---------------------
 src/DSi.cpp  |  2 +-
 src/NDS.cpp  |  2 +-
 4 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/src/ARM.h b/src/ARM.h
index dbf2d9cb..b0d5abe3 100644
--- a/src/ARM.h
+++ b/src/ARM.h
@@ -670,7 +670,7 @@ public:
     u8* PU_Map;                                     //! Current valid Region Mapping (is either @ref PU_PrivMap or PU_UserMap)
 
     // code/16N/32N/32S
-    u8 MemTimings[CP15_MAP_ENTRYCOUNT][3];
+    u8 MemTimings[0x40000][3];
 
     bool (*GetMemRegion)(u32 addr, bool write, MemRegion* region);
     
diff --git a/src/CP15.cpp b/src/CP15.cpp
index 3807373c..9e4736f2 100644
--- a/src/CP15.cpp
+++ b/src/CP15.cpp
@@ -292,8 +292,6 @@ void ARMv5::UpdatePURegion(const u32 n)
         PU_UserMap[i] = usermask;
         PU_PrivMap[i] = privmask;
     }
-
-    UpdateRegionTimings(start, end);
 }
 
 void ARMv5::UpdatePURegions(const bool update_all)
@@ -307,7 +305,6 @@ void ARMv5::UpdatePURegions(const bool update_all)
         memset(PU_UserMap, mask, CP15_MAP_ENTRYCOUNT);
         memset(PU_PrivMap, mask, CP15_MAP_ENTRYCOUNT);
 
-        UpdateRegionTimings(0x00000, CP15_MAP_ENTRYCOUNT);
         return;
     }
 
@@ -322,10 +319,6 @@ void ARMv5::UpdatePURegions(const bool update_all)
         UpdatePURegion(n);
     }
 
-    // TODO: this is way unoptimized
-    // should be okay unless the game keeps changing shit, tho
-    if (update_all) UpdateRegionTimings(0x00000, CP15_MAP_ENTRYCOUNT);
-
     // TODO: throw exception if the region we're running in has become non-executable, I guess
 }
 
@@ -333,8 +326,7 @@ void ARMv5::UpdateRegionTimings(u32 addrstart, u32 addrend)
 {
     for (u32 i = addrstart; i < addrend; i++)
     {
-        u8 pu = PU_Map[i];
-        u8* bustimings = NDS.ARM9MemTimings[i >> 2];
+        u8* bustimings = NDS.ARM9MemTimings[i];
 
         // checkme: should these be (bus timings shifted) - 1 or ((bustimings - 1) shifted) + 1
         // should the last cycle be halved...?
@@ -630,7 +622,8 @@ u32 ARMv5::DCacheLookup(const u32 addr)
     //                      first N32                                  remaining S32
     NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
     
-    DataCycles = MemTimings[addr >> 12][2];
+    NDS.ARM9Timestamp += ((NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 2)) - 1) << NDS.ARM9ClockShift) + 1;
+    DataCycles = NDS.ARM9MemTimings[tag>>14][3] << NDS.ARM9ClockShift;
 
     if ((addr >> 24) == 0x02)
     {
@@ -640,8 +633,6 @@ u32 ARMv5::DCacheLookup(const u32 addr)
     }
     else DataRegion = NDS.ARM9Regions[addr>>14];
 
-    NDS.ARM9Timestamp += ((NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 2)) - 1) << NDS.ARM9ClockShift) + 1;
-    DataCycles = NDS.ARM9MemTimings[tag>>14][3] << NDS.ARM9ClockShift;
     return ptr[(addr & (DCACHE_LINELENGTH-1)) >> 2];
 }
 
@@ -1794,7 +1785,7 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch)
     #endif 
         }
 
-    CodeCycles = MemTimings[addr >> 12][1];
+    CodeCycles = MemTimings[addr >> 14][1];
     
     if (PU_Map[addr>>12] & 0x30)
         WriteBufferDrain();
@@ -1862,7 +1853,7 @@ bool ARMv5::DataRead8(u32 addr, u32* val)
 
     NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
     
-    DataCycles = MemTimings[addr >> 12][0];
+    DataCycles = MemTimings[addr >> 14][0];
 
     if ((addr >> 24) == 0x02)
     {
@@ -1924,7 +1915,7 @@ bool ARMv5::DataRead16(u32 addr, u32* val)
 
     NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
     
-    DataCycles = MemTimings[addr >> 12][0];
+    DataCycles = MemTimings[addr >> 14][0];
 
     if ((addr >> 24) == 0x02)
     {
@@ -1986,7 +1977,7 @@ bool ARMv5::DataRead32(u32 addr, u32* val)
 
     NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
     
-    DataCycles = MemTimings[addr >> 12][1];
+    DataCycles = MemTimings[addr >> 14][1];
 
     if ((addr >> 24) == 0x02)
     {
@@ -2048,7 +2039,7 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
 
     if (!(addr & 0x3FF)) return DataRead32(addr, val); // bursts cannot cross a 1kb boundary
 
-    DataCycles = MemTimings[addr >> 12][2];
+    DataCycles = MemTimings[addr >> 14][2];
 
     NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
 
@@ -2111,7 +2102,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
     {
         NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
 
-        DataCycles = MemTimings[addr >> 12][0];
+        DataCycles = MemTimings[addr >> 14][0];
 
         if ((addr >> 24) == 0x02)
         {
@@ -2191,7 +2182,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
     {
         NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
 
-        DataCycles = MemTimings[addr >> 12][0];
+        DataCycles = MemTimings[addr >> 14][0];
 
         if ((addr >> 24) == 0x02)
         {
@@ -2272,7 +2263,7 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
     {
         NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
 
-        DataCycles = MemTimings[addr >> 12][1];
+        DataCycles = MemTimings[addr >> 14][1];
 
         if ((addr >> 24) == 0x02)
         {
@@ -2362,7 +2353,7 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val)
         else DataRegion = NDS.ARM9Regions[addr>>14];
     
         BusWrite32(addr, val);
-        DataCycles += MemTimings[addr >> 12][2];
+        DataCycles += MemTimings[addr >> 14][2];
     }
     else
     {
diff --git a/src/DSi.cpp b/src/DSi.cpp
index 0e35841f..9b947ba5 100644
--- a/src/DSi.cpp
+++ b/src/DSi.cpp
@@ -1288,7 +1288,7 @@ void DSi::Set_SCFG_Clock9(u16 val)
 
     ARM9Timestamp <<= ARM9ClockShift;
     ARM9Target    <<= ARM9ClockShift;
-    ARM9.UpdateRegionTimings(0x00000, 0x100000);
+    ARM9.UpdateRegionTimings(0x00000, 0x40000);
 }
 
 void DSi::Set_SCFG_MC(u32 val)
diff --git a/src/NDS.cpp b/src/NDS.cpp
index e0edf03b..591c22a0 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -179,7 +179,7 @@ void NDS::SetARM9RegionTimings(u32 addrstart, u32 addrend, u32 region, int buswi
         ARM9Regions[i] = region;
     }
 
-    ARM9.UpdateRegionTimings(addrstart<<2, addrend<<2);
+    ARM9.UpdateRegionTimings(addrstart, addrend);
 }
 
 void NDS::SetARM7RegionTimings(u32 addrstart, u32 addrend, u32 region, int buswidth, int nonseq, int seq)