X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fcdrom.c;h=327ddb1d0ad8613a70c768b6978e0da9fc978a3c;hp=297c8aee48f8fc07cc3c43f5c454ae2b52df836b;hb=6f6fe96900374d8744473ce240279e66d1260191;hpb=2daaaae3b2bb131d88ad750d8a74c146f04da62a diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 297c8aee..327ddb1d 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -26,6 +26,7 @@ #include "psxdma.h" cdrStruct cdr; +static unsigned char *pTransfer; /* CD-ROM magic numbers */ #define CdlSync 0 @@ -121,11 +122,11 @@ unsigned char Test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 }; static struct CdrStat stat; -static unsigned int msf2sec(char *msf) { +static unsigned int msf2sec(u8 *msf) { return ((msf[0] * 60 + msf[1]) * 75) + msf[2]; } -static void sec2msf(unsigned int s, char *msf) { +static void sec2msf(unsigned int s, u8 *msf) { msf[0] = s / 75 / 60; s = s - msf[0] * 75 * 60; msf[1] = s / 75; @@ -541,6 +542,9 @@ static void cdrPlayInterrupt_Autopause() struct SubQ *subq = (struct SubQ *)CDR_getBufferSub(); int track_changed = 0; if (subq != NULL ) { + // update subq + ReadTrack( cdr.SetSectorPlay ); + #ifdef CDR_LOG CDR_LOG( "CDDA SUB - %X:%X:%X\n", subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); @@ -553,7 +557,9 @@ static void cdrPlayInterrupt_Autopause() Tomb Raider 1 ($7) */ - if( cdr.CurTrack < btoi( subq->TrackNumber ) ) + // .. + 1 is probably wrong, but deals with corrupted subq + good checksum + // (how does real thing handle those?) + if( cdr.CurTrack + 1 == btoi( subq->TrackNumber ) ) track_changed = 1; } else { Create_Fake_Subq(); @@ -582,13 +588,14 @@ static void cdrPlayInterrupt_Autopause() StopCdda(); } - if (cdr.Mode & MODE_REPORT) { + else if (cdr.Mode & MODE_REPORT) { if (subq != NULL) { #ifdef CDR_LOG CDR_LOG( "REPPLAY SUB - %X:%X:%X\n", subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); #endif - cdr.CurTrack = btoi( subq->TrackNumber ); + // breaks when .sub doesn't have index 0 for some reason (bad rip?) + //cdr.CurTrack = btoi( subq->TrackNumber ); if (subq->AbsoluteAddress[2] & 0xf) return; @@ -779,7 +786,7 @@ void cdrInterrupt() { cdr.SetSectorPlay[2] = cdr.ResultTD[0]; // reset data - Set_Track(); + //Set_Track(); Find_CurTrack(); ReadTrack( cdr.SetSectorPlay ); @@ -958,6 +965,10 @@ void cdrInterrupt() { subq = (struct SubQ *)CDR_getBufferSub(); if (subq != NULL) { + if( cdr.Play && (cdr.Mode & MODE_CDDA) && !(cdr.Mode & (MODE_AUTOPAUSE|MODE_REPORT)) ) + // update subq + ReadTrack( cdr.SetSectorPlay ); + cdr.Result[0] = subq->TrackNumber; cdr.Result[1] = subq->IndexNumber; memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3); @@ -1473,7 +1484,7 @@ unsigned char cdrRead1(void) { } void cdrWrite1(unsigned char rt) { - char set_loc[3]; + u8 set_loc[3]; int i; #ifdef CDR_LOG @@ -1826,7 +1837,7 @@ unsigned char cdrRead2(void) { if (cdr.Readed == 0) { ret = 0; } else { - ret = *cdr.pTransfer++; + ret = *pTransfer++; } #ifdef CDR_LOG @@ -1942,16 +1953,16 @@ void cdrWrite3(unsigned char rt) { if (rt == 0x80 && !(cdr.Ctrl & 0x3) && cdr.Readed == 0) { cdr.Readed = 1; - cdr.pTransfer = cdr.Transfer; + pTransfer = cdr.Transfer; switch (cdr.Mode & 0x30) { case MODE_SIZE_2328: case 0x00: - cdr.pTransfer += 12; + pTransfer += 12; break; case MODE_SIZE_2340: - cdr.pTransfer += 0; + pTransfer += 0; break; default: @@ -2007,16 +2018,16 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { - CdlPlay - Spams DMA3 and gets buffer overrun */ - size = CD_FRAMESIZE_RAW - (cdr.pTransfer - cdr.Transfer); + size = CD_FRAMESIZE_RAW - (pTransfer - cdr.Transfer); if (size > cdsize) size = cdsize; if (size > 0) { - memcpy(ptr, cdr.pTransfer, size); + memcpy(ptr, pTransfer, size); } psxCpu->Clear(madr, cdsize / 4); - cdr.pTransfer += cdsize; + pTransfer += cdsize; // burst vs normal @@ -2053,6 +2064,7 @@ void cdrReset() { cdr.CurTrack = 1; cdr.File = 1; cdr.Channel = 1; + pTransfer = cdr.Transfer; // BIOS player - default values cdr.AttenuatorLeft[0] = 0x80; @@ -2062,8 +2074,7 @@ void cdrReset() { } int cdrFreeze(gzFile f, int Mode) { - uintptr_t tmp; - + u32 tmp; if( Mode == 0 ) { StopCdda(); @@ -2072,12 +2083,12 @@ int cdrFreeze(gzFile f, int Mode) { gzfreeze(&cdr, sizeof(cdr)); if (Mode == 1) - tmp = cdr.pTransfer - cdr.Transfer; + tmp = pTransfer - cdr.Transfer; gzfreeze(&tmp, sizeof(tmp)); if (Mode == 0) { - cdr.pTransfer = cdr.Transfer + tmp; + pTransfer = cdr.Transfer + tmp; if (cdr.Play && !Config.Cdda) CDR_play(cdr.SetSectorPlay);