cdrom: replace resched hack with another one
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 343d82c..87a7c19 100644 (file)
@@ -709,11 +709,12 @@ void cdrInterrupt() {
                        Wild 9: skip PREGAP + starting accurate SubQ
                        - plays tracks without retry play
                        */
+                       /* unneeded with correct cdriso?
                        Set_Track();
+                       */
                        Find_CurTrack();
                        ReadTrack( cdr.SetSectorPlay );
 
-
                        // GameShark CD Player: Calls 2x + Play 2x
                        if( cdr.FastBackward || cdr.FastForward ) {
                                if( cdr.FastForward ) cdr.FastForward--;
@@ -861,7 +862,17 @@ void cdrInterrupt() {
                        cdr.Result[0] = cdr.StatP;
                        cdr.Stat = Acknowledge;
 
-                       AddIrqQueue(CdlPause + 0x20, 0x800);
+                       /*
+                       Gundam Battle Assault 2: much slower (*)
+                       - Fixes boot, gameplay
+
+                       Hokuto no Ken 2: slower
+                       - Fixes intro + subtitles
+
+                       InuYasha - Feudal Fairy Tale: slower
+                       - Fixes battles
+                       */
+                       AddIrqQueue(CdlPause + 0x20, cdReadTime * 3);
                        cdr.Ctrl |= 0x80;
                        break;
 
@@ -978,10 +989,9 @@ void cdrInterrupt() {
                        }
 
                        // redump.org - wipe time
-                       /*if( !cdr.Play && CheckSBI(cdr.Result+5) ) {
+                       if( !cdr.Play && CheckSBI(cdr.Result+5) ) {
                                memset( cdr.Result+2, 0, 6 );
                        }
-                       */
 
                        cdr.Stat = Acknowledge;
                        break;
@@ -1207,7 +1217,8 @@ void cdrInterrupt() {
                        // - fixes cutscene speech
                        {
                                u8 *buf = CDR_getBuffer();
-                               memcpy(cdr.Transfer, buf, 8);
+                               if (buf != NULL)
+                                       memcpy(cdr.Transfer, buf, 8);
                        }
                        
                        
@@ -1321,11 +1332,14 @@ void cdrReadInterrupt() {
                                SPU_playADPCMchannel(&cdr.Xa);
                                cdr.FirstSector = 0;
 
-
+#if 0
                                // Crash Team Racing: music, speech
+                               // - done using cdda decoded buffer (spu irq)
+                               // - don't do here
 
                                // signal ADPCM data ready
                                psxHu32ref(0x1070) |= SWAP32((u32)0x200);
+#endif
                        }
                        else cdr.FirstSector = -1;
                }
@@ -1610,17 +1624,7 @@ void cdrWrite1(unsigned char rt) {
                cdr.Ctrl |= 0x80;
                cdr.Stat = NoIntr;
 
-               /*
-                  Gundam Battle Assault 2: much slower (*)
-                  - Fixes boot, gameplay
-
-                  Hokuto no Ken 2: slower
-                  - Fixes intro + subtitles
-
-                  InuYasha - Feudal Fairy Tale: slower
-                  - Fixes battles
-                  */
-               AddIrqQueue(cdr.Cmd, cdReadTime * 3);
+               AddIrqQueue(cdr.Cmd, 0x800);
                break;
 
        case CdlReset:
@@ -1898,11 +1902,14 @@ void cdrWrite3(unsigned char rt) {
                // - Final Fantasy Tactics
                // - various other games
 
-               /*
                if (cdr.Reading && !cdr.ResultReady) {
-                       CDREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime);
+                       int left = psxRegs.intCycle[PSXINT_CDREAD].sCycle + psxRegs.intCycle[PSXINT_CDREAD].cycle - psxRegs.cycle;
+                       int time = (cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime;
+                       if (left < time / 2) { // rearmed guesswork hack
+                               //printf("-- resched %d -> %d\n", left, time / 2);
+                               CDREAD_INT(time / 2);
+                       }
                }
-               */
 
                return;
        }