From: beeanyew Date: Wed, 23 Jun 2021 04:43:25 +0000 (+0200) Subject: Revert to new IRQ behavior after some unsuccessful experiments X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=6695f9335e1d2ff30d775909a86070d80f34c7f1;p=pistorm 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. --- 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; }