void ReadTOC(void) { unsigned char xbuffer[4];DWORD dwStatus; LockGenCDAccess(); memset(&(sTOC),0,sizeof(sTOC)); // init toc infos dwStatus=GetSCSITOC((LPTOC)&sTOC); // get toc by scsi... may change that for ioctrl in xp/2k? UnlockGenCDAccess(); if(dwStatus!=SS_COMP) return; #ifdef DBGOUT auxprintf("TOC Last %d, max %08x,%08x\n",sTOC.cLastTrack,sTOC.tracks[sTOC.cLastTrack].lAddr,reOrder(sTOC.tracks[sTOC.cLastTrack].lAddr)); #endif // re-order it to psemu pro standards addr2time(reOrder(sTOC.tracks[sTOC.cLastTrack].lAddr),xbuffer); #ifdef DBGOUT auxprintf("TOC %d, %d, %d, %d\n", xbuffer[0],xbuffer[1],xbuffer[2],xbuffer[3] ); #endif xbuffer[0]=itob(xbuffer[0]); xbuffer[1]=itob(xbuffer[1]); xbuffer[2]=itob(xbuffer[2]); xbuffer[3]=itob(xbuffer[3]); lMaxAddr=time2addrB(xbuffer); // get max data adr }
DWORD CheckSCSIReadMode(void) { DWORD dwStatus;int i,j,k,iCnt;char * p; int iModes[MAXMODES]={MODE_BE_2,MODE_BE_1,MODE_28_1,MODE_28_2,MODE_28_2048,MODE_28_2048_Ex}; int iBlock[MAXMODES]={2352, 2352, 2352, 2352, 2048, 2048}; unsigned char cdb[3000]; FRAMEBUF * f=(FRAMEBUF *)cdb; for(i=0;i<MAXMODES;i++) // loop avail read modes { f->dwFrame = 16; // we check on addr 16 (should be available on all ps2 cds/dvds) f->dwFrameCnt = 1; f->dwBufLen = iBlock[i]; pDeInitFunc = NULL; iRType=iModes[i]; // set global read mode GetGenReadFunc(iRType); // get read func pointer for(j=0;j<3;j++) // try it 3 times { memset(f->BufData,0xAA,f->dwBufLen); // fill buf with AA dwStatus=pReadFunc(TRUE,f); // do the read #ifdef DBGOUT auxprintf("status %d\n",dwStatus); #endif if(dwStatus!=SS_COMP) continue; // error? try again p=&(f->BufData[0]); #ifdef DBGOUT auxprintf("check mode %d\n",i); #endif for(k=0,iCnt=0;k<(int)f->dwBufLen;k+=4,p+=4) // now check the returned data { #ifdef DBGOUT // auxprintf("%08x ",*((DWORD *)p)); #endif if(*((DWORD *)p)==0xAAAAAAAA) // -> still AA? bad iCnt++; else iCnt=0; if(iCnt>=8) {dwStatus=SS_ERR;break;} // -> if we have found many AA's, the reading was bad } if(dwStatus==SS_COMP) // reading was a success, no AA's? { iRType = iModes[i]; // -> set found mode iUsedBlockSize = iBlock[i]; if(iUsedBlockSize==2352) iUsedMode=CDVD_MODE_2352; else iUsedMode=CDVD_MODE_2048; #ifdef DBGOUT auxprintf("mode found %d\n",i); #endif return dwStatus; // -> bye } } if(pDeInitFunc) pDeInitFunc(); // deinit, try next mode } return dwStatus; }