diff options
| author | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-02-12 22:21:19 +0000 |
|---|---|---|
| committer | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-02-12 22:21:19 +0000 |
| commit | de0b6f626f0fac7f4c35d92736b176f04300b933 (patch) | |
| tree | dcfdc4eb1dc6db4c9c48f9017e2336ba1cdaf435 /libpcsxcore/cdrom.c | |
| parent | 92337c525e17a76dc896a11c4ddd0f7595bd7bd0 (diff) | |
Fixed MKT music resume issue #9524 by checking if CDDA mode is enabled when 0x1b command is issued. Refaktored CDROM debug logs.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@82833 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore/cdrom.c')
| -rwxr-xr-x | libpcsxcore/cdrom.c | 195 |
1 files changed, 115 insertions, 80 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 1377f2a4..1dac1f6f 100755 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -25,24 +25,6 @@ #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; /* CD-ROM magic numbers */ @@ -56,27 +38,27 @@ cdrStruct cdr; #define CdlStandby 7 #define CdlStop 8 #define CdlPause 9 -#define CdlInit 10 -#define CdlMute 11 -#define CdlDemute 12 -#define CdlSetfilter 13 -#define CdlSetmode 14 -#define CdlGetmode 15 -#define CdlGetlocL 16 -#define CdlGetlocP 17 -#define CdlReadT 18 -#define CdlGetTN 19 -#define CdlGetTD 20 -#define CdlSeekL 21 -#define CdlSeekP 22 -#define CdlSetclock 23 -#define CdlGetclock 24 -#define CdlTest 25 -#define CdlID 26 -#define CdlReadS 27 -#define CdlReset 28 -#define CdlGetQ 29 -#define CdlReadToc 30 +#define CdlInit 10 // 0xa +#define CdlMute 11 // 0xb +#define CdlDemute 12 // 0xc +#define CdlSetfilter 13 // 0xd +#define CdlSetmode 14 // 0xe +#define CdlGetmode 15 // 0xf +#define CdlGetlocL 16 // 0x10 +#define CdlGetlocP 17 // 0x11 +#define CdlReadT 18 // 0x12 +#define CdlGetTN 19 // 0x13 +#define CdlGetTD 20 // 0x14 +#define CdlSeekL 21 // 0x15 +#define CdlSeekP 22 // 0x16 +#define CdlSetclock 23 // 0x17 +#define CdlGetclock 24 // 0x18 +#define CdlTest 25 // 0x19 +#define CdlID 26 // 0x1a +#define CdlReadS 27 // 0x1b +#define CdlReset 28 // 0x1c +#define CdlGetQ 29 // 0x1d +#define CdlReadToc 30 // 0x1e char *CmdName[0x100]= { "CdlSync", "CdlNop", "CdlSetloc", "CdlPlay", @@ -394,6 +376,9 @@ static void Find_CurTrack(const u8 *time) if (sect - current >= 150) break; } +#ifdef CDR_LOG + CDR_LOG("Find_CurTrack *** %02d %02d\n", cdr.CurTrack, current); +#endif } static void generate_subq(const u8 *time) @@ -457,7 +442,9 @@ static void ReadTrack(const u8 *time) { if (memcmp(cdr.Prev, tmp, 3) == 0) return; +#ifdef CDR_LOG CDR_LOG("ReadTrack *** %02x:%02x:%02x\n", tmp[0], tmp[1], tmp[2]); +#endif cdr.RErr = CDR_readTrack(tmp); memcpy(cdr.Prev, tmp, 3); @@ -475,18 +462,22 @@ static void ReadTrack(const u8 *time) { memcpy(cdr.subq.Absolute, subq->AbsoluteAddress, 3); } else { - CDR_LOG_I("subq bad crc @%02x:%02x:%02x\n", +#ifdef CDR_LOG_IO + CDR_LOG_IO("subq bad crc @%02x:%02x:%02x\n", tmp[0], tmp[1], tmp[2]); +#endif } } else { generate_subq(time); } +#ifdef CDR_LOG CDR_LOG(" -> %02x,%02x %02x:%02x:%02x %02x:%02x:%02x\n", cdr.subq.Track, cdr.subq.Index, cdr.subq.Relative[0], cdr.subq.Relative[1], cdr.subq.Relative[2], cdr.subq.Absolute[0], cdr.subq.Absolute[1], cdr.subq.Absolute[2]); +#endif } static void AddIrqQueue(unsigned short irq, unsigned long ecycle) { @@ -496,8 +487,9 @@ static void AddIrqQueue(unsigned short irq, unsigned long ecycle) { CDR_INT(ecycle); return; } - - CDR_LOG_I("cdr: override cmd %02x -> %02x\n", cdr.Irq, irq); +#ifdef CDR_LOG_IO + CDR_LOG_IO("cdr: override cmd %02x -> %02x\n", cdr.Irq, irq); +#endif } cdr.Irq = irq; @@ -509,8 +501,9 @@ static void AddIrqQueue(unsigned short irq, unsigned long ecycle) { static void cdrPlayInterrupt_Autopause() { if ((cdr.Mode & MODE_AUTOPAUSE) && cdr.TrackChanged) { +#ifdef CDR_LOG CDR_LOG( "CDDA STOP\n" ); - +#endif // Magic the Gathering // - looping territory cdda @@ -576,10 +569,10 @@ void cdrPlayInterrupt() } if (!cdr.Play) return; - +#ifdef CDR_LOG CDR_LOG( "CDDA - %d:%d:%d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); - +#endif if (memcmp(cdr.SetSectorPlay, cdr.SetSectorEnd, 3) == 0) { StopCdda(); cdr.TrackChanged = TRUE; @@ -644,7 +637,9 @@ void cdrInterrupt() { } cdr.Irq = 0; - +#ifdef CDR_LOG + CDR_LOG("CDRINT %x %x %x %x\n", cdr.Seeked, cdr.Stat, Irq, cdr.IrqRepeated); +#endif switch (Irq) { case CdlSync: // TOOD: sometimes/always return error? @@ -671,8 +666,10 @@ void cdrInterrupt() { // - Pause player, hit Track 01/02/../xx (Setloc issued!!) if (cdr.ParamC == 0 || cdr.Param[0] == 0) { +#ifdef CDR_LOG CDR_LOG("PLAY Resume @ %d:%d:%d\n", cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2]); +#endif } else { @@ -681,7 +678,9 @@ void cdrInterrupt() { if (track <= cdr.ResultTN[1]) cdr.CurTrack = track; +#ifdef CDR_LOG CDR_LOG("PLAY track %d\n", cdr.CurTrack); +#endif if (CDR_getTD((u8)cdr.CurTrack, cdr.ResultTD) != -1) { cdr.SetSectorPlay[0] = cdr.ResultTD[2]; @@ -782,6 +781,8 @@ void cdrInterrupt() { break; case CdlPause: + cdr.StatP |= STATUS_READ; + cdr.Result[0] = cdr.StatP; /* Gundam Battle Assault 2: much slower (*) - Fixes boot, gameplay @@ -796,6 +797,7 @@ void cdrInterrupt() { cdr.Ctrl |= 0x80; break; + case CdlPause + 0x100: cdr.StatP &= ~STATUS_READ; cdr.Result[0] = cdr.StatP; @@ -969,7 +971,9 @@ void cdrInterrupt() { case CdlGetQ: // TODO? - CDR_LOG_I("got CdlGetQ\n"); +#ifdef CDR_LOG + CDR_LOG("got CdlGetQ\n"); +#endif break; case CdlReadToc: @@ -988,11 +992,19 @@ void cdrInterrupt() { cdr.Reading = 1; cdr.FirstSector = 1; - // Fighting Force 2 - update subq time immediately - // - fixes new game - Find_CurTrack(cdr.SetSector); - ReadTrack(cdr.SetSector); - + // Mortal Kombat Trilogy - resume CDDA playback from pause + if ((cdr.Mode & MODE_CDDA)) { +#ifdef CDR_LOG + CDR_LOG("Resuming CDDA playback at track %d.\n", cdr.CurTrack); +#endif + AddIrqQueue(CdlPlay, cdReadTime * 75 / 4); + break; + } else { + // Fighting Force 2 - update subq time immediately + // - fixes new game + Find_CurTrack(cdr.SetSector); + ReadTrack(cdr.SetSector); + } // Crusaders of Might and Magic - update getlocl now // - fixes cutscene speech @@ -1029,7 +1041,9 @@ void cdrInterrupt() { break; default: - CDR_LOG_I("Invalid command: %02x\n", Irq); +#ifdef CDR_LOG + CDR_LOG("Invalid command: %02x\n", Irq); +#endif error = ERROR_INVALIDCMD; // FALLTHROUGH @@ -1063,14 +1077,14 @@ finish: setIrq(); cdr.ParamC = 0; -#ifdef CDR_LOG_CMD_IRQ +#ifdef CDR_LOG_IO { int i; - SysPrintf("CDR IRQ %d cmd %02x stat %02x: ", + CDR_LOG_IO("CDR IRQ %d cmd %02x stat %02x: ", !!(cdr.Stat & cdr.Reg2), Irq, cdr.Stat); for (i = 0; i < cdr.ResultC; i++) - SysPrintf("%02x ", cdr.Result[i]); - SysPrintf("\n"); + CDR_LOG_IO("%02x ", cdr.Result[i]); + CDR_LOG_IO("\n"); } #endif } @@ -1152,7 +1166,9 @@ void cdrReadInterrupt() { cdr.RErr = -1; if (cdr.RErr == -1) { - CDR_LOG_I("cdrReadInterrupt() Log: err\n"); +#ifdef CDR_LOG + CDR_LOG("cdrReadInterrupt() Log: err\n"); +#endif memset(cdr.Transfer, 0, DATA_SIZE); cdr.Stat = DiskError; cdr.Result[0] |= STATUS_ERROR; @@ -1163,8 +1179,9 @@ void cdrReadInterrupt() { memcpy(cdr.Transfer, buf, DATA_SIZE); CheckPPFCache(cdr.Transfer, cdr.Prev[0], cdr.Prev[1], cdr.Prev[2]); - +#ifdef CDR_LOG CDR_LOG("cdrReadInterrupt() Log: cdr.Transfer %x:%x:%x\n", cdr.Transfer[0], cdr.Transfer[1], cdr.Transfer[2]); +#endif if ((!cdr.Muted) && (cdr.Mode & MODE_STRSND) && (!Config.Xa) && (cdr.FirstSector != -1)) { // CD-XA // Firemen 2: Multi-XA files - briefings, cutscenes @@ -1241,14 +1258,16 @@ 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_IO CDR_LOG_IO("cdr r0: %02x\n", cdr.Ctrl); - +#endif return psxHu8(0x1800) = cdr.Ctrl; } void cdrWrite0(unsigned char rt) { +#ifdef CDR_LOG_IO CDR_LOG_IO("cdr w0: %02x\n", rt); - +#endif cdr.Ctrl = (rt & 3) | (cdr.Ctrl & ~3); } @@ -1260,18 +1279,18 @@ unsigned char cdrRead1(void) { cdr.ResultP++; if (cdr.ResultP == cdr.ResultC) cdr.ResultReady = 0; - +#ifdef CDR_LOG_IO CDR_LOG_IO("cdr r1: %02x\n", psxHu8(0x1801)); - +#endif return psxHu8(0x1801); } void cdrWrite1(unsigned char rt) { u8 set_loc[3]; int i; - +#ifdef CDR_LOG_IO CDR_LOG_IO("cdr w1: %02x\n", rt); - +#endif switch (cdr.Ctrl & 3) { case 0: break; @@ -1285,15 +1304,15 @@ void cdrWrite1(unsigned char rt) { cdr.Cmd = rt; cdr.OCUP = 0; -#ifdef CDR_LOG_CMD_IRQ - SysPrintf("CD1 write: %x (%s)", rt, CmdName[rt]); +#ifdef CDR_LOG_IO + CDR_LOG_IO("CD1 write: %x (%s)", rt, CmdName[rt]); if (cdr.ParamC) { - SysPrintf(" Param[%d] = {", cdr.ParamC); + CDR_LOG_IO(" Param[%d] = {", cdr.ParamC); for (i = 0; i < cdr.ParamC; i++) - SysPrintf(" %x,", cdr.Param[i]); - SysPrintf("}\n"); + CDR_LOG_IO(" %x,", cdr.Param[i]); + CDR_LOG_IO("}\n"); } else { - SysPrintf("\n"); + CDR_LOG_IO("\n"); } #endif @@ -1335,16 +1354,17 @@ void cdrWrite1(unsigned char rt) { StopReading(); break; - case CdlSetmode: + case CdlSetmode: +#ifdef CDR_LOG CDR_LOG("cdrWrite1() Log: Setmode %x\n", cdr.Param[0]); - - cdr.Mode = cdr.Param[0]; +#endif + cdr.Mode = cdr.Param[0]; // Squaresoft on PlayStation 1998 Collector's CD Vol. 1 // - fixes choppy movie sound if( cdr.Play && (cdr.Mode & MODE_CDDA) == 0 ) StopCdda(); - break; + break; } } @@ -1358,14 +1378,16 @@ unsigned char cdrRead2(void) { cdr.transferIndex++; adjustTransferIndex(); } - +#ifdef CDR_LOG_IO CDR_LOG_IO("cdr r2: %02x\n", ret); +#endif return ret; } void cdrWrite2(unsigned char rt) { +#ifdef CDR_LOG_IO CDR_LOG_IO("cdr w2: %02x\n", rt); - +#endif switch (cdr.Ctrl & 3) { case 0: if (cdr.ParamC < 8) // FIXME: size and wrapping @@ -1389,14 +1411,16 @@ unsigned char cdrRead3(void) { psxHu8(0x1803) = cdr.Stat | 0xE0; else psxHu8(0x1803) = cdr.Reg2 | 0xE0; - +#ifdef CDR_LOG_IO CDR_LOG_IO("cdr r3: %02x\n", psxHu8(0x1803)); +#endif return psxHu8(0x1803); } void cdrWrite3(unsigned char rt) { +#ifdef CDR_LOG_IO CDR_LOG_IO("cdr w3: %02x\n", rt); - +#endif switch (cdr.Ctrl & 3) { case 0: break; // transfer @@ -1412,9 +1436,11 @@ void cdrWrite3(unsigned char rt) { case 3: if (rt & 0x20) { memcpy(&cdr.AttenuatorLeftToLeft, &cdr.AttenuatorLeftToLeftT, 4); - CDR_LOG_I("CD-XA Volume: %02x %02x | %02x %02x\n", +#ifdef CDR_LOG_IO + CDR_LOG_IO("CD-XA Volume: %02x %02x | %02x %02x\n", cdr.AttenuatorLeftToLeft, cdr.AttenuatorLeftToRight, cdr.AttenuatorRightToLeft, cdr.AttenuatorRightToRight); +#endif } return; } @@ -1444,13 +1470,18 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { int i; 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; } @@ -1471,7 +1502,9 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { ptr = (u8 *)PSXM(madr); if (ptr == NULL) { +#ifdef CDR_LOG CDR_LOG("psxDma3() Log: *** DMA 3 *** NULL Pointer!\n"); +#endif break; } @@ -1499,7 +1532,9 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { return; default: +#ifdef CDR_LOG CDR_LOG("psxDma3() Log: Unknown cddma %x\n", chcr); +#endif break; } |
