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
|
// Free-running mode
|
||||||
// - Ultima4/5 change ACCESS_TIMER1 after a couple of IRQs into tune
|
// - 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);
|
StartTimer1(pMB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pMB->bTimer2Active && bTimer2Underflow)
|
|
||||||
|
if (pMB->bTimer2Active && bTimer2Underflow)
|
||||||
{
|
{
|
||||||
UpdateIFR(pMB, 0, IxR_TIMER2);
|
UpdateIFR(pMB, 0, IxR_TIMER2);
|
||||||
|
|
||||||
|
@ -1811,7 +1819,14 @@ void MB_UpdateCycles(ULONG uExecutedCycles)
|
||||||
}
|
}
|
||||||
else
|
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);
|
StartTimer2(pMB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue