From 4d4c05a5037a729d83bb3481ed3c0f74c2d4cafe Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Sat, 30 Oct 2010 13:34:38 +0000 Subject: Duke Nukem: Land of the Babes - cdrom.c - Fix read interrupt start timing, Seek / Reading flags - Fixes cutscene loading git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@58924 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdrom.c | 48 +++++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 0c68ff7a..44e4d5b6 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -599,7 +599,6 @@ void cdrInterrupt() { cdr.Result[0] = cdr.StatP; cdr.StatP |= 0x40; cdr.Stat = Acknowledge; - cdr.Seeked = TRUE; AddIrqQueue(CdlSeekL + 0x20, 0x1000); break; @@ -608,6 +607,7 @@ void cdrInterrupt() { cdr.StatP |= 0x2; cdr.StatP &= ~0x40; cdr.Result[0] = cdr.StatP; + cdr.Seeked = TRUE; cdr.Stat = Complete; break; @@ -626,6 +626,7 @@ void cdrInterrupt() { cdr.StatP &= ~0x40; cdr.Result[0] = cdr.StatP; cdr.Stat = Complete; + cdr.Seeked = TRUE; // Tomb Raider 2: must update read cursor for getlocp ReadTrack(); @@ -721,20 +722,33 @@ void cdrInterrupt() { break; case READ_ACK: - if (!cdr.Reading) return; - - SetResultSize(1); - cdr.StatP |= 0x2; - cdr.Result[0] = cdr.StatP; - if (!cdr.Seeked) { - cdr.Seeked = TRUE; - cdr.StatP |= 0x40; - } - cdr.StatP |= 0x20; - cdr.Stat = Acknowledge; - -// CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); - CDREAD_INT(0x80000); + if (!cdr.Reading) return; + + // Duke Nukem: Land of the Babes - seek then read + // - fixes cutscenes + if (!cdr.Seeked) { + cdr.Seeked = TRUE; + + cdr.StatP |= 0x40; + cdr.StatP &= ~0x20; + } else { + cdr.StatP |= 0x20; + cdr.StatP &= ~0x40; + } + + /* + Duke Nukem: Land of the Babes - delay read for one frame + - fixes cutscenes + + Judge Dredd - don't delay too long + - breaks gameplay movies + */ + CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); + + SetResultSize(1); + cdr.StatP |= 0x02; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; break; case 0xff: @@ -893,8 +907,8 @@ void cdrReadInterrupt() { #ifdef CDR_LOG CDR_LOG("cdrReadInterrupt() Log: Autopausing read\n"); #endif -// AddIrqQueue(AUTOPAUSE, 0x1000); - AddIrqQueue(CdlPause, 0x1000); +// AddIrqQueue(AUTOPAUSE, 0x2000); + AddIrqQueue(CdlPause, 0x2000); } else { CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); -- cgit v1.2.3