X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fmdec.c;h=bed4e53b94f02b53f47851b369c102631fa74ac0;hp=629816bc706e5c07575f574325a345d53cfa2a00;hb=650adfd2da779ba8855623362c2900583e22931e;hpb=528ad661dd07067cbcd6c1beebad63fc36795759 diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c index 629816bc..bed4e53b 100644 --- a/libpcsxcore/mdec.c +++ b/libpcsxcore/mdec.c @@ -219,7 +219,7 @@ struct _pending_dma1 { u32 chcr; }; -struct { +static struct { u32 reg0; u32 reg1; u16 * rl; @@ -436,11 +436,10 @@ static void yuv2rgb24(int *blk, u8 *image) { } void mdecInit(void) { + memset(&mdec, 0, sizeof(mdec)); + memset(iq_y, 0, sizeof(iq_y)); + memset(iq_uv, 0, sizeof(iq_uv)); mdec.rl = (u16 *)&psxM[0x100000]; - mdec.reg0 = 0; - mdec.reg1 = 0; - mdec.pending_dma1.adr = 0; - mdec.block_buffer_pos = 0; } // command register @@ -532,8 +531,11 @@ void psxDma0(u32 adr, u32 bcr, u32 chcr) { void mdec0Interrupt() { - HW_DMA0_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(0); + if (HW_DMA0_CHCR & SWAP32(0x01000000)) + { + HW_DMA0_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(0); + } } #define SIZE_OF_24B_BLOCK (16*16*3) @@ -652,26 +654,48 @@ void mdec1Interrupt() { * */ - /* this else if avoid to read outside memory */ - if(mdec.rl >= mdec.rl_end) { - mdec.reg1 &= ~MDEC1_STP; - HW_DMA0_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(0); - mdec.reg1 &= ~MDEC1_BUSY; - } else if (SWAP16(*(mdec.rl)) == MDEC_END_OF_DATA) { - mdec.reg1 &= ~MDEC1_STP; - HW_DMA0_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(0); - mdec.reg1 &= ~MDEC1_BUSY; + /* MDEC_END_OF_DATA avoids read outside memory */ + if (mdec.rl >= mdec.rl_end || SWAP16(*(mdec.rl)) == MDEC_END_OF_DATA) { + mdec.reg1 &= ~(MDEC1_STP|MDEC1_BUSY); + if (HW_DMA0_CHCR & SWAP32(0x01000000)) + { + HW_DMA0_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(0); + } } - HW_DMA1_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(1); - return; + if (HW_DMA1_CHCR & SWAP32(0x01000000)) + { + HW_DMA1_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(1); + } } -int mdecFreeze(gzFile f, int Mode) { - gzfreeze(&mdec, sizeof(mdec)); +int mdecFreeze(void *f, int Mode) { + u8 *base = (u8 *)&psxM[0x100000]; + 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)); + v = (u8 *)mdec.rl_end - base; + gzfreeze(&v, sizeof(v)); + mdec.rl_end = (u16 *)(base + (v & 0xffffe)); + + v = 0; + if (mdec.block_buffer_pos) + v = mdec.block_buffer_pos - base; + gzfreeze(&v, sizeof(v)); + mdec.block_buffer_pos = 0; + if (v) + mdec.block_buffer_pos = base + (v & 0xfffff); + + gzfreeze(&mdec.block_buffer, sizeof(mdec.block_buffer)); + gzfreeze(&mdec.pending_dma1, sizeof(mdec.pending_dma1)); gzfreeze(iq_y, sizeof(iq_y)); gzfreeze(iq_uv, sizeof(iq_uv));