mcd, improve polling detection

This commit is contained in:
kub 2021-05-14 22:55:03 +02:00
parent fbebab6934
commit 5402223466
3 changed files with 9 additions and 5 deletions

View file

@ -342,7 +342,7 @@ void pcd_run_cpus_normal(int m68k_cycles)
Pico_mcd->m.m68k_poll_cnt = 0; Pico_mcd->m.m68k_poll_cnt = 0;
#ifdef USE_POLL_DETECT #ifdef USE_POLL_DETECT
if (Pico_mcd->m.m68k_poll_cnt >= 16) { if (Pico_mcd->m.m68k_poll_cnt >= 32) {
int s68k_left; int s68k_left;
// main CPU is polling, (wake and) run sub only // main CPU is polling, (wake and) run sub only
if (SekIsStoppedS68k()) if (SekIsStoppedS68k())

View file

@ -63,19 +63,22 @@ static void remap_prg_window(u32 r1, u32 r3);
static void remap_word_ram(u32 r3); static void remap_word_ram(u32 r3);
// poller detection // poller detection
#define POLL_LIMIT 16 #define POLL_LIMIT 32
#define POLL_CYCLES 64 #define POLL_CYCLES 64
void m68k_comm_check(u32 a) void m68k_comm_check(u32 a)
{ {
pcd_sync_s68k(SekCyclesDone(), 0); u32 cycles = SekCyclesDone();
u32 clkdiff = cycles - Pico_mcd->m.m68k_poll_clk;
pcd_sync_s68k(cycles, 0);
if (a >= 0x0e && !Pico_mcd->m.need_sync) { if (a >= 0x0e && !Pico_mcd->m.need_sync) {
// there are cases when slave updates comm and only switches RAM // there are cases when slave updates comm and only switches RAM
// over after that (mcd1b), so there must be a resync.. // over after that (mcd1b), so there must be a resync..
SekEndRun(64); SekEndRun(64);
Pico_mcd->m.need_sync = 1; Pico_mcd->m.need_sync = 1;
} }
if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a) { Pico_mcd->m.m68k_poll_clk = cycles;
if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a || clkdiff > POLL_CYCLES) {
Pico_mcd->m.m68k_poll_a = a; Pico_mcd->m.m68k_poll_a = a;
Pico_mcd->m.m68k_poll_cnt = 0; Pico_mcd->m.m68k_poll_cnt = 0;
SekNotPolling = 0; SekNotPolling = 0;

View file

@ -491,7 +491,8 @@ struct mcd_misc
unsigned char dmna_ret_2m; unsigned char dmna_ret_2m;
unsigned char need_sync; unsigned char need_sync;
unsigned char pad3; unsigned char pad3;
int pad4[9]; unsigned int m68k_poll_clk;
int pad4[8];
}; };
typedef struct typedef struct