vdp fifo, tentative fix for hanging DMA
authorkub <derkub@gmail.com>
Thu, 17 Sep 2020 21:47:34 +0000 (23:47 +0200)
committerkub <derkub@gmail.com>
Thu, 17 Sep 2020 22:25:14 +0000 (00:25 +0200)
pico/videoport.c

index f324f70..cbcc60d 100644 (file)
@@ -64,7 +64,7 @@ static struct VdpFIFO { // XXX this must go into save file!
   // queued FIFO transfers, ...x = index, ...l = queue length\r
   // each entry has 2 values: [n]>>3 = #writes, [n]&7 = flags (FQ_*)\r
   unsigned int fifo_queue[8], fifo_qx, fifo_ql;\r
-  unsigned int fifo_total;    // total# of pending FIFO entries (w/o BGDMA)\r
+  int fifo_total;             // total# of pending FIFO entries (w/o BGDMA)\r
 \r
   unsigned short fifo_slot;   // last executed slot in current scanline\r
   unsigned short fifo_maxslot;// #slots in scanline\r
@@ -85,7 +85,7 @@ static __inline int AdvanceFIFOEntry(struct VdpFIFO *vf, struct PicoVideo *pv, i
   if (l > cnt)\r
     l = cnt;\r
   if (!(vf->fifo_queue[vf->fifo_qx] & FQ_BGDMA))\r
-    vf->fifo_total -= ((cnt & b) + l) >> b;\r
+    if ((vf->fifo_total -= ((cnt & b) + l) >> b) < 0) vf->fifo_total = 0;\r
   cnt -= l;\r
 \r
   // if entry has been processed...\r