core, fix Pico horizontal irq (on irq level 5)
authorkub <derkub@gmail.com>
Sat, 20 Jan 2024 16:15:51 +0000 (17:15 +0100)
committerkub <derkub@gmail.com>
Sat, 20 Jan 2024 16:15:51 +0000 (17:15 +0100)
pico/pico.c
pico/pico_cmn.c
pico/pico_int.h
pico/sek.c
pico/videoport.c

index ad57b6e..cc5ef7c 100644 (file)
@@ -185,6 +185,7 @@ int PicoReset(void)
 \r
   PicoDetectRegion();\r
   Pico.video.status = 0x3428 | Pico.m.pal; // 'always set' bits | vblank | collision | pal\r
+  Pico.video.hint_irq = (PicoIn.AHW & PAHW_PICO ? 5 : 4);\r
 \r
   PsndReset(); // pal must be known here\r
 \r
index 5a73544..d51477f 100644 (file)
@@ -105,8 +105,8 @@ static void do_hint(struct PicoVideo *pv)
   pv->pending_ints |= 0x10;
   if (pv->reg[0] & 0x10) {
     elprintf(EL_INTS, "hint: @ %06x [%u]", SekPc, SekCyclesDone());
-    if (SekIrqLevel < 4)
-      SekInterrupt(4);
+    if (SekIrqLevel < pv->hint_irq)
+      SekInterrupt(pv->hint_irq);
   }
 }
 
index 9ccfddb..cbf61e4 100644 (file)
@@ -312,7 +312,7 @@ struct PicoVideo
   unsigned char debug_p;      // ... parsed: PVD_*\r
   unsigned char addr_u;       // bit16 of .addr\r
   unsigned char hint_cnt;\r
-  unsigned char pad2;\r
+  unsigned char hint_irq;     // irq# of HINT (4 on MD, 5 on Pico)\r
   unsigned short hv_latch;    // latched hvcounter value\r
   signed int fifo_cnt;        // pending xfers for blocking FIFO queue entries\r
   signed int fifo_bgcnt;      // pending xfers for background FIFO queue entries\r
index 4dd0b4a..236d03f 100644 (file)
@@ -35,7 +35,8 @@ static int do_ack(int level)
   if (pv->pending_ints & pv->reg[1] & 0x20) {\r
     pv->pending_ints &= ~0x20;\r
     pv->status &= ~SR_F;\r
-    return (pv->reg[0] & pv->pending_ints & 0x10) >> 2;\r
+    if (pv->reg[0] & pv->pending_ints & 0x10)\r
+      return pv->hint_irq;\r
   }\r
   else if (pv->pending_ints & pv->reg[0] & 0x10)\r
     pv->pending_ints &= ~0x10;\r
index fe8e5eb..dcfc58c 100644 (file)
@@ -979,7 +979,7 @@ PICO_INTERNAL_ASM void PicoVideoWrite(u32 a,unsigned short d)
         }\r
         SATaddr = ((pvid->reg[5]&0x7f) << 9) | ((pvid->reg[6]&0x20) << 11);\r
         SATmask = ~0x1ff;\r
-        if (Pico.video.reg[12]&1)\r
+        if (pvid->reg[12]&1)\r
           SATaddr &= ~0x200, SATmask &= ~0x200; // H40, zero lowest SAT bit\r
         //elprintf(EL_STATUS, "spritep moved to %04x", SATaddr);\r
         return;\r
@@ -993,8 +993,9 @@ update_irq:
           lines = (pvid->reg[1] & 0x20) | (pvid->reg[0] & 0x10);\r
           pints = pvid->pending_ints & lines;\r
                if (pints & 0x20) irq = 6;\r
-          else if (pints & 0x10) irq = 4;\r
-          SekInterrupt(irq); // update line\r
+          else if (pints & 0x10) irq = pvid->hint_irq;\r
+          if (SekIrqLevel < irq)\r
+            SekInterrupt(irq); // update line\r
 \r
           // this is broken because cost of current insn isn't known here\r
           if (irq) SekEndRun(21); // make it delayed\r