X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fcdrom.c;h=5b4beb52281c3f934cc832f058a04c691a6724cf;hb=115d0459b2ed99d9536fe84411f4c72e7fe6cf2e;hp=5ffb7fa4dd7d82722312da7f70a2865a2a087664;hpb=4810ff9b810f9ae2b9bf511abe167278c957a6b2;p=pcsx_rearmed.git diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 5ffb7fa4..5b4beb52 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -383,7 +383,7 @@ static void ReadTrack(const u8 *time) { CDR_LOG("ReadTrack *** %02x:%02x:%02x\n", tmp[0], tmp[1], tmp[2]); - cdr.RErr = CDR_readTrack(tmp); + cdr.NoErr = CDR_readTrack(tmp); memcpy(cdr.Prev, tmp, 3); if (CheckSBI(time)) @@ -505,7 +505,6 @@ void cdrPlayInterrupt() cdr.Seeked = SEEK_DONE; if (cdr.Irq == 0) { cdr.Stat = Complete; - cdr.RErr = 1; setIrq(); } @@ -571,6 +570,8 @@ void cdrInterrupt() { int error = 0; int delay; unsigned int seekTime = 0; + u8 set_loc[3]; + int i; // Reschedule IRQ if (cdr.Stat) { @@ -604,13 +605,40 @@ void cdrInterrupt() { break; case CdlSetloc: + CDR_LOG("CDROM setloc command (%02X, %02X, %02X)\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]); + + // MM must be BCD, SS must be BCD and <0x60, FF must be BCD and <0x75 + if (((cdr.Param[0] & 0x0F) > 0x09) || (cdr.Param[0] > 0x99) || ((cdr.Param[1] & 0x0F) > 0x09) || (cdr.Param[1] >= 0x60) || ((cdr.Param[2] & 0x0F) > 0x09) || (cdr.Param[2] >= 0x75)) + { + CDR_LOG("Invalid/out of range seek to %02X:%02X:%02X\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]); + error = ERROR_INVALIDARG; + goto set_error; + } + else + { + for (i = 0; i < 3; i++) + { + set_loc[i] = btoi(cdr.Param[i]); + } + + i = msf2sec(cdr.SetSectorPlay); + i = abs(i - msf2sec(set_loc)); + if (i > 16) + cdr.Seeked = SEEK_PENDING; + + memcpy(cdr.SetSector, set_loc, 3); + cdr.SetSector[3] = 0; + cdr.SetlocPending = 1; + } break; do_CdlPlay: case CdlPlay: StopCdda(); - /* It would set it to SEEK_DONE*/ - cdr.Seeked = SEEK_PENDING; + if (cdr.Seeked == SEEK_PENDING) { + // XXX: wrong, should seek instead.. + cdr.Seeked = SEEK_DONE; + } cdr.FastBackward = 0; cdr.FastForward = 0; @@ -677,7 +705,6 @@ void cdrInterrupt() { case CdlForward: // TODO: error 80 if stopped cdr.Stat = Complete; - cdr.RErr = 1; // GameShark CD Player: Calls 2x + Play 2x cdr.FastForward = 1; cdr.FastBackward = 0; @@ -702,7 +729,6 @@ void cdrInterrupt() { case CdlStandby + 0x100: cdr.Stat = Complete; - cdr.RErr = 1; break; case CdlStop: @@ -730,7 +756,6 @@ void cdrInterrupt() { cdr.StatP &= ~STATUS_ROTATING; cdr.Result[0] = cdr.StatP; cdr.Stat = Complete; - cdr.RErr = 1; break; case CdlPause: @@ -766,7 +791,6 @@ void cdrInterrupt() { cdr.StatP &= ~STATUS_READ; cdr.Result[0] = cdr.StatP; cdr.Stat = Complete; - cdr.RErr = 1; break; case CdlReset: @@ -779,7 +803,6 @@ void cdrInterrupt() { case CdlReset + 0x100: cdr.Stat = Complete; - cdr.RErr = 1; break; case CdlMute: @@ -829,7 +852,6 @@ void cdrInterrupt() { case CdlReadT + 0x100: cdr.Stat = Complete; - cdr.RErr = 1; break; case CdlGetTN: @@ -929,7 +951,6 @@ void cdrInterrupt() { /* This adds the string "PCSX" in Playstation bios boot screen */ memcpy((char *)&cdr.Result[4], "PCSX", 4); cdr.Stat = Complete; - cdr.RErr = 1; break; case CdlInit: @@ -953,7 +974,6 @@ void cdrInterrupt() { case CdlReadToc + 0x100: cdr.Stat = Complete; - cdr.RErr = 1; no_busy_error = 1; break; @@ -1153,9 +1173,9 @@ void cdrReadInterrupt() { buf = CDR_getBuffer(); if (buf == NULL) - cdr.RErr = 0; + cdr.NoErr = 0; - if (cdr.RErr == 0) { + if (cdr.NoErr == 0) { CDR_LOG_I("cdrReadInterrupt() Log: err\n"); memset(cdr.Transfer, 0, DATA_SIZE); cdr.Stat = DiskError; @@ -1188,6 +1208,19 @@ void cdrReadInterrupt() { int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector); if (!ret) { cdrAttenuate(cdr.Xa.pcm, cdr.Xa.nsamples, cdr.Xa.stereo); + /* + * Gameblabla - + * This is a hack for Megaman X4, Castlevania etc... + * that regressed from the new m_locationChanged and CDROM timings changes. + * It is mostly noticeable in Castevania however and the stuttering can be very jarring. + * + * According to PCSX redux authors, we shouldn't cause a location change if + * the sector difference is too small. + * I attempted to go with that approach but came empty handed. + * So for now, let's just set cdr.m_locationChanged to false when playing back any ADPCM samples. + * This does not regress Crash Team Racing's intro at least. + */ + cdr.m_locationChanged = FALSE; SPU_playADPCMchannel(&cdr.Xa); cdr.FirstSector = 0; } @@ -1281,9 +1314,6 @@ unsigned char cdrRead1(void) { } void cdrWrite1(unsigned char rt) { - u8 set_loc[3]; - int i; - CDR_LOG_IO("cdr w1: %02x\n", rt); switch (cdr.Ctrl & 3) { @@ -1317,32 +1347,6 @@ void cdrWrite1(unsigned char rt) { AddIrqQueue(cdr.Cmd, 0x800); switch (cdr.Cmd) { - case CdlSetloc: - CDR_LOG("CDROM setloc command (%02X, %02X, %02X)\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]); - - // MM must be BCD, SS must be BCD and <0x60, FF must be BCD and <0x75 - if (((cdr.Param[0] & 0x0F) > 0x09) || (cdr.Param[0] > 0x99) || ((cdr.Param[1] & 0x0F) > 0x09) || (cdr.Param[1] >= 0x60) || ((cdr.Param[2] & 0x0F) > 0x09) || (cdr.Param[2] >= 0x75)) - { - CDR_LOG("Invalid/out of range seek to %02X:%02X:%02X\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]); - } - else - { - for (i = 0; i < 3; i++) - { - set_loc[i] = btoi(cdr.Param[i]); - } - - i = msf2sec(cdr.SetSectorPlay); - i = abs(i - msf2sec(set_loc)); - if (i > 16) - cdr.Seeked = SEEK_PENDING; - - memcpy(cdr.SetSector, set_loc, 3); - cdr.SetSector[3] = 0; - cdr.SetlocPending = 1; - } - break; - case CdlReadN: case CdlReadS: case CdlPause: