diff --git a/src/ARM.cpp b/src/ARM.cpp index 7072978d..8c74a248 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -210,6 +210,7 @@ void ARMv5::Reset() WBWritePointer = 16; WBFillPointer = 0; + WBDelay = 0; ARM::Reset(); } diff --git a/src/ARM.h b/src/ARM.h index 12675023..16f4b72a 100644 --- a/src/ARM.h +++ b/src/ARM.h @@ -377,6 +377,7 @@ public: u8 WBWritePointer; u8 WBFillPointer; + u64 WBDelay; u32 WBAddr; // current working address for the write buffer u32 storeaddr[16]; // debugging u64 WBCycles[16]; // timestamp each write will complete diff --git a/src/CP15.cpp b/src/CP15.cpp index c0da4711..1d082f04 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -1297,10 +1297,11 @@ bool ARMv5::DataWrite8(u32 addr, u8 val) } else { - NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1< NDS.ARM9Timestamp) NDS.ARM9Timestamp = WBDelay; DataCycles = 1; WriteBufferWrite(addr, 3, 1); WriteBufferWrite(val, 0, MemTimings[addr >> 12][1], addr); + WBDelay = NDS.ARM9Timestamp + 2; } return true; } @@ -1357,10 +1358,11 @@ bool ARMv5::DataWrite16(u32 addr, u16 val) } else { - NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1< NDS.ARM9Timestamp) NDS.ARM9Timestamp = WBDelay; DataCycles = 1; WriteBufferWrite(addr, 3, 1); WriteBufferWrite(val, 1, MemTimings[addr >> 12][1], addr); + WBDelay = NDS.ARM9Timestamp + 2; } return true; } @@ -1417,10 +1419,11 @@ bool ARMv5::DataWrite32(u32 addr, u32 val) } else { - NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1< NDS.ARM9Timestamp) NDS.ARM9Timestamp = WBDelay; DataCycles = 1; WriteBufferWrite(addr, 3, 1); WriteBufferWrite(val, 2, MemTimings[addr >> 12][2], addr); + WBDelay = NDS.ARM9Timestamp + 2; } return true; } @@ -1476,9 +1479,9 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val) } else { - DataCycles += (((NDS.ARM9Timestamp + DataCycles) + ((1<> 12][3], addr); + WBDelay = NDS.ARM9Timestamp + DataCycles + 1; } return true; }