summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2011-02-02 14:42:02 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2011-02-02 14:42:02 +0000
commit8162b50769bd9afaf9e05d0bb5cfe7de20790354 (patch)
tree119eb44d1aebe5f22354c78108d1362babf8633f /libpcsxcore
parentb0cf7dd03d0c060ad22b48749612c6da2eb7248b (diff)
downloadpcsxr-8162b50769bd9afaf9e05d0bb5cfe7de20790354.tar.gz
Experimental patches
- gpu.c - use 1/3x dma time (max time allowed by X-Files - system interrupt timing) - cdrom.c - fix dma wrap pointers Disabled by default - enable yourself for now git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@62840 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/cdrom.c43
-rw-r--r--libpcsxcore/gpu.c10
2 files changed, 32 insertions, 21 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c
index c40a4116..fc8a7931 100644
--- a/libpcsxcore/cdrom.c
+++ b/libpcsxcore/cdrom.c
@@ -97,6 +97,7 @@ unsigned char Test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 };
#define MODE_STRSND (1<<6) // 0x40 ADPCM on/off
#define MODE_SIZE_2340 (1<<5) // 0x20
#define MODE_SIZE_2328 (1<<4) // 0x10
+#define MODE_SIZE_2048 (0<<4) // 0x00
#define MODE_SF (1<<3) // 0x08 channel on/off
#define MODE_REPORT (1<<2) // 0x04
#define MODE_AUTOPAUSE (1<<1) // 0x02
@@ -2200,9 +2201,9 @@ void cdrWrite3(unsigned char rt) {
cdr.Readed = 1;
cdr.pTransfer = cdr.Transfer;
- switch (cdr.Mode & 0x30) {
- case MODE_SIZE_2328:
- case 0x00:
+ switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) {
+ case MODE_SIZE_2328:
+ case MODE_SIZE_2048:
cdr.pTransfer += 12;
break;
@@ -2218,7 +2219,7 @@ void cdrWrite3(unsigned char rt) {
void psxDma3(u32 madr, u32 bcr, u32 chcr) {
u32 cdsize;
- u8 *ptr;
+ u8 *ptr, *cdwrap_ptr;
#ifdef CDR_LOG
CDR_LOG("psxDma3() Log: *** DMA 3 *** %x addr = %x size = %x\n", chcr, madr, bcr);
@@ -2240,10 +2241,10 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
// - fix boot
if( cdsize == 0 )
{
- switch (cdr.Mode & 0x30) {
- case 0x00: cdsize = 2048; break;
- case MODE_SIZE_2328: cdsize = 2328; break;
+ switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) {
case MODE_SIZE_2340: cdsize = 2340; break;
+ case MODE_SIZE_2328: cdsize = 2328; break;
+ case MODE_SIZE_2048: cdsize = 2048; break;
}
}
@@ -2278,8 +2279,16 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
psxCpu->Clear(madr, cdsize / 4);
cdr.pTransfer += cdsize;
#else
+ cdwrap_ptr = cdr.Transfer;
+ switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) {
+ case MODE_SIZE_2340: cdwrap_ptr += 2340; break;
+ case MODE_SIZE_2328: cdwrap_ptr += 12 + 2328; break;
+ case MODE_SIZE_2048: cdwrap_ptr += 12 + 2048; break;
+ }
+
+
// fast copy - no wrap
- if( cdr.pTransfer + cdsize <= cdr.Transfer + 2352 ) {
+ if( cdr.pTransfer + cdsize <= cdwrap_ptr ) {
memcpy(ptr, cdr.pTransfer, cdsize);
psxCpu->Clear(madr, cdsize / 4);
@@ -2300,22 +2309,24 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
for( lcv = 0; lcv < cdsize; lcv++ )
{
- *(ptr+lcv) = *cdr.pTransfer;
-
- cdr.pTransfer++;
- if( cdr.pTransfer == cdr.Transfer + 2352 ) {
- // wrap cdrom ptr
+ // wrap cdrom ptr
+ if( cdr.pTransfer == cdwrap_ptr ) {
switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) {
case MODE_SIZE_2328:
- case 0x00:
- cdr.pTransfer += 12;
+ case MODE_SIZE_2048:
+ cdr.pTransfer = cdr.Transfer + 12;
break;
case MODE_SIZE_2340:
- cdr.pTransfer += 0;
+ cdr.pTransfer = cdr.Transfer + 0;
break;
}
}
+
+
+ *(ptr+lcv) = *cdr.pTransfer;
+
+ cdr.pTransfer++;
}
diff --git a/libpcsxcore/gpu.c b/libpcsxcore/gpu.c
index c9512559..ff3426f3 100644
--- a/libpcsxcore/gpu.c
+++ b/libpcsxcore/gpu.c
@@ -126,8 +126,8 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
// already 32-bit word size ((size * 4) / 4)
GPUDMA_INT(size);
#else
- // NOTE: no bus conflicts emulated - speed this up
- GPUDMA_INT(size/4);
+ // Possible DMA burst + overhead
+ GPUDMA_INT(size/3);
#endif
return;
@@ -150,9 +150,9 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
// 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 );
+ // Possible DMA burst + overhead
+ // - X-Files = 0.333333x max for videos
+ GPUDMA_INT( size / 3 );
#endif
return;