From 37edbb7d48a17b7321ebeb5bcf992c7d77fd2662 Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Sun, 5 Sep 2010 00:59:20 +0000 Subject: Vib Ribbon CD swapping needed fixing (CDROM) - Game still not working (SPU CDDA timing problems.. maybe) dfsound: feed CDDA data to SPU RAM for decoded buffer IRQs git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@56823 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdriso.c | 32 ++++++++++++++++++++++++++--- libpcsxcore/cdrom.c | 58 ++++++++++++++++++++++++---------------------------- 2 files changed, 56 insertions(+), 34 deletions(-) (limited to 'libpcsxcore') diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index 18b0de92..a6812e1e 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -31,6 +31,9 @@ #include #endif +#define btoi(b) ((b) / 16 * 10 + (b) % 16) /* BCD to u_char */ +#define itob(i) ((i)/10*16 + (i)%10) /* u_char to BCD */ + static FILE *cdHandle = NULL; static FILE *cddaHandle = NULL; static FILE *subHandle = NULL; @@ -172,12 +175,16 @@ static void *playthread(void *param) s += d; - // skip the subchannel data - fseek(cddaHandle, SUB_FRAMESIZE, SEEK_CUR); + fread( subbuffer, 1, SUB_FRAMESIZE, cddaHandle ); } } else { s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle); + + if (subHandle != NULL) { + fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET); + fread(subbuffer, 1, SUB_FRAMESIZE, subHandle); + } } if (s == 0) { @@ -740,7 +747,26 @@ static long CALLBACK ISOgetTN(unsigned char *buffer) { // byte 1 - second // byte 2 - minute static long CALLBACK ISOgetTD(unsigned char track, unsigned char *buffer) { - if (numtracks > 0 && track <= numtracks) { + if( track == 0 ) { + unsigned int pos, size; + unsigned char time[3]; + + // Vib Ribbon: return size of CD + // - ex. 20 min, 22 sec, 66 fra + pos = ftell( cdHandle ); + fseek( cdHandle, 0, SEEK_END ); + size = ftell( cdHandle ); + fseek( cdHandle, pos, SEEK_SET ); + + // relative -> absolute time (+2 seconds) + size += 150 * 2352; + + sec2msf( size / 2352, time ); + buffer[2] = time[0]; + buffer[1] = time[1]; + buffer[0] = time[2]; + } + else if (numtracks > 0 && track <= numtracks) { buffer[2] = ti[track].start[0]; buffer[1] = ti[track].start[1]; buffer[0] = ti[track].start[2]; diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 12b5966d..7ff2d68f 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -184,20 +184,6 @@ void cdrInterrupt() { SetResultSize(1); cdr.Result[0] = cdr.StatP; cdr.Stat = Acknowledge; - 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 CdlSetloc: @@ -249,22 +235,6 @@ void cdrInterrupt() { cdr.Result[0] = cdr.StatP; 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: @@ -353,6 +323,7 @@ void cdrInterrupt() { SetResultSize(8); subq = (struct SubQ *)CDR_getBufferSub(); + // DATA + AUDIO has subchannel data if (subq != NULL) { cdr.Result[0] = subq->TrackNumber; cdr.Result[1] = subq->IndexNumber; @@ -366,7 +337,8 @@ void cdrInterrupt() { } else { cdr.Result[0] = 1; cdr.Result[1] = 1; - + + // NOTE: This only works for TRACK 01 cdr.Result[2] = btoi(cdr.Prev[0]); cdr.Result[3] = btoi(cdr.Prev[1]) - 2; cdr.Result[4] = cdr.Prev[2]; @@ -387,6 +359,9 @@ void cdrInterrupt() { break; case CdlGetTN: + StopReading(); + StopCdda(); + cdr.CmdProcess = 0; SetResultSize(3); cdr.StatP |= 0x2; @@ -591,6 +566,27 @@ void cdrInterrupt() { break; } + // check case open/close + i = stat.Status; + if (CDR_getStatus(&stat) != -1) { + if (stat.Type == 0xff) cdr.Stat = DiskError; + + // case now open + if (stat.Status & 0x10) { + cdr.Stat = DiskError; + + cdr.Result[0] |= 0x11; + cdr.Result[0] &= ~0x02; + } + // case now closed + else if (i & 0x10) { + cdr.StatP &= ~0x11; + cdr.Result[0] |= 0x2; + + CheckCdrom(); + } + } + if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) { psxHu32ref(0x1070) |= SWAP32((u32)0x4); } -- cgit v1.2.3