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
This commit is contained in:
SND\shalma_cp 2011-02-02 03:10:33 +00:00
parent f1da161879
commit b0cf7dd03d
2 changed files with 86 additions and 1 deletions

View File

@ -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

View File

@ -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