diff options
Diffstat (limited to 'libpcsxcore')
| -rw-r--r-- | libpcsxcore/cdriso.c | 33 | ||||
| -rw-r--r-- | libpcsxcore/cdrom.c | 555 | ||||
| -rw-r--r-- | libpcsxcore/cdrom.h | 1 | ||||
| -rw-r--r-- | libpcsxcore/r3000a.c | 15 | ||||
| -rw-r--r-- | libpcsxcore/r3000a.h | 2 |
5 files changed, 338 insertions, 268 deletions
diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index 5cb1b7bc..f2746943 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -38,7 +38,7 @@ static FILE *subHandle = NULL; static boolean subChanMixed = FALSE; static boolean subChanRaw = FALSE; -static unsigned char cdbuffer[DATA_SIZE]; +static unsigned char cdbuffer[CD_FRAMESIZE_RAW]; static unsigned char subbuffer[SUB_FRAMESIZE]; static unsigned char sndbuffer[CD_FRAMESIZE_RAW * 10]; @@ -940,8 +940,8 @@ static long CALLBACK ISOreadTrack(unsigned char *time) { } if (subChanMixed) { - fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE) + 12, SEEK_SET); - fread(cdbuffer, 1, DATA_SIZE, cdHandle); + fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET); + fread(cdbuffer, 1, CD_FRAMESIZE_RAW, cdHandle); fread(subbuffer, 1, SUB_FRAMESIZE, cdHandle); if (subChanRaw) DecodeRawSubData(); @@ -956,8 +956,8 @@ static long CALLBACK ISOreadTrack(unsigned char *time) { cdbuffer[2] = (time[2]);
cdbuffer[3] = 1; //mode 1
} else { - fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * CD_FRAMESIZE_RAW + 12, SEEK_SET); - fread(cdbuffer, 1, DATA_SIZE, cdHandle);
+ fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * CD_FRAMESIZE_RAW, SEEK_SET); + fread(cdbuffer, 1, CD_FRAMESIZE_RAW, cdHandle);
} if (subHandle != NULL) { @@ -973,7 +973,7 @@ static long CALLBACK ISOreadTrack(unsigned char *time) { // return readed track static unsigned char * CALLBACK ISOgetBuffer(void) { - return cdbuffer; + return cdbuffer+12; } // plays cdda audio @@ -1023,7 +1023,25 @@ static long CALLBACK ISOgetStatus(struct CdrStat *stat) { stat->Type = ti[1].type; return 0; -} +}
+
+// read CDDA sector into buffer
+long CALLBACK ISOreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned char *buffer) {
+ unsigned char msf[3] = {m, s, f};
+ unsigned char *p;
+
+ msf[0] = itob(msf[0]);
+ msf[1] = itob(msf[1]);
+ msf[2] = itob(msf[2]);
+
+ if (ISOreadTrack(msf) != 0) return -1;
+
+ p = ISOgetBuffer();
+ if (p == NULL) return -1;
+
+ memcpy(buffer, p - 12, CD_FRAMESIZE_RAW); // copy from the beginning of the sector
+ return 0;
+}
void cdrIsoInit(void) { CDR_init = ISOinit; @@ -1038,6 +1056,7 @@ void cdrIsoInit(void) { CDR_stop = ISOstop; CDR_getBufferSub = ISOgetBufferSub; CDR_getStatus = ISOgetStatus; + CDR_readCDDA = ISOreadCDDA;
CDR_getDriveLetter = CDR__getDriveLetter; CDR_configure = CDR__configure; diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index ae39ee19..316a0671 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -152,12 +152,6 @@ extern SPUregisterCallback SPU_registerCallback; psxRegs.intCycle[PSXINT_CDREAD].sCycle = psxRegs.cycle; \ } -#define CDREPPLAY_INT(eCycle) { \ - psxRegs.interrupt |= (1 << PSXINT_CDREPPLAY); \ - psxRegs.intCycle[PSXINT_CDREPPLAY].cycle = eCycle; \ - psxRegs.intCycle[PSXINT_CDREPPLAY].sCycle = psxRegs.cycle; \ -} - #define CDRDBUF_INT(eCycle) { \ psxRegs.interrupt |= (1 << PSXINT_CDRDBUF); \ psxRegs.intCycle[PSXINT_CDRDBUF].cycle = eCycle; \ @@ -533,238 +527,325 @@ void Set_Track() } -void cdrPlayInterrupt()
+void cdrPlayInterrupt_Autopause()
{
- if( !cdr.Play ) return;
+ if ((cdr.Mode & (MODE_AUTOPAUSE|MODE_CDDA)) != (MODE_AUTOPAUSE|MODE_CDDA)) return;
- if( (cdr.Mode & MODE_AUTOPAUSE) == 0 ) return;
+ // Reschedule IRQ
+ if ( cdr.Irq || cdr.Stat ) {
+#ifdef CDR_LOG
+ CDR_LOG("=== BUSY === cdrPlayInterrupt\n");
+#endif
- if( CDR_getStatus(&stat) != -1) {
- subq = (struct SubQ *)CDR_getBufferSub();
+ //CDRPLAY_INT( 0x800 );
+ return;
+ }
+
+
+ if( CDR_getStatus(&stat) != -1) return;
+
+ subq = (struct SubQ *)CDR_getBufferSub();
- if (subq != NULL ) {
+ if (subq != NULL ) {
#ifdef CDR_LOG
- CDR_LOG( "CDDA IRQ - %X:%X:%X\n",
- subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] );
+ CDR_LOG( "CDDA SUB - %X:%X:%X\n",
+ subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] );
#endif
- /*
- CDDA Autopause
+ /*
+ CDDA Autopause
- Silhouette Mirage ($3)
- Tomb Raider 1 ($7)
- */
+ Silhouette Mirage ($3)
+ Tomb Raider 1 ($7)
+ */
- if( cdr.CurTrack < btoi( subq->TrackNumber ) ) {
- // Magic the Gathering
- // - looping territory cdda
+ if( cdr.CurTrack < btoi( subq->TrackNumber ) ) {
+#ifdef CDR_LOG
+ CDR_LOG( "CDDA STOP\n" );
+#endif
- // ...?
- //cdr.ResultReady = 1;
- //cdr.Stat = DataReady;
- cdr.Stat = DataEnd;
- psxHu32ref(0x1070) |= SWAP32((u32)0x4);
+ // Magic the Gathering
+ // - looping territory cdda
-
- StopCdda();
- }
- } else {
- if (CDR_getTN(cdr.ResultTN) != -1) {
- if( cdr.CurTrack+1 <= cdr.ResultTN[1] ) {
- if( CDR_getTD(cdr.CurTrack+1, cdr.ResultTD) != -1 ) {
- u8 temp_cur[3], temp_next[3];
-
- temp_cur[0] = stat.Time[0];
- temp_cur[1] = stat.Time[1];
- temp_cur[2] = stat.Time[2];
-
- temp_next[0] = cdr.ResultTD[2];
- temp_next[1] = cdr.ResultTD[1];
- temp_next[2] = cdr.ResultTD[0];
-
- if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) {
- // Magic the Gathering
- // - looping territory cdda
-
- // ...?
- //cdr.ResultReady = 1;
- //cdr.Stat = DataReady;
- cdr.Stat = DataEnd;
- psxHu32ref(0x1070) |= SWAP32((u32)0x4);
-
-
- StopCdda();
-
- cdr.CurTrack++;
- }
- }
- }
- }
+ // ...?
+ //cdr.ResultReady = 1;
+ //cdr.Stat = DataReady;
+ cdr.Stat = DataEnd;
+ psxHu32ref(0x1070) |= SWAP32((u32)0x4);
+
+
+ StopCdda();
}
- }
+ } else {
+ u8 temp_cur[3], temp_next[3];
+ if (CDR_getTN(cdr.ResultTN) == -1) return;
+ if( cdr.CurTrack+1 > cdr.ResultTN[1] ) return;
+ if( CDR_getTD(cdr.CurTrack+1, cdr.ResultTD) == -1 ) return;
- CDRPLAY_INT( cdReadTime );
+ temp_cur[0] = cdr.SetSectorPlay[0];
+ temp_cur[1] = cdr.SetSectorPlay[1];
+ temp_cur[2] = cdr.SetSectorPlay[2];
+ temp_next[0] = cdr.ResultTD[2];
+ temp_next[1] = cdr.ResultTD[1];
+ temp_next[2] = cdr.ResultTD[0];
- Check_Shell(0);
+
+#ifdef CDR_LOG
+ CDR_LOG( "CDDA FAKE SUB - %d:%d:%d\n",
+ temp_cur[0], temp_cur[1], temp_cur[2] );
+#endif
+
+
+ if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) {
+#ifdef CDR_LOG
+ CDR_LOG( "CDDA STOP\n" );
+#endif
+
+ // Magic the Gathering
+ // - looping territory cdda
+
+ // ...?
+ //cdr.ResultReady = 1;
+ //cdr.Stat = DataReady;
+ cdr.Stat = DataEnd;
+ psxHu32ref(0x1070) |= SWAP32((u32)0x4);
+
+
+ StopCdda();
+
+ cdr.CurTrack++;
+ }
+ }
}
-void cdrRepplayInterrupt() -{ - if( !cdr.Play ) return;
+void cdrPlayInterrupt_Repplay()
+{
+ // BIOS - HACK: Switch between local / absolute times
+ static u8 report_time = 1;
+
+
+ if ((cdr.Mode & (MODE_REPORT|MODE_CDDA)) != (MODE_REPORT|MODE_CDDA)) return;
+
+#ifdef CDR_LOG
+ CDR_LOG("cdrRepplayInterrupt() Log: KEY END\n");
+#endif
+
+ // Doom - no more cdda playing
+ // - fixes boot with irq cmd reschedule
+
+ // Reschedule IRQ
+ if ( cdr.Irq || cdr.Stat ) {
+#ifdef CDR_LOG
+ CDR_LOG("=== BUSY === cdrRepplayInterrupt\n");
+#endif
+
+ //CDREPPLAY_INT( 0x800 );
+ return;
+ }
- if (cdr.Irq || cdr.Stat) { - CDREAD_INT( cdReadTime ); - return; - } - -#ifdef CDR_LOG - CDR_LOG("cdrRepplayInterrupt() Log: KEY END\n"); -#endif - - if ((cdr.Mode & (MODE_REPORT|MODE_CDDA)) != (MODE_REPORT|MODE_CDDA)) return; - - memset( cdr.Result, 0, 8 ); - if( CDR_getStatus(&stat) != -1) { - // BIOS - HACK: Switch between local / absolute times - static u8 report_time = 1; - - - subq = (struct SubQ *)CDR_getBufferSub(); - - if (subq != NULL ) { -#ifdef CDR_LOG - CDR_LOG( "REPPLAY IRQ - %X:%X:%X\n", - subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); -#endif - - - /* - skip subQ integrity check (audio playback) - - mainly useful for DATA LibCrypt checking - */ - //if( SWAP16(subq->CRC) != calcCrc((unsigned char *)subq + 12, 10) ) - - cdr.Result[0] = cdr.StatP; - - - // Rayman: audio pregap flag / track change - // - not all CDs will use PREGAPs, so we track it manually - if( cdr.CurTrack < btoi( subq->TrackNumber ) ) { - cdr.Result[0] |= 0x10; - - cdr.CurTrack = btoi( subq->TrackNumber ); - } - - - // BIOS CD Player: data already BCD format - cdr.Result[1] = subq->TrackNumber; - cdr.Result[2] = subq->IndexNumber; - - - // BIOS CD Player: switch between local / absolute times - if( report_time == 0 ) { - cdr.Result[3] = subq->AbsoluteAddress[0]; - cdr.Result[4] = subq->AbsoluteAddress[1]; - cdr.Result[5] = subq->AbsoluteAddress[2]; - - report_time = 1; - } - else { - cdr.Result[3] = subq->TrackRelativeAddress[0]; - cdr.Result[4] = subq->TrackRelativeAddress[1]; - cdr.Result[5] = subq->TrackRelativeAddress[2]; - - cdr.Result[4] |= 0x80; - - report_time = 0; - } +
+ memset( cdr.Result, 0, 8 );
+ if( CDR_getStatus(&stat) == -1) return;
+
+ cdr.Result[0] = cdr.StatP;
+
+
+ subq = (struct SubQ *)CDR_getBufferSub();
+ if (subq != NULL ) {
+#ifdef CDR_LOG
+ CDR_LOG( "REPPLAY SUB - %X:%X:%X\n",
+ subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] );
+#endif
+
+
+ /*
+ skip subQ integrity check (audio playback)
+ - mainly useful for DATA LibCrypt checking
+ */
+ //if( SWAP16(subq->CRC) != calcCrc((unsigned char *)subq + 12, 10) )
+
+ // Rayman: audio pregap flag / track change
+ // - not all CDs will use PREGAPs, so we track it manually
+ if( cdr.CurTrack < btoi( subq->TrackNumber ) ) {
+ cdr.Result[0] |= 0x10;
+
+ cdr.CurTrack = btoi( subq->TrackNumber );
+ }
+
+
+ // BIOS CD Player: data already BCD format
+ cdr.Result[1] = subq->TrackNumber;
+ cdr.Result[2] = subq->IndexNumber;
+
+
+ // BIOS CD Player: switch between local / absolute times
+ if( report_time == 0 ) {
+ cdr.Result[3] = subq->AbsoluteAddress[0];
+ cdr.Result[4] = subq->AbsoluteAddress[1];
+ cdr.Result[5] = subq->AbsoluteAddress[2];
+
+ report_time = 1;
+ } else {
+ cdr.Result[3] = subq->TrackRelativeAddress[0];
+ cdr.Result[4] = subq->TrackRelativeAddress[1];
+ cdr.Result[5] = subq->TrackRelativeAddress[2];
+
+ cdr.Result[4] |= 0x80;
+
+ report_time = 0;
+ }
+ } else {
+ u8 temp_cur[3], temp_next[3];
+
+ if (CDR_getTN(cdr.ResultTN) == -1) return;
+ if( cdr.CurTrack+1 > cdr.ResultTN[1] ) return;
+ if( CDR_getTD(cdr.CurTrack+1, cdr.ResultTD) == -1 ) return;
+
+
+ temp_cur[0] = cdr.SetSectorPlay[0];
+ temp_cur[1] = cdr.SetSectorPlay[1];
+ temp_cur[2] = cdr.SetSectorPlay[2];
+
+ temp_next[0] = cdr.ResultTD[2];
+ temp_next[1] = cdr.ResultTD[1];
+ temp_next[2] = cdr.ResultTD[0];
+
+
+#ifdef CDR_LOG
+ CDR_LOG( "REPPLAY FAKE - %d:%d:%d\n",
+ temp_cur[0], temp_cur[1], temp_cur[2] );
+#endif
+
+
+ // Rayman: check track change
+ if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) {
+#ifdef CDR_LOG___0
+ CDR_LOG( "TRACK CHANGE %d - %d %d %d ==> %d %d %d\n",
+ cdr.CurTrack,
+ temp_cur[0], temp_cur[1], temp_cur[2],
+ temp_next[0], temp_next[1], temp_next[2] );
+#endif
+
+ cdr.Result[0] |= 0x10;
+
+ cdr.CurTrack++;
+ }
+
+
+ // track # / index # (assume no pregaps)
+ cdr.Result[1] = itob(cdr.CurTrack);
+ cdr.Result[2] = 1;
+
+ if( report_time == 0 ) {
+ // absolute
+ cdr.Result[3] = temp_cur[0];
+ cdr.Result[4] = temp_cur[1];
+ cdr.Result[5] = itob(temp_cur[2]);
+
+ // m:s adjustment
+ if ((s8)cdr.Result[4] < 0) {
+ cdr.Result[4] += 60;
+ cdr.Result[3] -= 1;
+ }
+
+ cdr.Result[3] = itob(cdr.Result[3]);
+ cdr.Result[4] = itob(cdr.Result[4]);
+
+ report_time = 1;
} else {
- // Rayman: check track change
- if (CDR_getTN(cdr.ResultTN) != -1) {
- if( cdr.CurTrack+1 <= cdr.ResultTN[1] ) {
- if( CDR_getTD(cdr.CurTrack+1, cdr.ResultTD) != -1 ) {
- u8 temp_cur[3], temp_next[3];
-
- temp_cur[0] = stat.Time[0];
- temp_cur[1] = stat.Time[1];
- temp_cur[2] = stat.Time[2];
-
- temp_next[0] = cdr.ResultTD[2];
- temp_next[1] = cdr.ResultTD[1];
- temp_next[2] = cdr.ResultTD[0];
-
- if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) {
- cdr.Result[0] |= 0x10;
-
- cdr.CurTrack++;
- }
- }
- }
+ // local
+ cdr.Result[3] = temp_cur[0];
+ cdr.Result[4] = temp_cur[1] - 2;
+ cdr.Result[5] = itob( temp_cur[2] );
+
+ // m:s adjustment
+ if ((s8)cdr.Result[4] < 0) {
+ cdr.Result[4] += 60;
+ cdr.Result[3] -= 1;
}
-
- // track # / index # (assume no pregaps)
- cdr.Result[1] = itob( cdr.CurTrack );
- cdr.Result[2] = 1;
-
- if( report_time == 0 ) {
- // absolute
- cdr.Result[3] = stat.Time[0];
- cdr.Result[4] = stat.Time[1];
- cdr.Result[5] = itob( stat.Time[2] );
-
- // m:s adjustment
- if ((s8)cdr.Result[4] < 0) {
- cdr.Result[4] += 60;
- cdr.Result[3] -= 1;
- }
+ cdr.Result[3] = itob(cdr.Result[3]);
+ cdr.Result[4] = itob(cdr.Result[4]);
- cdr.Result[3] = itob(cdr.Result[3]);
- cdr.Result[4] = itob(cdr.Result[4]);
+ cdr.Result[4] |= 0x80;
- report_time = 1;
- } else {
- // local
- cdr.Result[3] = stat.Time[0];
- cdr.Result[4] = stat.Time[1] - 2;
- cdr.Result[5] = itob( stat.Time[2] );
-
- // m:s adjustment
- if ((s8)cdr.Result[4] < 0) {
- cdr.Result[4] += 60;
- cdr.Result[3] -= 1;
- }
+ report_time = 0;
+ }
+
+ cdr.Result[6] = 0;
+ cdr.Result[7] = 0;
+ }
- cdr.Result[3] = itob(cdr.Result[3]);
- cdr.Result[4] = itob(cdr.Result[4]);
- cdr.Result[4] |= 0x80;
+ // Rayman: Logo freeze (resultready + dataready)
+ cdr.ResultReady = 1;
+ cdr.Stat = DataReady;
- report_time = 0;
- }
+ SetResultSize(8);
+ psxHu32ref(0x1070) |= SWAP32((u32)0x4);
+}
+
+
+void cdrPlayInterrupt()
+{
+ if( !cdr.Play ) return;
+
+ //////////////////////////////////////////
+ //////////////////////////////////////////
+
+#ifdef CDR_LOG
+ CDR_LOG( "CDDA - %d:%d:%d\n",
+ cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] );
+#endif
- cdr.Result[6] = 0;
- cdr.Result[7] = 0;
+
+ {
+ u8 temp[3];
+
+ temp[0] = itob(cdr.SetSectorPlay[0]);
+ temp[1] = itob(cdr.SetSectorPlay[1]);
+ temp[2] = itob(cdr.SetSectorPlay[2]);
+
+ // get subq
+ CDR_readTrack( temp );
+ }
+
+ if( CDR_readCDDA )
+ CDR_readCDDA( cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2], cdr.Transfer );
+
+ cdr.SetSectorPlay[2]++;
+ if (cdr.SetSectorPlay[2] == 75) {
+ cdr.SetSectorPlay[2] = 0;
+ cdr.SetSectorPlay[1]++;
+ if (cdr.SetSectorPlay[1] == 60) {
+ cdr.SetSectorPlay[1] = 0;
+ cdr.SetSectorPlay[0]++;
}
- } - - // Rayman: Logo freeze - cdr.ResultReady = 1; - - cdr.Stat = DataReady; - SetResultSize(8); - - - // Wild 9: Do not use REPPLAY_ACK - CDREPPLAY_INT(cdReadTime); - - Check_Shell( 0 ); - - psxHu32ref(0x1070) |= SWAP32((u32)0x4); -} + }
+
+
+ // TODO: mute data track cdplay
+
+ // mute
+ if (Config.Cdda) memset( cdr.Transfer, 0, CD_FRAMESIZE_RAW );
+
+
+ SPU_playCDDAchannel((short *)cdr.Transfer, CD_FRAMESIZE_RAW);
+
+ CDRPLAY_INT( cdReadTime );
+
+ //////////////////////////////////////////
+ //////////////////////////////////////////
+
+ cdrPlayInterrupt_Autopause();
+ cdrPlayInterrupt_Repplay();
+
+ Check_Shell(0);
+}
+
void cdrInterrupt() { int i; @@ -772,7 +853,7 @@ void cdrInterrupt() { // Reschedule IRQ if (cdr.Stat) { - CDR_INT( cdr.eCycle ); + CDR_INT( 0x100 ); return; } @@ -845,7 +926,7 @@ void cdrInterrupt() { cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); #endif - CDR_play( cdr.SetSectorPlay ); + //CDR_play( cdr.SetSectorPlay ); } else { @@ -856,7 +937,7 @@ void cdrInterrupt() { cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); #endif - CDR_play( cdr.SetSectorPlay ); + //CDR_play( cdr.SetSectorPlay ); } else { #ifdef CDR_LOG___0 @@ -880,7 +961,7 @@ void cdrInterrupt() { cdr.SetSectorPlay[1] = cdr.ResultTD[1]; cdr.SetSectorPlay[2] = cdr.ResultTD[0]; - CDR_play(cdr.SetSectorPlay); + //CDR_play(cdr.SetSectorPlay); } } } @@ -899,17 +980,12 @@ void cdrInterrupt() { cdr.Stat = Acknowledge; cdr.StatP |= STATUS_PLAY; +
+
+ // BIOS player - set flag again
cdr.Play = TRUE;
- // Lemmings: report play times - if ((cdr.Mode & (MODE_REPORT|MODE_CDDA)) == (MODE_REPORT|MODE_CDDA)) { - CDREPPLAY_INT( cdReadTime ); - } -
- // autopause cdda
- if ((cdr.Mode & (MODE_AUTOPAUSE|MODE_CDDA)) == (MODE_AUTOPAUSE|MODE_CDDA)) {
- CDRPLAY_INT( cdReadTime );
- }
+ CDRPLAY_INT( cdReadTime );
break; case CdlForward: @@ -1405,7 +1481,7 @@ void cdrReadInterrupt() { return; if (cdr.Irq || cdr.Stat) { - CDREAD_INT(0x800); + CDREAD_INT(0x100); return; } @@ -1663,12 +1739,6 @@ void cdrWrite1(unsigned char rt) { memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 ); - // Tomb Raider 2 - new game
- // - no set_track (seekp - getlocp interfere)
- //Set_Track();
- Find_CurTrack();
-
-
/* if ((cdr.SetSector[0] | cdr.SetSector[1] | cdr.SetSector[2]) == 0) { *(u32 *)cdr.SetSector = *(u32 *)cdr.SetSectorSeek; @@ -1889,12 +1959,21 @@ void cdrWrite1(unsigned char rt) { cdr.Ctrl |= 0x80; cdr.Stat = NoIntr; AddIrqQueue(cdr.Cmd, 0x800); +
+ StopCdda();
+ StopReading();
+
break; case CdlSeekP: // ((u32 *)cdr.SetSectorSeek)[0] = ((u32 *)cdr.SetSector)[0]; cdr.Ctrl |= 0x80; cdr.Stat = NoIntr; +
+ // Tomb Raider 2 - reset cdda
+ StopCdda();
+ StopReading();
+
AddIrqQueue(cdr.Cmd, 0x800); break; @@ -2213,31 +2292,11 @@ int cdrFreeze(gzFile f, int Mode) { if( Mode == 0 ) {
StopCdda();
}
- if( Mode == 1 ) {
- // get restart time
- if( cdr.Play && CDR_getStatus(&stat) != -1 ) {
- cdr.SetSectorPlay[0] = stat.Time[0];
- cdr.SetSectorPlay[1] = stat.Time[1];
- cdr.SetSectorPlay[2] = stat.Time[2];
- }
- }
gzfreeze(&cdr, sizeof(cdr)); - if( Mode == 0 ) {
- // resume cdda
- if( cdr.Play ) {
- Set_Track();
- Find_CurTrack();
- ReadTrack( cdr.SetSectorPlay );
-
- CDR_play( cdr.SetSectorPlay );
- }
- }
-
-
if (Mode == 1) tmp = cdr.pTransfer - cdr.Transfer; diff --git a/libpcsxcore/cdrom.h b/libpcsxcore/cdrom.h index 9b826786..43f5b2fd 100644 --- a/libpcsxcore/cdrom.h +++ b/libpcsxcore/cdrom.h @@ -103,7 +103,6 @@ void cdrDecodedBufferInterrupt(); void cdrReset(); void cdrInterrupt(); void cdrReadInterrupt(); -void cdrRepplayInterrupt();
void cdrLidSeekInterrupt();
void cdrPlayInterrupt();
unsigned char cdrRead0(void); diff --git a/libpcsxcore/r3000a.c b/libpcsxcore/r3000a.c index d0f59c4b..bcae44ef 100644 --- a/libpcsxcore/r3000a.c +++ b/libpcsxcore/r3000a.c @@ -194,10 +194,10 @@ void psxBranchTest() { }
}
- if (psxRegs.interrupt & (1 << PSXINT_CDREPPLAY)) { // cdr report play
- if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDREPPLAY].sCycle) >= psxRegs.intCycle[PSXINT_CDREPPLAY].cycle) {
- psxRegs.interrupt &= ~(1 << PSXINT_CDREPPLAY);
- cdrRepplayInterrupt();
+ if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY)) { // cdr play timing
+ if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDRPLAY].sCycle) >= psxRegs.intCycle[PSXINT_CDRPLAY].cycle) {
+ psxRegs.interrupt &= ~(1 << PSXINT_CDRPLAY);
+ cdrPlayInterrupt();
}
}
@@ -214,13 +214,6 @@ void psxBranchTest() { cdrLidSeekInterrupt();
}
}
-
- if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY)) { // cdr play timing
- if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDRPLAY].sCycle) >= psxRegs.intCycle[PSXINT_CDRPLAY].cycle) {
- psxRegs.interrupt &= ~(1 << PSXINT_CDRPLAY);
- cdrPlayInterrupt();
- }
- }
} } diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h index ad368800..8d5fd618 100644 --- a/libpcsxcore/r3000a.h +++ b/libpcsxcore/r3000a.h @@ -155,7 +155,7 @@ enum { PSXINT_MDECINDMA, PSXINT_GPUOTCDMA, PSXINT_CDRDMA, - PSXINT_CDREPPLAY, + DUMMY1, PSXINT_CDRDBUF, PSXINT_CDRLID, PSXINT_CDRPLAY |
