From 998248e80d1c8b1d86007de27ba8baae83ffd986 Mon Sep 17 00:00:00 2001 From: "SND\\weimingzhi_cp" Date: Sat, 10 Apr 2010 12:27:28 +0000 Subject: git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@44492 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdrom.c | 129 +++++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 57 deletions(-) (limited to 'libpcsxcore') 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) -- cgit v1.2.3