X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=libpcsxcore%2Fcdrom.c;h=614f0d97785c55fb7ff8a0e20d4e8fd929628afa;hb=8b380e97ccb16808ea31f1cc89af11c0f063bdb3;hp=878559859473ff083ff36f2e9ab975783f454d87;hpb=50b13be9826da8433b39bd7d02cce2422f91cf0c;p=pcsx_rearmed.git diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 87855985..614f0d97 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -25,7 +25,26 @@ #include "ppf.h" #include "psxdma.h" +/* logging */ +#if 0 +#define CDR_LOG SysPrintf +#else +#define CDR_LOG(...) +#endif +#if 0 +#define CDR_LOG_I SysPrintf +#else +#define CDR_LOG_I(...) +#endif +#if 0 +#define CDR_LOG_IO SysPrintf +#else +#define CDR_LOG_IO(...) +#endif +//#define CDR_LOG_CMD_IRQ + cdrStruct cdr; +static unsigned char *pTransfer; /* CD-ROM magic numbers */ #define CdlSync 0 @@ -119,13 +138,20 @@ unsigned char Test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 }; // so (PSXCLK / 75) = cdr read time (linuzappz) #define cdReadTime (PSXCLK / 75) +// for cdr.Seeked +enum seeked_state { + SEEK_PENDING = 0, + SEEK_DONE = 1, + SEEK_DOING_CMD = 2, +}; + static struct CdrStat stat; -static unsigned int msf2sec(char *msf) { +static unsigned int msf2sec(u8 *msf) { return ((msf[0] * 60 + msf[1]) * 75) + msf[2]; } -static void sec2msf(unsigned int s, char *msf) { +static void sec2msf(unsigned int s, u8 *msf) { msf[0] = s / 75 / 60; s = s - msf[0] * 75 * 60; msf[1] = s / 75; @@ -133,7 +159,7 @@ static void sec2msf(unsigned int s, char *msf) { msf[2] = s; } - +// cdrInterrupt #define CDR_INT(eCycle) { \ psxRegs.interrupt |= (1 << PSXINT_CDR); \ psxRegs.intCycle[PSXINT_CDR].cycle = eCycle; \ @@ -141,6 +167,7 @@ static void sec2msf(unsigned int s, char *msf) { new_dyna_set_event(PSXINT_CDR, eCycle); \ } +// cdrReadInterrupt #define CDREAD_INT(eCycle) { \ psxRegs.interrupt |= (1 << PSXINT_CDREAD); \ psxRegs.intCycle[PSXINT_CDREAD].cycle = eCycle; \ @@ -148,6 +175,7 @@ static void sec2msf(unsigned int s, char *msf) { new_dyna_set_event(PSXINT_CDREAD, eCycle); \ } +// cdrLidSeekInterrupt #define CDRLID_INT(eCycle) { \ psxRegs.interrupt |= (1 << PSXINT_CDRLID); \ psxRegs.intCycle[PSXINT_CDRLID].cycle = eCycle; \ @@ -155,7 +183,8 @@ static void sec2msf(unsigned int s, char *msf) { new_dyna_set_event(PSXINT_CDRLID, eCycle); \ } -#define CDRPLAY_INT(eCycle) { \ +// cdrPlayInterrupt +#define CDRMISC_INT(eCycle) { \ psxRegs.interrupt |= (1 << PSXINT_CDRPLAY); \ psxRegs.intCycle[PSXINT_CDRPLAY].cycle = eCycle; \ psxRegs.intCycle[PSXINT_CDRPLAY].sCycle = psxRegs.cycle; \ @@ -251,15 +280,12 @@ void cdrLidSeekInterrupt() } } - static void Check_Shell( int Irq ) { // check case open/close if (cdr.LidCheck > 0) { -#ifdef CDR_LOG CDR_LOG( "LidCheck\n" ); -#endif // $20 = check lid state if( cdr.LidCheck == 0x20 ) @@ -372,12 +398,10 @@ void Find_CurTrack() { if (CDR_getTD((u8)(lcv), cdr.ResultTD) != -1) { u32 sect1, sect2; -#ifdef CDR_LOG___0 CDR_LOG( "curtrack %d %d %d | %d %d %d | %d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2], cdr.ResultTD[2], cdr.ResultTD[1], cdr.ResultTD[0], cdr.CurTrack ); -#endif // find next track boundary - only need m:s accuracy sect1 = cdr.SetSectorPlay[0] * 60 * 75 + cdr.SetSectorPlay[1] * 75; @@ -403,19 +427,18 @@ static void ReadTrack( u8 *time ) { cdr.Prev[1] = itob( time[1] ); cdr.Prev[2] = itob( time[2] ); -#ifdef CDR_LOG CDR_LOG("ReadTrack() Log: KEY *** %x:%x:%x\n", cdr.Prev[0], cdr.Prev[1], cdr.Prev[2]); -#endif cdr.RErr = CDR_readTrack(cdr.Prev); } -void AddIrqQueue(unsigned char irq, unsigned long ecycle) { +static void AddIrqQueue(unsigned char irq, unsigned long ecycle) { + if (cdr.Irq != 0 && cdr.Irq != 0xff) + CDR_LOG_I("cdr: override cmd %02x -> %02x\n", cdr.Irq, irq); + cdr.Irq = irq; cdr.eCycle = ecycle; - // Doom: Force rescheduling - // - Fixes boot CDR_INT(ecycle); } @@ -427,12 +450,10 @@ void Set_Track() for( lcv = 1; lcv < cdr.ResultTN[1]; lcv++ ) { if (CDR_getTD((u8)(lcv), cdr.ResultTD) != -1) { -#ifdef CDR_LOG___0 CDR_LOG( "settrack %d %d %d | %d %d %d | %d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2], cdr.ResultTD[2], cdr.ResultTD[1], cdr.ResultTD[0], cdr.CurTrack ); -#endif // check if time matches track start (only need min, sec accuracy) // - m:s:f vs f:s:m @@ -513,12 +534,10 @@ static void Create_Fake_Subq() temp_start[2] = cdr.ResultTD[0]; -#ifdef CDR_LOG CDR_LOG( "CDDA FAKE SUB - %d:%d:%d / %d:%d:%d / %d:%d:%d\n", temp_cur[0], temp_cur[1], temp_cur[2], temp_start[0], temp_start[1], temp_start[2], temp_next[0], temp_next[1], temp_next[2]); -#endif @@ -541,10 +560,11 @@ static void cdrPlayInterrupt_Autopause() struct SubQ *subq = (struct SubQ *)CDR_getBufferSub(); int track_changed = 0; if (subq != NULL ) { -#ifdef CDR_LOG + // update subq + ReadTrack( cdr.SetSectorPlay ); + CDR_LOG( "CDDA SUB - %X:%X:%X\n", subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); -#endif /* CDDA Autopause @@ -553,23 +573,21 @@ static void cdrPlayInterrupt_Autopause() Tomb Raider 1 ($7) */ - if( cdr.CurTrack < btoi( subq->TrackNumber ) ) + // .. + 1 is probably wrong, but deals with corrupted subq + good checksum + // (how does real thing handle those?) + if( cdr.CurTrack + 1 == btoi( subq->TrackNumber ) ) track_changed = 1; } else { Create_Fake_Subq(); -#ifdef CDR_LOG___0 CDR_LOG( "CDDA FAKE SUB - %d:%d:%d\n", fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] ); -#endif track_changed = fake_subq_change; fake_subq_change = 0; } if ((cdr.Mode & MODE_AUTOPAUSE) && track_changed) { -#ifdef CDR_LOG CDR_LOG( "CDDA STOP\n" ); -#endif // Magic the Gathering // - looping territory cdda @@ -582,13 +600,13 @@ static void cdrPlayInterrupt_Autopause() StopCdda(); } - if (cdr.Mode & MODE_REPORT) { + else if (cdr.Mode & MODE_REPORT) { if (subq != NULL) { -#ifdef CDR_LOG CDR_LOG( "REPPLAY SUB - %X:%X:%X\n", subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); -#endif - cdr.CurTrack = btoi( subq->TrackNumber ); + + // breaks when .sub doesn't have index 0 for some reason (bad rip?) + //cdr.CurTrack = btoi( subq->TrackNumber ); if (subq->AbsoluteAddress[2] & 0xf) return; @@ -602,10 +620,8 @@ static void cdrPlayInterrupt_Autopause() cdr.Result[4] = subq->AbsoluteAddress[1]; cdr.Result[5] = subq->AbsoluteAddress[2]; } else { -#ifdef CDR_LOG___0 CDR_LOG( "REPPLAY FAKE - %d:%d:%d\n", fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] ); -#endif if (fake_subq_real[2] & 0xf) return; @@ -629,15 +645,44 @@ static void cdrPlayInterrupt_Autopause() } } +// also handles seek void cdrPlayInterrupt() { - if( !cdr.Play ) return; + if (cdr.Seeked == SEEK_DOING_CMD) { + if (cdr.Stat) { + CDR_LOG_I("cdrom: seek stat hack\n"); + CDRMISC_INT(0x1000); + return; + } + SetResultSize(1); + cdr.StatP |= STATUS_ROTATING; + cdr.StatP &= ~STATUS_SEEK; + cdr.Result[0] = cdr.StatP; + if (cdr.Irq == 0 || cdr.Irq == 0xff) { + cdr.Stat = Complete; + if (cdr.Reg2 != 0x18) + psxHu32ref(0x1070) |= SWAP32(0x4); + } + + cdr.Seeked = SEEK_PENDING; + CDRMISC_INT(cdReadTime * 20); // ??? + return; + } + else if (cdr.Seeked == SEEK_PENDING) { + cdr.Seeked = SEEK_DONE; + if (!cdr.Play && !cdr.Reading) { + memcpy(cdr.SetSectorPlay, cdr.SetSector, 4); + Find_CurTrack(); + ReadTrack(cdr.SetSector); + } + } + + if (!cdr.Play) return; -#ifdef CDR_LOG CDR_LOG( "CDDA - %d:%d:%d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); -#endif - CDRPLAY_INT( cdReadTime ); + + CDRMISC_INT( cdReadTime ); if (!cdr.Irq && !cdr.Stat && (cdr.Mode & MODE_CDDA) && (cdr.Mode & (MODE_AUTOPAUSE|MODE_REPORT))) cdrPlayInterrupt_Autopause(); @@ -662,7 +707,8 @@ void cdrInterrupt() { // Reschedule IRQ if (cdr.Stat) { - CDR_INT( 0x100 ); + CDR_LOG_I("cdrom: stat hack: %02x %x\n", cdr.Irq, cdr.Stat); + CDR_INT(0x1000); return; } @@ -696,9 +742,10 @@ void cdrInterrupt() { case CdlPlay: fake_subq_change = 0; - if( cdr.Seeked == FALSE ) { + if (cdr.Seeked == SEEK_PENDING) { + // XXX: wrong, should seek instead.. memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 ); - cdr.Seeked = TRUE; + cdr.Seeked = SEEK_DONE; } /* @@ -738,10 +785,8 @@ void cdrInterrupt() { // GameShark CD Player: Resume play if( cdr.ParamC == 0 ) { -#ifdef CDR_LOG___0 CDR_LOG( "PLAY Resume @ %d:%d:%d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); -#endif //CDR_play( cdr.SetSectorPlay ); } @@ -749,18 +794,14 @@ void cdrInterrupt() { { // BIOS CD Player: Resume play if( cdr.Param[0] == 0 ) { -#ifdef CDR_LOG___0 CDR_LOG( "PLAY Resume T0 @ %d:%d:%d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); -#endif //CDR_play( cdr.SetSectorPlay ); } else { -#ifdef CDR_LOG___0 CDR_LOG( "PLAY Resume Td @ %d:%d:%d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); -#endif // BIOS CD Player: Allow track replaying StopCdda(); @@ -779,7 +820,7 @@ void cdrInterrupt() { cdr.SetSectorPlay[2] = cdr.ResultTD[0]; // reset data - Set_Track(); + //Set_Track(); Find_CurTrack(); ReadTrack( cdr.SetSectorPlay ); @@ -807,7 +848,7 @@ void cdrInterrupt() { // BIOS player - set flag again cdr.Play = TRUE; - CDRPLAY_INT( cdReadTime ); + CDRMISC_INT( cdReadTime ); break; case CdlForward: @@ -958,6 +999,10 @@ void cdrInterrupt() { subq = (struct SubQ *)CDR_getBufferSub(); if (subq != NULL) { + if( cdr.Play && (cdr.Mode & MODE_CDDA) && !(cdr.Mode & (MODE_AUTOPAUSE|MODE_REPORT)) ) + // update subq + ReadTrack( cdr.SetSectorPlay ); + cdr.Result[0] = subq->TrackNumber; cdr.Result[1] = subq->IndexNumber; memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3); @@ -1036,6 +1081,7 @@ void cdrInterrupt() { break; case CdlSeekL: + case CdlSeekP: SetResultSize(1); cdr.StatP |= STATUS_ROTATING; cdr.Result[0] = cdr.StatP; @@ -1055,45 +1101,8 @@ void cdrInterrupt() { Rockman X5 = 0.5-4x - fix capcom logo */ - AddIrqQueue(CdlSeekL + 0x20, cdReadTime * 4); - break; - - case CdlSeekL + 0x20: - SetResultSize(1); - cdr.StatP |= STATUS_ROTATING; - cdr.StatP &= ~STATUS_SEEK; - cdr.Result[0] = cdr.StatP; - cdr.Seeked = TRUE; - cdr.Stat = Complete; - - - // Mega Man Legends 2: must update read cursor for getlocp - ReadTrack( cdr.SetSector ); - break; - - case CdlSeekP: - SetResultSize(1); - cdr.StatP |= STATUS_ROTATING; - cdr.Result[0] = cdr.StatP; - cdr.StatP |= STATUS_SEEK; - cdr.Stat = Acknowledge; - AddIrqQueue(CdlSeekP + 0x20, cdReadTime * 1); - break; - - case CdlSeekP + 0x20: - SetResultSize(1); - cdr.StatP |= STATUS_ROTATING; - cdr.StatP &= ~STATUS_SEEK; - cdr.Result[0] = cdr.StatP; - cdr.Stat = Complete; - cdr.Seeked = TRUE; - - // GameShark Music Player - memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 ); - - // Tomb Raider 2: must update read cursor for getlocp - Find_CurTrack(); - ReadTrack( cdr.SetSectorPlay ); + CDRMISC_INT(cdr.Seeked == SEEK_DONE ? 0x800 : cdReadTime * 4); + cdr.Seeked = SEEK_DOING_CMD; break; case CdlTest: @@ -1222,17 +1231,14 @@ void cdrInterrupt() { if (buf != NULL) memcpy(cdr.Transfer, buf, 8); } - - + /* Duke Nukem: Land of the Babes - seek then delay read for one frame - fixes cutscenes C-12 - Final Resistance - doesn't like seek */ - if (!cdr.Seeked) { - cdr.Seeked = TRUE; - + if (cdr.Seeked != SEEK_DONE) { cdr.StatP |= STATUS_SEEK; cdr.StatP &= ~STATUS_READ; @@ -1264,12 +1270,19 @@ void cdrInterrupt() { Check_Shell( Irq ); + cdr.ParamP = 0; + cdr.ParamC = 0; + if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) { psxHu32ref(0x1070) |= SWAP32((u32)0x4); } -#ifdef CDR_LOG - CDR_LOG("cdrInterrupt() Log: CDR Interrupt IRQ %x\n", Irq); +#ifdef CDR_LOG_CMD_IRQ + SysPrintf("cdrInterrupt() Log: CDR Interrupt IRQ %d %02x: ", + cdr.Stat != NoIntr && cdr.Reg2 != 0x18, Irq); + for (i = 0; i < cdr.ResultC; i++) + SysPrintf("%02x ", cdr.Result[i]); + SysPrintf("\n"); #endif } @@ -1280,19 +1293,17 @@ void cdrReadInterrupt() { return; if (cdr.Irq || cdr.Stat) { - CDREAD_INT(0x100); + CDR_LOG_I("cdrom: read stat hack %02x %x\n", cdr.Irq, cdr.Stat); + CDREAD_INT(0x1000); return; } -#ifdef CDR_LOG - CDR_LOG("cdrReadInterrupt() Log: KEY END"); -#endif - cdr.OCUP = 1; SetResultSize(1); cdr.StatP |= STATUS_READ|STATUS_ROTATING; cdr.StatP &= ~STATUS_SEEK; cdr.Result[0] = cdr.StatP; + cdr.Seeked = SEEK_DONE; ReadTrack( cdr.SetSector ); @@ -1301,9 +1312,7 @@ void cdrReadInterrupt() { cdr.RErr = -1; if (cdr.RErr == -1) { -#ifdef CDR_LOG - fprintf(emuLog, "cdrReadInterrupt() Log: err\n"); -#endif + CDR_LOG_I("cdrReadInterrupt() Log: err\n"); memset(cdr.Transfer, 0, DATA_SIZE); cdr.Stat = DiskError; cdr.Result[0] |= STATUS_ERROR; @@ -1315,9 +1324,7 @@ void cdrReadInterrupt() { CheckPPFCache(cdr.Transfer, cdr.Prev[0], cdr.Prev[1], cdr.Prev[2]); -#ifdef CDR_LOG - fprintf(emuLog, "cdrReadInterrupt() Log: cdr.Transfer %x:%x:%x\n", cdr.Transfer[0], cdr.Transfer[1], cdr.Transfer[2]); -#endif + CDR_LOG("cdrReadInterrupt() Log: cdr.Transfer %x:%x:%x\n", cdr.Transfer[0], cdr.Transfer[1], cdr.Transfer[2]); if ((!cdr.Muted) && (cdr.Mode & MODE_STRSND) && (!Config.Xa) && (cdr.FirstSector != -1)) { // CD-XA // Firemen 2: Multi-XA files - briefings, cutscenes @@ -1380,9 +1387,9 @@ void cdrReadInterrupt() { // G-Police: Don't autopause ADPCM even if mode set (music) if ((cdr.Transfer[4 + 2] & 0x80) && (cdr.Mode & MODE_AUTOPAUSE) && (cdr.Transfer[4 + 2] & 0x4) != 0x4 ) { // EOF -#ifdef CDR_LOG + CDR_LOG("cdrReadInterrupt() Log: Autopausing read\n"); -#endif + // AddIrqQueue(AUTOPAUSE, 0x2000); AddIrqQueue(CdlPause, 0x2000); } @@ -1434,9 +1441,7 @@ unsigned char cdrRead0(void) { // What means the 0x10 and the 0x08 bits? I only saw it used by the bios cdr.Ctrl |= 0x18; -#ifdef CDR_LOG - CDR_LOG("cdrRead0() Log: CD0 Read: %x\n", cdr.Ctrl); -#endif + CDR_LOG_IO("cdr r0: %02x\n", cdr.Ctrl); return psxHu8(0x1800) = cdr.Ctrl; } @@ -1447,16 +1452,9 @@ cdrWrite0: */ void cdrWrite0(unsigned char rt) { -#ifdef CDR_LOG - CDR_LOG("cdrWrite0() Log: CD0 write: %x\n", rt); -#endif - cdr.Ctrl = (rt & 3) | (cdr.Ctrl & ~3); + CDR_LOG_IO("cdr w0: %02x\n", rt); - if (rt == 0) { - cdr.ParamP = 0; - cdr.ParamC = 0; - cdr.ResultReady = 0; - } + cdr.Ctrl = (rt & 3) | (cdr.Ctrl & ~3); } unsigned char cdrRead1(void) { @@ -1469,20 +1467,16 @@ unsigned char cdrRead1(void) { } else { psxHu8(0x1801) = 0; } -#ifdef CDR_LOG - CDR_LOG("cdrRead1() Log: CD1 Read: %x\n", psxHu8(0x1801)); -#endif + CDR_LOG_IO("cdr r1: %02x\n", psxHu8(0x1801)); + return psxHu8(0x1801); } void cdrWrite1(unsigned char rt) { - char set_loc[3]; + u8 set_loc[3]; int i; -#ifdef CDR_LOG - CDR_LOG("cdrWrite1() Log: CD1 write: %x (%s)\n", rt, CmdName[rt]); -#endif - + CDR_LOG_IO("cdr w1: %02x\n", rt); // Tekken: CDXA fade-out if( (cdr.Ctrl & 3) == 3 ) { @@ -1494,7 +1488,7 @@ void cdrWrite1(unsigned char rt) { cdr.Cmd = rt; cdr.OCUP = 0; -#ifdef CDRCMD_DEBUG +#ifdef CDR_LOG_CMD_IRQ SysPrintf("cdrWrite1() Log: CD1 write: %x (%s)", rt, CmdName[rt]); if (cdr.ParamC) { SysPrintf(" Param[%d] = {", cdr.ParamC); @@ -1508,6 +1502,8 @@ void cdrWrite1(unsigned char rt) { if (cdr.Ctrl & 0x3) return; + cdr.ResultReady = 0; + switch (cdr.Cmd) { case CdlSync: cdr.Ctrl |= 0x80; @@ -1527,17 +1523,14 @@ void cdrWrite1(unsigned char rt) { StopReading(); for (i = 0; i < 3; i++) set_loc[i] = btoi(cdr.Param[i]); + i = abs(msf2sec(cdr.SetSector) - msf2sec(set_loc)); if (i > 16) - cdr.Seeked = FALSE; + cdr.Seeked = SEEK_PENDING; + memcpy(cdr.SetSector, set_loc, 3); cdr.SetSector[3] = 0; - /* - if ((cdr.SetSector[0] | cdr.SetSector[1] | cdr.SetSector[2]) == 0) { - *(u32 *)cdr.SetSector = *(u32 *)cdr.SetSectorSeek; - }*/ - cdr.Ctrl |= 0x80; cdr.Stat = NoIntr; AddIrqQueue(cdr.Cmd, 0x800); @@ -1653,6 +1646,7 @@ void cdrWrite1(unsigned char rt) { case CdlReset: case CdlInit: + cdr.Seeked = SEEK_DONE; StopCdda(); StopReading(); cdr.Ctrl |= 0x80; @@ -1693,9 +1687,8 @@ void cdrWrite1(unsigned char rt) { break; case CdlSetmode: -#ifdef CDR_LOG CDR_LOG("cdrWrite1() Log: Setmode %x\n", cdr.Param[0]); -#endif + cdr.Mode = cdr.Param[0]; cdr.Ctrl |= 0x80; cdr.Stat = NoIntr; @@ -1809,9 +1802,9 @@ void cdrWrite1(unsigned char rt) { break; default: -#ifdef CDR_LOG - CDR_LOG("cdrWrite1() Log: Unknown command: %x\n", cdr.Cmd); -#endif + cdr.ParamP = 0; + cdr.ParamC = 0; + CDR_LOG_I("cdrWrite1() Log: Unknown command: %x\n", cdr.Cmd); return; } if (cdr.Stat != NoIntr) { @@ -1825,19 +1818,15 @@ unsigned char cdrRead2(void) { if (cdr.Readed == 0) { ret = 0; } else { - ret = *cdr.pTransfer++; + ret = *pTransfer++; } -#ifdef CDR_LOG - CDR_LOG("cdrRead2() Log: CD2 Read: %x\n", ret); -#endif + CDR_LOG_IO("cdr r2: %02x\n", ret); return ret; } void cdrWrite2(unsigned char rt) { -#ifdef CDR_LOG - CDR_LOG("cdrWrite2() Log: CD2 write: %x\n", rt); -#endif + CDR_LOG_IO("cdr w2: %02x\n", rt); // Tekken: CDXA fade-out if( (cdr.Ctrl & 3) == 2 ) { @@ -1876,27 +1865,22 @@ unsigned char cdrRead3(void) { } else { psxHu8(0x1803) = 0; } -#ifdef CDR_LOG - CDR_LOG("cdrRead3() Log: CD3 Read: %x\n", psxHu8(0x1803)); -#endif + + CDR_LOG_IO("cdr r3: %02x\n", psxHu8(0x1803)); return psxHu8(0x1803); } void cdrWrite3(unsigned char rt) { -#ifdef CDR_LOG - CDR_LOG("cdrWrite3() Log: CD3 write: %x\n", rt); -#endif + CDR_LOG_IO("cdr w3: %02x\n", rt); // Tekken: CDXA fade-out if( (cdr.Ctrl & 3) == 2 ) { cdr.AttenuatorLeft[1] = rt; } else if( (cdr.Ctrl & 3) == 3 && rt == 0x20 ) { -#ifdef CDR_LOG CDR_LOG( "CD-XA Volume: %X %X | %X %X\n", cdr.AttenuatorLeft[0], cdr.AttenuatorLeft[1], cdr.AttenuatorRight[0], cdr.AttenuatorRight[1] ); -#endif } @@ -1931,7 +1915,7 @@ void cdrWrite3(unsigned char rt) { int time = (cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime; if (Config.CdrReschedule != 2) if (left < time / 2 || Config.CdrReschedule) { // rearmed guesswork hack - //printf("-- resched %d -> %d\n", left, time); + CDR_LOG_I("-- resched %d -> %d\n", left, time); CDREAD_INT(time); } } @@ -1941,16 +1925,16 @@ void cdrWrite3(unsigned char rt) { if (rt == 0x80 && !(cdr.Ctrl & 0x3) && cdr.Readed == 0) { cdr.Readed = 1; - cdr.pTransfer = cdr.Transfer; + pTransfer = cdr.Transfer; switch (cdr.Mode & 0x30) { case MODE_SIZE_2328: case 0x00: - cdr.pTransfer += 12; + pTransfer += 12; break; case MODE_SIZE_2340: - cdr.pTransfer += 0; + pTransfer += 0; break; default: @@ -1964,17 +1948,13 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { int size; u8 *ptr; -#ifdef CDR_LOG CDR_LOG("psxDma3() Log: *** DMA 3 *** %x addr = %x size = %x\n", chcr, madr, bcr); -#endif switch (chcr) { case 0x11000000: case 0x11400100: if (cdr.Readed == 0) { -#ifdef CDR_LOG CDR_LOG("psxDma3() Log: *** DMA 3 *** NOT READY\n"); -#endif break; } @@ -1994,9 +1974,7 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { ptr = (u8 *)PSXM(madr); if (ptr == NULL) { -#ifdef CPU_LOG CDR_LOG("psxDma3() Log: *** DMA 3 *** NULL Pointer!\n"); -#endif break; } @@ -2006,16 +1984,16 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { - CdlPlay - Spams DMA3 and gets buffer overrun */ - size = CD_FRAMESIZE_RAW - (cdr.pTransfer - cdr.Transfer); + size = CD_FRAMESIZE_RAW - (pTransfer - cdr.Transfer); if (size > cdsize) size = cdsize; if (size > 0) { - memcpy(ptr, cdr.pTransfer, size); + memcpy(ptr, pTransfer, size); } psxCpu->Clear(madr, cdsize / 4); - cdr.pTransfer += cdsize; + pTransfer += cdsize; // burst vs normal @@ -2028,9 +2006,7 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { return; default: -#ifdef CDR_LOG CDR_LOG("psxDma3() Log: Unknown cddma %x\n", chcr); -#endif break; } @@ -2052,6 +2028,7 @@ void cdrReset() { cdr.CurTrack = 1; cdr.File = 1; cdr.Channel = 1; + pTransfer = cdr.Transfer; // BIOS player - default values cdr.AttenuatorLeft[0] = 0x80; @@ -2060,9 +2037,8 @@ void cdrReset() { cdr.AttenuatorRight[1] = 0x00; } -int cdrFreeze(gzFile f, int Mode) { - uintptr_t tmp; - +int cdrFreeze(void *f, int Mode) { + u32 tmp; if( Mode == 0 ) { StopCdda(); @@ -2071,12 +2047,12 @@ int cdrFreeze(gzFile f, int Mode) { gzfreeze(&cdr, sizeof(cdr)); if (Mode == 1) - tmp = cdr.pTransfer - cdr.Transfer; + tmp = pTransfer - cdr.Transfer; gzfreeze(&tmp, sizeof(tmp)); if (Mode == 0) { - cdr.pTransfer = cdr.Transfer + tmp; + pTransfer = cdr.Transfer + tmp; if (cdr.Play && !Config.Cdda) CDR_play(cdr.SetSectorPlay);