unify with cdrReadInterrupt and name it cdrPlaySeekReadInterrupt
... althoug these are not actually interrupts, more like events,
but keep this weird PCSX's naming convention
new_dyna_set_event(PSXINT_CDR, eCycle); \
}
new_dyna_set_event(PSXINT_CDR, eCycle); \
}
-// cdrReadInterrupt
-#define CDREAD_INT(eCycle) { \
+// cdrPlaySeekReadInterrupt
+#define CDRPLAYSEEKREAD_INT(eCycle) { \
psxRegs.interrupt |= (1 << PSXINT_CDREAD); \
psxRegs.intCycle[PSXINT_CDREAD].cycle = eCycle; \
psxRegs.intCycle[PSXINT_CDREAD].sCycle = psxRegs.cycle; \
psxRegs.interrupt |= (1 << PSXINT_CDREAD); \
psxRegs.intCycle[PSXINT_CDREAD].cycle = eCycle; \
psxRegs.intCycle[PSXINT_CDREAD].sCycle = psxRegs.cycle; \
new_dyna_set_event(PSXINT_CDRLID, eCycle); \
}
new_dyna_set_event(PSXINT_CDRLID, eCycle); \
}
-// cdrPlayInterrupt
-#define CDRSEEKPLAY_INT(eCycle) { \
- psxRegs.interrupt |= (1 << PSXINT_CDRPLAY); \
- psxRegs.intCycle[PSXINT_CDRPLAY].cycle = eCycle; \
- psxRegs.intCycle[PSXINT_CDRPLAY].sCycle = psxRegs.cycle; \
- new_dyna_set_event(PSXINT_CDRPLAY, eCycle); \
-}
-
#define StopReading() { \
cdr.Reading = 0; \
psxRegs.interrupt &= ~(1 << PSXINT_CDREAD); \
#define StopReading() { \
cdr.Reading = 0; \
psxRegs.interrupt &= ~(1 << PSXINT_CDREAD); \
// timing used in this function was taken from tests on real hardware
// (yes it's slow, but you probably don't want to modify it)
// timing used in this function was taken from tests on real hardware
// (yes it's slow, but you probably don't want to modify it)
-void cdrLidSeekInterrupt()
+void cdrLidSeekInterrupt(void)
{
switch (cdr.DriveState) {
default:
{
switch (cdr.DriveState) {
default:
-// also handles seek
-void cdrPlayInterrupt()
+static void cdrReadInterrupt(void);
+
+void cdrPlaySeekReadInterrupt(void)
- if (cdr.StatP & STATUS_SEEK) {
+ if (cdr.Reading) {
+ cdrReadInterrupt();
+ return;
+ }
+
+ if (!cdr.Play && (cdr.StatP & STATUS_SEEK)) {
if (cdr.Stat) {
CDR_LOG_I("cdrom: seek stat hack\n");
if (cdr.Stat) {
CDR_LOG_I("cdrom: seek stat hack\n");
- CDRSEEKPLAY_INT(0x1000);
+ CDRPLAYSEEKREAD_INT(0x1000);
return;
}
SetResultSize(1);
cdr.StatP |= STATUS_ROTATING;
return;
}
SetResultSize(1);
cdr.StatP |= STATUS_ROTATING;
- SetPlaySeekRead(cdr.StatP, cdr.Play ? STATUS_PLAY : 0);
+ SetPlaySeekRead(cdr.StatP, 0);
cdr.Result[0] = cdr.StatP;
if (cdr.Irq == 0) {
cdr.Stat = Complete;
cdr.Result[0] = cdr.StatP;
if (cdr.Irq == 0) {
cdr.Stat = Complete;
Find_CurTrack(cdr.SetSectorPlay);
ReadTrack(cdr.SetSectorPlay);
cdr.TrackChanged = FALSE;
Find_CurTrack(cdr.SetSectorPlay);
ReadTrack(cdr.SetSectorPlay);
cdr.TrackChanged = FALSE;
CDR_LOG( "CDDA - %d:%d:%d\n",
cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] );
CDR_LOG( "CDDA - %d:%d:%d\n",
cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] );
+ SetPlaySeekRead(cdr.StatP, STATUS_PLAY);
if (memcmp(cdr.SetSectorPlay, cdr.SetSectorEnd, 3) == 0) {
StopCdda();
SetPlaySeekRead(cdr.StatP, 0);
if (memcmp(cdr.SetSectorPlay, cdr.SetSectorEnd, 3) == 0) {
StopCdda();
SetPlaySeekRead(cdr.StatP, 0);
- CDRSEEKPLAY_INT(cdReadTime);
+ CDRPLAYSEEKREAD_INT(cdReadTime);
// update for CdlGetlocP/autopause
generate_subq(cdr.SetSectorPlay);
}
// update for CdlGetlocP/autopause
generate_subq(cdr.SetSectorPlay);
}
+void cdrInterrupt(void) {
u16 Irq = cdr.Irq;
int no_busy_error = 0;
int start_rotating = 0;
u16 Irq = cdr.Irq;
int no_busy_error = 0;
int start_rotating = 0;
// BIOS player - set flag again
cdr.Play = TRUE;
// BIOS player - set flag again
cdr.Play = TRUE;
- CDRSEEKPLAY_INT(cdReadTime + seekTime);
+ CDRPLAYSEEKREAD_INT(cdReadTime + seekTime);
start_rotating = 1;
break;
start_rotating = 1;
break;
Rockman X5 = 0.5-4x
- fix capcom logo
*/
Rockman X5 = 0.5-4x
- fix capcom logo
*/
- CDRSEEKPLAY_INT(cdReadTime + seekTime);
+ CDRPLAYSEEKREAD_INT(cdReadTime + seekTime);
start_rotating = 1;
break;
start_rotating = 1;
break;
Gameblabla additional notes :
This still needs the "+ seekTime" that PCSX Redux doesn't have for the Driver "retry" mission error.
*/
Gameblabla additional notes :
This still needs the "+ seekTime" that PCSX Redux doesn't have for the Driver "retry" mission error.
*/
- CDREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime);
+ CDRPLAYSEEKREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime);
SetPlaySeekRead(cdr.StatP, STATUS_SEEK);
start_rotating = 1;
SetPlaySeekRead(cdr.StatP, STATUS_SEEK);
start_rotating = 1;
-void cdrReadInterrupt() {
+static void cdrReadInterrupt(void)
+{
- if (!cdr.Reading)
- return;
-
if (cdr.Irq || cdr.Stat) {
CDR_LOG_I("cdrom: read stat hack %02x %x\n", cdr.Irq, cdr.Stat);
if (cdr.Irq || cdr.Stat) {
CDR_LOG_I("cdrom: read stat hack %02x %x\n", cdr.Irq, cdr.Stat);
+ CDRPLAYSEEKREAD_INT(2048);
memset(cdr.Transfer, 0, DATA_SIZE);
cdr.Stat = DiskError;
cdr.Result[0] |= STATUS_ERROR;
memset(cdr.Transfer, 0, DATA_SIZE);
cdr.Stat = DiskError;
cdr.Result[0] |= STATUS_ERROR;
- CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime);
- CDREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime);
+ CDRPLAYSEEKREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime);
/*
Croc 2: $40 - only FORM1 (*)
/*
Croc 2: $40 - only FORM1 (*)
+void cdrDmaInterrupt(void)
{
if (HW_DMA3_CHCR & SWAP32(0x01000000))
{
{
if (HW_DMA3_CHCR & SWAP32(0x01000000))
{
Find_CurTrack(cdr.SetSectorPlay);
if (!Config.Cdda)
CDR_play(cdr.SetSectorPlay);
Find_CurTrack(cdr.SetSectorPlay);
if (!Config.Cdda)
CDR_play(cdr.SetSectorPlay);
+ if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY_OLD))
+ CDRPLAYSEEKREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime);
}
if ((cdr.freeze_ver & 0xffffff00) != 0x63647200) {
}
if ((cdr.freeze_ver & 0xffffff00) != 0x63647200) {
+void LidInterrupt(void) {
getCdInfo();
cdrLidSeekInterrupt();
}
getCdInfo();
cdrLidSeekInterrupt();
}
void cdrReset();
void cdrAttenuate(s16 *buf, int samples, int stereo);
void cdrReset();
void cdrAttenuate(s16 *buf, int samples, int stereo);
-void cdrInterrupt();
-void cdrReadInterrupt();
-void cdrRepplayInterrupt();
-void cdrLidSeekInterrupt();
-void cdrPlayInterrupt();
-void cdrDmaInterrupt();
-void LidInterrupt();
+void cdrInterrupt(void);
+void cdrPlaySeekReadInterrupt(void);
+void cdrLidSeekInterrupt(void);
+void cdrDmaInterrupt(void);
+void LidInterrupt(void);
unsigned char cdrRead0(void);
unsigned char cdrRead1(void);
unsigned char cdrRead2(void);
unsigned char cdrRead0(void);
unsigned char cdrRead1(void);
unsigned char cdrRead2(void);
next_interupt = c + min;
}
next_interupt = c + min;
}
+static void unusedInterrupt()
+{
+}
+
typedef void (irq_func)();
static irq_func * const irq_funcs[] = {
[PSXINT_SIO] = sioInterrupt,
[PSXINT_CDR] = cdrInterrupt,
typedef void (irq_func)();
static irq_func * const irq_funcs[] = {
[PSXINT_SIO] = sioInterrupt,
[PSXINT_CDR] = cdrInterrupt,
- [PSXINT_CDREAD] = cdrReadInterrupt,
+ [PSXINT_CDREAD] = cdrPlaySeekReadInterrupt,
[PSXINT_GPUDMA] = gpuInterrupt,
[PSXINT_MDECOUTDMA] = mdec1Interrupt,
[PSXINT_SPUDMA] = spuInterrupt,
[PSXINT_GPUDMA] = gpuInterrupt,
[PSXINT_MDECOUTDMA] = mdec1Interrupt,
[PSXINT_SPUDMA] = spuInterrupt,
[PSXINT_GPUOTCDMA] = gpuotcInterrupt,
[PSXINT_CDRDMA] = cdrDmaInterrupt,
[PSXINT_CDRLID] = cdrLidSeekInterrupt,
[PSXINT_GPUOTCDMA] = gpuotcInterrupt,
[PSXINT_CDRDMA] = cdrDmaInterrupt,
[PSXINT_CDRLID] = cdrLidSeekInterrupt,
- [PSXINT_CDRPLAY] = cdrPlayInterrupt,
+ [PSXINT_CDRPLAY_OLD] = unusedInterrupt,
[PSXINT_SPU_UPDATE] = spuUpdate,
[PSXINT_RCNT] = psxRcntUpdate,
};
[PSXINT_SPU_UPDATE] = spuUpdate,
[PSXINT_RCNT] = psxRcntUpdate,
};
if (psxRegs.interrupt & (1 << PSXINT_CDREAD)) { // cdr read
if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDREAD].sCycle) >= psxRegs.intCycle[PSXINT_CDREAD].cycle) {
psxRegs.interrupt &= ~(1 << PSXINT_CDREAD);
if (psxRegs.interrupt & (1 << PSXINT_CDREAD)) { // cdr read
if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDREAD].sCycle) >= psxRegs.intCycle[PSXINT_CDREAD].cycle) {
psxRegs.interrupt &= ~(1 << PSXINT_CDREAD);
+ cdrPlaySeekReadInterrupt();
}
}
if (psxRegs.interrupt & (1 << PSXINT_GPUDMA)) { // gpu dma
}
}
if (psxRegs.interrupt & (1 << PSXINT_GPUDMA)) { // gpu dma
- if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY)) { // cdr play timing
- if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDRPLAY].sCycle) >= psxRegs.intCycle[PSXINT_CDRPLAY].cycle) {
- psxRegs.interrupt &= ~(1 << PSXINT_CDRPLAY);
- cdrPlayInterrupt();
- }
- }
if (psxRegs.interrupt & (1 << PSXINT_CDRLID)) { // cdr lid states
if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDRLID].sCycle) >= psxRegs.intCycle[PSXINT_CDRLID].cycle) {
psxRegs.interrupt &= ~(1 << PSXINT_CDRLID);
if (psxRegs.interrupt & (1 << PSXINT_CDRLID)) { // cdr lid states
if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDRLID].sCycle) >= psxRegs.intCycle[PSXINT_CDRLID].cycle) {
psxRegs.interrupt &= ~(1 << PSXINT_CDRLID);
PSXINT_NEWDRC_CHECK,
PSXINT_RCNT,
PSXINT_CDRLID,
PSXINT_NEWDRC_CHECK,
PSXINT_RCNT,
PSXINT_CDRLID,
+ PSXINT_CDRPLAY_OLD, /* unused */
PSXINT_SPU_UPDATE,
PSXINT_COUNT
};
PSXINT_SPU_UPDATE,
PSXINT_COUNT
};