dma: some timing hacks
authornotaz <notasas@gmail.com>
Thu, 5 Feb 2015 00:36:58 +0000 (02:36 +0200)
committernotaz <notasas@gmail.com>
Thu, 5 Feb 2015 00:36:58 +0000 (02:36 +0200)
untested

libpcsxcore/cdrom.c
libpcsxcore/mdec.c
libpcsxcore/psxdma.c

index 2e6277b..556b512 100644 (file)
@@ -1418,7 +1418,10 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
                                CDRDMA_INT( (cdsize/4) / 4 );
                        }
                        else if( chcr == 0x11000000 ) {
-                               CDRDMA_INT( (cdsize/4) * 1 );
+                               // CDRDMA_INT( (cdsize/4) * 1 );
+                               // halted
+                               psxRegs.cycle += (cdsize/4) * 24/2;
+                               CDRDMA_INT(16);
                        }
                        return;
 
index bed4e53..d6c7ab6 100644 (file)
@@ -32,7 +32,7 @@
  * 320x240x16@60Hz => 9.216 MB/s
  * so 2.0 to 4.0 should be fine.
  */
-#define MDEC_BIAS 2.0f
+#define MDEC_BIAS 2
 
 #define DSIZE                  8
 #define DSIZE2                 (DSIZE * DSIZE)
@@ -545,15 +545,13 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
        int blk[DSIZE2 * 6];
        u8 * image;
        int size;
-       int dmacnt;
+       u32 words;
 
        if (chcr != 0x01000200) return;
 
-       size = (bcr >> 16) * (bcr & 0xffff);
+       words = (bcr >> 16) * (bcr & 0xffff);
        /* size in byte */
-       size *= 4;
-       /* I guess the memory speed is limitating */
-       dmacnt = size;
+       size = words * 4;
 
        if (!(mdec.reg1 & MDEC1_BUSY)) {
                /* add to pending */
@@ -625,7 +623,7 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
        }
        
        /* define the power of mdec */
-       MDECOUTDMA_INT((int) ((dmacnt* MDEC_BIAS)));
+       MDECOUTDMA_INT(words * MDEC_BIAS);
        }
 }
 
index b0f3fba..03ee563 100644 (file)
@@ -220,7 +220,7 @@ void gpuInterrupt() {
 }
 
 void psxDma6(u32 madr, u32 bcr, u32 chcr) {
-       u32 size;
+       u32 words;
        u32 *mem = (u32 *)PSXM(madr);
 
 #ifdef PSXDMA_LOG
@@ -238,7 +238,7 @@ void psxDma6(u32 madr, u32 bcr, u32 chcr) {
                }
 
                // already 32-bit size
-               size = bcr;
+               words = bcr;
 
                while (bcr--) {
                        *mem-- = SWAP32((madr - 4) & 0xffffff);
@@ -246,7 +246,10 @@ void psxDma6(u32 madr, u32 bcr, u32 chcr) {
                }
                mem++; *mem = 0xffffff;
 
-               GPUOTCDMA_INT(size);
+               //GPUOTCDMA_INT(size);
+               // halted
+               psxRegs.cycle += words;
+               GPUOTCDMA_INT(16);
                return;
        }
 #ifdef PSXDMA_LOG