handle bad cd images better
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 8785598..3bf3e03 100644 (file)
@@ -541,6 +541,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 +556,7 @@ static void cdrPlayInterrupt_Autopause()
                Tomb Raider 1 ($7)
                */
 
-               if( cdr.CurTrack < btoi( subq->TrackNumber ) )
+               if( cdr.CurTrack + 1 == btoi( subq->TrackNumber ) )
                        track_changed = 1;
        } else {
                Create_Fake_Subq();
@@ -958,6 +961,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);
@@ -1264,6 +1270,9 @@ void cdrInterrupt() {
 
        Check_Shell( Irq );
 
+       cdr.ParamP = 0;
+       cdr.ParamC = 0;
+
        if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) {
                psxHu32ref(0x1070) |= SWAP32((u32)0x4);
        }
@@ -1451,12 +1460,6 @@ void cdrWrite0(unsigned char rt) {
        CDR_LOG("cdrWrite0() Log: CD0 write: %x\n", rt);
 #endif
        cdr.Ctrl = (rt & 3) | (cdr.Ctrl & ~3);
-
-       if (rt == 0) {
-               cdr.ParamP = 0;
-               cdr.ParamC = 0;
-               cdr.ResultReady = 0;
-       }
 }
 
 unsigned char cdrRead1(void) {
@@ -1508,6 +1511,8 @@ void cdrWrite1(unsigned char rt) {
 
        if (cdr.Ctrl & 0x3) return;
 
+       cdr.ResultReady = 0;
+
        switch (cdr.Cmd) {
        case CdlSync:
                cdr.Ctrl |= 0x80;
@@ -1809,6 +1814,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