From ecff7df55f8b8f9c783d66063952b3cfe82f1784 Mon Sep 17 00:00:00 2001 From: "SND\\weimingzhi_cp" Date: Sun, 14 Feb 2010 12:05:54 +0000 Subject: git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@41527 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdrom.c | 71 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 24 deletions(-) (limited to 'libpcsxcore') diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index c6d44290..2df2e25e 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -112,7 +112,7 @@ static struct SubQ *subq; cdr.Reading = 0; \ psxRegs.interrupt &= ~0x40000; \ } \ - cdr.StatP &= ~0x20; \ + cdr.StatP &= ~0x20;\ } #define StopCdda() { \ @@ -129,7 +129,7 @@ static struct SubQ *subq; cdr.ResultReady = 1; \ } -void ReadTrack() { +static void ReadTrack() { cdr.Prev[0] = itob(cdr.SetSector[0]); cdr.Prev[1] = itob(cdr.SetSector[1]); cdr.Prev[2] = itob(cdr.SetSector[2]); @@ -160,6 +160,7 @@ void AddIrqQueue(unsigned char irq, unsigned long ecycle) { void cdrInterrupt() { int i; unsigned char Irq = cdr.Irq; + char cdr_localTime[3]; if (cdr.Stat) { CDR_INT(0x800); @@ -330,24 +331,48 @@ void cdrInterrupt() { cdr.Stat = Acknowledge; break; - case CdlGetlocP: - SetResultSize(8); - subq = (struct SubQ *)CDR_getBufferSub(); - if (subq != NULL) { - cdr.Result[0] = subq->TrackNumber; - cdr.Result[1] = subq->IndexNumber; - memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3); - memcpy(cdr.Result + 5, subq->AbsoluteAddress, 3); - } else { - cdr.Result[0] = 1; - cdr.Result[1] = 1; - cdr.Result[2] = cdr.Prev[0]; - cdr.Result[3] = itob((btoi(cdr.Prev[1])) - 2); - cdr.Result[4] = cdr.Prev[2]; - memcpy(cdr.Result + 5, cdr.Prev, 3); - } - cdr.Stat = Acknowledge; - break; + case CdlGetlocP: + SetResultSize(8); + subq = (struct SubQ *)CDR_getBufferSub(); + + cdr_localTime[0] = btoi(cdr.Prev[0]); + cdr_localTime[1] = btoi(cdr.Prev[1]) - 2; + cdr_localTime[2] = cdr.Prev[2]; + + // m:s adjustment + if (cdr_localTime[1] < 0) { + cdr_localTime[1] += 60; + cdr_localTime[0] -= 1; + } + + cdr_localTime[1] = itob(cdr_localTime[1]); + cdr_localTime[0] = itob(cdr_localTime[0]); + + if (subq != NULL) { + cdr.Result[0] = subq->TrackNumber; + cdr.Result[1] = subq->IndexNumber; + memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3); + memcpy(cdr.Result + 5, subq->AbsoluteAddress, 3); + + // subQ integrity check + if (cdr_localTime[0] != cdr.Result[2] || + cdr_localTime[1] != cdr.Result[3] || + cdr_localTime[2] != cdr.Result[4] || + cdr.Prev[0] != cdr.Result[5] || + cdr.Prev[1] != cdr.Result[6] || + cdr.Prev[2] != cdr.Result[7]) { + // wipe out time data + memset(cdr.Result + 2, 0, 3 + 3); + } + } else { + cdr.Result[0] = 1; + cdr.Result[1] = 1; + memcpy(cdr.Result + 2, cdr_localTime, 3); + memcpy(cdr.Result + 5, cdr.Prev, 3); + } + + cdr.Stat = Acknowledge; + break; case CdlGetTN: cdr.CmdProcess = 0; @@ -513,8 +538,6 @@ void cdrInterrupt() { cdr.StatP |= 0x20; cdr.Stat = Acknowledge; - ReadTrack(); - // CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); CDREAD_INT(0x40000); break; @@ -582,6 +605,8 @@ void cdrReadInterrupt() { cdr.StatP &= ~0x40; cdr.Result[0] = cdr.StatP; + ReadTrack(); + buf = CDR_getBuffer(); if (buf == NULL) cdr.RErr = -1; @@ -593,7 +618,6 @@ void cdrReadInterrupt() { memset(cdr.Transfer, 0, 2340); cdr.Stat = DiskError; cdr.Result[0] |= 0x01; - ReadTrack(); CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); return; } @@ -641,7 +665,6 @@ void cdrReadInterrupt() { AddIrqQueue(CdlPause, 0x800); } else { - ReadTrack(); CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); } psxHu32ref(0x1070) |= SWAP32((u32)0x4); -- cgit v1.2.3