Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
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;
}