From: notaz Date: Wed, 25 Oct 2023 21:47:50 +0000 (+0300) Subject: cdrom: try some different seek times X-Git-Tag: r24l~98 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=26d28fa4c30a23da7507ae226508103a470edc26;p=pcsx_rearmed.git cdrom: try some different seek times libretro/pcsx_rearmed#781 libretro/pcsx_rearmed#150 --- diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index bc973e90..fd09c7ef 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -448,11 +448,11 @@ static int ReadTrack(const u8 *time) tmp[1] = itob(time[1]); tmp[2] = itob(time[2]); + CDR_LOG("ReadTrack *** %02x:%02x:%02x\n", tmp[0], tmp[1], tmp[2]); + if (memcmp(cdr.Prev, tmp, 3) == 0) return 1; - CDR_LOG("ReadTrack *** %02x:%02x:%02x\n", tmp[0], tmp[1], tmp[2]); - read_ok = CDR_readTrack(tmp); if (read_ok) memcpy(cdr.Prev, tmp, 3); @@ -560,14 +560,21 @@ static int cdrSeekTime(unsigned char *target) { int diff = msf2sec(cdr.SetSectorPlay) - msf2sec(target); int seekTime = abs(diff) * (cdReadTime / 2000); + int cyclesSinceRS = psxRegs.cycle - cdr.LastReadSeekCycles; seekTime = MAX_VALUE(seekTime, 20000); // need this stupidly long penalty or else Spyro2 intro desyncs - if ((s32)(psxRegs.cycle - cdr.LastReadSeekCycles) > cdReadTime * 8) + // note: if misapplied this breaks MGS cutscenes among other things + if (cyclesSinceRS > cdReadTime * 50) seekTime += cdReadTime * 25; + // Transformers Beast Wars Transmetals does Setloc(x),SeekL,Setloc(x),ReadN + // and then wants some slack time + else if (cyclesSinceRS < cdReadTime *3/2) + seekTime += cdReadTime; seekTime = MIN_VALUE(seekTime, PSXCLK * 2 / 3); - CDR_LOG("seek: %.2f %.2f\n", (float)seekTime / PSXCLK, (float)seekTime / cdReadTime); + CDR_LOG("seek: %.2f %.2f (%.2f)\n", (float)seekTime / PSXCLK, + (float)seekTime / cdReadTime, (float)cyclesSinceRS / cdReadTime); return seekTime; } @@ -1191,11 +1198,11 @@ void cdrInterrupt(void) { // FALLTHROUGH set_error: - CDR_LOG_I("cmd %02x error %02x\n", Cmd, error); SetResultSize(2); cdr.Result[0] = cdr.StatP | STATUS_ERROR; cdr.Result[1] = not_ready ? ERROR_NOTREADY : error; cdr.Stat = DiskError; + CDR_LOG_I("cmd %02x error %02x\n", Cmd, cdr.Result[1]); break; }