diff options
| author | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-10-30 14:32:00 +0000 |
|---|---|---|
| committer | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-10-30 14:32:00 +0000 |
| commit | e457712509039b896e3ffd260d32180cf775e7f9 (patch) | |
| tree | 6b386aab13630f3c0afc191d232a3d5ec9ba6194 | |
| parent | 04178b2492cd548a7f4c6f38877e0a3e901b591f (diff) | |
| download | pcsxr-e457712509039b896e3ffd260d32180cf775e7f9.tar.gz | |
Wild 9, Rockman X3, Twisted Metal 2: cdrom.c
- Start cdda playback at official track start when possible + report correct SubQ time at start
- Fixes many games with music problems, choppy cdda play
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@58926 e17a0e51-4ae3-4d35-97c3-1a29b211df97
| -rw-r--r-- | libpcsxcore/cdrom.c | 74 |
1 files changed, 58 insertions, 16 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 54339a01..c5010537 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -154,13 +154,13 @@ void Find_CurTrack() { #ifdef CDR_LOG___0 CDR_LOG( "curtrack %d %d %d | %d %d %d | %d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2], - cdr.ResultTD[0], cdr.ResultTD[1], cdr.ResultTD[2], + cdr.ResultTD[2], cdr.ResultTD[1], cdr.ResultTD[0], cdr.CurTrack ); #endif - // find next track boundary - sect1 = cdr.SetSectorPlay[0] * 60 * 75 + cdr.SetSectorPlay[1] * 75 + cdr.SetSectorPlay[2]; - sect2 = cdr.ResultTD[2] * 60 * 75 + cdr.ResultTD[1] * 75 + cdr.ResultTD[0]; + // find next track boundary - only need m:s accuracy
+ sect1 = cdr.SetSectorPlay[0] * 60 * 75 + cdr.SetSectorPlay[1] * 75;
+ sect2 = cdr.ResultTD[2] * 60 * 75 + cdr.ResultTD[1] * 75;
if( sect1 >= sect2 ) { cdr.CurTrack++; continue; @@ -172,10 +172,10 @@ void Find_CurTrack() { } } -static void ReadTrack() { - cdr.Prev[0] = itob(cdr.SetSector[0]); - cdr.Prev[1] = itob(cdr.SetSector[1]); - cdr.Prev[2] = itob(cdr.SetSector[2]); +static void ReadTrack( u8 *time ) { + cdr.Prev[0] = itob( time[0] );
+ cdr.Prev[1] = itob( time[1] );
+ cdr.Prev[2] = itob( time[2] );
#ifdef CDR_LOG CDR_LOG("ReadTrack() Log: KEY *** %x:%x:%x\n", cdr.Prev[0], cdr.Prev[1], cdr.Prev[2]); @@ -200,6 +200,39 @@ void AddIrqQueue(unsigned char irq, unsigned long ecycle) { CDR_INT(ecycle);
} +
+void Set_Track()
+{
+ if (CDR_getTN(cdr.ResultTN) != -1) {
+ int lcv;
+
+ for( lcv = 1; lcv < cdr.ResultTN[1]; lcv++ ) {
+ if (CDR_getTD((u8)(lcv), cdr.ResultTD) != -1) {
+#ifdef CDR_LOG___0
+ CDR_LOG( "settrack %d %d %d | %d %d %d | %d\n",
+ cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2],
+ cdr.ResultTD[2], cdr.ResultTD[1], cdr.ResultTD[0],
+ cdr.CurTrack );
+#endif
+
+ // check if time matches track start (only need min, sec accuracy)
+ // - m:s:f vs f:s:m
+ if( cdr.SetSectorPlay[0] == cdr.ResultTD[2] &&
+ cdr.SetSectorPlay[1] == cdr.ResultTD[1] ) {
+ // skip pregap frames
+ if( cdr.SetSectorPlay[2] < cdr.ResultTD[0] )
+ cdr.SetSectorPlay[2] = cdr.ResultTD[0];
+
+ break;
+ }
+ else if( cdr.SetSectorPlay[0] < cdr.ResultTD[2] )
+ break;
+ }
+ }
+ }
+}
+
+
void cdrRepplayInterrupt() { // Wait for IRQ to be acknowledged @@ -280,12 +313,10 @@ void cdrRepplayInterrupt() // Wild 9: Do not use REPPLAY_ACK - // - must use faster times for reporting - CDREPPLAY_INT(cdReadTime / 2); + CDREPPLAY_INT(cdReadTime); psxHu32ref(0x1070) |= SWAP32((u32)0x4); - psxRegs.interrupt |= 0x80000000; } void cdrInterrupt() { @@ -631,7 +662,7 @@ void cdrInterrupt() { cdr.Seeked = TRUE;
// Tomb Raider 2: must update read cursor for getlocp - ReadTrack(); + ReadTrack( cdr.SetSectorPlay );
break; case CdlTest: @@ -841,7 +872,7 @@ void cdrReadInterrupt() { cdr.StatP &= ~0x40; cdr.Result[0] = cdr.StatP; - ReadTrack(); + ReadTrack( cdr.SetSector );
buf = CDR_getBuffer(); if (buf == NULL) @@ -1080,9 +1111,20 @@ void cdrWrite1(unsigned char rt) { break; case CdlPlay: - // Rayman: detect track changes - Find_CurTrack(); - + /*
+ Rayman: detect track changes
+ - fixes logo freeze
+
+ Twisted Metal 2: skip PREGAP + starting accurate SubQ
+ - plays tracks without retry play
+
+ Wild 9: skip PREGAP + starting accurate SubQ
+ - plays tracks without retry play
+ */
+ Set_Track();
+ Find_CurTrack();
+ ReadTrack( cdr.SetSectorPlay );
+
// GameShark CD Player: Calls 2x + Play 2x if( cdr.FastBackward || cdr.FastForward ) { |
