"Instant" ARAM DMA shouldn't schedule and event too soon.
Now that the accuracy of ScheduleEvent has changed, 0 cycles will schedule an event as soon as possible. But this breaks ATV 2. So we schedule it 100 cycles out (unless it's a really short copy)
This commit is contained in:
parent
94098a50c2
commit
662ed217d7
|
@ -212,6 +212,7 @@ void EnableInstantDMA()
|
||||||
CoreTiming::RemoveEvent(et_CompleteARAM);
|
CoreTiming::RemoveEvent(et_CompleteARAM);
|
||||||
CompleteARAM(0, 0);
|
CompleteARAM(0, 0);
|
||||||
instant_dma = true;
|
instant_dma = true;
|
||||||
|
ERROR_LOG(DSPINTERFACE, "Enabling Instant ARAM DMA hack");
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlushInstantDMA(u32 address)
|
void FlushInstantDMA(u32 address)
|
||||||
|
@ -544,14 +545,12 @@ static void Do_ARAM_DMA()
|
||||||
// ARAM DMA transfer rate has been measured on real hw
|
// ARAM DMA transfer rate has been measured on real hw
|
||||||
int ticksToTransfer = (g_arDMA.Cnt.count / 32) * 246;
|
int ticksToTransfer = (g_arDMA.Cnt.count / 32) * 246;
|
||||||
|
|
||||||
|
// This is a huge hack that appears to be here only to fix Resident Evil 2/3
|
||||||
if (instant_dma)
|
if (instant_dma)
|
||||||
ticksToTransfer = 0;
|
ticksToTransfer = std::min(ticksToTransfer, 100);
|
||||||
|
|
||||||
CoreTiming::ScheduleEvent(ticksToTransfer, et_CompleteARAM);
|
CoreTiming::ScheduleEvent(ticksToTransfer, et_CompleteARAM);
|
||||||
|
|
||||||
if (instant_dma)
|
|
||||||
CoreTiming::ForceExceptionCheck(100);
|
|
||||||
|
|
||||||
last_mmaddr = g_arDMA.MMAddr;
|
last_mmaddr = g_arDMA.MMAddr;
|
||||||
last_aram_dma_count = g_arDMA.Cnt.count;
|
last_aram_dma_count = g_arDMA.Cnt.count;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue