📄 dsa.c
字号:
#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 + -