From 6695f9335e1d2ff30d775909a86070d80f34c7f1 Mon Sep 17 00:00:00 2001 From: beeanyew Date: Wed, 23 Jun 2021 06:43:25 +0200 Subject: [PATCH] Revert to new IRQ behavior after some unsuccessful experiments This brings back all the graphics and music glitches, but it does make fewer games and software lock up on missed IRQs. --- emulator.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/emulator.c b/emulator.c index 968f52e..8a79667 100644 --- a/emulator.c +++ b/emulator.c @@ -116,6 +116,8 @@ void *ipl_task(void *args) { while (1) { value = *(gpio + 13); + if (value & (1 << PIN_TXN_IN_PROGRESS)) + goto noppers; if (!(value & (1 << PIN_IPL_ZERO))) { old_irq = irq_delay; @@ -170,6 +172,7 @@ void *ipl_task(void *args) { }*/ //usleep(0); //NOP NOP +noppers: NOP NOP NOP NOP NOP NOP NOP NOP //NOP NOP NOP NOP NOP NOP NOP NOP //NOP NOP NOP NOP NOP NOP NOP NOP @@ -180,6 +183,20 @@ void *ipl_task(void *args) { return args; } +static inline unsigned int inline_read_status_reg() { + *(gpio + 7) = (REG_STATUS << PIN_A0); + *(gpio + 7) = 1 << PIN_RD; + *(gpio + 7) = 1 << PIN_RD; + *(gpio + 7) = 1 << PIN_RD; + *(gpio + 7) = 1 << PIN_RD; + + unsigned int value = *(gpio + 13); + + *(gpio + 10) = 0xffffec; + + return (value >> 8) & 0xffff; +} + void *cpu_task() { m68ki_cpu_core *state = &m68ki_cpu; m68k_pulse_reset(state); @@ -209,13 +226,15 @@ cpu_loop: } } - if (irq) { - last_irq = ((read_reg() & 0xe000) >> 13); + while (irq) { + last_irq = ((inline_read_status_reg() & 0xe000) >> 13); if (last_irq != last_last_irq) { last_last_irq = last_irq; M68K_SET_IRQ(last_irq); } - } else if (!irq && last_last_irq != 0) { + m68k_execute(state, 50); + } + if (!irq && last_last_irq != 0) { M68K_SET_IRQ(0); last_last_irq = 0; } -- 2.39.2