devmiyax / yabause

Yabause is a Sega Saturn emulator and took over as Yaba Sanshiro
http://www.uoyabause.org
GNU General Public License v2.0
207 stars 35 forks source link

CD Drive emulation improvement #225

Closed devmiyax closed 8 years ago

devmiyax commented 8 years ago

minimize difference of the cd drive operation.

devmiyax commented 8 years ago

https://youtu.be/2cts0ltElhw

devmiyax commented 8 years ago
/***********************************************************

 CDC Test program
   devmiyax(smiyaxdev@gmail.com)
************************************************************/
#include    "sgl.h"
#include    "sgl_cd.h"
#include    "SEGA_CDC.H"

void showError( char * func, int code ){
    char buf[64];
    sprintf(buf,"Fail: %s,%d      ",func,code);
    slPrint(buf, slLocate(1, 0));
}

void showStatus( CdcStat * stat ){

    Sint32 totalsiz;
    Sint32 bufnum;
    Sint32 freesiz;
    char buf[64];

        slPrint("stat:", slLocate(1, 1));
        slDispHex((Uint32)CDC_STAT_STATUS(stat), slLocate(7, 1));
        slPrint("flgrep:", slLocate(1, 2));
        slDispHex((Uint32)CDC_STAT_FLGREP(stat), slLocate(7, 2));
        slPrint("ctladr:", slLocate(1, 3));
        slDispHex((Uint32)CDC_STAT_CTLADR(stat), slLocate(7, 3));
        slPrint("TNO:", slLocate(1, 4));
        slDispHex((Uint32)CDC_STAT_TNO(stat), slLocate(7, 4));
        slPrint("IDX:", slLocate(1, 5));
        slDispHex((Uint32)CDC_STAT_IDX(stat), slLocate(7, 5));
        slPrint("FAD:", slLocate(1, 6));
        slDispHex((Uint32)CDC_STAT_FAD(stat), slLocate(7, 6));
        slPrint("IRQ:", slLocate(1, 7));
        slDispHex(CDC_GetHirqReq(), slLocate(7, 7));
        CDC_GetBufSiz(&totalsiz, &bufnum, &freesiz);
        sprintf(buf,"BUF: %d/%d/%d       ",totalsiz,bufnum,freesiz);
        slPrint(buf, slLocate(1, 8));
        CDC_GetSctNum(0,&bufnum);
        sprintf(buf,"BUF: %d      ",bufnum);
        slPrint(buf, slLocate(1, 9));

}

#define READSIZE (0x3FF)

void    ss_main(void)
{

    CdcStat stat;
    CdcPos pos;
    CdcSubh sbh;
    CdcPly ply;
    int ret;
    int playing = 0;
    Sint32 cdwnum;
    int i;
    int rtn;
    int bufnum;
    Sint32 actwsiz, nsct, st;   
    int finish = 0;
    int bufcnt = 0;

    Uint32 value;

    slInitSystem(TV_320x224, NULL, 1);      

    CDC_CdInit(0x00,0x00,0x05,0x0f);

    if( (rtn=CDC_ResetSelector(0xFC,0)) != CDC_ERR_OK ){
        CDC_GetCurStat(&stat) ;     
        showStatus(&stat);
        showError("CDC_ResetSelector", rtn);
        slSynch();      
        while (1) ;
    }

    rtn = CDC_GetHirqReq();
    while( (rtn & CDC_HIRQ_ESEL) == 0 ){
        rtn = CDC_GetHirqReq();
    }

    if( (rtn=CDC_SetSctLen(CDC_SLEN_2048,CDC_SLEN_2048)) != CDC_ERR_OK){
        CDC_GetCurStat(&stat) ;     
        showStatus(&stat);
        showError("CDC_SetSctLen", rtn);
        slSynch();  
        while (1) ;     
    }

    rtn = CDC_GetHirqReq();
    while( (rtn & CDC_HIRQ_ESEL) == 0 ){
        rtn = CDC_GetHirqReq();
    }   

    if( (rtn=CDC_CdSetCon(0)) != CDC_ERR_OK ){
        CDC_GetCurStat(&stat) ;     
        showStatus(&stat);
        showError("CDC_CdSetCon", rtn);
        slSynch();      
        while (1) ;

    }

    rtn = CDC_GetHirqReq();
    while( (rtn & CDC_HIRQ_ESEL) == 0 ){
        rtn = CDC_GetHirqReq();
    }

    if( (rtn= CDC_SetFiltCon(0,0x03,0,CDC_NUL_SEL)) != CDC_ERR_OK ){
        CDC_GetCurStat(&stat) ;     
        showStatus(&stat);
        showError("CDC_SetFiltCon", rtn);
        slSynch();      
        while (1) ;     
    }

    rtn = CDC_GetHirqReq();
    while( (rtn & CDC_HIRQ_ESEL) == 0 ){
        rtn = CDC_GetHirqReq();
    }

    for( i=0; i< 60*3; i++ ){
        slSynch();
        CDC_GetCurStat(&stat) ;
        showStatus(&stat);
    }

    CDC_PLY_STYPE(&ply)=CDC_PTYPE_FAD;
    CDC_PLY_SFAD(&ply) =0x0096;         
    CDC_PLY_ETYPE(&ply)=CDC_PTYPE_FAD;
    CDC_PLY_EFAS(&ply) =READSIZE;       
    CDC_PLY_PMODE(&ply)=0;           
    CDC_CdPlay(&ply);

    while (1) {

        slSynch();
        CDC_GetCurStat(&stat) ;
        showStatus(&stat);

        if( finish == 1 ){
            slPrint("Finised                  ", slLocate(1, 0));
            continue;
        }

        if( (rtn=CDC_CalActSiz(0, 0, 1) != CDC_ERR_OK) ){
            CDC_GetCurStat(&stat) ;     
            showStatus(&stat);
            showError("CDC_CalActSiz", rtn);
            slSynch();      
            continue;       
        }

        rtn = CDC_GetHirqReq();
        while( (rtn & CDC_HIRQ_ESEL) == 0 ){
            rtn = CDC_GetHirqReq();
        }

        rtn = CDC_GetActSiz(&actwsiz);
        if (rtn != CDC_ERR_OK) {
            CDC_GetCurStat(&stat) ;     
            showStatus(&stat);
            showError("CDC_GetActSiz", rtn);
            slSynch();      
            continue;
        }

        if( actwsiz > 0 ){
            rtn = CDC_GetSctData(0, 0, 1) ;
            if (rtn != CDC_ERR_OK) {
                CDC_GetCurStat(&stat) ;     
                showStatus(&stat);
                showError("CDC_GetSctData", rtn);
                slSynch();      
                continue;
            }

            rtn = CDC_DataReady(CDC_DRDY_GET);
            if (rtn != CDC_ERR_OK) {
                CDC_GetCurStat(&stat) ;     
                showStatus(&stat);
                showError("CDC_DataReady", rtn);
                slSynch();      
                continue;
            }

            for( i=0; i<(actwsiz>>1) ; i++ ){
                Uint32 * ptr = CDC_GetDataPtr() ;
                value =  *ptr;
            }

            rtn = CDC_DataEnd(&cdwnum) ;
            if (rtn != CDC_ERR_OK) {
                CDC_GetCurStat(&stat) ;     
                showStatus(&stat);
                showError("CDC_DataEnd", rtn);
                slSynch();      
                continue;
            }           

            rtn = CDC_GetHirqReq();
            while( (rtn & CDC_HIRQ_EHST) == 0 ){
                rtn = CDC_GetHirqReq();
            }

            rtn = CDC_DelSctData(0,0, 1);
            if (rtn != CDC_ERR_OK) {
                CDC_GetCurStat(&stat) ;     
                showStatus(&stat);
                showError("CDC_DelSctData", rtn);
                slSynch();      
                continue;
            }

            bufcnt += 1;
        }

        if( bufcnt >= READSIZE ){

            if( (rtn=CDC_ResetSelector(0,0)) != CDC_ERR_OK ){
                CDC_GetCurStat(&stat) ;     
                showStatus(&stat);
                showError("CDC_ResetSelector", rtn);
                slSynch();      
                while (1) ;
            }

            finish = 1;
        }

#if 0       
        CDC_GetSctNum(0,&bufnum);
        if( bufnum > 0 ){
            CDC_DelSctData(0,0, bufnum);
            rtn = CDC_GetHirqReq();
            while( (rtn & CDC_HIRQ_EHST) == 0 ){
                rtn = CDC_GetHirqReq();
            }
            CDC_ClrHirqReq(~CDC_HIRQ_BFUL);             
        }
#endif      
#if 0                       

        if( CDC_STAT_STATUS(&stat) == 0x03 ){
            playing = 1;
        }
        if( playing && CDC_STAT_STATUS(&stat) == 0x01 ){
            playing = 0;
            //CDC_POS_PTYPE(&pos)=CDC_PTYPE_DFL;
            CDC_POS_PTYPE(&pos)=CDC_PTYPE_NOCHG;
            ret = CDC_CdSeek(&pos);
        }
#endif      
    }
    while (1) ;
}
BenjaminSiskoo commented 8 years ago

It could fix boot problem with some games ?

devmiyax commented 8 years ago

@BenjaminSiskoo

This is the cleanup solution of #212 . As you may know, since this fix, some games are improved.

187

211

BenjaminSiskoo commented 8 years ago

Yup, I'm here each day :)