spu: fix saving bug
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 8785598..327ddb1 100644 (file)
@@ -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);
@@ -1264,6 +1275,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 +1465,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) {
@@ -1476,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
@@ -1508,6 +1516,8 @@ void cdrWrite1(unsigned char rt) {
 
        if (cdr.Ctrl & 0x3) return;
 
+       cdr.ResultReady = 0;
+
        switch (cdr.Cmd) {
        case CdlSync:
                cdr.Ctrl |= 0x80;
@@ -1809,6 +1819,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
@@ -1825,7 +1837,7 @@ unsigned char cdrRead2(void) {
        if (cdr.Readed == 0) {
                ret = 0;
        } else {
-               ret = *cdr.pTransfer++;
+               ret = *pTransfer++;
        }
 
 #ifdef CDR_LOG
@@ -1941,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:
@@ -2006,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
@@ -2052,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;
@@ -2061,8 +2074,7 @@ void cdrReset() {
 }
 
 int cdrFreeze(gzFile f, int Mode) {
-       uintptr_t tmp;
-
+       u32 tmp;
 
        if( Mode == 0 ) {
                StopCdda();
@@ -2071,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);