}
// cdrPlaySeekReadInterrupt
-#define CDRPLAYSEEKREAD_INT(eCycle) { \
+#define CDRPLAYSEEKREAD_INT(eCycle, isFirst) { \
+ u32 e_ = eCycle; \
psxRegs.interrupt |= (1 << PSXINT_CDREAD); \
- psxRegs.intCycle[PSXINT_CDREAD].cycle = eCycle; \
- psxRegs.intCycle[PSXINT_CDREAD].sCycle = psxRegs.cycle; \
- new_dyna_set_event(PSXINT_CDREAD, eCycle); \
+ if (isFirst) \
+ psxRegs.intCycle[PSXINT_CDREAD].sCycle = psxRegs.cycle; \
+ else \
+ psxRegs.intCycle[PSXINT_CDREAD].sCycle += psxRegs.intCycle[PSXINT_CDREAD].cycle; \
+ psxRegs.intCycle[PSXINT_CDREAD].cycle = e_; \
+ new_dyna_set_event_abs(PSXINT_CDREAD, psxRegs.intCycle[PSXINT_CDREAD].sCycle + e_); \
}
// cdrLidSeekInterrupt
if (!cdr.Play && (cdr.StatP & STATUS_SEEK)) {
if (cdr.Stat) {
CDR_LOG_I("cdrom: seek stat hack\n");
- CDRPLAYSEEKREAD_INT(0x1000);
+ CDRPLAYSEEKREAD_INT(0x1000, 1);
return;
}
SetResultSize(1);
}
}
- CDRPLAYSEEKREAD_INT(cdReadTime);
+ CDRPLAYSEEKREAD_INT(cdReadTime, 0);
// update for CdlGetlocP/autopause
generate_subq(cdr.SetSectorPlay);
// BIOS player - set flag again
cdr.Play = TRUE;
- CDRPLAYSEEKREAD_INT(cdReadTime + seekTime);
+ CDRPLAYSEEKREAD_INT(cdReadTime + seekTime, 1);
start_rotating = 1;
break;
Rockman X5 = 0.5-4x
- fix capcom logo
*/
- CDRPLAYSEEKREAD_INT(cdReadTime + seekTime);
+ CDRPLAYSEEKREAD_INT(cdReadTime + seekTime, 1);
start_rotating = 1;
break;
// - fixes new game
ReadTrack(cdr.SetSectorPlay);
- CDRPLAYSEEKREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime);
+ CDRPLAYSEEKREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime, 1);
SetPlaySeekRead(cdr.StatP, STATUS_SEEK);
start_rotating = 1;
if (cdr.Irq || cdr.Stat) {
CDR_LOG_I("cdrom: read stat hack %02x %x\n", cdr.Irq, cdr.Stat);
- CDRPLAYSEEKREAD_INT(2048);
+ CDRPLAYSEEKREAD_INT(2048, 1);
return;
}
cdr.Readed = 0;
- CDRPLAYSEEKREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime);
+ CDRPLAYSEEKREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime, 0);
/*
Croc 2: $40 - only FORM1 (*)
if (!Config.Cdda)
CDR_play(cdr.SetSectorPlay);
if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY_OLD))
- CDRPLAYSEEKREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime);
+ CDRPLAYSEEKREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime, 1);
}
if ((cdr.freeze_ver & 0xffffff00) != 0x63647200) {
void new_dyna_after_save(void);
void new_dyna_freeze(void *f, int mode);
-#define new_dyna_set_event(e, c) { \
- s32 c_ = c; \
- u32 abs_ = psxRegs.cycle + c_; \
- s32 odi_ = next_interupt - psxRegs.cycle; \
+#define new_dyna_set_event_abs(e, abs) { \
+ u32 abs_ = abs; \
+ s32 di_ = next_interupt - abs_; \
event_cycles[e] = abs_; \
- if (c_ < odi_) { \
- /*printf("%u: next_interupt %d -> %d (%u)\n", psxRegs.cycle, odi_, c_, abs_);*/ \
+ if (di_ > 0) { \
+ /*printf("%u: next_interupt %u -> %u\n", psxRegs.cycle, next_interupt, abs_);*/ \
next_interupt = abs_; \
} \
}
+#define new_dyna_set_event(e, c) \
+ new_dyna_set_event_abs(e, psxRegs.cycle + (c))
+
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define _i32(x) *(s32 *)&x