📄 cdfunc.c
字号:
#include "config.h"
#include "global.h"
#include "regmap.h"
#include "avd.h"
#include "util.h"
#include "func.h"
#include "cd.h"
#include "dsa.h"
#include "cdfunc.h"
#include "iop.h"//2003/4/1
//#define MONE_TOC_DATA
/*
int cd_func_init(void)
{
#if SUPPORT_DSA
reset_dsa();
dsaSendCommand(DSA_SET_DAC_MODE | CDDAC_SONY_16_FS);
dsaSendCommand(DSA_SET_MODE | (CDDA_SPEED_1x | CDDA_CDROM | CDDA_ATTI_abs));
#endif
dsaSendCommand(0x8010); //abs time
return 0;
}
*/
int cd_func_speed_init(BYTE speed)
{
#if SUPPORT_DSA
reset_dsa();
dsaSendCommand(DSA_SET_DAC_MODE | CDDAC_SONY_16_FS);
dsaSendCommand(DSA_SET_MODE | (speed | CDDA_CDROM | CDDA_ATTI_abs));
if(speed == CDDA_SPEED_2x)
cdrom_speed = 1;
else
cdrom_speed = 0;
#endif
dsaSendCommand(0x8010); //abs time
return 0;
}
/*
int cd_func_2X_init(void)
{
#if SUPPORT_DSA
reset_dsa();
dsaSendCommand(DSA_SET_DAC_MODE | CDDAC_SONY_16_FS);
dsaSendCommand(DSA_SET_MODE | (CDDA_SPEED_2x | CDDA_CDROM | CDDA_ATTI_abs));
cdrom_speed = 1;
#endif
dsaSendCommand(0x8010); //abs time
return 0;
}
*/
int cd_func_tray(int func)
{
#if SUPPORT_DSA
#if !defined(SUPPORT_DISCMAN) || !defined(SUPPORT_BOOMBOX_ESP)
if(func == CD_FUNC_OPEN)
dsaSendCommand(DSA_OPEN_TRAY);
else
dsaSendCommand(DSA_CLOSE_TRAY);
#endif
#endif
return 0;
}
int cd_func_stop(void)
{
#if SUPPORT_DSA
dsaSendCommand(DSA_STOP);
#endif
return 0;
}
int cd_func_playtrack(int trk)
{
#ifdef SUPPORT_ESP
ESP_SHOCK_GOTO_SET();//regs0->iop_data[4] &= (~(1 << 5));
#endif
#if SUPPORT_DSA
if(trk >= 100 && trk < 0)
return -1;
goto_active = GOTO_NONE;
ChkIsSkipTrk = 1;//for CDDA skate condition 2003/3/16
timestamp_cd = regs0->rtc_15_0;
dsaSendCommand(DSA_PLAY | trk);
#endif
return 0;
#if 0
#if SUPPORT_DSA
if(trk >= 100 && trk < 0)
return -1;
dsaSendCommand(DSA_PAUSE_RELEASE);
dsaSendCommand(DSA_PLAY | trk);
#endif
return 0;
#endif
}
int cd_func_gotomsf(UINT32 x_msf)
{
#ifdef SUPPORT_ESP//jhuang 2003/3/3 move to top
ESP_SHOCK_GOTO_SET();//regs0->iop_data[4] &= (~(1 << 5));
#endif
#ifdef SUPPORT_COMBO
if(cd_type != CDDA)
{
regs0->cddsp_mm_bcd = bin2bcd(msf_mm(x_msf));
regs0->cddsp_ss_bcd = bin2bcd(msf_ss(x_msf));
regs0->cddsp_ff_bcd = bin2bcd(msf_ff(x_msf));
//psprintf(linebuf,"SET %x %x %x\n",regs0->cddsp_mm_bcd,regs0->cddsp_ss_bcd,regs0->cddsp_ff_bcd);
//epp_write_wait(linebuf);
}
#endif
#if SUPPORT_DSA
dsaSendCommand(DSA_GOTO_MM | msf_mm(x_msf));
dsaSendCommand(DSA_GOTO_SS | msf_ss(x_msf));
dsaSendCommand(DSA_GOTO_FF | msf_ff(x_msf));
timestamp_cd = regs0->rtc_15_0;
dsa_found = C_FALSE;
#endif
return 0;
#if 0
#if SUPPORT_DSA
dsaSendCommand(DSA_PAUSE_RELEASE);
dsaSendCommand(DSA_GOTO_MM | msf_mm(x_msf));
dsaSendCommand(DSA_GOTO_SS | msf_ss(x_msf));
dsaSendCommand(DSA_GOTO_FF | msf_ff(x_msf));
#endif
return 0;
#endif
}
int cd_func_pause(int pause)
{
#if SUPPORT_DSA
if(pause)
dsaSendCommand(DSA_PAUSE);
else
dsaSendCommand(DSA_PAUSE_RELEASE);
#endif
return 0;
}
int cd_func_setspeed(int speed)
{
#if SUPPORT_DSA
if(speed == 1)
{
dsaSendCommand(DSA_SET_MODE_DEFAULT_1x);
}
else if(speed == 2)
{
dsaSendCommand(DSA_SET_MODE_DEFAULT_2x);
}
else
{
dsaSendCommand(DSA_SET_MODE_DEFAULT_4x);
}
#endif
return 0;
}
UINT32 cd_func_gettime(void)
{
return MSF(cd_qcode_mm, cd_qcode_ss, 0);
}
/*
** FUNCTION
** cd_func_readtoc(int session)
**
*/
#define READTOC_RETRY 4
#define READTOC_INIT (UINT32)(-1)
int cd_func_readtoc(int session)
{
int toc_retry;
#if 1
UISetState(VCD_STATE_READTOC);
dsa_state = DSA_READTOC;
/*
** send READ_TOC
*/
dsaSendCommand(DSA_READ_TOC | session);
toc_retry = 0;
cd_trk_lo = 0xff;
cd_trk_hi = 0xff;
AVD_ResetMediaStatus();
#ifdef READ_MUTI_SESSION
timeout_playback = 1600 / 16; /* 20 second. */
#else
timeout_playback = 800 / 16; /* 10 second. */
#endif
regs0->rtc_31_16 = 0;
while(1)
{
polling();
//polling_dsar(0);//jhuang playability 2002/12/4
polling_timeout();
if(cd_trk_lo != 0xff && cd_trk_hi != 0xff)
{
if((!cd_trk_hi) && (!cd_trk_lo))
return -2;
if(cd_trk_hi >= cd_trk_lo)
break;
}
if(CDOpened())
return -1;
if(CheckUIState(VCD_STATE_IDLE))
return -2;
#ifdef POWER_KEY
if(system_state==SYSTEM_POWER) //zhyf test 2-9-11 21:12
return -3;
#endif
if(IsAVDMediaTimeout())
{
if(toc_retry > READTOC_RETRY)
{
cd_type_loaded = CDUNKNOWN;
return -2;
}
else
{
AVD_ResetMediaStatus();
#ifdef READ_MUTI_SESSION
timeout_playback = 1600 / 16; /* 20 second. */
#else
timeout_playback = 800 / 16; /* 10 second. */
#endif
regs0->rtc_31_16 = 0;
toc_retry++;
dsaSendCommand(DSA_READ_TOC | session);
}
}
}
return 0;
#endif
}
int cd_func_readlongtoc(int session)
{
int done;
int toc_retry;
#if 1
/*
** send READ_LONGTOC (for session-0)
*/
#define READTOC_INIT (UINT32)(-1)
{
int i;
for(i = cd_trk_lo; i <= cd_trk_hi; i++)
settrkmsf(i, READTOC_INIT);
settrkmsf(0x66, READTOC_INIT);
settrkmsf(0, 0); //rbhung 2002/12/9 for leadin time
}
dsa_state = DSA_READLONGTOC;
#ifdef READ_MUTI_SESSION
timeout_playback = 2000 / 8; /* 40 second. */
#else
timeout_playback = 2000 / 16; /* 20 second. */
#endif
AVD_ResetMediaStatus();
regs0->rtc_31_16 = 0;
toc_retry = 0;
cd_trk_no = 0xff;
dsaSendCommand(DSA_READ_LONG_TOC | session);
do
{
int i;
//for(i = 0; i < 256; i++)
for(i = 0; i < 256; i++)
{
polling();
//polling_dsar(0);//jhuang playability 2002/12/4
if(CDOpened())
return -1;
if(CheckUIState(VCD_STATE_IDLE))
return -2;
#ifdef POWER_KEY
if(system_state==SYSTEM_POWER) //zhyf test 2-9-11 21:12
return -3;
#endif
}
polling_timeout();
if(IsAVDMediaTimeout())
{
if(toc_retry > READTOC_RETRY)
{
cd_type_loaded = CDUNKNOWN;
return -2;
}
else
{
AVD_ResetMediaStatus();
regs0->rtc_31_16 = 0;
toc_retry++;
cd_trk_no = 0xff;
dsaSendCommand(DSA_READ_LONG_TOC | session);
}
}
/*
** CHECK if cd_trk_lo to cd_trk_hi and 0x64-0x66 valid
*/
done = 1;
#if 0
for(i = cd_trk_lo; i <= TRACK_INFO_MAX; i++)
{
if(i > cd_trk_hi && i < 0x64)
continue;
if(gettrkmsf(i) == READTOC_INIT)
{
done = 0;
break;
}
}
#endif
if(gettrkmsf(TRACK_INFO_MAX) == READTOC_INIT)
{
done = 0;
}
for(i = cd_trk_lo; i <= cd_trk_hi; i++)
{
if(gettrkmsf(i) == READTOC_INIT)
{
done = 0;
break;
}
}
} while(!done);
return 0;
#endif
}
/*
** ReadSessionData
*/
int ReadSessionData(BYTE session)
{
int Res;
#ifdef SUPPORT_EPP_DBG
#ifdef MONE_TOC_DATA
BYTE fff;
#endif
#endif
#ifdef READ_MUTI_SESSION
BYTE min, max;
min = cd_trk_lo;
max = cd_trk_hi;
#endif
Res = cd_func_readtoc(session);
#ifdef MONE_TOC_DATA
if(Res >= 0)
{
psprintf(linebuf, "Res:%x Trk %d - Trk %d\n", Res, cd_trk_lo, cd_trk_hi);
epp_write_slow(linebuf);
}
else
{
psprintf(linebuf, "===RTOC FAIL==\n");
epp_write_slow(linebuf);
fff = 1;
}
#endif
if(Res >= 0)
Res = cd_func_readlongtoc(session);
#ifdef READ_MUTI_SESSION
if(Res < 0)
{
SessionNs = 0;
cd_trk_lo = min;
cd_trk_hi = max;
}
else
{
UINT32 i;
for(i = 0; i < 0x3fff; i++)
{ //waiting for number of session
if(SessionNs)
break;
polling();
//polling_dsar(0);//jhuang not used 2003/2/24
}
}
#endif
#ifdef MONE_TOC_DATA
if(fff != 1)
{
int i;
for(i = cd_trk_lo; i <= cd_trk_hi; i++)
{
UINT32 msf = gettrkmsf(i);
psprintf(linebuf, "Trk %02d: %02d:%02d:%02d \n", i, msf_mm(msf),
msf_ss(msf), msf_ff(msf) /*, msf_cna(msf) */ );
epp_write_slow(linebuf);
}
}
psprintf(linebuf, "Long TOC Res:%x\n", Res);
epp_write_slow(linebuf);
#endif
dsa_state = 0;
return Res;
}
#if defined(SUPPORT_OKO_DISC)
/*
*** make toc table
*** we assume cdi file is continuing
***
*/
void make_toc_tab(UINT32 msf)
{
int i;
cd_trk_hi++;
track_info[cd_trk_hi] = (0x41 << 24) | msf;
for(i = 1; i < cd_trk_hi; i++)
{
if(track_info[i] > track_info[cd_trk_hi])
{
msf = track_info[i];
track_info[i] = track_info[cd_trk_hi];
track_info[cd_trk_hi] = msf;
}
psprintf(linebuf, "i:%x msf:%x\n", cd_trk_hi, track_info[i]);
epp_write(linebuf);
}
}
void make_oko_addr(UINT32 * msf, UINT32 s)
{
int ss, ff;
ss = s / 10;
ff = ((s - (ss * 10)) / 10) + (ss * 75) * 2;
*msf = (0x41 << 24) | addmsf(track_info[2], ff);
//psprintf(linebuf,"trks:%x s:%x\n",track_info[2],*msf);
//epp_write(linebuf);
}
/*
*** make toc table
*** we assume cdi file is continuing
***
*/
void make_oko_toc_tab(UINT32 s, UINT32 e, UINT32 a_o)
{
//psprintf(linebuf,"s:%d e:%d a_o:%x\n",s,e,a_o);
//epp_write(linebuf);
//psprintf(linebuf,"hi:%d\n",cd_trk_hi);
// epp_write_wait(linebuf);
if(cd_trk_hi < 99)
{
// if((cd_trk_hi != 2) || s) //Mark off by Gary
cd_trk_hi++;
make_oko_addr(&track_info[cd_trk_hi], s);
make_oko_addr(&oko_trk_end[cd_trk_hi], e);
oko_trk_end[cd_trk_hi] = (oko_trk_end[cd_trk_hi] & 0x00ffffff) | a_o;
//psprintf(linebuf,"cd_trk_hi:%d s_msf:%x e_msf:%x\n",cd_trk_hi,track_info[cd_trk_hi],oko_trk_end[cd_trk_hi]);
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -