32x: improve pwm accuracy
[picodrive.git] / pico / pico_int.h
index bfdf73a..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
@@ -757,6 +762,7 @@ void p32x_m68k_poll_event(unsigned int flags);
 void p32x_sh2_poll_event(SH2 *sh2, unsigned int flags, unsigned int m68k_cycles);\r
 \r
 // 32x/draw.c\r
+void PicoDrawSetOutFormat32x(pdso_t which, int use_32x_line_mode);\r
 void FinalizeLine32xRGB555(int sh, int line);\r
 void PicoDraw32xLayer(int offs, int lines, int mdbg);\r
 void PicoDraw32xLayerMdOnly(int offs, int lines);\r
@@ -770,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
@@ -784,7 +790,6 @@ void p32x_pwm_schedule_sh2(SH2 *sh2);
 #define PicoFrame32x()\r
 #define PicoUnload32x()\r
 #define Pico32xStateLoaded()\r
-#define PicoDraw32xSetFrameMode(...)\r
 #define FinalizeLine32xRGB555 NULL\r
 #define p32x_pwm_update(...)\r
 #define p32x_timers_recalc()\r
@@ -802,7 +807,11 @@ static __inline int isspace_(int c)
 \r
 // emulation event logging\r
 #ifndef EL_LOGMASK\r
-#define EL_LOGMASK 0\r
+# ifdef __x86_64__ // HACK\r
+#  define EL_LOGMASK (EL_STATUS|EL_IDLE|EL_ANOMALY)\r
+# else\r
+#  define EL_LOGMASK (EL_STATUS)\r
+# endif\r
 #endif\r
 \r
 #define EL_HVCNT   0x00000001 /* hv counter reads */\r