int CdRead(u32 lsn, u32 sectors, void *buf, CdRMode *mode){ u32 i; u8* buff; int rmode; switch (mode->datapattern) { case CdSecS2048: rmode = CDVD_MODE_2048; break; case CdSecS2328: rmode = CDVD_MODE_2328; break; case CdSecS2340: rmode = CDVD_MODE_2340; break; default: return 0; } for (i=0; i<sectors; i++){ if (CDVDreadTrack(lsn+i, rmode)==-1) return 0; buff = CDVDgetBuffer(); if (buff==NULL) return 0; switch (mode->datapattern){ case CdSecS2048: memcpy((void*)((uptr)buf+2048*i), buff, 2048);break;//only data case CdSecS2328: memcpy((void*)((uptr)buf+2328*i), buff, 2328);break;//without sync & head & sub case CdSecS2340: memcpy((void*)((uptr)buf+2340*i), buff, 2340);break;//without sync } } return 1; }
int DvdRead(u32 lsn, u32 sectors, void *buf, CdRMode *mode){ u32 i; u8* buff; for (i=lsn; i<(lsn+sectors); i++){ if (CDVDreadTrack(i, CDVD_MODE_2048)==-1) return 0; buff = CDVDgetBuffer(); if (buff==NULL) return 0; // switch (mode->datapattern){ // case CdSecS2064: ((u32*)buf)[0] = i + 0x30000; memcpy((u8*)buf+12, buff, 2048); (u8*)buf+= 2064; break; // default: // return 0; // } } return 1; }
void cdrReadInterrupt() { u8 *buf; if (!cdr.Reading) return; if (cdr.Stat) { CDREAD_INT(0x800); return; } CDR_LOG("KEY END"); cdr.OCUP = 1; SetResultSize(1); cdr.StatP|= 0x22; cdr.Result[0] = cdr.StatP; SysPrintf("Reading From CDR"); buf = CDVDgetBuffer(); if (buf == NULL) cdr.RErr = -1; if (cdr.RErr == -1) { CDR_LOG(" err\n"); memzero_ptr<2340>(cdr.Transfer); cdr.Stat = DiskError; cdr.Result[0]|= 0x01; ReadTrack(); CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); return; } memcpy_fast(cdr.Transfer, buf+12, 2340); cdr.Stat = DataReady; CDR_LOG(" %x:%x:%x\n", cdr.Transfer[0], cdr.Transfer[1], cdr.Transfer[2]); cdr.SetSector[2]++; if (cdr.SetSector[2] == 75) { cdr.SetSector[2] = 0; cdr.SetSector[1]++; if (cdr.SetSector[1] == 60) { cdr.SetSector[1] = 0; cdr.SetSector[0]++; } } cdr.Readed = 0; if ((cdr.Transfer[4+2] & 0x80) && (cdr.Mode & 0x2)) { // EOF CDR_LOG("AutoPausing Read\n"); AddIrqQueue(CdlPause, 0x800); } else { ReadTrack(); CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); } psxHu32(0x1070)|= 0x4; return; }