📄 cd.c
字号:
/*
** FILE
** cd.c
**
** DESCRIPTION
** cd/cdrom format processing
**
** HISTORY
** v.0.0.1 1999.4.27
**
** split from mpegsys.c
**
**/
#include "config.h"
#include "global.h"
#include "memmap.h"
#include "dma.h"
#include "avd.h"
#include "sig.h"
#include "stc.h"
#include "epp.h"
#include "util.h"
#include "func.h"
#include "cdfunc.h"
#include "ringbuf.h"
#include "cddsp.h"
#include "cdxa.h"
#include "cdfs.h"
#include "cd.h"
////#include "servo.h"
#include "fs9660.h"
#include "iop.h"
#ifdef SUPPORT_DISC_DMG
#include "tx_code.h"
#endif
//#define MONE_CDMSF
//#define MONE_S_LEN
//#define MONE_VCD_ESP
#ifdef SUPPORT_UDF
#define _MSF2l(mm,ss,ff) (((mm)*60+(ss))*75+(ff)-150)
#define CDRW_Sector_mapping(x) (((x/32) * 7) + x)
#endif
extern void reset_cddsp(void); //in cddsp.c
int do_cd_layer(void);
int do_cd_payload(void);
#ifdef SUPPORT_ESP
int do_cdda_esp(void);
int do_vcd_esp(void);
#endif
/*
**
*/
void AdjustGoBack(int *goback)
{
#ifndef PANASONIC_DSA
if(*goback && (*goback > CDDSP_GOBACK))
*goback = CDDSP_GOBACK;
#else
if(*goback > CDDSP_GOBACK)
*goback = CDDSP_GOBACK;
#endif
}
/*
** FUNCTION
** do_cdda_esp
**
** DESCRIPTION
** search ESP Pattern to connect.
**/
#ifdef SUPPORT_ESP
int do_cdda_esp()
{
UINT32 i, pattern;
BYTE c;
if(shock_state & SHOCK_PAUSE)
return 0;
//if(regs0->iop_data[4] & (1 << 6) && (!(shock_state & (SHOCK_CONNECT | SHOCK_PROCESS)))) /* shock start */
if(IsESP_SHOCK_PROCESS_SET() && (!(shock_state & (SHOCK_CONNECT | SHOCK_PROCESS)))) /* shock start */
{/*Shock happen and not process connection yet.*/
ESP_SHOCK_PROCESS_CLR();//regs0->iop_data[4] &= (~(1 << 6));/*clear */
shock_state |= (SHOCK_FOUND | SHOCK_PROCESS);
esp.msf = (cd_qcode_mm << 16) | (cd_qcode_ss << 8) | cd_qcode_ff;
esp.lba = msf2l(esp.msf) - 2;
cd_func_gotomsf(addmsf(esp.msf, -6)); //because cddsp have 12k byte data good
SET_CDDSP_VX(0);
SET_CDDSP_VY(0);
#ifdef DEBUG_ESP
psprintf(linebuf, "Shock start=%d,D=%08x\n\r", esp.lba, esp.sync_data);
epp_write_wait(linebuf);
//psprintf(linebuf,"M=%d-%d-%d,D=%08x\n",cd_qcode_mm,cd_qcode_ss,cd_qcode_ff,esp.sync_data);
//psprintf(linebuf,"esp_sync1=%08x,esp_sync2=%08x\n",esp.sync_data,esp_sync2);
//epp_write_wait("shock\n");
#endif
return 0;
}
if(shock_state & SHOCK_FOUND)
{
if(IsESP_SHOCK_GOTO_OK())//if(regs0->iop_data[4] & (1 << 5))
{
shock_state &= ~SHOCK_FOUND;
shock_state |= SHOCK_CONNECT;
#ifdef DEBUG_ESP
psprintf(linebuf, "FLBA=%d,D=%08x\n\r",
MSF2l(cd_qcode_mm, cd_qcode_ss, cd_qcode_ff), esp.sync_data);
epp_write_wait(linebuf);
#endif
}
//epp_write_wait("g");
return 0;
}
else if(!IsESP_SHOCK_GOTO_OK())//if(!(regs0->iop_data[4] & (1 << 5)))
return 0;
//if ((shock_state&SHOCK_CONNECT)&&(shock_state&SHOCK_PROCESS))
if((shock_state & (SHOCK_CONNECT | SHOCK_PROCESS)) ==
(SHOCK_CONNECT | SHOCK_PROCESS))
{
BYTE success = 0;
UINT32 syncpattern = esp.sync_data;
pattern = esp.sync_pattern;
for(i = 0; i < 32; i++)
{
c = dma_buf.b[i];
pattern = pattern << 8;
pattern = pattern | c;
if(syncpattern == 0 || pattern == syncpattern)
{
success = 1;
break;
}
}
i = MSF2l(cd_qcode_mm, cd_qcode_ss, cd_qcode_ff);
if(esp.sync_lba != i)
{
esp.sync_lba = i;
if(esp.hard_connect > 2 && i == esp.lba)
{
success = 1;
//epp_write("Hard connect\n");
}
else if(i > (esp.lba + 10))
{
shock_state |= (SHOCK_FOUND);
shock_state &= ~(SHOCK_CONNECT);
//regs0->iop_data[4] &= (~(1 << 5));//redundancy in cd_func_gotomsf 2003/3/2
esp.hard_connect++;
cd_func_gotomsf(addmsf(esp.msf, -8));
SET_CDDSP_VX(0);
SET_CDDSP_VY(0);
#ifdef DEBUG_ESP
psprintf(linebuf, "Reconnect=%d,D=%08x\n", i, esp.sync_data);
epp_write_wait(linebuf);
//epp_write_wait("hard connect\n\r");
#endif
}
}
esp.sync_pattern = pattern;
if(success)
{
shock_state &= ~(SHOCK_CONNECT | SHOCK_PROCESS);
esp.hard_connect = 0;
//epp_write("success\n");
}
return 0;
} //esp connect end if
pattern = 0;
for(i = 0; i < 4; i++)
{
c = dma_buf.b[i];
pattern = pattern << 8;
pattern = pattern | c;
}
esp.sync_data = pattern;
//psprintf(linebuf,"esp=%08x\n",esp.sync_data);
// epp_write_wait(linebuf);
return 1;
}
#endif
/*
** FUNCTION
** do_vcd_esp
**
** DESCRIPTION
** search ESP Pattern to connect.
**/
#ifdef SUPPORT_ESP
int do_vcd_esp(void)
{
UINT32 i;
if(shock_state & SHOCK_PAUSE)
return 0;
//if(regs0->iop_data[4] & (1 << 6) && (!(shock_state & (SHOCK_CONNECT | SHOCK_PROCESS)))) /* shock start */
if(IsESP_SHOCK_PROCESS_SET() && (!(shock_state & (SHOCK_CONNECT | SHOCK_PROCESS)))) /* shock start */
{/*Shock happen and not process connection yet.*/
//extern SERVO_MEMBER servo;
int failed;
int cx;
int cy;
int cw = CBV_W;
int ch = CBV_H;
int cnt;//qq
UINT8 *p;
ESP_SHOCK_PROCESS_CLR();//regs0->iop_data[4] &= (~(1 << 6));/*clear */
shock_state |= (SHOCK_FOUND | SHOCK_PROCESS);
{
regs0->cddsp_control = RF_CDDSP_STOP | RF_CDDSP_RESET;
cy=(GET_CDDSP_VY()-6);
if(cy<0)
{
cy+=CBV_H;
}
cx=GET_CDDSP_VX();
p = (UINT8 *)SDRAM_BASE+(regs0->cdya+cy)*1024+cx;
do{
polling();
if(*p==0x00 && *(p+1)==0xff && *(p+2)==0xff && *(p+3)==0xff && \
*(p+4)==0xff && *(p+5)==0xff && *(p+6)==0xff && *(p+7)==0xff && \
*(p+8)==0xff && *(p+9)==0xff && *(p+10)==0xff && *(p+11)==0x00)
{
failed=0;
break;
}
else
failed=1;
p++;
cnt++;
}while(failed);
#ifdef SUPPORT_CD_MOVE
cnt += 128;
while (cnt > 256) {
ADDR_adv_cdmove(cx,cy,cw,ch,256);
cnt -= 256;
}
ADDR_adv_cdmove(cx,cy,cw,ch,cnt);
#else
cnt += 128;
while (cnt > 256) {
ADDR_adv(cx,cy,cw,ch,256);
cnt -= 256;
}
ADDR_adv(cx,cy,cw,ch,cnt);
#endif
SET_CDDSP_VX(cx);
SET_CDDSP_VY(cy);
esp.msf = (bcd2bin(*(p+12)) << 16) | (bcd2bin(*(p+13)) << 8) | bcd2bin(*(p+14));
*(p+1) = 0;/*瘆胊sync byte戈
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -