adjust z80 timing a bit
authornotaz <notasas@gmail.com>
Tue, 3 Oct 2017 23:23:27 +0000 (02:23 +0300)
committernotaz <notasas@gmail.com>
Wed, 11 Oct 2017 23:54:46 +0000 (02:54 +0300)
pico/memory.c
pico/pico.c
pico/pico_cmn.c
pico/pico_int.h

index 858ab65..436f545 100644 (file)
@@ -331,11 +331,10 @@ NOINLINE void io_ports_write(u32 a, u32 d)
   Pico.ioports[a] = d;\r
 }\r
 \r
-// lame..\r
 static int z80_cycles_from_68k(void)\r
 {\r
-  return z80_cycle_aim\r
-    + cycles_68k_to_z80(SekCyclesDone() - last_z80_sync);\r
+  int m68k_cnt = SekCyclesDone() - timing.m68c_frame_start;\r
+  return cycles_68k_to_z80(m68k_cnt);\r
 }\r
 \r
 void NOINLINE ctl_write_z80busreq(u32 d)\r
@@ -346,7 +345,7 @@ void NOINLINE ctl_write_z80busreq(u32 d)
   {\r
     if (d)\r
     {\r
-      z80_cycle_cnt = z80_cycles_from_68k();\r
+      timing.z80c_cnt = z80_cycles_from_68k() + 2;\r
     }\r
     else\r
     {\r
@@ -378,7 +377,7 @@ void NOINLINE ctl_write_z80reset(u32 d)
     }\r
     else\r
     {\r
-      z80_cycle_cnt = z80_cycles_from_68k();\r
+      timing.z80c_cnt = z80_cycles_from_68k() + 2;\r
       z80_reset();\r
     }\r
     Pico.m.z80_reset = d;\r
@@ -896,10 +895,11 @@ static void m68k_mem_setup(void)
 static int get_scanline(int is_from_z80)\r
 {\r
   if (is_from_z80) {\r
-    int cycles = z80_cyclesDone();\r
-    while (cycles - z80_scanline_cycles >= 228)\r
-      z80_scanline++, z80_scanline_cycles += 228;\r
-    return z80_scanline;\r
+    int mclk_z80 = z80_cyclesDone() * 15;\r
+    int mclk_line = timing.z80_scanline * 488 * 7;\r
+    while (mclk_z80 - mclk_line >= 488 * 7)\r
+      timing.z80_scanline++, mclk_line += 488 * 7;\r
+    return timing.z80_scanline;\r
   }\r
 \r
   return Pico.m.scanline;\r
index f0c54d1..0404367 100644 (file)
@@ -23,6 +23,8 @@ int PicoAutoRgnOrder;
 struct PicoSRAM SRam;\r
 int emustatus;         // rapid_ym2612, multi_ym_updates\r
 \r
+struct PicoTiming timing;\r
+\r
 void (*PicoWriteSound)(int len) = NULL; // called at the best time to send sound buffer (PsndOut) to hardware\r
 void (*PicoResetHook)(void) = NULL;\r
 void (*PicoLineHook)(void) = NULL;\r
@@ -278,31 +280,24 @@ PICO_INTERNAL int CheckDMA(void)
 \r
 #include "pico_cmn.c"\r
 \r
-unsigned int last_z80_sync; /* in 68k cycles */\r
-int z80_cycle_cnt;\r
-int z80_cycle_aim;\r
-int z80_scanline;\r
-int z80_scanline_cycles;  /* cycles done until z80_scanline */\r
-\r
 /* sync z80 to 68k */\r
 PICO_INTERNAL void PicoSyncZ80(unsigned int m68k_cycles_done)\r
 {\r
   int m68k_cnt;\r
   int cnt;\r
 \r
-  m68k_cnt = m68k_cycles_done - last_z80_sync;\r
-  z80_cycle_aim += cycles_68k_to_z80(m68k_cnt);\r
-  cnt = z80_cycle_aim - z80_cycle_cnt;\r
-  last_z80_sync = m68k_cycles_done;\r
+  m68k_cnt = m68k_cycles_done - timing.m68c_frame_start;\r
+  timing.z80c_aim = cycles_68k_to_z80(m68k_cnt);\r
+  cnt = timing.z80c_aim - timing.z80c_cnt;\r
 \r
   pprof_start(z80);\r
 \r
   elprintf(EL_BUSREQ, "z80 sync %i (%u|%u -> %u|%u)", cnt,\r
-    z80_cycle_cnt, z80_cycle_cnt / 228,\r
-    z80_cycle_aim, z80_cycle_aim / 228);\r
+    timing.z80c_cnt, timing.z80c_cnt * 15 / 7 / 488,\r
+    timing.z80c_aim, timing.z80c_aim * 15 / 7 / 488);\r
 \r
   if (cnt > 0)\r
-    z80_cycle_cnt += z80_run(cnt);\r
+    timing.z80c_cnt += z80_run(cnt);\r
 \r
   pprof_end(z80);\r
 }\r
index b44bfba..01d57a7 100644 (file)
@@ -78,7 +78,6 @@ static int PicoFrameHints(void)
   int hint; // Hint counter
 
   pevt_log_m68k_o(EVT_FRAME_START);
-  pv->v_counter = Pico.m.scanline = 0;
 
   if ((PicoOpt&POPT_ALT_RENDERER) && !PicoSkipFrame && (pv->reg[1]&0x40)) { // fast rend., display enabled
     // draw a frame just after vblank in alternative render mode
@@ -91,6 +90,8 @@ static int PicoFrameHints(void)
   }
   else skip=PicoSkipFrame;
 
+  timing.m68c_frame_start = SekCyclesDone();
+  pv->v_counter = Pico.m.scanline = 0;
   z80_resetCycles();
   PsndStartFrame();
 
index 743ecb4..89cccc7 100644 (file)
@@ -211,20 +211,13 @@ extern struct DrZ80 drZ80;
 \r
 #define Z80_STATE_SIZE 0x60\r
 \r
-extern unsigned int last_z80_sync;\r
-extern int z80_cycle_cnt;        /* 'done' z80 cycles before z80_run() */\r
-extern int z80_cycle_aim;\r
-extern int z80_scanline;\r
-extern int z80_scanline_cycles;  /* cycles done until z80_scanline */\r
-\r
 #define z80_resetCycles() \\r
-  last_z80_sync = SekCyclesDone(); \\r
-  z80_cycle_cnt = z80_cycle_aim = z80_scanline = z80_scanline_cycles = 0;\r
+  timing.z80c_cnt = timing.z80c_aim = timing.z80_scanline = 0\r
 \r
 #define z80_cyclesDone() \\r
-  (z80_cycle_aim - z80_cyclesLeft)\r
+  (timing.z80c_aim - z80_cyclesLeft)\r
 \r
-#define cycles_68k_to_z80(x) ((x)*957 >> 11)\r
+#define cycles_68k_to_z80(x) ((x) * 3823 >> 13)\r
 \r
 // ----------------------- SH2 CPU -----------------------\r
 \r
@@ -599,6 +592,15 @@ struct Pico32xMem
   unsigned short pwm_fifo[2][4];        // [0] - current raw, others - fifo entries\r
 };\r
 \r
+struct PicoTiming\r
+{\r
+  unsigned int m68c_frame_start;        // m68k cycles\r
+  unsigned int z80c_cnt;                // z80 cycles done (this frame)\r
+  unsigned int z80c_aim;\r
+  int z80_scanline;\r
+};\r
+extern struct PicoTiming timing;\r
+\r
 // area.c\r
 extern void (*PicoLoadStateHook)(void);\r
 \r
@@ -1092,3 +1094,4 @@ void pevt_dump(void);
 \r
 #endif // PICO_INTERNAL_INCLUDED\r
 \r
+// vim:shiftwidth=2:ts=2:expandtab\r