From e2cc5d251c76a663f9fee92a78d67fd17bbe0a76 Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Sat, 30 Oct 2010 13:31:04 +0000 Subject: Doom - cdrom.c - IRQ reschedule - Fixes boot - InuYasha CdlPause adjustment git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@58923 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdrom.c | 50 +++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index af770d12..0c68ff7a 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -192,19 +192,19 @@ static void ReadTrack() { #define DiskError 5 void AddIrqQueue(unsigned char irq, unsigned long ecycle) { - cdr.Irq = irq; - if (cdr.Stat) { - cdr.eCycle = ecycle; - } else { - CDR_INT(ecycle); - } + cdr.Irq = irq; + cdr.eCycle = ecycle; + + // Doom: Force rescheduling + // - Fixes boot + CDR_INT(ecycle); } void cdrRepplayInterrupt() { // Wait for IRQ to be acknowledged if (cdr.Stat) { - CDREAD_INT(0x1000); + CDREAD_INT( cdReadTime ); return; } @@ -292,10 +292,11 @@ void cdrInterrupt() { int i; unsigned char Irq = cdr.Irq; - if (cdr.Stat) { - CDR_INT(0x1000); - return; - } + // Reschedule IRQ + if (cdr.Stat) { + CDR_INT( cdr.eCycle ); + return; + } cdr.Irq = 0xff; cdr.Ctrl &= ~0x80; @@ -390,9 +391,7 @@ void cdrInterrupt() { cdr.Result[0] = cdr.StatP; cdr.Stat = Acknowledge; - // Gundam Battle Assault 2: sync to next frame @ 0.5x speed - AddIrqQueue(CdlPause + 0x20, cdReadTime * 2); - + AddIrqQueue(CdlPause + 0x20, 0x1000); cdr.Ctrl |= 0x80; break; @@ -1205,8 +1204,17 @@ void cdrWrite1(unsigned char rt) { cdr.Ctrl |= 0x80; cdr.Stat = NoIntr; - // Gundam Battle Assault 2: sync to next frame @ 0.5x speed - AddIrqQueue(cdr.Cmd, cdReadTime * 2); + /* + Gundam Battle Assault 2: much slower (*) + - Fixes boot, gameplay + + Hokuto no Ken 2: slower + - Fixes intro + subtitles + + InuYasha - Feudal Fairy Tale: slower + - Fixes battles + */ + AddIrqQueue(cdr.Cmd, cdReadTime * 3); break; case CdlReset: @@ -1420,11 +1428,11 @@ void cdrWrite3(unsigned char rt) { return; } - if (cdr.Irq) - CDR_INT(cdr.eCycle); - - if (cdr.Reading && !cdr.ResultReady) - CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); + /* + Do not reset interrupts here + - Doom: fixes boot + - Judge Dredd: better gameplay, some dropped frames + */ return; } -- cgit v1.2.3