⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsa.c

📁 这是一个VCD解码的学习资料,主要是CD SERVO 的一些源代码!以供大家参考!
💻 C
📖 第 1 页 / 共 3 页
字号:
#ifdef MONE_DSA_TIMEOUT              	  
  	  psprintf(linebuf, "TrkChg Timeout max:%x min:%x now:%x\n", max,min,now);
  	  NowPrint(linebuf);
#endif      
		      		
		    		SetIntrFlag(GetIntrFlag()|INTR_TRACK_CHANGE);
		        	AVD_SetMediaTimeout();
					cd_trk_now = low;
		        }
	    }	      	
      }else
      {     	
          if((cd_type_loaded!=CDROM))
	      {
	      	cd_trk_now=low;	
	      }
      }
      
      
  		switch(play_state)
  		{      			
  			case VCD_STATE_NORMAL:
  			case VCD_STATE_9FRAMES:
  			case VCD_STATE_INTRO:  			
  				CounterChgSkipTrkFlg=20;//terry ,1103
  				ChkIsSkipTrk=1;  			
  			
  			
  			case VCD_STATE_FASTFORWARD:
  			case VCD_STATE_FREEZE:
  			case VCD_STATE_SLOW:
			case VCD_STATE_PREVIEW:
			
			
			if(low==cd_trk_hi)
			{
				max=gettrkmsf_leadout();
	  	  		if(now>=max)
	  	  		{	
#ifdef MONE_DSA_TIMEOUT              	  
  	  psprintf(linebuf, "TrkChg Timeout max:%x min:%x now:%x\n", max,min,now);
  	  NowPrint(linebuf);
#endif      
	    			SetIntrFlag(GetIntrFlag()|INTR_TRACK_CHANGE);
	        		AVD_SetMediaTimeout();
	        		cd_trk_now++;
	        	}
	        }
        	break;
       	}
      //printf("Skip:%d\n",ChkIsSkipTrk);
      SetQcodeTRK(low);
      get_cdkit_time(CD_TRK_CHANGED);
      
      if(cd_type_loaded!=CDDA)  /*jhuang 2001/6/14*/
      goto_active = 0;
      break;

    /*
    ** CDKIT_ACT_IDX	??
    */
    case CDKIT_ACT_IDX: break;

    /*
    ** CDKIT_ACT_MM	Actual playback time
    ** CDKIT_ABS_MM	Absolute playback time
    */
    case CDKIT_ACT_MM:
    case CDKIT_ABS_MM:
    
      SetQcodeMM(low);
      cd_msf_changed	|= MSF_MM_CHANGED;
      if(vcd_state&VCD_CDDA)
      {
      	if( (sys_cmd!=(CMD_FUNC|CMD_FUNC_REPAB))&&cd_trk_now )
      	s_msf=(s_msf&0xff00ffff)|(low<<16);
      }      
      break;

    case CDKIT_ACT_SS:
    case CDKIT_ABS_SS:

      SetQcodeSS(low);
      cd_msf_changed	|= MSF_SS_CHANGED;
      
      if(vcd_state&VCD_CDDA)
      {
      	if( (sys_cmd!=(CMD_FUNC|CMD_FUNC_REPAB))&&cd_trk_now )
      	s_msf=(s_msf&0xffff00ff)|(low<<8);
      }
      
      
#if 0
      psprintf(linebuf, "%x-%x-%02d:%02d",osd_font_mode,play_state, cd_qcode_mm, cd_qcode_ss);
      osd_print2(linebuf);
#endif
      break;

#if	SUPPORT_CDKIT_FF
    case CDKIT_ABS_FF:
      SetQcodeFF(low);
      cd_msf_changed	|= MSF_FF_CHANGED;
      break;
#endif

    case CDKIT_DISC_STATUS:
      if (low&0x01)
        PostCommand(CMD_FUNC | CMD_FUNC_DISC_PRESENT);
      break;
    case CDKIT_ERROR:
    	//printf("err\n");
      switch(low&0xff)
      {
        case CDKIT_ERR_FOCUS:        
          //printf("focus\n");
          ServoFocusFail();
          break; 
       case CDKIT_RECOVER_ERR:              	  
       
       	  ServoRecoverFail();       	  		
       	  break;
      }
#ifdef	MONE_DSA_ERROR
      psprintf(linebuf, "DSAERR: %02x ", low);
      //osd_print2_f(linebuf);   
      epp_write(linebuf);
      epp_write(dsa_error_string(low));
      epp_write("\n");
#endif/*MONE_DSA_ERROR*/

      #ifndef SUPPORT_COMBO  //kevinlu 2001.5.30
      dsaResetCommandQueue();
      #endif

      break;

    case CDKIT_MOVING:
      if (low==0x01)
      {
        /* outside */
	   vfd_set_open();
	/* NMI */
	if (GetIntrMask()&INTR_TRAYOUT)
        {
          SetIntrFlag(GetIntrFlag()|INTR_TRAYOUT);
          AVD_SetMediaTimeout();
#ifdef	MONE_TIMEOUT_DSA
  	    epp_write("TimeOut CDMOVE\n");
#endif
        }
        PostCommand(CMD_FUNC | CMD_FUNC_OPEN);
        CDSetOpen();
      }
      else
      {
        /* inside */
	if(play_state==VCD_STATE_CLOSE)
	{
	  
	  erase_vfd_mem();
	  vfd_set_close();
	  
	  
	}
	/* NMI */
	if (GetIntrMask()&INTR_TRAYIN)
	{
          SetIntrFlag(GetIntrFlag()|INTR_TRAYIN);
          AVD_SetMediaTimeout();
#ifdef	MONE_TIMEOUT_DSA
  	      epp_write("TimeIn CDMOVE\n");
#endif
	}
        PostCommand(CMD_FUNC | CMD_FUNC_CLOSE);
        
        if (CDOpened())
           {
        	#include "osd.h"
	        #include "user_init.h"
	  
        	
        	dsaSendCommand(DSA_CLOSE_TRAY);/*jhuang 891024 if force tray to close,resend dsa command*/
        	CDSetStop();
                
                
	  	#ifdef JINZH_VCD    /*jhuang 2001/5/22 05:10PM*/         	   
	   	 PrintOsdMsg(STR_OS_READWAIT,REGION0,0,0);
	   	 PrintOsdMsg(STR_OS_WAITING,REGION1,0,0);  
	  	#endif  
           
           }
        
        
      }
      break;

    case CDKIT_OPEN:
      /*
      ** tray actually opened
      */
      if (GetIntrMask()&INTR_TRAYOUT)
      {
        SetIntrFlag(GetIntrFlag()|INTR_TRAYOUT);
#ifdef	MONE_INTR
    epp_write("CD INTR4\n");
#endif
        AVD_SetMediaInterrupt();
      }
      PostCommand(CMD_FUNC | CMD_FUNC_OPEN);
      CDSetOpen();
      break;

    case CDKIT_CLOSE:
      /*  
      ** tray actually closed
      */
      if (GetIntrMask()&INTR_TRAYIN)
      {
#ifdef	MONE_INTR
    epp_write("CD INTR5\n");
#endif
        SetIntrFlag(GetIntrFlag()|INTR_TRAYIN);
        AVD_SetMediaInterrupt();
      }
      PostCommand(CMD_FUNC | CMD_FUNC_CLOSED);
      
      if (CDOpened()) CDSetStop();
      break;

     
    case CDKIT_FOUND:
          
          if(cd_type_loaded==CDDA)  /*jhuang 2001/6/14*/
           goto_active=0; 
          
#ifdef	MONE_DSA_FOUND
      epp_write("FOUND\n");
#endif
	  //cd_seek_error=0;
      SetIntrFlag(GetIntrFlag()|INTR_FOUND);
      break;

	case CDKIT_SESSION_INFO:
       	SessionNs=low;
       	break;
       	
    case CDKIT_STOPPED:
    	#ifdef NES_GAME  /*summer 2001/5/9 09:44AM*/
    	if(bDiscType&NES_DISC)
    	bDiscType|=NES_CD_STOP_OK;  
    	#endif
    	break;
    //case CDKIT_TOC_LEADOUT_MM:
    //case CDKIT_TOC_LEADOUT_SS:
    //case CDKIT_TOC_LEADOUT_FF:
    //case CDKIT_AB_RELEASED:
    
    //case CDKIT_DAC_MODE:
    //case CDKIT_SERVO_VERSION:
    //default:
    //  break;
  }
}


/*
** FUNCTION
** polling_dsar
**
** DESCRIPTION
** check if receiving DSA command(s)
*/
/*kevinlu 2000.9.15*/
#ifdef LINEAR_PLAYBACK
int     polling_dsar(int n)
{
  Servo_monitor();
  return 0;
}
#else
#ifdef SUPPORT_COMBO
int     polling_dsar(int n)
{
  UINT32    rx;
  
  rx=Servo_command(0,0,0,0);  
  if(rx)  /*jhuang 2000/11/27 reduce warning*/
  {
    dsa_response(rx);
  }
  return n;
}
#else
int     polling_dsar(int n)
{
  int   retval	= 0;
  do {
    if (IsDsaRxFull)
    {
      UINT32    rx = dsaReadRx();

      dsa_response(rx);
#ifdef	MONE_DSA_READ
      psprintf(linebuf, "DSAR: %04x\n", rx);
      epp_write(linebuf);
#endif
      if ((rx&0xff00) == CDKIT_ERROR)
        return -1;
      retval++;
    }
  } while (n>0);
  return retval;
}
#endif
#endif

/*
** FUNCTION
** polling_dsat
**
** DESCRIPTION
** transmit DSA commands.
*/
/*kevinlu 2000.9.15*/
#ifdef LINEAR_PLAYBACK
int     polling_dsat(int n)
{
  return n;
}
#else
#ifdef SUPPORT_COMBO
int     polling_dsat(int n)
{
  return n;
}
#else
int     polling_dsat(int n)
{
  int   head = dsa_cmd_head;
  int   tail = dsa_cmd_tail;
  do {
    if (head==tail) break;
    if (IsDsaTxEmpty)
    {
      UINT32	tx = dsa_cmd[tail];
#ifdef	MONE_DSA_WRITE
      psprintf(linebuf, "DSAW: %04x\n", tx);
      epp_write(linebuf);
#endif
      dsaWriteTx(tx);
      tail = WRAPr(tail+1, DSA_CMD_BUF_SIZE);
      n--;
    }
  } while (n>0);
  dsa_cmd_tail = tail;
  return 0;
}
#endif
#endif


/*BYTE cdkit_time_equal(UINT32 endMSF)
{
 
 int now,end;
  
 now = cd_qcode_mm*60+cd_qcode_ss;
 end = msf_mm(endMSF)*60+msf_ss(endMSF);
 if(now>=end)
    return 1;
 else
   return 0;
}*/




/*
**Check msf time in the same track
**ChkTrkTmByMSF
**Terry, 890918
*/
UINT32 ChkTrkTmByMSF(UINT32 msf)
{
	  BYTE now=cd_trk_now,intr=0;
      UINT32 min,max;
            	
      if(IsAVDMediaTimeout())
	  	return 0;
	  	
      if(cd_type_loaded==CDROM)
      	return 1;      
       
      if(rep_ab_mode==REPEAT_FIND_B)
      	return 1;
      
      if(cd_type_loaded!=CDDA)
      {
        if(!(psd_state&PSD_PLAY_TRACK))
      		return 1;
      }else if(!cd_trk_now)      	
      	now=v11_trk_now;
      
      min=gettrkmsf(now)&0x00FFFFFF;      
      if(now==cd_trk_hi)
        max=gettrkmsf_leadout();
      else
        max=gettrkmsf(now+1)&0x00FFFFFF;
      
      if(adv_search_time)
      {
      	if( (min>=msf)||(msf>=max) )
      		intr=1;
      }else
      {
      	if( (min>msf)||(msf>max) )
      		intr=1;
      }
      
      if(intr)		
      {     
#ifdef	MONE_INTR
    epp_write("CD INTR6\n");
#endif
        SetIntrFlag(GetIntrFlag()|INTR_PROG_END);
      	AVD_SetMediaTimeout();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -