this fixes stuff
This commit is contained in:
parent
09cdec70a6
commit
604b21c85a
36
src/CP15.cpp
36
src/CP15.cpp
|
@ -535,7 +535,9 @@ u32 ARMv5::ICacheLookup(const u32 addr)
|
||||||
{
|
{
|
||||||
if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
||||||
}
|
}
|
||||||
else if (NDS.ARM9Regions[addr>>14] == DataRegion && Store) NDS.ARM9Timestamp += (1<<NDS.ARM9ClockShift);
|
else if (((NDS.ARM9Timestamp <= WBReleaseTS) && (NDS.ARM9Regions[addr>>14] == WBLastRegion)) // check write buffer
|
||||||
|
|| (Store && (NDS.ARM9Regions[addr>>14] == DataRegion))) //check the actual store
|
||||||
|
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
||||||
Store = false;
|
Store = false;
|
||||||
|
|
||||||
// Disabled ICACHE Streaming:
|
// Disabled ICACHE Streaming:
|
||||||
|
@ -555,10 +557,6 @@ u32 ARMv5::ICacheLookup(const u32 addr)
|
||||||
u32 cycles = ns + (seq * linepos);
|
u32 cycles = ns + (seq * linepos);
|
||||||
NDS.ARM9Timestamp = cycles += NDS.ARM9Timestamp;
|
NDS.ARM9Timestamp = cycles += NDS.ARM9Timestamp;
|
||||||
|
|
||||||
if (((NDS.ARM9Timestamp <= WBReleaseTS) && (NDS.ARM9Regions[addr>>14] == WBLastRegion)) // check write buffer
|
|
||||||
|| (Store && (NDS.ARM9Regions[addr>>14] == DataRegion))) //check the actual store
|
|
||||||
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
|
||||||
|
|
||||||
if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual;
|
if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual;
|
||||||
|
|
||||||
ICacheFillPtr = linepos;
|
ICacheFillPtr = linepos;
|
||||||
|
@ -1178,6 +1176,7 @@ inline bool ARMv5::WriteBufferHandle()
|
||||||
if (WBWriting)
|
if (WBWriting)
|
||||||
{
|
{
|
||||||
// look up timings
|
// look up timings
|
||||||
|
// TODO: handle interrupted bursts?
|
||||||
u32 cycles;
|
u32 cycles;
|
||||||
switch (WBCurVal >> 61)
|
switch (WBCurVal >> 61)
|
||||||
{
|
{
|
||||||
|
@ -1217,12 +1216,12 @@ inline bool ARMv5::WriteBufferHandle()
|
||||||
|
|
||||||
// get the current timestamp
|
// get the current timestamp
|
||||||
u64 ts;
|
u64 ts;
|
||||||
if (NDS.ARM9Regions[WBCurAddr>>14] == Mem9_MainRAM)
|
if (((WBCurVal >> 61) != 3) && (NDS.ARM9Regions[WBCurAddr>>14] == Mem9_MainRAM))
|
||||||
ts = std::max(WBTimestamp, MainRAMTimestamp);
|
ts = std::max(WBTimestamp, MainRAMTimestamp);
|
||||||
else
|
else
|
||||||
ts = WBTimestamp;
|
ts = WBTimestamp;
|
||||||
|
|
||||||
ts = (ts + ((1<<NDS.ARM9ClockShift)-1)) & ~((1<<NDS.ARM9ClockShift)-1);
|
if ((WBCurVal >> 61) != 3) ts = (ts + ((1<<NDS.ARM9ClockShift)-1)) & ~((1<<NDS.ARM9ClockShift)-1);
|
||||||
|
|
||||||
ts += cycles;
|
ts += cycles;
|
||||||
|
|
||||||
|
@ -1240,8 +1239,8 @@ inline bool ARMv5::WriteBufferHandle()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WBReleaseTS = WBTimestamp = ts;
|
WBTimestamp = ts;
|
||||||
if (NDS.ARM9Regions[WBCurAddr>>14] == Mem9_MainRAM) MainRAMTimestamp = ts;
|
if (NDS.ARM9Regions[WBCurAddr>>14] == Mem9_MainRAM) MainRAMTimestamp += 2 << NDS.ARM9ClockShift;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (WBCurVal >> 61)
|
switch (WBCurVal >> 61)
|
||||||
|
@ -1264,7 +1263,7 @@ inline bool ARMv5::WriteBufferHandle()
|
||||||
WBLastRegion = NDS.ARM9Regions[WBCurAddr>>14];
|
WBLastRegion = NDS.ARM9Regions[WBCurAddr>>14];
|
||||||
//printf("writing: adr: %i, val: %lli, cyl: %i", WBCurAddr, WBCurVal, WBCurCycles);
|
//printf("writing: adr: %i, val: %lli, cyl: %i", WBCurAddr, WBCurVal, WBCurCycles);
|
||||||
WBWriting = false;
|
WBWriting = false;
|
||||||
if constexpr (force == 2) return true;
|
if ((force == 2) && ((WriteBufferFifo[WBWritePointer] >> 61) != 3)) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if write buffer is empty
|
// check if write buffer is empty
|
||||||
|
@ -1304,7 +1303,7 @@ void ARMv5::WriteBufferCheck()
|
||||||
|
|
||||||
if constexpr (next == 1) // check if the next write is occuring
|
if constexpr (next == 1) // check if the next write is occuring
|
||||||
{
|
{
|
||||||
if (NDS.ARM9Timestamp >= WBTimestamp)
|
if (WBWriting)
|
||||||
{
|
{
|
||||||
while(!WriteBufferHandle<2>());
|
while(!WriteBufferHandle<2>());
|
||||||
}
|
}
|
||||||
|
@ -1328,7 +1327,7 @@ void ARMv5::WriteBufferWrite(u32 val, u8 flag, u32 addr)
|
||||||
else if (WBWritePointer == 16) // indicates empty write buffer
|
else if (WBWritePointer == 16) // indicates empty write buffer
|
||||||
{
|
{
|
||||||
WBWritePointer = 0;
|
WBWritePointer = 0;
|
||||||
if (WBTimestamp < (NDS.ARM9Timestamp + 1)) WBTimestamp = (NDS.ARM9Timestamp + 1 + ((1<<NDS.ARM9ClockShift)-1)) & ~((1<<NDS.ARM9ClockShift)-1);
|
if (!WBWriting && (WBTimestamp < (NDS.ARM9Timestamp+1))) WBTimestamp = (NDS.ARM9Timestamp+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
WriteBufferFifo[WBFillPointer] = val | (u64)flag << 61;
|
WriteBufferFifo[WBFillPointer] = val | (u64)flag << 61;
|
||||||
|
@ -2129,6 +2128,7 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch)
|
||||||
|
|
||||||
if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual;
|
if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual;
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
DataRegion = Mem9_Null;
|
DataRegion = Mem9_Null;
|
||||||
return BusRead32(addr);
|
return BusRead32(addr);
|
||||||
}
|
}
|
||||||
|
@ -2211,6 +2211,7 @@ bool ARMv5::DataRead8(u32 addr, u32* val)
|
||||||
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
*val = BusRead8(addr);
|
*val = BusRead8(addr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2294,6 +2295,7 @@ bool ARMv5::DataRead16(u32 addr, u32* val)
|
||||||
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
*val = BusRead16(addr);
|
*val = BusRead16(addr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2377,6 +2379,7 @@ bool ARMv5::DataRead32(u32 addr, u32* val)
|
||||||
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
NDS.ARM9Timestamp += 1<<NDS.ARM9ClockShift;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
*val = BusRead32(addr);
|
*val = BusRead32(addr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2476,6 +2479,7 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
*val = BusRead32(addr);
|
*val = BusRead32(addr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2554,6 +2558,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
|
||||||
}
|
}
|
||||||
else DataRegion = NDS.ARM9Regions[addr>>14];
|
else DataRegion = NDS.ARM9Regions[addr>>14];
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
BusWrite8(addr, val);
|
BusWrite8(addr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2562,6 +2567,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
|
||||||
|
|
||||||
WriteBufferWrite(addr, 4);
|
WriteBufferWrite(addr, 4);
|
||||||
WriteBufferWrite(val, 0, addr);
|
WriteBufferWrite(val, 0, addr);
|
||||||
|
DataRegion = Mem9_Null;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
WBDelay = NDS.ARM9Timestamp + 2;
|
WBDelay = NDS.ARM9Timestamp + 2;
|
||||||
}
|
}
|
||||||
|
@ -2644,6 +2650,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
|
||||||
}
|
}
|
||||||
else DataRegion = NDS.ARM9Regions[addr>>14];
|
else DataRegion = NDS.ARM9Regions[addr>>14];
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
BusWrite16(addr, val);
|
BusWrite16(addr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2652,6 +2659,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
|
||||||
|
|
||||||
WriteBufferWrite(addr, 4);
|
WriteBufferWrite(addr, 4);
|
||||||
WriteBufferWrite(val, 1, addr);
|
WriteBufferWrite(val, 1, addr);
|
||||||
|
DataRegion = Mem9_Null;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
WBDelay = NDS.ARM9Timestamp + 2;
|
WBDelay = NDS.ARM9Timestamp + 2;
|
||||||
}
|
}
|
||||||
|
@ -2734,6 +2742,7 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
|
||||||
}
|
}
|
||||||
else DataRegion = NDS.ARM9Regions[addr>>14];
|
else DataRegion = NDS.ARM9Regions[addr>>14];
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
BusWrite32(addr, val);
|
BusWrite32(addr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2742,6 +2751,7 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
|
||||||
|
|
||||||
WriteBufferWrite(addr, 4);
|
WriteBufferWrite(addr, 4);
|
||||||
WriteBufferWrite(val, 2, addr);
|
WriteBufferWrite(val, 2, addr);
|
||||||
|
DataRegion = Mem9_Null;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
WBDelay = NDS.ARM9Timestamp + 2;
|
WBDelay = NDS.ARM9Timestamp + 2;
|
||||||
}
|
}
|
||||||
|
@ -2839,11 +2849,13 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val)
|
||||||
else DataRegion = NDS.ARM9Regions[addr>>14];
|
else DataRegion = NDS.ARM9Regions[addr>>14];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WBTimestamp = NDS.ARM9Timestamp;
|
||||||
BusWrite32(addr, val);
|
BusWrite32(addr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WriteBufferWrite(val, 3, addr);
|
WriteBufferWrite(val, 3, addr);
|
||||||
|
DataRegion = Mem9_Null;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
WBDelay = NDS.ARM9Timestamp + 2;
|
WBDelay = NDS.ARM9Timestamp + 2;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue