X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fcdrom.c;h=3159e90bbd8c475b1a61fdd54a8b4623f66fb103;hb=480e570b6f27909ecdb3f7b2769171b7a7b7f484;hp=e01d7debd1e4b43f09a2510b13e423badb8f8b6b;hpb=8aeb66dcc917d0271e4574799b1793da7f3426c4;p=pcsx_rearmed.git diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index e01d7deb..3159e90b 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -243,8 +243,8 @@ static void sec2msf(unsigned int s, u8 *msf) { new_dyna_set_event(PSXINT_CDR, eCycle); \ } -// cdrPlaySeekReadInterrupt -#define CDRPLAYSEEKREAD_INT(eCycle, isFirst) { \ +// cdrPlayReadInterrupt +#define CDRPLAYREAD_INT(eCycle, isFirst) { \ u32 e_ = eCycle; \ psxRegs.interrupt |= (1 << PSXINT_CDREAD); \ if (isFirst) \ @@ -308,6 +308,8 @@ static void setIrq(int log_cmd) // (yes it's slow, but you probably don't want to modify it) void cdrLidSeekInterrupt(void) { + CDR_LOG_I("%u %s cdr.DriveState=%d\n", psxRegs.cycle, __func__, cdr.DriveState); + switch (cdr.DriveState) { default: case DRIVESTATE_STANDBY: @@ -369,10 +371,14 @@ void cdrLidSeekInterrupt(void) break; case DRIVESTATE_PREPARE_CD: - cdr.StatP |= STATUS_SEEK; - - cdr.DriveState = DRIVESTATE_STANDBY; - CDRLID_INT(cdReadTime * 26); + if (cdr.StatP & STATUS_SEEK) { + SetPlaySeekRead(cdr.StatP, 0); + cdr.DriveState = DRIVESTATE_STANDBY; + } + else { + SetPlaySeekRead(cdr.StatP, STATUS_SEEK); + CDRLID_INT(cdReadTime * 26); + } break; } } @@ -572,32 +578,13 @@ static void cdrReadInterrupt(void); static void cdrPrepCdda(s16 *buf, int samples); static void cdrAttenuate(s16 *buf, int samples, int stereo); -void cdrPlaySeekReadInterrupt(void) +void cdrPlayReadInterrupt(void) { if (cdr.Reading) { cdrReadInterrupt(); return; } - if (!cdr.Play && (cdr.StatP & STATUS_SEEK)) { - if (cdr.Stat) { - CDR_LOG_I("cdrom: seek stat hack\n"); - CDRPLAYSEEKREAD_INT(0x1000, 1); - return; - } - SetResultSize(1); - cdr.StatP |= STATUS_ROTATING; - SetPlaySeekRead(cdr.StatP, 0); - cdr.Result[0] = cdr.StatP; - cdr.Stat = Complete; - setIrq(0x1002); - - Find_CurTrack(cdr.SetSectorPlay); - ReadTrack(cdr.SetSectorPlay); - cdr.TrackChanged = FALSE; - return; - } - if (!cdr.Play) return; CDR_LOG( "CDDA - %d:%d:%d\n", @@ -636,7 +623,7 @@ void cdrPlaySeekReadInterrupt(void) // update for CdlGetlocP/autopause generate_subq(cdr.SetSectorPlay); - CDRPLAYSEEKREAD_INT(cdReadTime, 0); + CDRPLAYREAD_INT(cdReadTime, 0); } #define CMD_PART2 0x100 @@ -687,9 +674,18 @@ void cdrInterrupt(void) { } switch (cdr.DriveState) { + case DRIVESTATE_PREPARE_CD: + if (Cmd > 2) { + // Syphon filter 2 expects commands to work shortly after it sees + // STATUS_ROTATING, so give up trying to emulate the startup seq + cdr.DriveState = DRIVESTATE_STANDBY; + cdr.StatP &= ~STATUS_SEEK; + psxRegs.interrupt &= ~(1 << PSXINT_CDRLID); + break; + } + // fallthrough case DRIVESTATE_LID_OPEN: case DRIVESTATE_RESCAN_CD: - case DRIVESTATE_PREPARE_CD: // no disk or busy with the initial scan, allowed cmds are limited not_ready = CMD_WHILE_NOT_READY; break; @@ -782,7 +778,7 @@ void cdrInterrupt(void) { // BIOS player - set flag again cdr.Play = TRUE; - CDRPLAYSEEKREAD_INT(cdReadTime + seekTime, 1); + CDRPLAYREAD_INT(cdReadTime + seekTime, 1); start_rotating = 1; break; @@ -973,7 +969,7 @@ void cdrInterrupt(void) { case CdlSeekP: StopCdda(); StopReading(); - SetPlaySeekRead(cdr.StatP, STATUS_SEEK); + SetPlaySeekRead(cdr.StatP, STATUS_SEEK | STATUS_ROTATING); seekTime = cdrSeekTime(cdr.SetSector); memcpy(cdr.SetSectorPlay, cdr.SetSector, 4); @@ -990,10 +986,20 @@ void cdrInterrupt(void) { Rockman X5 = 0.5-4x - fix capcom logo */ - CDRPLAYSEEKREAD_INT(cdReadTime + seekTime, 1); + second_resp_time = cdReadTime + seekTime; start_rotating = 1; break; + case CdlSeekL + CMD_PART2: + case CdlSeekP + CMD_PART2: + SetPlaySeekRead(cdr.StatP, 0); + cdr.Stat = Complete; + + Find_CurTrack(cdr.SetSectorPlay); + ReadTrack(cdr.SetSectorPlay); + cdr.TrackChanged = FALSE; + break; + case CdlTest: case CdlTest + CMD_WHILE_NOT_READY: switch (cdr.Param[0]) { @@ -1088,7 +1094,7 @@ void cdrInterrupt(void) { // - fixes new game ReadTrack(cdr.SetSectorPlay); - CDRPLAYSEEKREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime, 1); + CDRPLAYREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime, 1); SetPlaySeekRead(cdr.StatP, STATUS_SEEK); start_rotating = 1; @@ -1282,7 +1288,7 @@ static void cdrReadInterrupt(void) ReadTrack(cdr.SetSectorPlay); } - CDRPLAYSEEKREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime, 0); + CDRPLAYREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime, 0); } /* @@ -1564,9 +1570,15 @@ void cdrReset() { cdr.Channel = 1; cdr.Reg2 = 0x1f; cdr.Stat = NoIntr; - cdr.DriveState = DRIVESTATE_STANDBY; - cdr.StatP = STATUS_ROTATING; cdr.FifoOffset = DATA_SIZE; // fifo empty + if (CdromId[0] == '\0') { + cdr.DriveState = DRIVESTATE_STOPPED; + cdr.StatP = 0; + } + else { + cdr.DriveState = DRIVESTATE_STANDBY; + cdr.StatP = STATUS_ROTATING; + } // BIOS player - default values cdr.AttenuatorLeftToLeft = 0x80; @@ -1615,7 +1627,7 @@ int cdrFreeze(void *f, int Mode) { if (!Config.Cdda) CDR_play(cdr.SetSectorPlay); if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY_OLD)) - CDRPLAYSEEKREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime, 1); + CDRPLAYREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime, 1); } if ((cdr.freeze_ver & 0xffffff00) != 0x63647200) {