📄 drv_esp.c
字号:
//Sxxx 20041112 俤俽俹張棟峔抸奐巒丅
// 傑偢偼丄僽儔僢僔儏傾僢僾丅柍懯僐儊儞僩傪徣偄偰偡偭偒傝
// 20041116 僷儚乕僙乕僽慻傒崬傓丅嘆偍帋偟斉丅
// ==============================================
// CD ESP control routines
// ==============================================
//#include <machine.h> //Z80梡
#include "BU18703.h" //儗僕僗僞掕媊
#include "prototype.h"
#include "extern.h"
#include "mcal.h"
extern UINT08 MP3decF; //YTC00G 20050128
//偙偺僼傽僀儖偺拞偩偗偺娭悢偺僾儘僩僞僀僾
// 庡偵ROM埑弅梡嫟捠張棟
void ESP_bios_valid(void);
void ESP_bios_Wclear(void);
void ESP_bios_Wstop(void);
void ESP_bios_Wstart(void);
void ESP_bios_Rclear(void);
void ESP_bios_WRclear(void); //YTC006
void ESP_bios_Rstart(void);
void ESP_bios_Rstop(void);
void DrvDSP_SearchJUMP(void);
void DrvDSP_ctrlESP_setPSMode(void); //YTC005
void DrvDSP_ctrlESP_clrESP(void); //YTC006
void DrvDSP_ctrlESP_speedUP(void); //YTC006 20050106 -ROM
//巄掕 偙偺僼傽僀儖偺拞偺僌儘乕僶儖曄悢
//static SINT32 esp_wqok; //尰嵼棴崬拞偺僙僋僞
//static UINT08 esp_wqok_track; //尰嵼棴崬拞偺僩儔僢僋
SINT32 esp_wqok; //尰嵼棴崬拞偺僙僋僞
UINT08 esp_wqok_track; //尰嵼棴崬拞偺僩儔僢僋
//僷儚乕僙乕僽 暅婣億僀儞僩昞
//YTC002 倄俿俠偑尒捈偟偰愝掕偡傞丅
const UINT32 shoene_recoverpoint[][3] = {
// 4M 16M 64M
{ OFF, 0x00080000, 0x00100000 }, // 0 : JOG=OFF / 旕埑弅
{ 0x00020000, 0x00040000, 0x00100000 }, // 1 : JOG=OFF / ADPCM // YTC_20041228
{ OFF, 0x00080000, 0x00300000 }, // 2 : JOG= ON / 旕埑弅
{ 0x00020000, 0x000C0000, 0x00300000 } // 3 : JOG= ON / ADPCM // YTC_20041228
// { OFF, 0x00080000, 0x00100000 }, // 0 : JOG=OFF / 旕埑弅
// { 0x00020000, 0x00040000, 0x00100000 }, // 1 : JOG=OFF / ADPCM // YTC_20041228
// { OFF, 0x00080000, 0x00100000 }, // 2 : JOG= ON / 旕埑弅
// { 0x00020000, 0x000C0000, 0x00100000 } // 3 : JOG= ON / ADPCM // YTC_20041228
};
UINT08 ESPMode;
// --------------------------------------------------------
// ESP CONTROL
// --------------------------------------------------------
void DrvDSP_CtrlESP( void )
{
#if DM_ROM
// static UINT08 gu08_esp_read_status; //20041128 gloval壔丅懠儌僕儏乕儖偱嶲徠偡傞偨傔丅
static UINT08 esp_decode_green; //撉弌奐巒俷俲 柤慜曄偊傞丅
static UINT08 retry_count; //愙懕儕僩儔僀
static UINT08 n; //弶婜棴傔僙僋僞悢僇僂儞僞
static UINT08 matagi; //僩儔僢僋屪偓拞僼儔僌
// 0: PICK == SOUND
// 1: PICK == SOUND +1
static UINT08 aa_touch_f; //AA傑偱棴崬嵪
// static SINT32 esp_wqok; //尰嵼棴崬拞偺僙僋僞 20041128僌儘乕僶儖壔
// static UINT08 esp_wqok_track; //尰嵼棴崬拞偺僩儔僢僋 20041128僌儘乕僶儖壔
static UINT08 tmp_timing; //尰嵼壒帪娫庢傝崬傒僞僀儈儞僌
// 弰夞枅偵巊偄幪偰
UINT08 ctmp_fc0; //彂崬宯偺STATUS
UINT08 ctmp_fc1; //撉弌宯偺STATUS
UINT08 ctmp_fc2; //愙懕宯偺STATUS
UINT08 ctmp_fe0; // STATUS
UINT08 esp_subq_f; // STATUS
UINT08 dramMode;
// UINT08 i;
UINT32 tmp;
#if !ROM
UINT08 size;
size = gu08_kind_DRAM >> 2;
#endif
if( gu08_sccd_ESPctrl != 0 )
{ //ESP梫媮偁傞帪偺傒幚巤
// COMMON =======================================
#if 1 // sdc deb
ctmp_fc0 = DrvDSP_BIOS_ReadRegMP3( 0xC0 ); // EACH STATUS
ctmp_fc1 = DrvDSP_BIOS_ReadRegMP3( 0xC1 ); //
ctmp_fc2 = DrvDSP_BIOS_ReadRegMP3( 0xC2 ); //
#else
fc0 = ctmp_fc0 = DrvDSP_BIOS_ReadRegMP3( 0xC0 ); // EACH STATUS
fc1 = ctmp_fc1 = DrvDSP_BIOS_ReadRegMP3( 0xC1 ); //
fc2 = ctmp_fc2 = DrvDSP_BIOS_ReadRegMP3( 0xC2 ); //
fc8 = DrvDSP_BIOS_ReadRegMP3( 0xC8 );
fc9 = DrvDSP_BIOS_ReadRegMP3( 0xC9 );
fca = DrvDSP_BIOS_ReadRegMP3( 0xCA );
fcb = DrvDSP_BIOS_ReadRegMP3( 0xCB );
#endif // sdc deb
if(++tmp_timing==6) //Suxxx joggable
{ //@12mS
tmp_timing=0;
// SDC 20050122 dram_zanryou = get_mp3reg_zanryo( ); //俇夞偵堦夞偖傜偄巆検傪峏怴丅
tmp = get_mp3reg_zanryo( ); //俇夞偵堦夞偖傜偄巆検傪峏怴丅 // SDC 20050122
if( !( tmp & 0x800000 )) // 巆検壔偗偰偄側偄帪偺傒峏怴
dram_zanryou = tmp; //
}
/* B0004 --->
dramMode = (gu08_JOGGABLE << 1) | gu08_mode_ESP; // 0 : JOG=OFF / 旕埑弅
// 1 : JOG=OFF / ADPCM
// 2 : JOG= ON / 旕埑弅
// 3 : JOG= ON / ADPCM
*/
dramMode = gu08_mode_ESP;
// B0004 <---
// POWER SAVE control mode0 (1/2:尭懍拞)======================
if((gu08_PowersaveMode==0) && (aa_touch_f == 0))
{ //MODE0 僞僀僾徣僄僱丂倃侾侾亅亜倃俀侽偵愗傝懼偊傞張棟
//乮幚幙丄愙懕拞偵偟偐巆検尭傜側偄偼偢側偺偩偗傟偳傕乯
// AA摓払屻偼嵞壛懍偟側偄丅
if(tmp_timing == 2) //娫堷偔丅枅夞幚峴偡傞傎偳偺張棟偱偼側偄
{
if(gu08_kind_SPEED == 1)
{ //X1.1W
#if ROM // SDC 20050207
if(dram_zanryou < shoene_recoverpoint[ dramMode ][ gu08_kind_DRAM_SIZE ]) //DRAM庬椶暿暅婣億僀儞僩埲壓偵側偭偨偐丠
#else
if(dram_zanryou < shoene_recoverpoint[ dramMode ][ size ]) //DRAM庬椶暿暅婣億僀儞僩埲壓偵側偭偨偐丠
#endif
{ //尭偭偰偒偨丅壛懍偡傞丅
DrvDSP_ctrlESP_speedUP(); //YTC006 20050106 -ROM
}
}
}
}
// WRITE control ================================
switch ( gu08_sccd_ESPctrl )
{
// ---------------
// case 0: //偁傝摼側偄丅俴俽俬俠俉侽側傜惗惉偟側偄偟丅
// break; //
// --------------- Rclear,Wclear偐傜棴傔捈偟
// SKIP捈屻丄ESPoff->on偺擖傝岥
case 1: //弶婜壔
esp_wqok = gu32_val_TargetFrame; //尰嵼ATIME曐懚 SKIP偱嶌惉偟偨嬋愭摢傪棴崬奐巒偲偡傞
// esp_wqok_track = stInfoArea.hexPlayTitleCD;
esp_wqok_track = Common_Hex2BCD(stInfoArea.hexPlayTitleCD); //BCD偱庴偗庢傞丅
//YTC006 gu08_sccd_ESPctrl++;
gu08_sccd_ESPctrl=2; //YTC006 20060106
//YTC A2x debug_direct_count = 0; //for DEBUG 20050303 攑婞
n=0; //YTC003
// break; //懕偗偰丒丒丒
// --------------
// 僄儔乕偱僄儞僾僥傿偟偨摍 esp_wqok偑掕媊嵪傒
case 2: //
ESPMode = gu08_mode_ESP; // 撪晹儌乕僪愗傝姺偊
DrvDSP_ctrlESP_setPSMode(); //YTC005 20050104 撪晹儌乕僪愗傝懼偊偨傜丄僷儚乕僙乕僽儌乕僪傕愗傝懼偊傞
// esp_wqok=嵟屻偵棴崬傫偩強丅;
ESP_bios_WRclear(); //YTC006 20050106
matagi = 0; //棴捈偡偺偱丄屪偓=0;
gu08_esp_read_status = 0; //
esp_decode_green = 0; //
gu08_GotoMsfSC = 1; /* GotoMSF梫媮 */
aa_touch_f = 0; //
//YTC006 gu08_sccd_ESPctrl++; //
gu08_sccd_ESPctrl=3; //YTC006 20050106
break;
// --------------- 棴傔崬傒奐巒埵抲傊偺傾僋僙僗
case 3:
if( gu08_GotoMsfSC == 0 )
{ //埵抲弌偟廔椆
//Write奐巒
ESP_bios_Wstart(); //Wstart-ADPCM_4bit
//YTC003 n = 0; //
esp_decode_green = 0; //
retry_count = 0; //
//YTC006 gu08_sccd_ESPctrl++; //
gu08_sccd_ESPctrl=4; //YTC006 20050106
}
break;
// --------------- 嵟弶偺倱倳倐俻捠夁懸偪
case 4:
if( gu08_sts_Subq_valid == VALID)
{
//YTC003 gu08_sccd_ESPctrl++;
gu08_sccd_ESPctrl=50; //YTC003
#if ERR_DETECT // SDC 20041218
gu08_sts_DISPLAY = 1; // 昞帵 enable
#endif
}
break;
// --------------- 嵟弶偺倱倳倐俻捠夁懸偪丒彂偒崬傒奐巒妋擣
case 50:
if((ctmp_fc2 & B01000000 ) == 0x00 ) //
{ //棴崬巭傑偭偰傞
// if(++n > 10)
if(++n > 2) //YTC00E 20050125 柍懯偵偑傫偽傜側偄丅
{
n=0;
esp_wqok++; //
gu32_val_TargetFrame = esp_wqok; //偮側偑傜側偐偭偨subq偺師偐傜棴捈偟
}
ESP_bios_Wstop();
gu08_sccd_ESPctrl=2; //YTC003
}
else
{ //棴傔崬傒巒傑偭偨
n=0;
gu08_sccd_ESPctrl=5; //YTC003 廬棃偺棳傟偵
}
break;
// --------------- 棴傔崬傒拞悤
case 5:
if((ctmp_fc2 & B01000000 ) == 0x00 ) //
{ //棴崬巭傑偭偰傞
if((ctmp_fc0 & B00000010) != 0)
{ //儊儌儕乕僼儖偵傛傞彂偒崬傒掆巭
#if 1 // SDC 041226
#if ROM // SDC 20050207
if( shoene_recoverpoint[ dramMode ][ gu08_kind_DRAM_SIZE ] != OFF )
#else
if( shoene_recoverpoint[ dramMode ][ size ] != OFF )
#endif
{
#endif // SDC 041226
// POWER SAVE control mode0 (2/2:壛懍拞)======================
if(gu08_PowersaveMode==0) //Su_xxx
{ //mode 0 clv speed down
gu08_kind_SPEED = 1; //
gu08_scc_speed = 8; //slowdown 梫媮丅
gu08_sccd_ESPctrl = 20; //嵞惗拞側傜僐僱僋僩張棟傊
if(gu08_esp_read_status ==0)
{ //壒弌偟偰側偄
gu08_sccd_ESPctrl = 40; //億乕僘拞側傜億乕僘張棟傊
}
}
else
{ //mode 1 servo off
gu08_sccd_ESPctrl = 30; //->僷儚乕僙乕僽 mode 1傊丅
}
#if 1 // SDC 041226
} else {
gu08_sccd_ESPctrl = 20; //->愙懕張棟傊
}
#endif // SDC 041226
}
else
{ //YFLAG偵傛傞棴傔崬傒掆巭
//傑偨偼丄偦偺懠WRITE掆巭僐儅儞僪偵傛傞掆巭側偳丅
gu08_sccd_ESPctrl = 20; //->愙懕張棟傊
}
break; //
}
#if 1 // SDC 041224
if( esp_decode_green && !(ctmp_fc2 & B00100000) ) // read stop
{
esp_decode_green = 0; // 壒巭傑偭偰偄傞僙僢僩
gu08_esp_read_status = 0; // 壒弌偰側偄僙僢僩
n = 0; // valid countor reset
}
#endif // SDC 041224
if( gu08_sts_Subq_valid )
{ //subQ偲傟偨弰夞
//YTC002 俤俽俹偵埵抲僘儗専弌婡擻傪捛壛丅Wstop偟偰丄師偺弰夞偱棴傔崬傒掆巭張棟傊
if( stSubq_bcd.tno == LEAD_IN )
{ //偢傟偰偨傜丄彂偒崬傒巭傔傞
ESP_bios_Wstop(); //Wstop
break;
}
if(gu32_frame_atime < esp_wqok)
{ //偢傟偰偨傜丄彂偒崬傒巭傔傞
ESP_bios_Wstop(); //Wstop
break;
}
else if((gu32_frame_atime - esp_wqok) > 20)
{ //偢傟偰偨傜丄彂偒崬傒巭傔傞
ESP_bios_Wstop(); //Wstop
break;
}
// if( stSubq_bcd.tno != esp_wqok_track )
if( stSubq_bcd.tno > esp_wqok_track )
{ //僩儔僢僋僫儞僶乕愗傝懼傢偭偨
if( matagi == 0 )
{ //師偺嬋
if( stSubq_hex.tno > 99 )
{ //AA偵屪偄偱擖偭偰峴偭偨
ESP_bios_valid(); //VALID! YTC002 丠
//esp_wqok = gu32_frame_atime; //尰嵼埵抲
// esp_wqok_track = 0xAA; //YTC002
//border (pickup)傪曬崘 //
matagi = //1; //YTC00D 20050116 -ROM 柧帵揑偵//値;偭偰彂偔偐
aa_touch_f = 1; //
gu08_sccd_ESPctrl = 6; //傕偆棴傔側偄丅億乕僘
if(gu08_kind_SPEED != 0) //MODE0,1娭學側偔丄AA専弌偟偨傜X1W
{
gu08_kind_SPEED = 1;
gu08_scc_speed = 8; //slowdown 梫媮丅
}
if( esp_decode_green == 0 )
{
//傑偩壒弌偟偰偄側偄側傜偽丄弌偡
esp_decode_green = 1;
}
}
else
{ //傆偮偆偵n->n+1
ESP_bios_valid(); //VALID!
//esp_wqok = gu32_frame_atime; //尰嵼埵抲
//esp_wqok_track = stSubq_bcd.tno; //
//border (pickup)傪曬崘 //
matagi = 1; //
if( n < 4 )
n++;
else
esp_decode_green = 1;
}
}
else
{ //師偺師偺嬋偼棴傔崬傑側偄丅
//wrie stop傪偐偗偰丄屪偓夝徚偟偨傜愙懕張棟傊
ESP_bios_Wstop(); //Wstop
gu32_val_TargetFrame = esp_wqok; //
gu08_GotoMsfSC = 1;
//matagi=1; //
gu08_sccd_ESPctrl = 7; //
break;
}
}
else
{ //慜夞偲摨偠僩儔僢僋
ESP_bios_valid(); //VALID!
//esp_wqok = gu32_frame_atime;
//esp_wqok_track = stSubq_bcd.tno;
if( n < 4 )
n++;
else
esp_decode_green = 1;
}
} //subQ庢傟偨弰夞
break;
// --------------- 棴崬廔椆
case 6: //俙俙埵抲偱億乕僘丅
if( gu08_GotoMsfSC == 0 )
gu08_GotoMsfSC = 1; //pause
break;
// --------------- 嬋屪偓夝徚懸偪
case 7: //read偑恑傫偱丄嬋屪偓夝徚偡傞傑偱懸偮
if( matagi == 0 )
{ //READcontrol偑儅乕僋僠僃僢僋偡傞丅
//嬋屪偓夝徚
gu08_sccd_ESPctrl = 20; //愙懕張棟傊
}
else
{
if( gu08_GotoMsfSC == 0 )
{
gu08_GotoMsfSC = 1; //pause
}
}
break;
// --------------- 彂崬宯^^^
// --------------- 愙懕宯vvv
// --------------- 嬻偒懸偪
case 20:
// dram_zanryou = get_mp3reg_zanryo( ); //
if( ( gl_buff_max - dram_zanryou ) > ( unsigned long ) ( 2363 * 32 ) )
{ //2sector暘埲忋偺嬻偒僄儕傾偁傝
gu32_val_TargetFrame = esp_wqok - 2; //2偙庤慜
gu08_GotoMsfSC = 1;
//YTC006 gu08_sccd_ESPctrl++;
gu08_sccd_ESPctrl = 21; //YTC006
}
break;
// --------------- 僺僢僋堏摦
case 21:
if( gu08_GotoMsfSC == 0 )
{ //拝抧偟偨
if( !retry_count )
DrvDSP_BIOS_WriteRegMP3( 0x02, 0x80 );
else if( retry_count <= 4 )
DrvDSP_BIOS_WriteRegMP3( 0x02, 0x80 | ( retry_count - 1 ));
Common_Wait_ms( 1 );
//YTC006 gu08_sccd_ESPctrl++;
gu08_sccd_ESPctrl = 22; //YTC006 -ROM
}
else
{ //僺僢僋堏摦幚峴拞丅
//YTC003 20041231 No302
if( ( ctmp_fc2 & B00100000 ) == 00 )
{
//拝抧慜偵壒巭傑偭偨丒丒丒棴捈偟 Wclear,Rclear偐傜傗傝捈偡丅 嵞惗愊嶼帪娫晄梫偩偟
if( gu08_esp_read_status != 0 )
{
DrvDSP_Mute_Soft( );
}
ESP_bios_Rstop(); //READstop
ESP_bios_Wstop();
dram_zanryou =0L; //YTC003
gu08_esp_read_status = 0; //壒巭忬懺
esp_decode_green = 0; //桳岠壒僨乕僞柍偟
esp_wqok +=4; //偪傚偭偲屄幪偰傞丅
gu32_val_TargetFrame = esp_wqok; //偮側偑傜側偐偭偨subq偺師++偐傜棴捈偟
gu08_sccd_ESPctrl = 2;
}
}
break;
// --------------- 僐僱僋僩姰椆懸偪
case 22:
if( ( ctmp_fc2 & B10000000 ) == 00 )
{ //connect ok!
retry_count = 0;
gu08_sccd_ESPctrl = 5;
}
else
{
//YTC003
if( ( ctmp_fc2 & B00100000 ) == 00 )
{
//拝抧屻丄愙懕姰椆慜偵壒巭傑偭偨丒丒丒棴捈偟 //YTC003 20041231
if( gu08_esp_read_status != 0 )
{
DrvDSP_Mute_Soft( );
}
ESP_bios_Rstop(); //READstop
ESP_bios_Wstop();
dram_zanryou =0L; //YTC003
gu08_esp_read_status = 0; //壒巭忬懺
esp_decode_green = 0; //桳岠壒僨乕僞柍偟
esp_wqok +=4; //偪傚偭偲屄幪偰傞丅
gu32_val_TargetFrame = esp_wqok; //偮側偑傜側偐偭偨subq偺師++偐傜棴捈偟
gu08_sccd_ESPctrl = 2;
break;
}
//YTC003 20041231
// if( gu08_esp_read_status != 0 )
// { //壒弌偟偰偄傞
// if( ( ctmp_fc2 & B00100000 ) == 00 )
// {
// //拝抧屻丄愙懕姰椆慜偵壒巭傑偭偨丒丒丒棴捈偟 //YTC003 20041231
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -