attempt at twl timings

also rework main ram's early finish handling
This commit is contained in:
Jaklyy 2024-10-21 11:38:26 -04:00
parent e254ac3240
commit af09e37d53
1 changed files with 61 additions and 15 deletions

View File

@ -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<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
NDS.ARM9Timestamp += CodeCycles;
if (NDS.ARM9ClockShift == 2)
{
MainRAMTimestamp = NDS.ARM9Timestamp;
NDS.ARM9Timestamp -= 4;
}
}
else
{
if (NDS.ARM9Regions[addr>>14] == DataRegion && Store) NDS.ARM9Timestamp += (1<<NDS.ARM9ClockShift);
NDS.ARM9Timestamp += CodeCycles;
}
else if (NDS.ARM9Regions[addr>>14] == DataRegion && Store) NDS.ARM9Timestamp += (1<<NDS.ARM9ClockShift);
Store = false;
NDS.ARM9Timestamp += CodeCycles;
if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual;
DataRegion = Mem9_Null;
@ -974,6 +1015,7 @@ bool ARMv5::DataRead8(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];
@ -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];
@ -1116,12 +1160,13 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
if (addr & 0x3FF) DataCycles = MemTimings[addr >> 12][3]; //s
else DataCycles = MemTimings[addr >> 12][2]; // ns
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles += (((NDS.ARM9Timestamp + DataCycles) + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1))) - (NDS.ARM9Timestamp + DataCycles);
if ((addr >> 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<<NDS.ARM9ClockShift);
DataCycles -= (2<<NDS.ARM9ClockShift);
}
else DataRegion = NDS.ARM9Regions[addr>>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<<NDS.ARM9ClockShift);
DataCycles -= (2<<NDS.ARM9ClockShift);
}
else DataRegion = NDS.ARM9Regions[addr>>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<<NDS.ARM9ClockShift);
DataCycles -= (2<<NDS.ARM9ClockShift);
}
else DataRegion = NDS.ARM9Regions[addr>>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);