adjust z80 timing a bit

This commit is contained in:
notaz 2017-10-04 02:23:27 +03:00
parent ebd70cb5d9
commit 3162a7104c
4 changed files with 32 additions and 33 deletions

View file

@ -331,11 +331,10 @@ NOINLINE void io_ports_write(u32 a, u32 d)
Pico.ioports[a] = d; Pico.ioports[a] = d;
} }
// lame..
static int z80_cycles_from_68k(void) static int z80_cycles_from_68k(void)
{ {
return z80_cycle_aim int m68k_cnt = SekCyclesDone() - timing.m68c_frame_start;
+ cycles_68k_to_z80(SekCyclesDone() - last_z80_sync); return cycles_68k_to_z80(m68k_cnt);
} }
void NOINLINE ctl_write_z80busreq(u32 d) void NOINLINE ctl_write_z80busreq(u32 d)
@ -346,7 +345,7 @@ void NOINLINE ctl_write_z80busreq(u32 d)
{ {
if (d) if (d)
{ {
z80_cycle_cnt = z80_cycles_from_68k(); timing.z80c_cnt = z80_cycles_from_68k() + 2;
} }
else else
{ {
@ -378,7 +377,7 @@ void NOINLINE ctl_write_z80reset(u32 d)
} }
else else
{ {
z80_cycle_cnt = z80_cycles_from_68k(); timing.z80c_cnt = z80_cycles_from_68k() + 2;
z80_reset(); z80_reset();
} }
Pico.m.z80_reset = d; Pico.m.z80_reset = d;
@ -896,10 +895,11 @@ static void m68k_mem_setup(void)
static int get_scanline(int is_from_z80) static int get_scanline(int is_from_z80)
{ {
if (is_from_z80) { if (is_from_z80) {
int cycles = z80_cyclesDone(); int mclk_z80 = z80_cyclesDone() * 15;
while (cycles - z80_scanline_cycles >= 228) int mclk_line = timing.z80_scanline * 488 * 7;
z80_scanline++, z80_scanline_cycles += 228; while (mclk_z80 - mclk_line >= 488 * 7)
return z80_scanline; timing.z80_scanline++, mclk_line += 488 * 7;
return timing.z80_scanline;
} }
return Pico.m.scanline; return Pico.m.scanline;

View file

@ -23,6 +23,8 @@ int PicoAutoRgnOrder;
struct PicoSRAM SRam; struct PicoSRAM SRam;
int emustatus; // rapid_ym2612, multi_ym_updates int emustatus; // rapid_ym2612, multi_ym_updates
struct PicoTiming timing;
void (*PicoWriteSound)(int len) = NULL; // called at the best time to send sound buffer (PsndOut) to hardware void (*PicoWriteSound)(int len) = NULL; // called at the best time to send sound buffer (PsndOut) to hardware
void (*PicoResetHook)(void) = NULL; void (*PicoResetHook)(void) = NULL;
void (*PicoLineHook)(void) = NULL; void (*PicoLineHook)(void) = NULL;
@ -278,31 +280,24 @@ PICO_INTERNAL int CheckDMA(void)
#include "pico_cmn.c" #include "pico_cmn.c"
unsigned int last_z80_sync; /* in 68k cycles */
int z80_cycle_cnt;
int z80_cycle_aim;
int z80_scanline;
int z80_scanline_cycles; /* cycles done until z80_scanline */
/* sync z80 to 68k */ /* sync z80 to 68k */
PICO_INTERNAL void PicoSyncZ80(unsigned int m68k_cycles_done) PICO_INTERNAL void PicoSyncZ80(unsigned int m68k_cycles_done)
{ {
int m68k_cnt; int m68k_cnt;
int cnt; int cnt;
m68k_cnt = m68k_cycles_done - last_z80_sync; m68k_cnt = m68k_cycles_done - timing.m68c_frame_start;
z80_cycle_aim += cycles_68k_to_z80(m68k_cnt); timing.z80c_aim = cycles_68k_to_z80(m68k_cnt);
cnt = z80_cycle_aim - z80_cycle_cnt; cnt = timing.z80c_aim - timing.z80c_cnt;
last_z80_sync = m68k_cycles_done;
pprof_start(z80); pprof_start(z80);
elprintf(EL_BUSREQ, "z80 sync %i (%u|%u -> %u|%u)", cnt, elprintf(EL_BUSREQ, "z80 sync %i (%u|%u -> %u|%u)", cnt,
z80_cycle_cnt, z80_cycle_cnt / 228, timing.z80c_cnt, timing.z80c_cnt * 15 / 7 / 488,
z80_cycle_aim, z80_cycle_aim / 228); timing.z80c_aim, timing.z80c_aim * 15 / 7 / 488);
if (cnt > 0) if (cnt > 0)
z80_cycle_cnt += z80_run(cnt); timing.z80c_cnt += z80_run(cnt);
pprof_end(z80); pprof_end(z80);
} }

View file

@ -78,7 +78,6 @@ static int PicoFrameHints(void)
int hint; // Hint counter int hint; // Hint counter
pevt_log_m68k_o(EVT_FRAME_START); 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 if ((PicoOpt&POPT_ALT_RENDERER) && !PicoSkipFrame && (pv->reg[1]&0x40)) { // fast rend., display enabled
// draw a frame just after vblank in alternative render mode // draw a frame just after vblank in alternative render mode
@ -91,6 +90,8 @@ static int PicoFrameHints(void)
} }
else skip=PicoSkipFrame; else skip=PicoSkipFrame;
timing.m68c_frame_start = SekCyclesDone();
pv->v_counter = Pico.m.scanline = 0;
z80_resetCycles(); z80_resetCycles();
PsndStartFrame(); PsndStartFrame();

View file

@ -211,20 +211,13 @@ extern struct DrZ80 drZ80;
#define Z80_STATE_SIZE 0x60 #define Z80_STATE_SIZE 0x60
extern unsigned int last_z80_sync;
extern int z80_cycle_cnt; /* 'done' z80 cycles before z80_run() */
extern int z80_cycle_aim;
extern int z80_scanline;
extern int z80_scanline_cycles; /* cycles done until z80_scanline */
#define z80_resetCycles() \ #define z80_resetCycles() \
last_z80_sync = SekCyclesDone(); \ timing.z80c_cnt = timing.z80c_aim = timing.z80_scanline = 0
z80_cycle_cnt = z80_cycle_aim = z80_scanline = z80_scanline_cycles = 0;
#define z80_cyclesDone() \ #define z80_cyclesDone() \
(z80_cycle_aim - z80_cyclesLeft) (timing.z80c_aim - z80_cyclesLeft)
#define cycles_68k_to_z80(x) ((x)*957 >> 11) #define cycles_68k_to_z80(x) ((x) * 3823 >> 13)
// ----------------------- SH2 CPU ----------------------- // ----------------------- SH2 CPU -----------------------
@ -599,6 +592,15 @@ struct Pico32xMem
unsigned short pwm_fifo[2][4]; // [0] - current raw, others - fifo entries unsigned short pwm_fifo[2][4]; // [0] - current raw, others - fifo entries
}; };
struct PicoTiming
{
unsigned int m68c_frame_start; // m68k cycles
unsigned int z80c_cnt; // z80 cycles done (this frame)
unsigned int z80c_aim;
int z80_scanline;
};
extern struct PicoTiming timing;
// area.c // area.c
extern void (*PicoLoadStateHook)(void); extern void (*PicoLoadStateHook)(void);
@ -1092,3 +1094,4 @@ void pevt_dump(void);
#endif // PICO_INTERNAL_INCLUDED #endif // PICO_INTERNAL_INCLUDED
// vim:shiftwidth=2:ts=2:expandtab