Closed devmiyax closed 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) ;
}
It could fix boot problem with some games ?
@BenjaminSiskoo
This is the cleanup solution of #212 . As you may know, since this fix, some games are improved.
Yup, I'm here each day :)
minimize difference of the cd drive operation.