writing to the write buffer has a 1 cycle delay before it can be done again
This commit is contained in:
parent
2c3ef9f903
commit
e25dca0030
|
@ -210,6 +210,7 @@ void ARMv5::Reset()
|
||||||
|
|
||||||
WBWritePointer = 16;
|
WBWritePointer = 16;
|
||||||
WBFillPointer = 0;
|
WBFillPointer = 0;
|
||||||
|
WBDelay = 0;
|
||||||
|
|
||||||
ARM::Reset();
|
ARM::Reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -377,6 +377,7 @@ public:
|
||||||
|
|
||||||
u8 WBWritePointer;
|
u8 WBWritePointer;
|
||||||
u8 WBFillPointer;
|
u8 WBFillPointer;
|
||||||
|
u64 WBDelay;
|
||||||
u32 WBAddr; // current working address for the write buffer
|
u32 WBAddr; // current working address for the write buffer
|
||||||
u32 storeaddr[16]; // debugging
|
u32 storeaddr[16]; // debugging
|
||||||
u64 WBCycles[16]; // timestamp each write will complete
|
u64 WBCycles[16]; // timestamp each write will complete
|
||||||
|
|
11
src/CP15.cpp
11
src/CP15.cpp
|
@ -1297,10 +1297,11 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
if (WBDelay > NDS.ARM9Timestamp) NDS.ARM9Timestamp = WBDelay;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
WriteBufferWrite(addr, 3, 1);
|
WriteBufferWrite(addr, 3, 1);
|
||||||
WriteBufferWrite(val, 0, MemTimings[addr >> 12][1], addr);
|
WriteBufferWrite(val, 0, MemTimings[addr >> 12][1], addr);
|
||||||
|
WBDelay = NDS.ARM9Timestamp + 2;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1357,10 +1358,11 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
if (WBDelay > NDS.ARM9Timestamp) NDS.ARM9Timestamp = WBDelay;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
WriteBufferWrite(addr, 3, 1);
|
WriteBufferWrite(addr, 3, 1);
|
||||||
WriteBufferWrite(val, 1, MemTimings[addr >> 12][1], addr);
|
WriteBufferWrite(val, 1, MemTimings[addr >> 12][1], addr);
|
||||||
|
WBDelay = NDS.ARM9Timestamp + 2;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1417,10 +1419,11 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
if (WBDelay > NDS.ARM9Timestamp) NDS.ARM9Timestamp = WBDelay;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
WriteBufferWrite(addr, 3, 1);
|
WriteBufferWrite(addr, 3, 1);
|
||||||
WriteBufferWrite(val, 2, MemTimings[addr >> 12][2], addr);
|
WriteBufferWrite(val, 2, MemTimings[addr >> 12][2], addr);
|
||||||
|
WBDelay = NDS.ARM9Timestamp + 2;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1476,9 +1479,9 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DataCycles += (((NDS.ARM9Timestamp + DataCycles) + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1)) - (NDS.ARM9Timestamp + DataCycles));
|
|
||||||
DataCycles += 1;
|
DataCycles += 1;
|
||||||
WriteBufferWrite(val, 2, MemTimings[addr >> 12][3], addr);
|
WriteBufferWrite(val, 2, MemTimings[addr >> 12][3], addr);
|
||||||
|
WBDelay = NDS.ARM9Timestamp + DataCycles + 1;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue