/[pcsx2_0.9.7]/trunk/pcsx2/Gif.cpp
ViewVC logotype

Diff of /trunk/pcsx2/Gif.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 62 by william, Tue Sep 7 11:08:22 2010 UTC revision 283 by william, Thu Dec 23 12:39:52 2010 UTC
# Line 27  using std::min; Line 27  using std::min;
27  // A three-way toggle used to determine if the GIF is stalling (transferring) or done (finished).  // A three-way toggle used to determine if the GIF is stalling (transferring) or done (finished).
28  // Should be a gifstate_t rather then int, but I don't feel like possibly interfering with savestates right now.  // Should be a gifstate_t rather then int, but I don't feel like possibly interfering with savestates right now.
29  static int gifstate = GIF_STATE_READY;  static int gifstate = GIF_STATE_READY;
 static bool gifempty = false;  
30    
31  static bool gspath3done = false;  static bool gspath3done = false;
32    
# Line 47  static __fi void clearFIFOstuff(bool ful Line 46  static __fi void clearFIFOstuff(bool ful
46          else          else
47                  CSRreg.FIFO = CSR_FIFO_EMPTY;                  CSRreg.FIFO = CSR_FIFO_EMPTY;
48  }  }
49    extern bool SIGNAL_IMR_Pending;
50  void gsPath1Interrupt()  void gsPath1Interrupt()
51  {  {
52          //DevCon.Warning("Path1 flush W %x, R %x", Path1WritePos, Path1ReadPos);          //DevCon.Warning("Path1 flush W %x, R %x", Path1WritePos, Path1ReadPos);
53    
54                    
55    
56          if((gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.IP3 == true && gifRegs.stat.APATH == GIF_APATH3)) && Path1WritePos > 0 && !gifRegs.stat.PSE)          if((gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.IP3 == true && gifRegs.stat.APATH == GIF_APATH3)) && Path1WritePos > 0 && !gifRegs.stat.PSE && SIGNAL_IMR_Pending == false)
57          {          {
58                  gifRegs.stat.P1Q = false;                  gifRegs.stat.P1Q = false;
59    
# Line 62  void gsPath1Interrupt() Line 61  void gsPath1Interrupt()
61                  {                  {
62                          GetMTGS().PrepDataPacket(GIF_PATH_1, size);                          GetMTGS().PrepDataPacket(GIF_PATH_1, size);
63                          //DevCon.Warning("Flush Size = %x", size);                          //DevCon.Warning("Flush Size = %x", size);
64                          while(size > 0)                          while(size > 0 && SIGNAL_IMR_Pending == false)
65                          {                          {
66                                  uint count = GIFPath_CopyTag(GIF_PATH_1, ((u128*)Path1Buffer) + Path1ReadPos, size);                                  uint count = GIFPath_CopyTag(GIF_PATH_1, ((u128*)Path1Buffer) + Path1ReadPos, size);
67                                  Path1ReadPos += count;                                  Path1ReadPos += count;
# Line 79  void gsPath1Interrupt() Line 78  void gsPath1Interrupt()
78                          if(Path1ReadPos == Path1WritePos)                          if(Path1ReadPos == Path1WritePos)
79                          {                          {
80                                  Path1WritePos = Path1ReadPos = 0;                                  Path1WritePos = Path1ReadPos = 0;
81                            }
82                            else
83                            {
84                                    //DevCon.Warning("Queue quitting early due to signal or EOP %x", size);
85                                    gifRegs.stat.P1Q = true;
86                          }                          }
87                  }                  }
88          }          }
89          else          else
90          {          {
91                  if(gifRegs.stat.PSE) DevCon.Warning("Path1 paused by GIF_CTRL");                  if(gifRegs.stat.PSE) DevCon.Warning("Path1 paused by GIF_CTRL");
92                  DevCon.Warning("Looping??? IP3 %x APATH %x OPH %x", gifRegs.stat.IP3, gifRegs.stat.APATH, gifRegs.stat.OPH);                  //DevCon.Warning("Looping??? IP3 %x APATH %x OPH %x", gifRegs.stat.IP3, gifRegs.stat.APATH, gifRegs.stat.OPH);
93                  //if(!(cpuRegs.interrupt & (1<<28)) && Path1WritePos > 0)CPU_INT(28, 128);                  //if(!(cpuRegs.interrupt & (1<<28)) && Path1WritePos > 0)CPU_INT(28, 128);
94          }          }
95                    
# Line 95  extern bool SIGNAL_IMR_Pending; Line 99  extern bool SIGNAL_IMR_Pending;
99    
100  __fi void gsInterrupt()  __fi void gsInterrupt()
101  {  {
102          GIF_LOG("gsInterrupt: %8.8x", cpuRegs.cycle);          GIF_LOG("gsInterrupt caught!");
103    
104            if (dmacRegs.ctrl.MFD == MFD_GIF)  // GIF MFIFO
105            {
106                    //Console.WriteLn("GIF MFIFO");
107                    gifMFIFOInterrupt();
108                    return;
109            }      
110    
111          if(SIGNAL_IMR_Pending == true)          if(SIGNAL_IMR_Pending == true)
112          {          {
# Line 234  bool CheckPaths(int Channel) Line 245  bool CheckPaths(int Channel)
245                  {                  {
246                          if((vif1.cmd & 0x7f) != 0x51 || gifRegs.stat.P1Q == true)                          if((vif1.cmd & 0x7f) != 0x51 || gifRegs.stat.P1Q == true)
247                          {                          {
248                                            //DevCon.Warning("GIF Stall 1 P1Q %x P2Q %x APATH %x PTH3 %x vif1cmd %x", gifRegs.stat.P1Q, gifRegs.stat.P2Q, gifRegs.stat.APATH, GSTransferStatus.PTH3, vif1.cmd);
249                                          gifRegs.stat.IP3 = true;                                          gifRegs.stat.IP3 = true;
250                                          if(gifRegs.stat.P1Q) gsPath1Interrupt();                                          if(gifRegs.stat.P1Q) gsPath1Interrupt();
251                                          CPU_INT(DMAC_GIF, 16);                                          CPU_INT(DMAC_GIF, 16);
# Line 246  bool CheckPaths(int Channel) Line 258  bool CheckPaths(int Channel)
258                  //This should cover both scenarios, as DIRECTHL doesn't gain priority when image mode is running (PENDINGIMAGE_MODE == fininshed).                  //This should cover both scenarios, as DIRECTHL doesn't gain priority when image mode is running (PENDINGIMAGE_MODE == fininshed).
259                  if((gifRegs.stat.P1Q == true || gifRegs.stat.P2Q == true) || (gifRegs.stat.APATH > GIF_APATH_IDLE && gifRegs.stat.APATH < GIF_APATH3))                  if((gifRegs.stat.P1Q == true || gifRegs.stat.P2Q == true) || (gifRegs.stat.APATH > GIF_APATH_IDLE && gifRegs.stat.APATH < GIF_APATH3))
260                  {                  {
261                            //DevCon.Warning("GIF Stall 2 P1Q %x P2Q %x APATH %x PTH3 %x vif1cmd %x", gifRegs.stat.P1Q, gifRegs.stat.P2Q, gifRegs.stat.APATH, GSTransferStatus.PTH3, vif1.cmd);
262                          gifRegs.stat.IP3 = true;                          gifRegs.stat.IP3 = true;
263                          CPU_INT(DMAC_GIF, 16);                          CPU_INT(DMAC_GIF, 16);
264                          return false;                          return false;
# Line 430  void dmaGIF() Line 443  void dmaGIF()
443                  }                  }
444          }          }
445    
446          if (dmacRegs.ctrl.MFD == MFD_GIF)  // GIF MFIFO          
447          {  
448                  //Console.WriteLn("GIF MFIFO");          gsInterrupt();
449                  gifMFIFOInterrupt();  }
450                  return;  
451          }        static u16 QWCinGIFMFIFO(u32 DrainADDR)
452    {
453            u32 ret;
454            
455    
456          GIFdma();          GIF_LOG("GIF MFIFO Requesting %x QWC from the MFIFO Base %x, SPR MADR %x Drain %x", gifch.qwc, dmacRegs.rbor.ADDR, spr0ch.madr, DrainADDR);
457            //Calculate what we have in the fifo.
458            if(DrainADDR <= spr0ch.madr)
459            {
460                    //Drain is below the tadr, calculate the difference between them
461                    ret = (spr0ch.madr - DrainADDR) >> 4;
462            }
463            else
464            {
465                    u32 limit = dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16;
466                    //Drain is higher than SPR so it has looped round,
467                    //calculate from base to the SPR tag addr and what is left in the top of the ring
468                    ret = ((spr0ch.madr - dmacRegs.rbor.ADDR) + (limit - DrainADDR)) >> 4;
469            }
470            GIF_LOG("%x Available of the %x requested", ret, gifch.qwc);
471            if((s32)ret < 0) DevCon.Warning("GIF Returning %x!", ret);
472            return ret;
473  }  }
474    
475  // called from only one location, so forceinline it:  // called from only one location, so forceinline it:
476  static __fi bool mfifoGIFrbTransfer()  static __fi bool mfifoGIFrbTransfer()
477  {  {
478          u32 mfifoqwc = min(gifqwc, (u32)gifch.qwc);          u16 mfifoqwc = min(QWCinGIFMFIFO(gifch.madr), gifch.qwc);
479          u32 *src;          u32 *src;
480    
481            if(mfifoqwc == 0) return true; //Lets skip all this, we don't have the data
482    
483          GetMTGS().PrepDataPacket(GIF_PATH_3, mfifoqwc);          GetMTGS().PrepDataPacket(GIF_PATH_3, mfifoqwc);
484    
485          // TODO (minor optimization): The new GIFpath parser can do rather efficient wrapping of          // TODO (minor optimization): The new GIFpath parser can do rather efficient wrapping of
486          // its own internally now. We just need to groom a version of it that can wrap around MFIFO          // its own internally now. We just need to groom a version of it that can wrap around MFIFO
487          // memory similarly to how it wraps VU1 memory on PATH1.          // memory similarly to how it wraps VU1 memory on PATH1.
488            GIF_LOG("MFIFO QWC to Transfer %x", mfifoqwc);
489          /* Check if the transfer should wrap around the ring buffer */          /* Check if the transfer should wrap around the ring buffer */
490          if ((gifch.madr + mfifoqwc * 16) > (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16))          if ( (gifch.madr + (mfifoqwc * 16)) > (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16))
491          {          {
492                  uint s1 = ((dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16) - gifch.madr) >> 4;                  uint s1 = ((dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16) - gifch.madr) >> 4;
493                  uint s2 = (mfifoqwc - s1);                  uint s2 = (mfifoqwc - s1);
494                    GIF_LOG("Split transfer doing %x QWC of %x Total QWC", s1, mfifoqwc);
495                  /* it does (wrap around), so first copy 's1' bytes from 'addr' to 'data' */                  /* it does (wrap around), so first copy 's1' bytes from 'addr' to 'data' */
496                  /* and second copy 's2' bytes from 'maddr' to '&data[s1]' */                  /* and second copy 's2' bytes from 'maddr' to '&data[s1]' */
497                    
498                    gifch.madr = dmacRegs.rbor.ADDR + (gifch.madr & dmacRegs.rbsr.RMSK);
499                  src = (u32*)PSM(gifch.madr);                  src = (u32*)PSM(gifch.madr);
500                  if (src == NULL) return false;                  if (src == NULL) return false;
501                  uint copied = GIFPath_CopyTag(GIF_PATH_3, (u128*)src, s1);                  uint copied = GIFPath_CopyTag(GIF_PATH_3, (u128*)src, s1);
502    
503                  if (copied == s1)       // but only copy second if first didn't abort prematurely for some reason.                  if (copied == s1)       // but only copy second if first didn't abort prematurely for some reason.
504                  {                  {
505                            GIF_LOG("Transferring last %x QWC", s2);
506                          src = (u32*)PSM(dmacRegs.rbor.ADDR);                          src = (u32*)PSM(dmacRegs.rbor.ADDR);
507                            gifch.madr = dmacRegs.rbor.ADDR;
508                          if (src == NULL) return false;                          if (src == NULL) return false;
509                          copied += GIFPath_CopyTag(GIF_PATH_3, (u128*)src, s2);                          copied += GIFPath_CopyTag(GIF_PATH_3, (u128*)src, s2);
510                  }                  }
511    
512                  mfifoqwc = copied;                  mfifoqwc = copied;
513                    GIF_LOG("Copied %x QWC, %x QWC Left", mfifoqwc, gifch.qwc);
514          }          }
515          else          else
516          {          {
517                    GIF_LOG("Direct MFIFO transfer doing %x Total QWC", mfifoqwc);
518                  /* it doesn't, so just transfer 'qwc*16' words from 'gifch.madr' to GS */                  /* it doesn't, so just transfer 'qwc*16' words from 'gifch.madr' to GS */
519                    
520                    gifch.madr = dmacRegs.rbor.ADDR + (gifch.madr & dmacRegs.rbsr.RMSK);
521                  src = (u32*)PSM(gifch.madr);                  src = (u32*)PSM(gifch.madr);
522                  if (src == NULL) return false;                  if (src == NULL) return false;
523                  mfifoqwc = GIFPath_CopyTag(GIF_PATH_3, (u128*)src, mfifoqwc);                  mfifoqwc = GIFPath_CopyTag(GIF_PATH_3, (u128*)src, mfifoqwc);
524                  gifch.madr = dmacRegs.rbor.ADDR + (gifch.madr & dmacRegs.rbsr.RMSK);                  GIF_LOG("%X QWC Copied direct %x QWC Left", mfifoqwc, gifch.qwc);
525          }          }
526    
527          GetMTGS().SendDataPacket();          GetMTGS().SendDataPacket();
528          gifqwc -= mfifoqwc;          //gifqwc -= mfifoqwc;
529            mfifocycles += (mfifoqwc) * 2; /* guessing */
530    
531          return true;          return true;
532  }  }
# Line 496  static __fi bool mfifoGIFchain() Line 538  static __fi bool mfifoGIFchain()
538          if (gifch.qwc == 0) return true;          if (gifch.qwc == 0) return true;
539    
540          if (gifch.madr >= dmacRegs.rbor.ADDR &&          if (gifch.madr >= dmacRegs.rbor.ADDR &&
541                  gifch.madr <= (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK))                  gifch.madr <= (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16))
542          {          {
543                  if (!mfifoGIFrbTransfer()) return false;                  bool ret = true;
544            //      if(gifch.madr == (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16)) DevCon.Warning("Edge GIF");
545                    if (!mfifoGIFrbTransfer()) ret = false;
546                    if(QWCinGIFMFIFO(gifch.madr) == 0) gifstate |= GIF_STATE_EMPTY;
547                    return ret;
548    
549          }          }
550          else          else
551          {          {
552                  int mfifoqwc;                  int mfifoqwc;
553                    GIF_LOG("Non-MFIFO Location transfer doing %x Total QWC", gifch.qwc);
554                  tDMA_TAG *pMem = dmaGetAddr(gifch.madr, false);                  tDMA_TAG *pMem = dmaGetAddr(gifch.madr, false);
555                  if (pMem == NULL) return false;                  if (pMem == NULL) return false;
556    
# Line 528  void mfifoGIFtransfer(int qwc) Line 575  void mfifoGIFtransfer(int qwc)
575    
576          if(qwc > 0 )          if(qwc > 0 )
577          {          {
578                  gifqwc += qwc;                  if ((gifstate & GIF_STATE_EMPTY) && !(cpuRegs.interrupt & (1<<DMAC_MFIFO_GIF)))
579                    {
580                  if (!(gifstate & GIF_STATE_EMPTY)) return;                          if(gifch.chcr.STR == true)CPU_INT(DMAC_MFIFO_GIF, 4);
581                  // if (gifempty == false) return;                          gifstate &= ~GIF_STATE_EMPTY;
582                  gifstate &= ~GIF_STATE_EMPTY;                  }
583                  gifempty = false;                  gifRegs.stat.FQC = 16;
584                    return;
585          }          }
586    
587          if (gifRegs.ctrl.PSE)  // temporarily stop          if (gifRegs.ctrl.PSE)  // temporarily stop
# Line 545  void mfifoGIFtransfer(int qwc) Line 593  void mfifoGIFtransfer(int qwc)
593    
594          if (gifch.qwc == 0)          if (gifch.qwc == 0)
595          {          {
                 if (gifch.tadr == spr0ch.madr)  
                 {  
                         //if( gifqwc > 1 ) DevCon.WriteLn("gif mfifo tadr==madr but qwc = %d", gifqwc);  
                         hwDmacIrq(DMAC_MFIFO_EMPTY);  
                         gifstate |= GIF_STATE_EMPTY;  
                         gifempty = true;  
                         return;  
                 }  
   
596                  gifch.tadr = qwctag(gifch.tadr);                  gifch.tadr = qwctag(gifch.tadr);
597    
598                  ptag = dmaGetAddr(gifch.tadr, false);                  ptag = dmaGetAddr(gifch.tadr, false);
# Line 565  void mfifoGIFtransfer(int qwc) Line 604  void mfifoGIFtransfer(int qwc)
604                  GIF_LOG("dmaChain %8.8x_%8.8x size=%d, id=%d, madr=%lx, tadr=%lx mfifo qwc = %x spr0 madr = %x",                  GIF_LOG("dmaChain %8.8x_%8.8x size=%d, id=%d, madr=%lx, tadr=%lx mfifo qwc = %x spr0 madr = %x",
605                                  ptag[1]._u32, ptag[0]._u32, gifch.qwc, ptag->ID, gifch.madr, gifch.tadr, gifqwc, spr0ch.madr);                                  ptag[1]._u32, ptag[0]._u32, gifch.qwc, ptag->ID, gifch.madr, gifch.tadr, gifqwc, spr0ch.madr);
606    
607                  gifqwc--;                  gspath3done = hwDmacSrcChainWithStack(gifch, ptag->ID);
608    
609                  switch (ptag->ID)                  if(gspath3done == true) gifstate = GIF_STATE_DONE;
610                  {                  else gifstate = GIF_STATE_READY;
                         case TAG_REFE:          // Refe - Transfer Packet According to ADDR field  
                                 gifch.tadr = qwctag(gifch.tadr + 16);  
                                 gifstate = GIF_STATE_DONE;                                                                              //End Transfer  
                                 break;  
   
                         case TAG_CNT:           // CNT - Transfer QWC following the tag.  
                                 gifch.madr = qwctag(gifch.tadr + 16);                                           //Set MADR to QW after Tag  
                                 gifch.tadr = qwctag(gifch.madr + (gifch.qwc << 4));             //Set TADR to QW following the data  
                                 gifstate = GIF_STATE_READY;  
                                 break;  
   
                         case TAG_NEXT:          // Next - Transfer QWC following tag. TADR = ADDR  
                         {  
                                 u32 temp = gifch.madr;                                                                  //Temporarily Store ADDR  
                                 gifch.madr = qwctag(gifch.tadr + 16);                                           //Set MADR to QW following the tag  
                                 gifch.tadr = temp;                                                                              //Copy temporarily stored ADDR to Tag  
                                 gifstate = GIF_STATE_READY;  
                                 break;  
                         }  
   
                         case TAG_REF:           // Ref - Transfer QWC from ADDR field  
                         case TAG_REFS:          // Refs - Transfer QWC from ADDR field (Stall Control)  
                                 gifch.tadr = qwctag(gifch.tadr + 16);                                                   //Set TADR to next tag  
                                 gifstate = GIF_STATE_READY;  
                                 break;  
   
                         case TAG_END:           // End - Transfer QWC following the tag  
                                 gifch.madr = qwctag(gifch.tadr + 16);                                   //Set MADR to data following the tag  
                                 gifch.tadr = qwctag(gifch.madr + (gifch.qwc << 4));     //Set TADR to QW following the data  
                                 gifstate = GIF_STATE_DONE;                                                      //End Transfer  
                                 break;  
                         }  
611    
612                  if ((gifch.chcr.TIE) && (ptag->IRQ))                  if ((gifch.chcr.TIE) && (ptag->IRQ))
613                  {                  {
# Line 608  void mfifoGIFtransfer(int qwc) Line 615  void mfifoGIFtransfer(int qwc)
615                          gifstate = GIF_STATE_DONE;                          gifstate = GIF_STATE_DONE;
616                          gifmfifoirq = true;                          gifmfifoirq = true;
617                  }                  }
618           }                  if (QWCinGIFMFIFO(gifch.tadr) == 0) gifstate |= GIF_STATE_EMPTY;
619             }      
620    
621          if (!mfifoGIFchain())          if (!mfifoGIFchain())
622          {          {
# Line 616  void mfifoGIFtransfer(int qwc) Line 624  void mfifoGIFtransfer(int qwc)
624                  gifstate = GIF_STATE_STALL;                  gifstate = GIF_STATE_STALL;
625          }          }
626    
627          if ((gifch.qwc == 0) && (gifstate & GIF_STATE_DONE)) gifstate = GIF_STATE_STALL;          if ((gifch.qwc == 0) && (gifstate & GIF_STATE_DONE)) gifstate |= GIF_STATE_STALL;
628          CPU_INT(DMAC_MFIFO_GIF,mfifocycles);          CPU_INT(DMAC_MFIFO_GIF,mfifocycles);
629    
630          SPR_LOG("mfifoGIFtransfer end %x madr %x, tadr %x", gifch.chcr._u32, gifch.madr, gifch.tadr);          SPR_LOG("mfifoGIFtransfer end %x madr %x, tadr %x", gifch.chcr._u32, gifch.madr, gifch.tadr);
# Line 624  void mfifoGIFtransfer(int qwc) Line 632  void mfifoGIFtransfer(int qwc)
632    
633  void gifMFIFOInterrupt()  void gifMFIFOInterrupt()
634  {  {
635      //Console.WriteLn("gifMFIFOInterrupt");      GIF_LOG("gifMFIFOInterrupt");
636          mfifocycles = 0;          mfifocycles = 0;
637    
638            if (dmacRegs.ctrl.MFD != MFD_GIF)
639            {
640                    DevCon.Warning("Not in GIF MFIFO mode! Stopping GIF MFIFO");
641                    return;
642            }
643    
644          if(SIGNAL_IMR_Pending == true)          if(SIGNAL_IMR_Pending == true)
645          {          {
646                  //DevCon.Warning("Path 3 Paused");                  //DevCon.Warning("Path 3 Paused");
# Line 634  void gifMFIFOInterrupt() Line 648  void gifMFIFOInterrupt()
648                  return;                  return;
649          }          }
650    
651          if(GSTransferStatus.PTH3 == STOPPED_MODE && gifRegs.stat.APATH == GIF_APATH3 )          if(GSTransferStatus.PTH3 >= PENDINGSTOP_MODE && gifRegs.stat.APATH == GIF_APATH3 )
652          {          {
653                  gifRegs.stat.OPH = false;                  gifRegs.stat.OPH = false;
654                    GSTransferStatus.PTH3 = STOPPED_MODE;
655                  gifRegs.stat.APATH = GIF_APATH_IDLE;                  gifRegs.stat.APATH = GIF_APATH_IDLE;
656                  if(gifRegs.stat.P1Q) gsPath1Interrupt();                  if(gifRegs.stat.P1Q) gsPath1Interrupt();
657          }          }
658    
659            if((gifstate & GIF_STATE_EMPTY))
660            {
661                    FireMFIFOEmpty();
662                    if(!(gifstate & GIF_STATE_STALL)) return;
663            }
664    
665          if(CheckPaths(11) == false) return;          if(CheckPaths(11) == false) return;
666    
667          if (!(gifch.chcr.STR))          if (!(gifch.chcr.STR))
# Line 652  void gifMFIFOInterrupt() Line 673  void gifMFIFOInterrupt()
673    
674          if (!(gifstate & GIF_STATE_STALL))          if (!(gifstate & GIF_STATE_STALL))
675          {          {
676                  if (gifqwc <= 0)                  if (QWCinGIFMFIFO(gifch.tadr) == 0)
677                  {                  {
                         //Console.WriteLn("Empty");  
                         hwDmacIrq(DMAC_MFIFO_EMPTY);  
678                          gifstate |= GIF_STATE_EMPTY;                          gifstate |= GIF_STATE_EMPTY;
679                          gifempty = true;                          CPU_INT(DMAC_MFIFO_GIF, 4);
   
                         gifRegs.stat.IMT = false;  
680                          return;                          return;
681                  }                  }
682                    
683                  mfifoGIFtransfer(0);                  mfifoGIFtransfer(0);
684                  return;                  return;
685          }          }
# Line 685  void gifMFIFOInterrupt() Line 703  void gifMFIFOInterrupt()
703          gifch.chcr.STR = false;          gifch.chcr.STR = false;
704          gifstate = GIF_STATE_READY;          gifstate = GIF_STATE_READY;
705          hwDmacIrq(DMAC_GIF);          hwDmacIrq(DMAC_GIF);
706            GIF_LOG("gifMFIFO End");
707          clearFIFOstuff(false);          clearFIFOstuff(false);
708  }  }
709    
# Line 696  void SaveStateBase::gifFreeze() Line 715  void SaveStateBase::gifFreeze()
715          Freeze( gifqwc );          Freeze( gifqwc );
716          Freeze( gspath3done );          Freeze( gspath3done );
717          Freeze( gscycles );          Freeze( gscycles );
         //Freeze(gifempty);  
718          // Note: mfifocycles is not a persistent var, so no need to save it here.          // Note: mfifocycles is not a persistent var, so no need to save it here.
719    
720          int bufsize = Path1WritePos - Path1ReadPos;          int bufsize = Path1WritePos - Path1ReadPos;

Legend:
Removed from v.62  
changed lines
  Added in v.283

  ViewVC Help
Powered by ViewVC 1.1.22