From f8b23faf9a11ba43822f2e3de05a3cfbb91914df Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Tue, 5 Oct 2010 20:31:50 +0000 Subject: CDROM Buffer: cdrom.c - real hardware uses 16 output bytes then loops around (edgbla) (Works with GameShark music players = 17 bytes) git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@58115 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdrom.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'libpcsxcore') diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 4ba8c5db..9c095aa1 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -369,23 +369,19 @@ void cdrInterrupt() { break; case CdlGetlocP: + // GameShark CDX CD Player: uses 17 bytes output (wraps around) SetResultSize(17); - memset( cdr.Result, 0, 17 ); + memset( cdr.Result, 0, 16 ); subq = (struct SubQ *)CDR_getBufferSub(); if (subq != NULL) { - // Subchannel block #1 cdr.Result[0] = subq->TrackNumber; cdr.Result[1] = subq->IndexNumber; memcpy(cdr.Result+2, subq->TrackRelativeAddress, 3); memcpy(cdr.Result+5, subq->AbsoluteAddress, 3); - // GameShark CDX CD Player: Subchannel block #2 - cdr.Result[16] = subq->TrackNumber; - - // subQ integrity check if (calcCrc((u8 *)subq + 12, 10) != (((u16)subq->CRC[0] << 8) | subq->CRC[1])) { memset(cdr.Result + 2, 0, 3 + 3); // CRC wrong, wipe out time data @@ -413,8 +409,8 @@ void cdrInterrupt() { #if 1 // FIXME!!! - if( cdr.LidCheck ) { - memset( cdr.Result, 0, 17 ); + if( cdr.LidCheck > 0 ) { + memset( cdr.Result, 0, 16 ); // each state needs ~50 tries if( cdr.LidCheck < 130 ) @@ -922,8 +918,10 @@ void cdrWrite0(unsigned char rt) { } unsigned char cdrRead1(void) { - if (cdr.ResultReady) { // && cdr.Ctrl & 0x1) { - psxHu8(0x1801) = cdr.Result[cdr.ResultP++]; + if (cdr.ResultReady) { // && cdr.Ctrl & 0x1) { + // GameShark CDX CD Player: uses 17 bytes output (wraps around) + psxHu8(0x1801) = cdr.Result[cdr.ResultP & 0xf]; + cdr.ResultP++; if (cdr.ResultP == cdr.ResultC) cdr.ResultReady = 0; } else { -- cgit v1.2.3