32x: improve pwm accuracy
[picodrive.git] / pico / pico_int.h
index e61c1f7..383739c 100644 (file)
@@ -260,6 +260,8 @@ extern SH2 sh2s[2];
 #endif\r
 \r
 #define sh2_cycles_done(sh2) ((int)(sh2)->cycles_timeslice - sh2_cycles_left(sh2))\r
+#define sh2_cycles_done_t(sh2) \\r
+  ((sh2)->m68krcycles_done * 3 + sh2_cycles_done(sh2))\r
 #define sh2_cycles_done_m68k(sh2) \\r
   ((sh2)->m68krcycles_done + (sh2_cycles_done(sh2) / 3))\r
 \r
@@ -507,7 +509,9 @@ struct Pico32x
   unsigned char comm_dirty_68k;\r
   unsigned char comm_dirty_sh2;\r
   unsigned short pad;\r
-  unsigned int reserved[8];\r
+  unsigned short pwm_p[2];       // pwm pos in fifo\r
+  unsigned int pwm_cycle_p;      // pwm play cursor (32x cycles)\r
+  unsigned int reserved[6];\r
 };\r
 \r
 struct Pico32xMem\r
@@ -531,6 +535,7 @@ struct Pico32xMem
   unsigned short pal_native[0x100];     // converted to native (for renderer)\r
   unsigned int   sh2_peri_regs[2][0x200/4]; // periphereal regs of SH2s\r
   signed short   pwm[2*PWM_BUFF_LEN];   // PWM buffer for current frame\r
+  signed short   pwm_fifo[2][4];        // [0] - current, others - fifo entries\r
 };\r
 \r
 // area.c\r
@@ -771,10 +776,10 @@ enum {
 extern int Pico32xDrawMode;\r
 \r
 // 32x/pwm.c\r
-unsigned int p32x_pwm_read16(unsigned int a);\r
-void p32x_pwm_write16(unsigned int a, unsigned int d);\r
+unsigned int p32x_pwm_read16(unsigned int a, unsigned int cycles);\r
+void p32x_pwm_write16(unsigned int a, unsigned int d, unsigned int cycles);\r
 void p32x_pwm_update(int *buf32, int length, int stereo);\r
-void p32x_timers_do(unsigned int cycles);\r
+void p32x_timers_do(unsigned int m68k_now, unsigned int m68k_slice);\r
 void p32x_timers_recalc(void);\r
 void p32x_pwm_schedule(unsigned int now);\r
 void p32x_pwm_schedule_sh2(SH2 *sh2);\r