core, slightly increase accuracy of some hw timers

This commit is contained in:
kub 2024-03-02 10:36:49 +01:00
parent 506adbd5eb
commit 80f51a1d59
2 changed files with 4 additions and 4 deletions

View file

@ -97,9 +97,9 @@ void m68k_comm_check(u32 a)
u32 pcd_stopwatch_read(int sub) u32 pcd_stopwatch_read(int sub)
{ {
// ugh.. // ugh... stopwatch runs 384 cycles per step, divide by mult with inverse
u32 d = sub ? SekCyclesDoneS68k() : pcd_cycles_m68k_to_s68k(SekCyclesDone()); u32 d = sub ? SekCyclesDoneS68k() : pcd_cycles_m68k_to_s68k(SekCyclesDone());
d = (d - Pico_mcd->m.stopwatch_base_c) / 384; d = ((d - Pico_mcd->m.stopwatch_base_c) * ((1LL << 32) / 384)) >> 32;
return d & 0x0fff; return d & 0x0fff;
} }

View file

@ -1092,7 +1092,7 @@ void ym2612_sync_timers(int z80_cycles, int mode_old, int mode_new)
* Starting a timer takes place at the next tick, so xcycles needs to be * Starting a timer takes place at the next tick, so xcycles needs to be
* rounded up to that: t = next tick# = (xcycles / TICK_ZCYCLES) + 1 * rounded up to that: t = next tick# = (xcycles / TICK_ZCYCLES) + 1
*/ */
unsigned t = ((xcycles * (((1<<20)/TIMER_A_TICK_ZCYCLES)+1))>>20) + 1; unsigned t = ((xcycles * (((1LL<<32)/TIMER_A_TICK_ZCYCLES)+1))>>32) + 1;
Pico.t.timer_a_next_oflow = t*TIMER_A_TICK_ZCYCLES + Pico.t.timer_a_step; Pico.t.timer_a_next_oflow = t*TIMER_A_TICK_ZCYCLES + Pico.t.timer_a_step;
} }
} }
@ -1115,7 +1115,7 @@ void ym2612_sync_timers(int z80_cycles, int mode_old, int mode_new)
* reset by loading timer b. The first run of timer b after loading is * reset by loading timer b. The first run of timer b after loading is
* therefore shorter by up to 15 ticks. * therefore shorter by up to 15 ticks.
*/ */
unsigned t = ((xcycles * (((1<<20)/TIMER_A_TICK_ZCYCLES)+1))>>20) + 1; unsigned t = ((xcycles * (((1LL<<32)/TIMER_A_TICK_ZCYCLES)+1))>>32) + 1;
int step = Pico.t.timer_b_step - TIMER_A_TICK_ZCYCLES*(t&15); int step = Pico.t.timer_b_step - TIMER_A_TICK_ZCYCLES*(t&15);
Pico.t.timer_b_next_oflow = t*TIMER_A_TICK_ZCYCLES + step; Pico.t.timer_b_next_oflow = t*TIMER_A_TICK_ZCYCLES + step;
} }