- if (cdr.Seeked != SEEK_DONE) {
- cdr.StatP |= STATUS_SEEK;
- cdr.StatP &= ~STATUS_READ;
-
- // Crusaders of Might and Magic - use short time
- // - fix cutscene speech (startup)
-
- // ??? - use more accurate seek time later
- CDREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1) + seekTime);
- } else {
- cdr.StatP |= STATUS_READ;
- cdr.StatP &= ~STATUS_SEEK;
-
- CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1);
- }
+ /*
+ By nicolasnoble from PCSX Redux :
+ "It LOOKS like this logic is wrong, therefore disabling it with `&& false` for now.
+ For "PoPoLoCrois Monogatari II", the game logic will soft lock and will never issue GetLocP to detect
+ the end of its XA streams, as it seems to assume ReadS will not return a status byte with the SEEK
+ flag set. I think the reasonning is that since it's invalid to call GetLocP while seeking, the game
+ tries to protect itself against errors by preventing from issuing a GetLocP while it knows the
+ last status was "seek". But this makes the logic just softlock as it'll never get a notification
+ about the fact the drive is done seeking and the read actually started.
+ In other words, this state machine here is probably wrong in assuming the response to ReadS/ReadN is
+ done right away. It's rather when it's done seeking, and the read has actually started. This probably
+ requires a bit more work to make sure seek delays are processed properly.
+ Checked with a few games, this seems to work fine."
+
+ Gameblabla additional notes :
+ This still needs the "+ seekTime" that PCSX Redux doesn't have for the Driver "retry" mission error.
+ */
+ cdr.StatP |= STATUS_READ;
+ cdr.StatP &= ~STATUS_SEEK;
+ CDREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime);