Merge pull request #578 from gameblabla/counters_lib
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 5ffb7fa..8054d81 100644 (file)
@@ -383,7 +383,7 @@ static void ReadTrack(const u8 *time) {
 
        CDR_LOG("ReadTrack *** %02x:%02x:%02x\n", tmp[0], tmp[1], tmp[2]);
 
-       cdr.RErr = CDR_readTrack(tmp);
+       cdr.NoErr = CDR_readTrack(tmp);
        memcpy(cdr.Prev, tmp, 3);
 
        if (CheckSBI(time))
@@ -505,7 +505,6 @@ void cdrPlayInterrupt()
                cdr.Seeked = SEEK_DONE;
                if (cdr.Irq == 0) {
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        setIrq();
                }
 
@@ -571,6 +570,8 @@ void cdrInterrupt() {
        int error = 0;
        int delay;
        unsigned int seekTime = 0;
+       u8 set_loc[3];
+       int i;
 
        // Reschedule IRQ
        if (cdr.Stat) {
@@ -604,13 +605,40 @@ void cdrInterrupt() {
                        break;
 
                case CdlSetloc:
+                       CDR_LOG("CDROM setloc command (%02X, %02X, %02X)\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]);
+
+                       // MM must be BCD, SS must be BCD and <0x60, FF must be BCD and <0x75
+                       if (((cdr.Param[0] & 0x0F) > 0x09) || (cdr.Param[0] > 0x99) || ((cdr.Param[1] & 0x0F) > 0x09) || (cdr.Param[1] >= 0x60) || ((cdr.Param[2] & 0x0F) > 0x09) || (cdr.Param[2] >= 0x75))
+                       {
+                               CDR_LOG("Invalid/out of range seek to %02X:%02X:%02X\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]);
+                               error = ERROR_INVALIDARG;
+                               goto set_error;
+                       }
+                       else
+                       {
+                               for (i = 0; i < 3; i++)
+                               {
+                                       set_loc[i] = btoi(cdr.Param[i]);
+                               }
+
+                               i = msf2sec(cdr.SetSectorPlay);
+                               i = abs(i - msf2sec(set_loc));
+                               if (i > 16)
+                                       cdr.Seeked = SEEK_PENDING;
+
+                               memcpy(cdr.SetSector, set_loc, 3);
+                               cdr.SetSector[3] = 0;
+                               cdr.SetlocPending = 1;
+                       }
                        break;
 
                do_CdlPlay:
                case CdlPlay:
                        StopCdda();
-                       /* It would set it to SEEK_DONE*/
-                       cdr.Seeked = SEEK_PENDING;
+                       if (cdr.Seeked == SEEK_PENDING) {
+                               // XXX: wrong, should seek instead..
+                               cdr.Seeked = SEEK_DONE;
+                       }
 
                        cdr.FastBackward = 0;
                        cdr.FastForward = 0;
@@ -677,7 +705,6 @@ void cdrInterrupt() {
                case CdlForward:
                        // TODO: error 80 if stopped
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        // GameShark CD Player: Calls 2x + Play 2x
                        cdr.FastForward = 1;
                        cdr.FastBackward = 0;
@@ -702,7 +729,6 @@ void cdrInterrupt() {
 
                case CdlStandby + 0x100:
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        break;
 
                case CdlStop:
@@ -730,7 +756,6 @@ void cdrInterrupt() {
                        cdr.StatP &= ~STATUS_ROTATING;
                        cdr.Result[0] = cdr.StatP;
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        break;
 
                case CdlPause:
@@ -766,7 +791,6 @@ void cdrInterrupt() {
                        cdr.StatP &= ~STATUS_READ;
                        cdr.Result[0] = cdr.StatP;
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        break;
 
                case CdlReset:
@@ -779,7 +803,6 @@ void cdrInterrupt() {
 
                case CdlReset + 0x100:
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        break;
 
                case CdlMute:
@@ -816,9 +839,6 @@ void cdrInterrupt() {
                case CdlGetlocP:
                        SetResultSize(8);
                        memcpy(&cdr.Result, &cdr.subq, 8);
-
-                       if (!cdr.Play && !cdr.Reading)
-                               cdr.Result[1] = 0; // HACK?
                        break;
 
                case CdlReadT: // SetSession?
@@ -829,7 +849,6 @@ void cdrInterrupt() {
 
                case CdlReadT + 0x100:
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        break;
 
                case CdlGetTN:
@@ -929,7 +948,6 @@ void cdrInterrupt() {
                        /* This adds the string "PCSX" in Playstation bios boot screen */
                        memcpy((char *)&cdr.Result[4], "PCSX", 4);
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        break;
 
                case CdlInit:
@@ -953,7 +971,6 @@ void cdrInterrupt() {
 
                case CdlReadToc + 0x100:
                        cdr.Stat = Complete;
-                       cdr.RErr = 1;
                        no_busy_error = 1;
                        break;
 
@@ -1153,9 +1170,9 @@ void cdrReadInterrupt() {
 
        buf = CDR_getBuffer();
        if (buf == NULL)
-               cdr.RErr = 0;
+               cdr.NoErr = 0;
 
-       if (cdr.RErr == 0) {
+       if (cdr.NoErr == 0) {
                CDR_LOG_I("cdrReadInterrupt() Log: err\n");
                memset(cdr.Transfer, 0, DATA_SIZE);
                cdr.Stat = DiskError;
@@ -1188,6 +1205,19 @@ void cdrReadInterrupt() {
                        int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector);
                        if (!ret) {
                                cdrAttenuate(cdr.Xa.pcm, cdr.Xa.nsamples, cdr.Xa.stereo);
+                               /*
+                                * Gameblabla -
+                                * This is a hack for Megaman X4, Castlevania etc...
+                                * that regressed from the new m_locationChanged and CDROM timings changes.
+                                * It is mostly noticeable in Castevania however and the stuttering can be very jarring.
+                                * 
+                                * According to PCSX redux authors, we shouldn't cause a location change if
+                                * the sector difference is too small. 
+                                * I attempted to go with that approach but came empty handed.
+                                * So for now, let's just set cdr.m_locationChanged to false when playing back any ADPCM samples.
+                                * This does not regress Crash Team Racing's intro at least.
+                               */
+                               cdr.m_locationChanged = FALSE;
                                SPU_playADPCMchannel(&cdr.Xa);
                                cdr.FirstSector = 0;
                        }
@@ -1281,9 +1311,6 @@ unsigned char cdrRead1(void) {
 }
 
 void cdrWrite1(unsigned char rt) {
-       u8 set_loc[3];
-       int i;
-
        CDR_LOG_IO("cdr w1: %02x\n", rt);
 
        switch (cdr.Ctrl & 3) {
@@ -1317,32 +1344,6 @@ void cdrWrite1(unsigned char rt) {
        AddIrqQueue(cdr.Cmd, 0x800);
 
        switch (cdr.Cmd) {
-       case CdlSetloc:
-               CDR_LOG("CDROM setloc command (%02X, %02X, %02X)\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]);
-
-               // MM must be BCD, SS must be BCD and <0x60, FF must be BCD and <0x75
-               if (((cdr.Param[0] & 0x0F) > 0x09) || (cdr.Param[0] > 0x99) || ((cdr.Param[1] & 0x0F) > 0x09) || (cdr.Param[1] >= 0x60) || ((cdr.Param[2] & 0x0F) > 0x09) || (cdr.Param[2] >= 0x75))
-               {
-                       CDR_LOG("Invalid/out of range seek to %02X:%02X:%02X\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]);
-               }
-               else
-               {
-                       for (i = 0; i < 3; i++)
-                       {
-                               set_loc[i] = btoi(cdr.Param[i]);
-                       }
-
-                       i = msf2sec(cdr.SetSectorPlay);
-                       i = abs(i - msf2sec(set_loc));
-                       if (i > 16)
-                               cdr.Seeked = SEEK_PENDING;
-
-                       memcpy(cdr.SetSector, set_loc, 3);
-                       cdr.SetSector[3] = 0;
-                       cdr.SetlocPending = 1;
-               }
-               break;
-
        case CdlReadN:
        case CdlReadS:
        case CdlPause: