notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cdrom: try some different seek times
[pcsx_rearmed.git]
/
libpcsxcore
/
cdrom.c
diff --git
a/libpcsxcore/cdrom.c
b/libpcsxcore/cdrom.c
index
2ce7fe9
..
fd09c7e
100644
(file)
--- 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]);
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;
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);
read_ok = CDR_readTrack(tmp);
if (read_ok)
memcpy(cdr.Prev, tmp, 3);
@@
-462,12
+462,13
@@
static int ReadTrack(const u8 *time)
static void UpdateSubq(const u8 *time)
{
const struct SubQ *subq;
static void UpdateSubq(const u8 *time)
{
const struct SubQ *subq;
+ int s = MSF2SECT(time[0], time[1], time[2]);
u16 crc;
u16 crc;
- if (CheckSBI(
time
))
+ if (CheckSBI(
s
))
return;
return;
- subq = (struct SubQ *)CDR_getBufferSub(
MSF2SECT(time[0], time[1], time[2])
);
+ subq = (struct SubQ *)CDR_getBufferSub(
s
);
if (subq != NULL && cdr.CurTrack == 1) {
crc = calcCrc((u8 *)subq + 12, 10);
if (crc == (((u16)subq->CRC[0] << 8) | subq->CRC[1])) {
if (subq != NULL && cdr.CurTrack == 1) {
crc = calcCrc((u8 *)subq + 12, 10);
if (crc == (((u16)subq->CRC[0] << 8) | subq->CRC[1])) {
@@
-559,14
+560,21
@@
static int cdrSeekTime(unsigned char *target)
{
int diff = msf2sec(cdr.SetSectorPlay) - msf2sec(target);
int seekTime = abs(diff) * (cdReadTime / 2000);
{
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
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;
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);
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;
}
return seekTime;
}
@@
-1190,11
+1198,11
@@
void cdrInterrupt(void) {
// FALLTHROUGH
set_error:
// 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;
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;
}
break;
}