improve main ram dma timings

This commit is contained in:
Jaklyy 2024-12-14 23:23:00 -05:00
parent 2051d412d1
commit c902dcfc98
2 changed files with 28 additions and 18 deletions

View File

@ -1069,9 +1069,10 @@ void NDS::MainRAMHandleARM9()
{ {
if (srcrgn == Mem9_MainRAM) if (srcrgn == Mem9_MainRAM)
{ {
if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0) if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0 || ((A9ContentionTS - DMABurstStart) >= 242) || (DMABORK && ((dma->CurSrcAddr & 0x1F) == 0)))
{ {
if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; } if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; }
DMABORK = ((dma->CurSrcAddr & 0x1F) >= 0x1A);
MainRAMTimestamp = A9ContentionTS + 9; MainRAMTimestamp = A9ContentionTS + 9;
A9ContentionTS += 6; A9ContentionTS += 6;
MainRAMLastAccess = A9LAST; MainRAMLastAccess = A9LAST;
@ -1079,7 +1080,7 @@ void NDS::MainRAMHandleARM9()
else else
{ {
A9ContentionTS += 2; A9ContentionTS += 2;
MainRAMTimestamp += 2; MainRAMTimestamp = A9ContentionTS + 3;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }
@ -1098,17 +1099,18 @@ void NDS::MainRAMHandleARM9()
{ {
if (dstrgn == Mem9_MainRAM) if (dstrgn == Mem9_MainRAM)
{ {
if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0) if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0 || ((A9ContentionTS - DMABurstStart) >= 242))
{ {
if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; } if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; }
MainRAMTimestamp = A9ContentionTS + 9; MainRAMTimestamp = A9ContentionTS + 9;
DMABurstStart = A9ContentionTS;
A9ContentionTS += 4; A9ContentionTS += 4;
MainRAMLastAccess = A9LAST; MainRAMLastAccess = A9LAST;
} }
else else
{ {
A9ContentionTS += 2; A9ContentionTS += 2;
MainRAMTimestamp += 2; MainRAMTimestamp = A9ContentionTS + 5;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }
@ -1171,9 +1173,11 @@ void NDS::MainRAMHandleARM9()
{ {
if (srcrgn == Mem9_MainRAM) if (srcrgn == Mem9_MainRAM)
{ {
if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0) if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0 || ((A9ContentionTS - DMABurstStart) >= 242) || (DMABORK && ((dma->CurSrcAddr & 0x1F) == 0)))
{ {
if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; } if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; }
DMABORK = ((dma->CurSrcAddr & 0x1F) >= 0x1A);
DMABurstStart = A9ContentionTS;
MainRAMTimestamp = A9ContentionTS + 8; MainRAMTimestamp = A9ContentionTS + 8;
A9ContentionTS += 5; A9ContentionTS += 5;
MainRAMLastAccess = A9LAST; MainRAMLastAccess = A9LAST;
@ -1181,7 +1185,7 @@ void NDS::MainRAMHandleARM9()
else else
{ {
A9ContentionTS += 1; A9ContentionTS += 1;
MainRAMTimestamp += 1; MainRAMTimestamp = A9ContentionTS + 3;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }
@ -1200,9 +1204,10 @@ void NDS::MainRAMHandleARM9()
{ {
if (dstrgn == Mem9_MainRAM) if (dstrgn == Mem9_MainRAM)
{ {
if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0) if (burststart == 2 || A7WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0 || ((A9ContentionTS - DMABurstStart) >= 242))
{ {
if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; } if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; }
DMABurstStart = A9ContentionTS;
MainRAMTimestamp = A9ContentionTS + 8; MainRAMTimestamp = A9ContentionTS + 8;
A9ContentionTS += 3; A9ContentionTS += 3;
MainRAMLastAccess = A9LAST; MainRAMLastAccess = A9LAST;
@ -1210,7 +1215,7 @@ void NDS::MainRAMHandleARM9()
else else
{ {
A9ContentionTS += 1; A9ContentionTS += 1;
MainRAMTimestamp += 1; MainRAMTimestamp = A9ContentionTS + 5;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }
@ -1421,9 +1426,11 @@ void NDS::MainRAMHandleARM7()
{ {
if (srcrgn == Mem7_MainRAM) if (srcrgn == Mem7_MainRAM)
{ {
if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0) if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0 || ((ARM7Timestamp - DMABurstStart) >= 242) || (DMABORK && ((dma->CurSrcAddr & 0x1F) == 0)))
{ {
if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; } if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; }
DMABORK = ((dma->CurSrcAddr & 0x1F) >= 0x1A);
DMABurstStart = ARM7Timestamp;
MainRAMTimestamp = ARM7Timestamp + 9; MainRAMTimestamp = ARM7Timestamp + 9;
ARM7Timestamp += 6; ARM7Timestamp += 6;
MainRAMLastAccess = A7LAST; MainRAMLastAccess = A7LAST;
@ -1431,7 +1438,7 @@ void NDS::MainRAMHandleARM7()
else else
{ {
ARM7Timestamp += 2; ARM7Timestamp += 2;
MainRAMTimestamp += 2; MainRAMTimestamp = ARM7Timestamp + 3;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }
@ -1450,9 +1457,10 @@ void NDS::MainRAMHandleARM7()
{ {
if (dstrgn == Mem7_MainRAM) if (dstrgn == Mem7_MainRAM)
{ {
if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0) if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0 || ((ARM7Timestamp - DMABurstStart) >= 242))
{ {
if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; } if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; }
DMABurstStart = ARM7Timestamp;
MainRAMTimestamp = ARM7Timestamp + 9; MainRAMTimestamp = ARM7Timestamp + 9;
ARM7Timestamp += 4; ARM7Timestamp += 4;
MainRAMLastAccess = A7LAST; MainRAMLastAccess = A7LAST;
@ -1460,7 +1468,7 @@ void NDS::MainRAMHandleARM7()
else else
{ {
ARM7Timestamp += 2; ARM7Timestamp += 2;
MainRAMTimestamp += 2; MainRAMTimestamp = ARM7Timestamp + 5;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }
@ -1520,9 +1528,11 @@ void NDS::MainRAMHandleARM7()
{ {
if (srcrgn == Mem7_MainRAM) if (srcrgn == Mem7_MainRAM)
{ {
if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0) if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->SrcAddrInc <= 0 || ((ARM7Timestamp - DMABurstStart) >= 242) || (DMABORK && ((dma->CurSrcAddr & 0x1F) == 0)))
{ {
if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; } if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; }
DMABORK = ((dma->CurSrcAddr & 0x1F) >= 0x1A);
DMABurstStart = ARM7Timestamp;
MainRAMTimestamp = ARM7Timestamp + 8; MainRAMTimestamp = ARM7Timestamp + 8;
ARM7Timestamp += 5; ARM7Timestamp += 5;
MainRAMLastAccess = A7LAST; MainRAMLastAccess = A7LAST;
@ -1530,7 +1540,7 @@ void NDS::MainRAMHandleARM7()
else else
{ {
ARM7Timestamp += 1; ARM7Timestamp += 1;
MainRAMTimestamp += 1; MainRAMTimestamp = ARM7Timestamp + 3;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }
@ -1549,7 +1559,7 @@ void NDS::MainRAMHandleARM7()
{ {
if (dstrgn == Mem7_MainRAM) if (dstrgn == Mem7_MainRAM)
{ {
if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0) if (burststart == 2 || A9WENTLAST || DMALastWasMainRAM || dma->DstAddrInc <= 0 || ((ARM7Timestamp - DMABurstStart) >= 242))
{ {
if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; } if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; }
MainRAMTimestamp = ARM7Timestamp + 8; MainRAMTimestamp = ARM7Timestamp + 8;
@ -1559,7 +1569,7 @@ void NDS::MainRAMHandleARM7()
else else
{ {
ARM7Timestamp += 1; ARM7Timestamp += 1;
MainRAMTimestamp += 1; MainRAMTimestamp = ARM7Timestamp + 5;
} }
DMALastWasMainRAM = true; DMALastWasMainRAM = true;
} }

View File

@ -257,7 +257,7 @@ public: // TODO: Encapsulate the rest of these members
// no need to worry about those overflowing, they can keep going for atleast 4350 years // no need to worry about those overflowing, they can keep going for atleast 4350 years
u64 ARM9Timestamp, DMA9Timestamp, ARM9Target; u64 ARM9Timestamp, DMA9Timestamp, ARM9Target;
u64 ARM7Timestamp, ARM7Target; u64 ARM7Timestamp, ARM7Target;
u64 MainRAMTimestamp; u64 MainRAMTimestamp, DMABurstStart;
u64 A9ContentionTS; bool ConTSLock; u64 A9ContentionTS; bool ConTSLock;
u32 ARM9ClockShift; u32 ARM9ClockShift;
@ -276,7 +276,7 @@ public: // TODO: Encapsulate the rest of these members
alignas(u32) u8 ROMSeed0[2*8]; alignas(u32) u8 ROMSeed0[2*8];
alignas(u32) u8 ROMSeed1[2*8]; alignas(u32) u8 ROMSeed1[2*8];
u32 DMAReadHold; u32 DMAReadHold; bool DMABORK;
bool MainRAMLastAccess; // 0 == ARM9 | 1 == ARM7 bool MainRAMLastAccess; // 0 == ARM9 | 1 == ARM7
bool DMALastWasMainRAM; bool DMALastWasMainRAM;