spu: fix saving bug
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 1aa958b..327ddb1 100644 (file)
@@ -122,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;
@@ -557,6 +557,8 @@ static void cdrPlayInterrupt_Autopause()
                Tomb Raider 1 ($7)
                */
 
+               // .. + 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 {
@@ -586,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;
@@ -783,7 +786,7 @@ void cdrInterrupt() {
                                                                cdr.SetSectorPlay[2] = cdr.ResultTD[0];
 
                                                                // reset data
-                                                               Set_Track();
+                                                               //Set_Track();
                                                                Find_CurTrack();
                                                                ReadTrack( cdr.SetSectorPlay );
 
@@ -962,8 +965,9 @@ void cdrInterrupt() {
                        subq = (struct SubQ *)CDR_getBufferSub();
 
                        if (subq != NULL) {
-                               // update subq
-                               ReadTrack( cdr.SetSectorPlay );
+                               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;
@@ -1480,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