X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=emulator.c;fp=emulator.c;h=8a796670e27b6bb890a116e1f84fda312a3f8d0c;hb=6695f9335e1d2ff30d775909a86070d80f34c7f1;hp=968f52e7bd430c988034566d401d08039c322d37;hpb=77a6ed07560273d6d5f55ae7805e2ab7fb64639d;p=pistorm 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; }