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<> 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<> 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<> 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<> 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<> 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<> 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<> 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)