summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-24 01:21:28 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-24 01:21:28 +0000
commit3614c1cedfce6ef5e96b2f0f4e7807dd44f2369b (patch)
tree0d02b62158a578cb02748ed517190d52dd3cf0d7
parentdd86ebe733746c215d59091bf0704334651bebac (diff)
downloadpcsxr-3614c1cedfce6ef5e96b2f0f4e7807dd44f2369b.tar.gz
Crusaders of Might and Magic - cdrom.c
- fix seek, getlocl, read_ack times - fix cutscene speech (start + play) git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@60064 e17a0e51-4ae3-4d35-97c3-1a29b211df97
-rw-r--r--libpcsxcore/cdrom.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c
index 37cded91..acbbc10a 100644
--- a/libpcsxcore/cdrom.c
+++ b/libpcsxcore/cdrom.c
@@ -1122,7 +1122,7 @@ void cdrInterrupt() {
cdr.Result[0] = cdr.StatP;
cdr.StatP |= 0x40;
cdr.Stat = Acknowledge;
- AddIrqQueue(CdlSeekL + 0x20, 0x1000);
+ AddIrqQueue(CdlSeekL + 0x20, cdReadTime * 1);
break;
case CdlSeekL + 0x20:
@@ -1140,7 +1140,7 @@ void cdrInterrupt() {
cdr.Result[0] = cdr.StatP;
cdr.StatP |= 0x40;
cdr.Stat = Acknowledge;
- AddIrqQueue(CdlSeekP + 0x20, 0x1000);
+ AddIrqQueue(CdlSeekP + 0x20, cdReadTime * 1);
break;
case CdlSeekP + 0x20:
@@ -1267,12 +1267,17 @@ void cdrInterrupt() {
ReadTrack( cdr.SetSector );
+ // Crusaders of Might and Magic - update getlocl now
+ // - fixes cutscene speech
+ {
+ u8 *buf = CDR_getBuffer();
+ memcpy(cdr.Transfer, buf, 8);
+ }
+
+
/*
Duke Nukem: Land of the Babes - seek then delay read for one frame
- fixes cutscenes
-
- Judge Dredd - don't delay too long
- - breaks gameplay movies
*/
if (!cdr.Seeked) {
@@ -1280,12 +1285,18 @@ void cdrInterrupt() {
cdr.StatP |= 0x40;
cdr.StatP &= ~0x20;
+
+ // Crusaders of Might and Magic - use short time
+ // - fix cutscene speech (startup)
+
+ // ??? - use more accurate seek time later
+ CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1);
} else {
cdr.StatP |= 0x20;
cdr.StatP &= ~0x40;
+
+ CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1);
}
-
- CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime * 4) : cdReadTime * 8);
SetResultSize(1);
cdr.StatP |= 0x02;
@@ -1418,7 +1429,8 @@ void cdrReadInterrupt() {
if( (cdr.Mode & 0x40) == 0 || (cdr.Transfer[4+2] & 0x4) != 0x4 ||
(cdr.Mode & 0x20) ) {
cdr.Stat = DataReady;
- } else {
+ } else {
+ // Rockman X5 - no music restart problem
cdr.Stat = NoIntr;
}
psxHu32ref(0x1070) |= SWAP32((u32)0x4);
@@ -1758,8 +1770,8 @@ void cdrWrite1(unsigned char rt) {
cdr.Ctrl |= 0x80;
cdr.Stat = NoIntr;
- // G-Police: in-game music needs longer time
- AddIrqQueue(cdr.Cmd, 0x4000);
+ // Crusaders of Might and Magic - cutscene speech
+ AddIrqQueue(cdr.Cmd, 0x800);
break;
case CdlGetlocP: