Compensate for prefetch in DIV’s initial value
This commit is contained in:
parent
629550c30b
commit
dbc338a887
@ -554,6 +554,9 @@ void GB_reset(GB_gameboy_t *gb)
|
|||||||
|
|
||||||
gb->accessed_oam_row = -1;
|
gb->accessed_oam_row = -1;
|
||||||
|
|
||||||
|
/* Todo: Ugly, fixme, see comment in the timer state machine */
|
||||||
|
gb->div_state = 3;
|
||||||
|
|
||||||
gb->magic = (uintptr_t)'SAME';
|
gb->magic = (uintptr_t)'SAME';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,9 +144,11 @@ static void GB_timers_run(GB_gameboy_t *gb, uint8_t cycles)
|
|||||||
GB_STATE_MACHINE(gb, div, cycles, 1) {
|
GB_STATE_MACHINE(gb, div, cycles, 1) {
|
||||||
GB_STATE(gb, div, 1);
|
GB_STATE(gb, div, 1);
|
||||||
GB_STATE(gb, div, 2);
|
GB_STATE(gb, div, 2);
|
||||||
|
GB_STATE(gb, div, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
GB_set_internal_div_counter(gb, 0);
|
GB_set_internal_div_counter(gb, 0);
|
||||||
|
main:
|
||||||
GB_SLEEP(gb, div, 1, 3);
|
GB_SLEEP(gb, div, 1, 3);
|
||||||
while (true) {
|
while (true) {
|
||||||
advance_tima_state_machine(gb);
|
advance_tima_state_machine(gb);
|
||||||
@ -154,6 +156,14 @@ static void GB_timers_run(GB_gameboy_t *gb, uint8_t cycles)
|
|||||||
gb->apu.apu_cycles += 4 << !gb->cgb_double_speed;
|
gb->apu.apu_cycles += 4 << !gb->cgb_double_speed;
|
||||||
GB_SLEEP(gb, div, 2, 4);
|
GB_SLEEP(gb, div, 2, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Todo: This is ugly to allow compatibility with 0.11 save states. Fix me when breaking save compatibility */
|
||||||
|
{
|
||||||
|
div3:
|
||||||
|
/* Compensate for lack of prefetch emulation, as well as DIV's internal initial value */
|
||||||
|
GB_set_internal_div_counter(gb, 8);
|
||||||
|
goto main;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles)
|
void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles)
|
||||||
|
Loading…
Reference in New Issue
Block a user