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
{\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
}\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
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
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
\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
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
}
else skip=PicoSkipFrame;
+ timing.m68c_frame_start = SekCyclesDone();
+ pv->v_counter = Pico.m.scanline = 0;
z80_resetCycles();
PsndStartFrame();
\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
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
\r
#endif // PICO_INTERNAL_INCLUDED\r
\r
+// vim:shiftwidth=2:ts=2:expandtab\r