diff options
| author | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2011-02-02 03:10:33 +0000 |
|---|---|---|
| committer | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2011-02-02 03:10:33 +0000 |
| commit | b0cf7dd03d0c060ad22b48749612c6da2eb7248b (patch) | |
| tree | 981a40dcc24e813357dffc367aebc842e8b8e542 /libpcsxcore | |
| parent | f1da161879cfb46abd5680203cdc2ffad7870283 (diff) | |
| download | pcsxr-b0cf7dd03d0c060ad22b48749612c6da2eb7248b.tar.gz | |
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
Diffstat (limited to 'libpcsxcore')
| -rw-r--r-- | libpcsxcore/cdrom.c | 76 | ||||
| -rw-r--r-- | libpcsxcore/gpu.c | 11 |
2 files changed, 86 insertions, 1 deletions
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
|
