]> git.sesse.net Git - pistorm/commitdiff
Revert to new IRQ behavior after some unsuccessful experiments
authorbeeanyew <beeanyew@gmail.com>
Wed, 23 Jun 2021 04:43:25 +0000 (06:43 +0200)
committerbeeanyew <beeanyew@gmail.com>
Wed, 23 Jun 2021 04:43:25 +0000 (06:43 +0200)
This brings back all the graphics and music glitches, but it does make fewer games and software lock up on missed IRQs.

emulator.c

index 968f52e7bd430c988034566d401d08039c322d37..8a796670e27b6bb890a116e1f84fda312a3f8d0c 100644 (file)
@@ -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;
   }