From b0cf7dd03d0c060ad22b48749612c6da2eb7248b Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Wed, 2 Feb 2011 03:10:33 +0000 Subject: Experimental patches 1- gpu.c We don't emulate bus conflicts. Especially with DMA. Lower vram2mem, mem2vram times (1 -> 0.25) - fixes X-Files videos 2- cdrom.c Duke Nukem - Time to Kill uses CD attenuation values for XA music, speech - fix volume slider 3- cdrom.c Add cdrom dma wrapping - possible Ape Escape additional fixes (>2352 transfers in several places) All disabled - view diff and activate at your own risk (accuracy regressions) git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@62832 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdrom.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++- libpcsxcore/gpu.c | 11 ++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) (limited to 'libpcsxcore') diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index e0abf159..c40a4116 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -488,6 +488,27 @@ void CDXA_Attenuation( s16 *buf, int size ) spsound = buf; +#if 0 + // mono xa attenuation + // - Tales of Phantasia (voice meter) + if( stereo == 0 ) { + s16 temp[32768]; + int dst; + + // TODO: do later + return; + + dst = 0; + for( i = 0; i < size / 2; i++, dst+=2 ) { + temp[dst+0] = spsound[i]; + temp[dst+1] = spsound[i]; + } + + size <<= 1; + memcpy( spsound, temp, size*2 ); + } +#endif + for( i = 0; i < size / 2; i += 2 ) { lc = (spsound[i+0] * cdr.AttenuatorLeft[0] + spsound[i+1] * cdr.AttenuatorRight[1]) / 128; @@ -1575,7 +1596,13 @@ void cdrReadInterrupt() { (cdr.Transfer[4 + 0] == cdr.File)) { int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector); - if (!ret) { + if (!ret) { +#if 0 + // Duke Nukem - Time to Kill - speech, music volume control + // Tekken 3 - post-match fade out + CDXA_Attenuation( cdr.Xa.pcm, cdr.Xa.nsamples, cdr.Xa.stereo ); +#endif + SPU_playADPCMchannel(&cdr.Xa); cdr.FirstSector = 0; @@ -2229,6 +2256,8 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { break; } + +#if 1 /* GS CDX: Enhancement CD crash - Setloc 0:0:0 @@ -2248,6 +2277,51 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { psxCpu->Clear(madr, cdsize / 4); cdr.pTransfer += cdsize; +#else + // fast copy - no wrap + if( cdr.pTransfer + cdsize <= cdr.Transfer + 2352 ) { + memcpy(ptr, cdr.pTransfer, cdsize); + + psxCpu->Clear(madr, cdsize / 4); + cdr.pTransfer += cdsize; + } else { + int lcv; + + /* + CDROM wrapping + + Ape Escape - used several times + Gameshark Lite - opening movie + + Gameshark CDX: enhancement CD patcher + - calls CdlPlay @ 0:2:0 + - spams DMA3 and overruns buffer + */ + + for( lcv = 0; lcv < cdsize; lcv++ ) + { + *(ptr+lcv) = *cdr.pTransfer; + + cdr.pTransfer++; + if( cdr.pTransfer == cdr.Transfer + 2352 ) { + // wrap cdrom ptr + switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { + case MODE_SIZE_2328: + case 0x00: + cdr.pTransfer += 12; + break; + + case MODE_SIZE_2340: + cdr.pTransfer += 0; + break; + } + } + } + + + psxCpu->Clear(madr, cdsize / 4); + } +#endif // burst vs normal diff --git a/libpcsxcore/gpu.c b/libpcsxcore/gpu.c index 773dd0e6..c9512559 100644 --- a/libpcsxcore/gpu.c +++ b/libpcsxcore/gpu.c @@ -122,8 +122,13 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU GPU_readDataMem(ptr, size); psxCpu->Clear(madr, size); +#if 1 // already 32-bit word size ((size * 4) / 4) GPUDMA_INT(size); +#else + // NOTE: no bus conflicts emulated - speed this up + GPUDMA_INT(size/4); +#endif return; case 0x01000201: // mem2vram @@ -141,8 +146,14 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU size = (bcr >> 16) * (bcr & 0xffff); GPU_writeDataMem(ptr, size); +#if 1 // already 32-bit word size ((size * 4) / 4) GPUDMA_INT(size); +#else + // X-Files: use very fast time for movies + // - we don't simulate bus conflicts + GPUDMA_INT( size / 4 ); +#endif return; case 0x01000401: // dma chain -- cgit v1.2.3