X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fcdrom.c;h=1aa958b0642ae99e301d487e7d0f138ee930b190;hp=a150db69712794db79500780fa4ca58337754c7a;hb=8e1040b6a82ee1802fda83d4de84290a02656cc0;hpb=914722b27cdd4e4373418461151e223557e70559 diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index a150db69..1aa958b0 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 @@ -539,7 +540,11 @@ static void Create_Fake_Subq() 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] ); @@ -552,8 +557,8 @@ static void cdrPlayInterrupt_Autopause() Tomb Raider 1 ($7) */ - if( cdr.CurTrack >= btoi( subq->TrackNumber ) ) - return; + if( cdr.CurTrack + 1 == btoi( subq->TrackNumber ) ) + track_changed = 1; } else { Create_Fake_Subq(); #ifdef CDR_LOG___0 @@ -561,13 +566,11 @@ static void cdrPlayInterrupt_Autopause() fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] ); #endif - if( !fake_subq_change ) - return; - + track_changed = fake_subq_change; fake_subq_change = 0; } - if (cdr.Mode & MODE_AUTOPAUSE) { + if ((cdr.Mode & MODE_AUTOPAUSE) && track_changed) { #ifdef CDR_LOG CDR_LOG( "CDDA STOP\n" ); #endif @@ -584,11 +587,6 @@ static void cdrPlayInterrupt_Autopause() StopCdda(); } if (cdr.Mode & MODE_REPORT) { - // rearmed note: PCSX-Reloaded does this for every sector, - // but we try to get away with only track change here. - memset( cdr.Result, 0, 8 ); - cdr.Result[0] |= 0x10; - if (subq != NULL) { #ifdef CDR_LOG CDR_LOG( "REPPLAY SUB - %X:%X:%X\n", @@ -596,6 +594,10 @@ static void cdrPlayInterrupt_Autopause() #endif cdr.CurTrack = btoi( subq->TrackNumber ); + if (subq->AbsoluteAddress[2] & 0xf) + return; + + cdr.Result[0] = cdr.StatP; // BIOS CD Player: data already BCD format cdr.Result[1] = subq->TrackNumber; cdr.Result[2] = subq->IndexNumber; @@ -609,6 +611,10 @@ static void cdrPlayInterrupt_Autopause() fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] ); #endif + if (fake_subq_real[2] & 0xf) + return; + + cdr.Result[0] = cdr.StatP; // track # / index # cdr.Result[1] = itob(cdr.CurTrack); cdr.Result[2] = itob(fake_subq_index); @@ -956,6 +962,9 @@ void cdrInterrupt() { subq = (struct SubQ *)CDR_getBufferSub(); if (subq != NULL) { + // update subq + ReadTrack( cdr.SetSectorPlay ); + cdr.Result[0] = subq->TrackNumber; cdr.Result[1] = subq->IndexNumber; memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3); @@ -1262,6 +1271,9 @@ void cdrInterrupt() { Check_Shell( Irq ); + cdr.ParamP = 0; + cdr.ParamC = 0; + if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) { psxHu32ref(0x1070) |= SWAP32((u32)0x4); } @@ -1448,13 +1460,7 @@ void cdrWrite0(unsigned char rt) { #ifdef CDR_LOG CDR_LOG("cdrWrite0() Log: CD0 write: %x\n", rt); #endif - cdr.Ctrl = rt | (cdr.Ctrl & ~0x3); - - if (rt == 0) { - cdr.ParamP = 0; - cdr.ParamC = 0; - cdr.ResultReady = 0; - } + cdr.Ctrl = (rt & 3) | (cdr.Ctrl & ~3); } unsigned char cdrRead1(void) { @@ -1504,7 +1510,9 @@ void cdrWrite1(unsigned char rt) { } #endif - if (cdr.Ctrl & 0x1) return; + if (cdr.Ctrl & 0x3) return; + + cdr.ResultReady = 0; switch (cdr.Cmd) { case CdlSync: @@ -1807,6 +1815,8 @@ void cdrWrite1(unsigned char rt) { break; default: + cdr.ParamP = 0; + cdr.ParamC = 0; #ifdef CDR_LOG CDR_LOG("cdrWrite1() Log: Unknown command: %x\n", cdr.Cmd); #endif @@ -1823,7 +1833,7 @@ unsigned char cdrRead2(void) { if (cdr.Readed == 0) { ret = 0; } else { - ret = *cdr.pTransfer++; + ret = *pTransfer++; } #ifdef CDR_LOG @@ -1859,7 +1869,7 @@ void cdrWrite2(unsigned char rt) { cdr.Reg2 = rt; break; } - } else if (!(cdr.Ctrl & 0x1) && cdr.ParamP < 8) { + } else if (!(cdr.Ctrl & 0x3) && cdr.ParamP < 8) { cdr.Param[cdr.ParamP++] = rt; cdr.ParamC++; } @@ -1912,7 +1922,7 @@ void cdrWrite3(unsigned char rt) { } - if (rt == 0x07 && cdr.Ctrl & 0x1) { + if (rt == 0x07 && (cdr.Ctrl & 3) == 1) { cdr.Stat = 0; if (cdr.Irq == 0xff) { @@ -1937,18 +1947,18 @@ void cdrWrite3(unsigned char rt) { return; } - if (rt == 0x80 && !(cdr.Ctrl & 0x1) && cdr.Readed == 0) { + 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: @@ -2004,16 +2014,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 @@ -2050,6 +2060,7 @@ void cdrReset() { cdr.CurTrack = 1; cdr.File = 1; cdr.Channel = 1; + pTransfer = cdr.Transfer; // BIOS player - default values cdr.AttenuatorLeft[0] = 0x80; @@ -2059,8 +2070,7 @@ void cdrReset() { } int cdrFreeze(gzFile f, int Mode) { - uintptr_t tmp; - + u32 tmp; if( Mode == 0 ) { StopCdda(); @@ -2069,12 +2079,16 @@ 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; + if (Mode == 0) { + pTransfer = cdr.Transfer + tmp; + + if (cdr.Play && !Config.Cdda) + CDR_play(cdr.SetSectorPlay); + } return 0; }