SetPlaySeekRead(cdr.StatP, 0);
cdr.LocL[0] = LOCL_INVALID;
cdr.Muted = FALSE;
- cdr.Mode = 0x20; /* This fixes This is Football 2, Pooh's Party lockups */
+ cdr.Mode = MODE_SIZE_2340; /* This fixes This is Football 2, Pooh's Party lockups */
second_resp_time = not_ready ? 70000 : 4100000;
start_rotating = 1;
break;
cdr.LocL[0] = LOCL_INVALID;
cdr.SubqForwardSectors = 1;
- cycles = (cdr.Mode & 0x80) ? cdReadTime : cdReadTime * 2;
+ cycles = (cdr.Mode & MODE_SPEED) ? cdReadTime : cdReadTime * 2;
cycles += seekTime;
if (Config.hacks.cdr_read_timing)
cycles = cdrAlignTimingHack(cycles);
break; // transfer
case 1:
if (cdr.Stat & rt) {
+ u32 nextCycle = psxRegs.intCycle[PSXINT_CDR].sCycle
+ + psxRegs.intCycle[PSXINT_CDR].cycle;
#ifdef CDR_LOG_CMD_IRQ
- SysPrintf("%u cdrom: ack %02x (w %02x)\n",
- psxRegs.cycle, cdr.Stat & rt, rt);
+ SysPrintf("%u cdrom: ack %02x (w=%02x p=%d,%d)\n",
+ psxRegs.cycle, cdr.Stat & rt, rt,
+ !!(psxRegs.interrupt & (1 << PSXINT_CDR)),
+ nextCycle - psxRegs.cycle);
#endif
- // note: Croc vs Discworld Noir
+ // note: Croc, Shadow Tower (more) vs Discworld Noir (<993)
if (!(psxRegs.interrupt & (1 << PSXINT_CDR)) &&
(cdr.CmdInProgress || cdr.Irq1Pending))
- CDR_INT(850); // 711-993
+ {
+ s32 c = 2048 - (psxRegs.cycle - nextCycle);
+ c = MAX_VALUE(c, 512);
+ CDR_INT(c);
+ }
}
cdr.Stat &= ~rt;
CDR_LOG("cdrom: FifoOffset(2) %d/%d\n", cdr.FifoOffset, cdr.FifoSize);
}
else if (rt & 0x80) {
- switch (cdr.Mode & 0x30) {
+ switch (cdr.Mode & (MODE_SIZE_2328|MODE_SIZE_2340)) {
case MODE_SIZE_2328:
case 0x00:
cdr.FifoOffset = 12;
getCdInfo();
cdr.FifoOffset = tmp < DATA_SIZE ? tmp : DATA_SIZE;
- cdr.FifoSize = (cdr.Mode & 0x20) ? 2340 : 2048 + 12;
+ cdr.FifoSize = (cdr.Mode & MODE_SIZE_2340) ? 2340 : 2048 + 12;
if (cdr.SubqForwardSectors > SUBQ_FORWARD_SECTORS)
cdr.SubqForwardSectors = SUBQ_FORWARD_SECTORS;
if (!Config.Cdda)
CDR_play(cdr.SetSectorPlay);
if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY_OLD))
- CDRPLAYREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime, 1);
+ CDRPLAYREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime, 1);
}
if ((cdr.freeze_ver & 0xffffff00) != 0x63647200) {