X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fmdec.c;h=ca42458567137d749a93c62e26eb0cfd201dc4db;hb=d5aeda23720ba9374312f8d387f299024fedb7e6;hp=cd8d3bf0013a16343395b61ffa53b48dbf79f3d6;hpb=8e1040b6a82ee1802fda83d4de84290a02656cc0;p=pcsx_rearmed.git diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c index cd8d3bf0..ca424585 100644 --- a/libpcsxcore/mdec.c +++ b/libpcsxcore/mdec.c @@ -32,7 +32,12 @@ * 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;