* so 2.0 to 4.0 should be fine.
*/
-/* Was set to 2 before but it would cause issues in R-types and Vandal Hearts videos.
- * Setting it to 6 as dmitrysmagin did fix those... except for Galerians.
- * Galerians needs this to be set to 10 (!!) before it looks properly.
- * I've tried this with a few other games (including R-Types) and so far, this
- * has not backfired.
- * */
+/*
+ * >= 10 for Galerians
+ * <= 18 for "Disney's Treasure Planet"
+ */
#define MDEC_BIAS 10
#define DSIZE 8
int size;
if (chcr != 0x01000201) {
+ log_unhandled("mdec0: invalid dma %08x\n", chcr);
return;
}
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;
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){
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()
int size;
u32 words;
- if (chcr != 0x01000200) return;
+ if (chcr != 0x01000200) {
+ log_unhandled("mdec1: invalid dma %08x\n", chcr);
+ return;
+ }
words = (bcr >> 16) * (bcr & 0xffff);
/* size in byte */
}
}
- /* define the power of mdec */
- MDECOUTDMA_INT(words * MDEC_BIAS);
+ /* define the power of mdec */
+ MDECOUTDMA_INT(words * MDEC_BIAS);
+ /* some CPU stalling */
+ psxRegs.cycle += words;
}
}
}
int mdecFreeze(void *f, int Mode) {
- u8 *base = (u8 *)&psxM[0x100000];
+ u8 *base = (u8 *)psxM;
u32 v;
gzfreeze(&mdec.reg0, sizeof(mdec.reg0));
gzfreeze(&mdec.reg1, sizeof(mdec.reg1));
- // old code used to save raw pointers..
v = (u8 *)mdec.rl - base;
gzfreeze(&v, sizeof(v));
- mdec.rl = (u16 *)(base + (v & 0xffffe));
+ mdec.rl = (u16 *)(base + (v & 0x1ffffe));
v = (u8 *)mdec.rl_end - base;
gzfreeze(&v, sizeof(v));
- mdec.rl_end = (u16 *)(base + (v & 0xffffe));
+ mdec.rl_end = (u16 *)(base + (v & 0x1ffffe));
v = 0;
if (mdec.block_buffer_pos)
- v = mdec.block_buffer_pos - base;
+ v = mdec.block_buffer_pos - mdec.block_buffer;
gzfreeze(&v, sizeof(v));
mdec.block_buffer_pos = 0;
- if (v)
- mdec.block_buffer_pos = base + (v & 0xfffff);
+ if (v && v < sizeof(mdec.block_buffer))
+ mdec.block_buffer_pos = mdec.block_buffer;
gzfreeze(&mdec.block_buffer, sizeof(mdec.block_buffer));
gzfreeze(&mdec.pending_dma1, sizeof(mdec.pending_dma1));