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

📄 cd.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 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 + -