X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fcdrom.c;h=fa0e6a9f24eaeac6d132a7add585835c2c9473e1;hp=839e89e924c2788010d03b8301194200bfeb96f3;hb=aafcb4ddc257478d613611adcae7cb13fd716577;hpb=056d67598872b0bac092878972633d6c10aa0ad6 diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 839e89e9..fa0e6a9f 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -539,6 +539,7 @@ static void Create_Fake_Subq() static void cdrPlayInterrupt_Autopause() { struct SubQ *subq = (struct SubQ *)CDR_getBufferSub(); + int track_changed = 0; if (subq != NULL ) { #ifdef CDR_LOG CDR_LOG( "CDDA SUB - %X:%X:%X\n", @@ -552,8 +553,8 @@ static void cdrPlayInterrupt_Autopause() Tomb Raider 1 ($7) */ - if( cdr.CurTrack >= btoi( subq->TrackNumber ) ) - return; + if( cdr.CurTrack < btoi( subq->TrackNumber ) ) + track_changed = 1; } else { Create_Fake_Subq(); #ifdef CDR_LOG___0 @@ -561,13 +562,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 +583,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 +590,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 +607,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); @@ -1225,6 +1227,7 @@ void cdrInterrupt() { /* Duke Nukem: Land of the Babes - seek then delay read for one frame - fixes cutscenes + C-12 - Final Resistance - doesn't like seek */ if (!cdr.Seeked) { @@ -1473,6 +1476,7 @@ unsigned char cdrRead1(void) { } void cdrWrite1(unsigned char rt) { + char set_loc[3]; int i; #ifdef CDR_LOG @@ -1521,9 +1525,12 @@ void cdrWrite1(unsigned char rt) { case CdlSetloc: StopReading(); - cdr.Seeked = FALSE; for (i = 0; i < 3; i++) - cdr.SetSector[i] = btoi(cdr.Param[i]); + set_loc[i] = btoi(cdr.Param[i]); + i = abs(msf2sec(cdr.SetSector) - msf2sec(set_loc)); + if (i > 16) + cdr.Seeked = FALSE; + memcpy(cdr.SetSector, set_loc, 3); cdr.SetSector[3] = 0; /* @@ -2068,9 +2075,13 @@ int cdrFreeze(gzFile f, int Mode) { gzfreeze(&tmp, sizeof(tmp)); - if (Mode == 0) + if (Mode == 0) { cdr.pTransfer = cdr.Transfer + tmp; + if (cdr.Play && !Config.Cdda) + CDR_play(cdr.SetSectorPlay); + } + return 0; }