|
|
@@ -27,7 +27,7 @@ static void _GBTimerDivIncrement(struct GBTimer* timer, uint32_t cyclesLate) { |
|
|
if (timer->timaPeriod > 0 && (timer->internalDiv & (timer->timaPeriod - 1)) == timer->timaPeriod - 1) {
|
|
|
++timer->p->memory.io[REG_TIMA];
|
|
|
if (!timer->p->memory.io[REG_TIMA]) {
|
|
|
- mTimingSchedule(&timer->p->timing, &timer->irq, 4 - cyclesLate);
|
|
|
+ mTimingSchedule(&timer->p->timing, &timer->irq, 7 - ((timer->p->cpu->executionState - cyclesLate) & 3));
|
|
|
}
|
|
|
}
|
|
|
++timer->internalDiv;
|
|
|
@@ -69,11 +69,11 @@ void GBTimerReset(struct GBTimer* timer) { |
|
|
void GBTimerDivReset(struct GBTimer* timer) {
|
|
|
timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event);
|
|
|
mTimingDeschedule(&timer->p->timing, &timer->event);
|
|
|
- _GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 1) & 3);
|
|
|
+ _GBTimerDivIncrement(timer, 0);
|
|
|
if (((timer->internalDiv << 1) | ((timer->nextDiv >> 3) & 1)) & timer->timaPeriod) {
|
|
|
++timer->p->memory.io[REG_TIMA];
|
|
|
if (!timer->p->memory.io[REG_TIMA]) {
|
|
|
- mTimingSchedule(&timer->p->timing, &timer->irq, 4 - ((timer->p->cpu->executionState + 1) & 3));
|
|
|
+ mTimingSchedule(&timer->p->timing, &timer->irq, 7 - (timer->p->cpu->executionState & 3));
|
|
|
}
|
|
|
}
|
|
|
timer->p->memory.io[REG_DIV] = 0;
|
|
|
@@ -101,7 +101,7 @@ uint8_t GBTimerUpdateTAC(struct GBTimer* timer, GBRegisterTAC tac) { |
|
|
|
|
|
timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event);
|
|
|
mTimingDeschedule(&timer->p->timing, &timer->event);
|
|
|
- _GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 1) & 3);
|
|
|
+ _GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 2) & 3);
|
|
|
timer->nextDiv += GB_DMG_DIV_PERIOD;
|
|
|
mTimingSchedule(&timer->p->timing, &timer->event, timer->nextDiv);
|
|
|
} else {
|
|
|
|
0 comments on commit
7ea686a