From d9a0249331e3f0da8820e158baaafa69e3a534ac Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 2 Sep 2022 23:13:44 +0300 Subject: [PATCH] cdrom: get rid of cdrPlayInterrupt unify with cdrReadInterrupt and name it cdrPlaySeekReadInterrupt ... althoug these are not actually interrupts, more like events, but keep this weird PCSX's naming convention --- libpcsxcore/cdrom.c | 60 ++++++++++++++++---------------- libpcsxcore/cdrom.h | 12 +++---- libpcsxcore/new_dynarec/emu_if.c | 8 +++-- libpcsxcore/r3000a.c | 8 +---- libpcsxcore/r3000a.h | 2 +- 5 files changed, 43 insertions(+), 47 deletions(-) diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 5dfa658d..2b30e89d 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -241,8 +241,8 @@ static void sec2msf(unsigned int s, u8 *msf) { 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; \ @@ -257,14 +257,6 @@ static void sec2msf(unsigned int s, u8 *msf) { 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); \ @@ -307,7 +299,7 @@ static void setIrq(int log_cmd) // 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: @@ -584,18 +576,24 @@ static int cdrSeekTime(unsigned char *target) return seekTime; } -// 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"); - CDRSEEKPLAY_INT(0x1000); + CDRPLAYSEEKREAD_INT(0x1000); 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; @@ -605,6 +603,7 @@ void cdrPlayInterrupt() Find_CurTrack(cdr.SetSectorPlay); ReadTrack(cdr.SetSectorPlay); cdr.TrackChanged = FALSE; + return; } if (!cdr.Play) return; @@ -612,6 +611,7 @@ void cdrPlayInterrupt() 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); @@ -640,13 +640,13 @@ void cdrPlayInterrupt() } } - CDRSEEKPLAY_INT(cdReadTime); + CDRPLAYSEEKREAD_INT(cdReadTime); // update for CdlGetlocP/autopause generate_subq(cdr.SetSectorPlay); } -void cdrInterrupt() { +void cdrInterrupt(void) { u16 Irq = cdr.Irq; int no_busy_error = 0; int start_rotating = 0; @@ -765,7 +765,7 @@ void cdrInterrupt() { // BIOS player - set flag again cdr.Play = TRUE; - CDRSEEKPLAY_INT(cdReadTime + seekTime); + CDRPLAYSEEKREAD_INT(cdReadTime + seekTime); start_rotating = 1; break; @@ -973,7 +973,7 @@ void cdrInterrupt() { Rockman X5 = 0.5-4x - fix capcom logo */ - CDRSEEKPLAY_INT(cdReadTime + seekTime); + CDRPLAYSEEKREAD_INT(cdReadTime + seekTime); start_rotating = 1; break; @@ -1103,7 +1103,7 @@ void cdrInterrupt() { 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; @@ -1193,15 +1193,13 @@ void cdrAttenuate(s16 *buf, int samples, int stereo) } } -void cdrReadInterrupt() { +static void cdrReadInterrupt(void) +{ u8 *buf; - if (!cdr.Reading) - return; - if (cdr.Irq || cdr.Stat) { CDR_LOG_I("cdrom: read stat hack %02x %x\n", cdr.Irq, cdr.Stat); - CDREAD_INT(2048); + CDRPLAYSEEKREAD_INT(2048); return; } @@ -1221,7 +1219,7 @@ void cdrReadInterrupt() { memset(cdr.Transfer, 0, DATA_SIZE); cdr.Stat = DiskError; cdr.Result[0] |= STATUS_ERROR; - CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); + setIrq(0x205); return; } @@ -1268,7 +1266,7 @@ void cdrReadInterrupt() { cdr.Readed = 0; - CDREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime); + CDRPLAYSEEKREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime); /* Croc 2: $40 - only FORM1 (*) @@ -1544,7 +1542,7 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { DMA_INTERRUPT(3); } -void cdrDmaInterrupt() +void cdrDmaInterrupt(void) { if (HW_DMA3_CHCR & SWAP32(0x01000000)) { @@ -1620,6 +1618,8 @@ int cdrFreeze(void *f, int Mode) { 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) { @@ -1640,7 +1640,7 @@ int cdrFreeze(void *f, int Mode) { return 0; } -void LidInterrupt() { +void LidInterrupt(void) { getCdInfo(); cdrLidSeekInterrupt(); } diff --git a/libpcsxcore/cdrom.h b/libpcsxcore/cdrom.h index e12c39aa..0cd6c5f6 100644 --- a/libpcsxcore/cdrom.h +++ b/libpcsxcore/cdrom.h @@ -48,13 +48,11 @@ extern "C" { 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); diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c index cc0bcdf1..bf64e0f0 100644 --- a/libpcsxcore/new_dynarec/emu_if.c +++ b/libpcsxcore/new_dynarec/emu_if.c @@ -46,12 +46,16 @@ static void schedule_timeslice(void) next_interupt = c + min; } +static void unusedInterrupt() +{ +} + 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, @@ -59,7 +63,7 @@ static irq_func * const irq_funcs[] = { [PSXINT_GPUOTCDMA] = gpuotcInterrupt, [PSXINT_CDRDMA] = cdrDmaInterrupt, [PSXINT_CDRLID] = cdrLidSeekInterrupt, - [PSXINT_CDRPLAY] = cdrPlayInterrupt, + [PSXINT_CDRPLAY_OLD] = unusedInterrupt, [PSXINT_SPU_UPDATE] = spuUpdate, [PSXINT_RCNT] = psxRcntUpdate, }; diff --git a/libpcsxcore/r3000a.c b/libpcsxcore/r3000a.c index 7e6f16b4..a9b800e3 100644 --- a/libpcsxcore/r3000a.c +++ b/libpcsxcore/r3000a.c @@ -139,7 +139,7 @@ void psxBranchTest() { 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); - cdrReadInterrupt(); + cdrPlaySeekReadInterrupt(); } } if (psxRegs.interrupt & (1 << PSXINT_GPUDMA)) { // gpu dma @@ -178,12 +178,6 @@ void psxBranchTest() { cdrDmaInterrupt(); } } - 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); diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h index 7d8e260c..ea6f0e75 100644 --- a/libpcsxcore/r3000a.h +++ b/libpcsxcore/r3000a.h @@ -164,7 +164,7 @@ enum { PSXINT_NEWDRC_CHECK, PSXINT_RCNT, PSXINT_CDRLID, - PSXINT_CDRPLAY, + PSXINT_CDRPLAY_OLD, /* unused */ PSXINT_SPU_UPDATE, PSXINT_COUNT }; -- 2.39.5