diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-04-10 12:27:28 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-04-10 12:27:28 +0000 |
| commit | 998248e80d1c8b1d86007de27ba8baae83ffd986 (patch) | |
| tree | 73700f93687a2340a57c1582806e1ecbb0ff341f /libpcsxcore | |
| parent | 902986217a71665d8d293ea2532c2df8c9f4962e (diff) | |
| download | pcsxr-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.c | 129 |
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) |
