diff --git a/src/CP15.cpp b/src/CP15.cpp index c9f184d6..f2384459 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -308,7 +308,21 @@ void ARMv5::UpdateRegionTimings(u32 addrstart, u32 addrend) } else { - MemTimings[i][0] = ((bustimings[2] - 1) << NDS.ARM9ClockShift) + 1; + if (NDS.ARM9ClockShift == 1) // ntr + { + MemTimings[i][0] = (bustimings[2] << NDS.ARM9ClockShift) - 1; + } + else // twl + { + if (NDS.ARM9Regions[i>>2] != Mem9_MainRAM) + { + MemTimings[i][0] = ((bustimings[2] - 1) << NDS.ARM9ClockShift) - 1; + } + else + { + MemTimings[i][0] = (bustimings[2] << NDS.ARM9ClockShift) - 1; + } + } } if (pu & 0x10) @@ -319,9 +333,27 @@ void ARMv5::UpdateRegionTimings(u32 addrstart, u32 addrend) } else { - MemTimings[i][1] = ((bustimings[0] - 1) << NDS.ARM9ClockShift) + 1; - MemTimings[i][2] = ((bustimings[2] - 1) << NDS.ARM9ClockShift) + 1; - MemTimings[i][3] = ((bustimings[3] - 1) << NDS.ARM9ClockShift) + 1;; // inaccurate but ehgh + if (NDS.ARM9ClockShift == 1) // ntr + { + MemTimings[i][1] = (bustimings[0] << NDS.ARM9ClockShift) - 1; + MemTimings[i][2] = (bustimings[2] << NDS.ARM9ClockShift) - 1; + MemTimings[i][3] = (bustimings[3] << NDS.ARM9ClockShift) - 1; + } + else // twl + { + if (NDS.ARM9Regions[i>>2] != Mem9_MainRAM) + { + MemTimings[i][1] = ((bustimings[0] - 1) << NDS.ARM9ClockShift) - 1; // 8/16 bit + MemTimings[i][2] = ((bustimings[2] - 1) << NDS.ARM9ClockShift) - 1; // 32 bit ns + MemTimings[i][3] = (bustimings[3] << NDS.ARM9ClockShift) - 1; // s + } + else // main ram; timing adjustments are handled elsewhere + { + MemTimings[i][1] = (bustimings[0] << NDS.ARM9ClockShift) - 1; + MemTimings[i][2] = (bustimings[2] << NDS.ARM9ClockShift) - 1; + MemTimings[i][3] = (bustimings[3] << NDS.ARM9ClockShift) - 1; + } + } } } } @@ -924,11 +956,20 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch) if ((addr >> 24) == 0x02) { if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp + ((1<>14] == DataRegion && Store) NDS.ARM9Timestamp += (1<>14] == DataRegion && Store) NDS.ARM9Timestamp += (1<>14]; @@ -1021,6 +1063,7 @@ bool ARMv5::DataRead16(u32 addr, u32* val) { if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp; MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles; + if (NDS.ARM9ClockShift == 2) DataCycles -= 4; DataRegion = Mem9_MainRAM; } else DataRegion = NDS.ARM9Regions[addr>>14]; @@ -1068,6 +1111,7 @@ bool ARMv5::DataRead32(u32 addr, u32* val) { if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp; MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles; + if (NDS.ARM9ClockShift == 2) DataCycles -= 4; DataRegion = Mem9_MainRAM; } else DataRegion = NDS.ARM9Regions[addr>>14]; @@ -1115,13 +1159,14 @@ bool ARMv5::DataRead32S(u32 addr, u32* val) // bursts cannot cross a 1kb boundary if (addr & 0x3FF) DataCycles = MemTimings[addr >> 12][3]; //s else DataCycles = MemTimings[addr >> 12][2]; // ns - - NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<> 24) == 0x02) { - if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp; + if ((NDS.ARM9Timestamp + DataCycles) < MainRAMTimestamp) DataCycles = MainRAMTimestamp - NDS.ARM9Timestamp; MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles; + if (NDS.ARM9ClockShift == 2) DataCycles -= 4; DataRegion = Mem9_MainRAM; } else DataRegion = NDS.ARM9Regions[addr>>14]; @@ -1170,7 +1215,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val) if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp; DataRegion = Mem9_MainRAM; MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles; - DataCycles -= (3<>14]; @@ -1236,7 +1281,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val) if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp; DataRegion = Mem9_MainRAM; MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles; - DataCycles -= (3<>14]; @@ -1302,7 +1347,7 @@ bool ARMv5::DataWrite32(u32 addr, u32 val) if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp; DataRegion = Mem9_MainRAM; MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles; - DataCycles -= (3<>14]; @@ -1368,8 +1413,9 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val) if ((addr >> 24) == 0x02) { - //if ((DataRegion != Mem9_MainRAM) && ((NDS.ARM9Timestamp + DataCycles) < MainRAMTimestamp)) DataCycles += MainRAMTimestamp - NDS.ARM9Timestamp; // what the hell was i smoking here? - MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles + (2 << NDS.ARM9ClockShift); + if ((NDS.ARM9Timestamp + DataCycles) < MainRAMTimestamp) DataCycles = MainRAMTimestamp - NDS.ARM9Timestamp; + MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles; + DataCycles -= 3 << NDS.ARM9ClockShift; // checkme: are sequentials actually - 3? DataRegion = Mem9_MainRAM; } else DataRegion = NDS.ARM9Regions[addr>>14]; @@ -1387,7 +1433,7 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val) if ((addr >> 24) == 0x02) { - cycles = (cycles - 2) | 0x80; + cycles = (cycles - 3) | 0x80; } WriteBufferWrite(val, 2, cycles, addr);