6522: account for underflowed cycles to ensure consistent interrupt period (#651)
This commit is contained in:
parent
f8bd94ae87
commit
941ef46e9a
1 changed files with 18 additions and 3 deletions
|
@ -1797,11 +1797,19 @@ void MB_UpdateCycles(ULONG uExecutedCycles)
|
|||
{
|
||||
// Free-running mode
|
||||
// - Ultima4/5 change ACCESS_TIMER1 after a couple of IRQs into tune
|
||||
pMB->sy6522.TIMER1_COUNTER.w = pMB->sy6522.TIMER1_LATCH.w;
|
||||
pMB->sy6522.TIMER1_COUNTER.w += pMB->sy6522.TIMER1_LATCH.w; // GH#651: account for underflowed cycles too
|
||||
if (pMB->sy6522.TIMER1_COUNTER.w > pMB->sy6522.TIMER1_LATCH.w)
|
||||
{
|
||||
if (pMB->sy6522.TIMER1_LATCH.w)
|
||||
pMB->sy6522.TIMER1_COUNTER.w %= pMB->sy6522.TIMER1_LATCH.w; // Only occurs if LATCH.w<0x0007 (# cycles for longest opcode)
|
||||
else
|
||||
pMB->sy6522.TIMER1_COUNTER.w = 0;
|
||||
}
|
||||
StartTimer1(pMB);
|
||||
}
|
||||
}
|
||||
else if (pMB->bTimer2Active && bTimer2Underflow)
|
||||
|
||||
if (pMB->bTimer2Active && bTimer2Underflow)
|
||||
{
|
||||
UpdateIFR(pMB, 0, IxR_TIMER2);
|
||||
|
||||
|
@ -1811,7 +1819,14 @@ void MB_UpdateCycles(ULONG uExecutedCycles)
|
|||
}
|
||||
else
|
||||
{
|
||||
pMB->sy6522.TIMER2_COUNTER.w = pMB->sy6522.TIMER2_LATCH.w;
|
||||
pMB->sy6522.TIMER2_COUNTER.w += pMB->sy6522.TIMER2_LATCH.w;
|
||||
if (pMB->sy6522.TIMER2_COUNTER.w > pMB->sy6522.TIMER2_LATCH.w)
|
||||
{
|
||||
if (pMB->sy6522.TIMER2_LATCH.w)
|
||||
pMB->sy6522.TIMER2_COUNTER.w %= pMB->sy6522.TIMER2_LATCH.w;
|
||||
else
|
||||
pMB->sy6522.TIMER2_COUNTER.w = 0;
|
||||
}
|
||||
StartTimer2(pMB);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue