From b23cb819bbca8612bab0f764f73b9394e61af973 Mon Sep 17 00:00:00 2001 From: DesperateProgrammer Date: Wed, 24 Jan 2024 11:57:57 +0100 Subject: [PATCH] Changed write to cached data from invalidating to updating the cached data to get nearer to hw timings --- src/ARM.h | 3 ++ src/CP15.cpp | 85 +++++++++++++++++++++++++++++++++++++++++------- wfcsettings.bin | Bin 0 -> 2304 bytes 3 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 wfcsettings.bin diff --git a/src/ARM.h b/src/ARM.h index 99ef4baf..f7a6b98b 100644 --- a/src/ARM.h +++ b/src/ARM.h @@ -319,6 +319,9 @@ public: void DCacheLookup(u32 addr); + void DCacheWrite32(u32 addr, u32 val); + void DCacheWrite16(u32 addr, u16 val); + void DCacheWrite8(u32 addr, u8 val); bool IsAddressDCachable(u32 addr); void DCacheInvalidateAll(); diff --git a/src/CP15.cpp b/src/CP15.cpp index edd720cf..b3afb00b 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -454,7 +454,6 @@ void ARMv5::DCacheLookup(u32 addr) { if ((DCacheTags[id+set] & ~0x0F) == tag) { - DataCycles = 1; CurDCacheLine = &DCache[(id+set) << DCACHE_LINELENGTH_LOG2]; DataCycles = 1; @@ -506,6 +505,66 @@ void ARMv5::DCacheLookup(u32 addr) CurDCacheLine = ptr; } +void ARMv5::DCacheWrite32(u32 addr, u32 val) +{ + u32 tag = (addr & ~(DCACHE_LINELENGTH - 1)) | CACHE_FLAG_VALID; + u32 id = (addr >> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1); + + id <<= DCACHE_SETS_LOG2; + for (int set=0;set %08lx\n", addr, ((u32 *)CurDCacheLine)[(addr & (DCACHE_LINELENGTH-1)) >> 2]); + return; + } + } +} + +void ARMv5::DCacheWrite16(u32 addr, u16 val) +{ + u32 tag = (addr & ~(DCACHE_LINELENGTH - 1)) | CACHE_FLAG_VALID; + u32 id = (addr >> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1); + + id <<= DCACHE_SETS_LOG2; + for (int set=0;set %08lx\n", addr, ((u32 *)CurDCacheLine)[(addr & (DCACHE_LINELENGTH-1)) >> 2]); + return; + } + } +} + +void ARMv5::DCacheWrite8(u32 addr, u8 val) +{ + u32 tag = (addr & ~(DCACHE_LINELENGTH - 1)) | CACHE_FLAG_VALID; + u32 id = (addr >> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1); + + id <<= DCACHE_SETS_LOG2; + for (int set=0;set %08lx\n", addr, ((u32 *)CurDCacheLine)[(addr & (DCACHE_LINELENGTH-1)) >> 2]); + return; + } + } +} + void ARMv5::DCacheInvalidateByAddr(u32 addr) { u32 tag = (addr & ~(DCACHE_LINELENGTH - 1)) | CACHE_FLAG_VALID; @@ -1098,6 +1157,8 @@ void ARMv5::DataRead8(u32 addr, u32* val) return; } + DataRegion = addr; + #if 1 if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) { @@ -1110,8 +1171,6 @@ void ARMv5::DataRead8(u32 addr, u32* val) } #endif - DataRegion = addr; - if (addr < ITCMSize) { DataCycles = 1; @@ -1137,6 +1196,8 @@ void ARMv5::DataRead16(u32 addr, u32* val) return; } + DataRegion = addr; + #if 1 if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) { @@ -1149,8 +1210,6 @@ void ARMv5::DataRead16(u32 addr, u32* val) } #endif - DataRegion = addr; - addr &= ~1; if (addr < ITCMSize) @@ -1178,6 +1237,8 @@ void ARMv5::DataRead32(u32 addr, u32* val) return; } + DataRegion = addr; + #if 1 if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) { @@ -1190,8 +1251,6 @@ void ARMv5::DataRead32(u32 addr, u32* val) } #endif - DataRegion = addr; - addr &= ~3; if (addr < ITCMSize) @@ -1256,7 +1315,8 @@ void ARMv5::DataWrite8(u32 addr, u8 val) { if (PU_Map[addr >> 12] & 0x10) { - DCacheInvalidateByAddr(addr); + DCacheWrite8(addr, val); + //DCacheInvalidateByAddr(addr); } } @@ -1292,7 +1352,8 @@ void ARMv5::DataWrite16(u32 addr, u16 val) { if (PU_Map[addr >> 12] & 0x10) { - DCacheInvalidateByAddr(addr); + DCacheWrite16(addr, val); +// DCacheInvalidateByAddr(addr); } } @@ -1330,7 +1391,8 @@ void ARMv5::DataWrite32(u32 addr, u32 val) { if (PU_Map[addr >> 12] & 0x10) { - DCacheInvalidateByAddr(addr); + DCacheWrite32(addr, val); +// DCacheInvalidateByAddr(addr); } } @@ -1364,7 +1426,8 @@ void ARMv5::DataWrite32S(u32 addr, u32 val) { if (PU_Map[addr >> 12] & 0x10) { - DCacheInvalidateByAddr(addr); + DCacheWrite32(addr, val); +// DCacheInvalidateByAddr(addr); } } diff --git a/wfcsettings.bin b/wfcsettings.bin new file mode 100644 index 0000000000000000000000000000000000000000..af3146aeb6423c6cff0a4d369941eb72c52e62d7 GIT binary patch literal 2304 zcmezWe-w;{z-S1JhQMeDjKmONpb+Gy=H%x&22f}U-Lx};ZSpv2Zan{jrB=^(PP*AV buonG?T94-cg1ZCjEV|i_>VLSkr#}DyyOIjR literal 0 HcmV?d00001