summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-02-14 12:05:54 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-02-14 12:05:54 +0000
commitecff7df55f8b8f9c783d66063952b3cfe82f1784 (patch)
tree1cf49103be0264d82dea165010ee13d0164b8710 /libpcsxcore
parent1ccb62ed8e2ba0ac2fe6d0f29eef3e4b69f10b74 (diff)
downloadpcsxr-ecff7df55f8b8f9c783d66063952b3cfe82f1784.tar.gz
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@41527 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/cdrom.c71
1 files changed, 47 insertions, 24 deletions
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);