summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-10-30 13:34:38 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-10-30 13:34:38 +0000
commit4d4c05a5037a729d83bb3481ed3c0f74c2d4cafe (patch)
tree952665df864527968499f4f103cd8974489ff566
parente2cc5d251c76a663f9fee92a78d67fd17bbe0a76 (diff)
downloadpcsxr-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.c48
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);