Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}