summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-04-10 12:27:28 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-04-10 12:27:28 +0000
commit998248e80d1c8b1d86007de27ba8baae83ffd986 (patch)
tree73700f93687a2340a57c1582806e1ecbb0ff341f /libpcsxcore
parent902986217a71665d8d293ea2532c2df8c9f4962e (diff)
downloadpcsxr-998248e80d1c8b1d86007de27ba8baae83ffd986.tar.gz
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@44492 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/cdrom.c129
1 files changed, 72 insertions, 57 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c
index 2df2e25e..558140f0 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() { \
@@ -171,19 +171,19 @@ void cdrInterrupt() {
cdr.Ctrl &= ~0x80;
switch (Irq) {
- case CdlSync:
+ case CdlSync:
SetResultSize(1);
cdr.StatP |= 0x2;
- cdr.Result[0] = cdr.StatP;
- cdr.Stat = Acknowledge;
+ cdr.Result[0] = cdr.StatP;
+ cdr.Stat = Acknowledge;
break;
- case CdlNop:
+ case CdlNop:
SetResultSize(1);
- cdr.Result[0] = cdr.StatP;
- cdr.Stat = Acknowledge;
+ cdr.Result[0] = cdr.StatP;
+ cdr.Stat = Acknowledge;
i = stat.Status;
- if (CDR_getStatus(&stat) != -1) {
+ if (CDR_getStatus(&stat) != -1) {
if (stat.Type == 0xff) cdr.Stat = DiskError;
if (stat.Status & 0x10) {
cdr.Stat = DiskError;
@@ -202,8 +202,8 @@ void cdrInterrupt() {
cdr.CmdProcess = 0;
SetResultSize(1);
cdr.StatP |= 0x2;
- cdr.Result[0] = cdr.StatP;
- cdr.Stat = Acknowledge;
+ cdr.Result[0] = cdr.StatP;
+ cdr.Stat = Acknowledge;
break;
case CdlPlay:
@@ -236,17 +236,32 @@ void cdrInterrupt() {
cdr.CmdProcess = 0;
SetResultSize(1);
cdr.StatP |= 0x2;
- cdr.Result[0] = cdr.StatP;
- cdr.Stat = Complete;
+ cdr.Result[0] = cdr.StatP;
+ cdr.Stat = Complete;
break;
case CdlStop:
cdr.CmdProcess = 0;
SetResultSize(1);
- cdr.StatP &= ~0x2;
+ cdr.StatP &= ~0x2;
cdr.Result[0] = cdr.StatP;
- cdr.Stat = Complete;
-// cdr.Stat = Acknowledge;
+ cdr.Stat = Complete;
+// cdr.Stat = Acknowledge;
+
+ // check case open/close -shalma
+ i = stat.Status;
+ if (CDR_getStatus(&stat) != -1) {
+ if (stat.Type == 0xff) cdr.Stat = DiskError;
+ if (stat.Status & 0x10) {
+ cdr.Stat = DiskError;
+ cdr.Result[0] |= 0x11;
+ cdr.Result[0] &= ~0x02;
+ } else if (i & 0x10) {
+ cdr.StatP |= 0x2;
+ cdr.Result[0] |= 0x2;
+ CheckCdrom();
+ }
+ }
break;
case CdlPause:
@@ -331,47 +346,47 @@ void cdrInterrupt() {
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;
+ 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:
@@ -605,7 +620,7 @@ void cdrReadInterrupt() {
cdr.StatP &= ~0x40;
cdr.Result[0] = cdr.StatP;
- ReadTrack();
+ ReadTrack();
buf = CDR_getBuffer();
if (buf == NULL)