handle dbra wait loops, update cyclone

This commit is contained in:
notaz 2013-09-08 16:43:54 +03:00
parent e71fae1f13
commit ecc8036ee2
9 changed files with 60 additions and 12 deletions

View file

@ -65,7 +65,7 @@ static int m68k_poll_detect(u32 a, u32 cycles, u32 flags)
int ret = 0;
if (a - 2 <= m68k_poll.addr && m68k_poll.addr <= a + 2
&& cycles - m68k_poll.cycles <= 64)
&& cycles - m68k_poll.cycles <= 64 && !SekNotPolling)
{
if (m68k_poll.cnt++ > POLL_THRESHOLD) {
if (!(Pico32x.emu_flags & flags)) {
@ -79,6 +79,7 @@ static int m68k_poll_detect(u32 a, u32 cycles, u32 flags)
else {
m68k_poll.cnt = 0;
m68k_poll.addr = a;
SekNotPolling = 0;
}
m68k_poll.cycles = cycles;
@ -186,15 +187,9 @@ static u32 p32x_reg_read16(u32 a)
return sh2_comm_faker(a);
#else
if ((a & 0x30) == 0x20) {
static u32 dr2 = 0;
unsigned int cycles = SekCyclesDone();
int comreg = 1 << (a & 0x0f) / 2;
// evil X-Men proto polls in a dbra loop and expects it to expire..
if (SekDar(2) != dr2)
m68k_poll.cnt = 0;
dr2 = SekDar(2);
if (cycles - msh2.m68krcycles_done > 244
|| (Pico32x.comm_dirty_68k & comreg))
p32x_sync_sh2s(cycles);
@ -205,7 +200,6 @@ static u32 p32x_reg_read16(u32 a)
SekSetStop(1);
SekEndRun(16);
}
dr2 = SekDar(2);
goto out;
}
#endif

View file

@ -75,9 +75,10 @@ static void remap_word_ram(u32 r3);
void m68k_comm_check(u32 a)
{
pcd_sync_s68k(SekCyclesDone(), 0);
if (a != Pico_mcd->m.m68k_poll_a) {
if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a) {
Pico_mcd->m.m68k_poll_a = a;
Pico_mcd->m.m68k_poll_cnt = 0;
SekNotPolling = 0;
return;
}
Pico_mcd->m.m68k_poll_cnt++;
@ -246,7 +247,7 @@ u32 s68k_poll_detect(u32 a, u32 d)
return d;
cycles = SekCyclesDoneS68k();
if (a == Pico_mcd->m.s68k_poll_a) {
if (!SekNotPolling && a == Pico_mcd->m.s68k_poll_a) {
u32 clkdiff = cycles - Pico_mcd->m.s68k_poll_clk;
if (clkdiff <= POLL_CYCLES) {
cnt = Pico_mcd->m.s68k_poll_cnt + 1;
@ -261,6 +262,7 @@ u32 s68k_poll_detect(u32 a, u32 d)
Pico_mcd->m.s68k_poll_a = a;
Pico_mcd->m.s68k_poll_clk = cycles;
Pico_mcd->m.s68k_poll_cnt = cnt;
SekNotPollingS68k = 0;
#endif
return d;
}

View file

@ -51,6 +51,9 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k;
#define SekIsStoppedS68k() (PicoCpuCS68k.state_flags&1)
#define SekShouldInterrupt() (PicoCpuCM68k.irq > (PicoCpuCM68k.srh&7))
#define SekNotPolling PicoCpuCM68k.not_pol
#define SekNotPollingS68k PicoCpuCS68k.not_pol
#define SekInterrupt(i) PicoCpuCM68k.irq=i
#define SekIrqLevel PicoCpuCM68k.irq
@ -79,6 +82,9 @@ extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;
#define SekIsStoppedS68k() (PicoCpuFS68k.execinfo&FM68K_HALTED)
#define SekShouldInterrupt() fm68k_would_interrupt()
#define SekNotPolling PicoCpuFM68k.not_polling
#define SekNotPollingS68k PicoCpuFS68k.not_polling
#define SekInterrupt(irq) PicoCpuFM68k.interrupts[0]=irq
#define SekIrqLevel PicoCpuFM68k.interrupts[0]
@ -108,6 +114,9 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k;
#define SekIsStoppedS68k() (PicoCpuMS68k.stopped==STOP_LEVEL_STOP)
#define SekShouldInterrupt() (CPU_INT_LEVEL > FLAG_INT_MASK)
#define SekNotPolling PicoCpuMM68k.not_polling
#define SekNotPollingS68k PicoCpuMS68k.not_polling
#define SekInterrupt(irq) { \
void *oldcontext = m68ki_cpu_p; \
m68k_set_context(&PicoCpuMM68k); \