cdrom: try different seek timing
authornotaz <notasas@gmail.com>
Mon, 20 Jan 2025 01:06:41 +0000 (03:06 +0200)
committernotaz <notasas@gmail.com>
Wed, 22 Jan 2025 02:36:06 +0000 (04:36 +0200)
unclear if it's better, might need to revert

libpcsxcore/cdrom.c

index 6874816..d0e2d4c 100644 (file)
@@ -580,18 +580,26 @@ static boolean canDoTurbo(void)
 
 static int cdrSeekTime(unsigned char *target)
 {
-       int diff = msf2sec(cdr.SetSectorPlay) - msf2sec(target);
-       int seekTime = abs(diff) * (cdReadTime / 2000);
+       int diff = abs((int)msf2sec(cdr.SetSectorPlay) - (int)msf2sec(target));
+       int seekTime = diff * (cdReadTime / 2000);
        int cyclesSinceRS = psxRegs.cycle - cdr.LastReadSeekCycles;
        seekTime = MAX_VALUE(seekTime, 20000);
 
+       // sled seek?
+       if (diff >= 7200)
+               seekTime = PSXCLK / 7 + diff * 64;
+       // add *something* as rotation time until the target sector
+       if (cyclesSinceRS >= cdReadTime)
+               seekTime += (8 - ((cyclesSinceRS >> 18) & 7)) * (cdReadTime / 2);
+
        // Transformers Beast Wars Transmetals does Setloc(x),SeekL,Setloc(x),ReadN
        // and then wants some slack time
        if (cdr.DriveState == DRIVESTATE_PAUSED || cyclesSinceRS < cdReadTime *3/2)
                seekTime += cdReadTime;
 
-       seekTime = MIN_VALUE(seekTime, PSXCLK * 2 / 3);
-       CDR_LOG("seek: %.2f %.2f (%.2f) st %d di %d\n", (float)seekTime / PSXCLK,
+       //seekTime = MIN_VALUE(seekTime, PSXCLK * 2 / 3);
+       CDR_LOG("seek: %02d:%02d:%02d %.2f %.2f (%.2f) st %d di %d\n",
+               target[0], target[1], target[2], (float)seekTime / PSXCLK,
                (float)seekTime / cdReadTime, (float)cyclesSinceRS / cdReadTime,
                cdr.DriveState, diff);
        return seekTime;