core, slightly increase accuracy of some hw timers
authorkub <derkub@gmail.com>
Sat, 2 Mar 2024 09:36:49 +0000 (10:36 +0100)
committerkub <derkub@gmail.com>
Sat, 2 Mar 2024 09:36:49 +0000 (10:36 +0100)
pico/cd/memory.c
pico/memory.c

index 0757828..b13644b 100644 (file)
@@ -97,9 +97,9 @@ void m68k_comm_check(u32 a)
 \r
 u32 pcd_stopwatch_read(int sub)\r
 {\r
-  // ugh..\r
+  // ugh... stopwatch runs 384 cycles per step, divide by mult with inverse\r
   u32 d = sub ? SekCyclesDoneS68k() : pcd_cycles_m68k_to_s68k(SekCyclesDone());\r
-  d = (d - Pico_mcd->m.stopwatch_base_c) / 384;\r
+  d = ((d - Pico_mcd->m.stopwatch_base_c) * ((1LL << 32) / 384)) >> 32;\r
   return d & 0x0fff;\r
 }\r
 \r
index c2a40f7..46e0bd4 100644 (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\r
        * rounded up to that: t = next tick# = (xcycles / TICK_ZCYCLES) + 1\r
        */\r
-      unsigned t = ((xcycles * (((1<<20)/TIMER_A_TICK_ZCYCLES)+1))>>20) + 1;\r
+      unsigned t = ((xcycles * (((1LL<<32)/TIMER_A_TICK_ZCYCLES)+1))>>32) + 1;\r
       Pico.t.timer_a_next_oflow = t*TIMER_A_TICK_ZCYCLES + Pico.t.timer_a_step;\r
     }\r
   }\r
@@ -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\r
        * therefore shorter by up to 15 ticks.\r
        */\r
-      unsigned t = ((xcycles * (((1<<20)/TIMER_A_TICK_ZCYCLES)+1))>>20) + 1;\r
+      unsigned t = ((xcycles * (((1LL<<32)/TIMER_A_TICK_ZCYCLES)+1))>>32) + 1;\r
       int step = Pico.t.timer_b_step - TIMER_A_TICK_ZCYCLES*(t&15);\r
       Pico.t.timer_b_next_oflow = t*TIMER_A_TICK_ZCYCLES + step;\r
     }\r