easier logging of unhandled stuff
[pcsx_rearmed.git] / libpcsxcore / mdec.c
index cd8d3bf..ca42458 100644 (file)
  * 320x240x16@60Hz => 9.216 MB/s
  * so 2.0 to 4.0 should be fine.
  */
-#define MDEC_BIAS 2.0f
+/*
+ * >= 10 for Galerians
+ * <= 18 for "Disney's Treasure Planet"
+ */
+#define MDEC_BIAS 10
 
 #define DSIZE                  8
 #define DSIZE2                 (DSIZE * DSIZE)
@@ -480,7 +485,7 @@ void psxDma0(u32 adr, u32 bcr, u32 chcr) {
        size = (bcr >> 16) * (bcr & 0xffff);
 
        switch (cmd >> 28) {
-               case 0x3: // decode
+               case 0x3: // decode 15/24bpp
                        mdec.rl = (u16 *) PSXM(adr);
                        /* now the mdec is busy till all data are decoded */
                        mdec.reg1 |= MDEC1_BUSY;
@@ -488,10 +493,8 @@ void psxDma0(u32 adr, u32 bcr, u32 chcr) {
                        mdec.rl_end = mdec.rl + (size * 2);
 
                        /* sanity check */
-                       if(mdec.rl_end <= mdec.rl) {
-                               MDECINDMA_INT( size / 4 );
-                               return;
-                       }
+                       if(mdec.rl_end <= mdec.rl)
+                               break;
 
                        /* process the pending dma1 */
                        if(mdec.pending_dma1.adr){
@@ -510,23 +513,18 @@ void psxDma0(u32 adr, u32 bcr, u32 chcr) {
                                iqtab_init(iq_y, p);
                                iqtab_init(iq_uv, p + 64);
                        }
-
-                       MDECINDMA_INT( size / 4 );
-      return;
+                       break;
 
                case 0x6: // cosine table
                        // printf("mdec cosine table\n");
-
-                       MDECINDMA_INT( size / 4 );
-      return;
+                       break;
 
                default:
-                       // printf("mdec unknown command\n");
+                       log_unhandled("mdec: unknown command %08x\n", cmd);
                        break;
        }
 
-       HW_DMA0_CHCR &= SWAP32(~0x01000000);
-       DMA_INTERRUPT(0);
+       MDECINDMA_INT(size);
 }
 
 void mdec0Interrupt()
@@ -545,15 +543,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 */
@@ -624,8 +620,10 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
                }
        }
        
-       /* define the power of mdec */
-       MDECOUTDMA_INT((int) ((dmacnt* MDEC_BIAS)));
+               /* define the power of mdec */
+               MDECOUTDMA_INT(words * MDEC_BIAS);
+               /* some CPU stalling */
+               psxRegs.cycle += words;
        }
 }
 
@@ -671,7 +669,7 @@ void mdec1Interrupt() {
        }
 }
 
-int mdecFreeze(gzFile f, int Mode) {
+int mdecFreeze(void *f, int Mode) {
        u8 *base = (u8 *)&psxM[0x100000];
        u32 v;