diff options
| author | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-10-30 13:34:38 +0000 |
|---|---|---|
| committer | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-10-30 13:34:38 +0000 |
| commit | 4d4c05a5037a729d83bb3481ed3c0f74c2d4cafe (patch) | |
| tree | 952665df864527968499f4f103cd8974489ff566 | |
| parent | e2cc5d251c76a663f9fee92a78d67fd17bbe0a76 (diff) | |
| download | pcsxr-4d4c05a5037a729d83bb3481ed3c0f74c2d4cafe.tar.gz | |
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
| -rw-r--r-- | libpcsxcore/cdrom.c | 48 |
1 files 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); |
