diff --git a/src/mame/drivers/galpani3.c b/src/mame/drivers/galpani3.c index 17f769a1dcd..ba2667a71ab 100644 --- a/src/mame/drivers/galpani3.c +++ b/src/mame/drivers/galpani3.c @@ -446,6 +446,56 @@ UINT16 galpani3_regs1_address_regs[0x20]; UINT16 galpani3_regs2_address_regs[0x20]; UINT16 galpani3_regs3_address_regs[0x20]; +void gp3_do_rle(UINT32 address, UINT16*framebuffer, UINT8* rledata) +{ + int rle_count = 0; + int normal_count = 0; + UINT32 dstaddress = 0; + + UINT8 thebyte; + + while (dstaddress<0x40000) + { + if (rle_count==0 && normal_count==0) // we need a new code byte + { + thebyte = rledata[address]; + + if ((thebyte & 0x80)) // stream of normal bytes follows + { + normal_count = (thebyte & 0x7f)+1; + address++; + } + else // rle block + { + rle_count = (thebyte & 0x7f)+1; + address++; + } + } + else if (rle_count) + { + thebyte = rledata[address]; + framebuffer[dstaddress] = thebyte; + dstaddress++; + rle_count--; + + if (rle_count==0) + { + address++; + } + } + else if (normal_count) + { + thebyte = rledata[address]; + framebuffer[dstaddress] = thebyte; + dstaddress++; + normal_count--; + address++; + + } + } + +} + WRITE16_HANDLER( galpani3_regs1_address_w ) { logerror("galpani3_regs1_address_w %04x\n",data); @@ -455,9 +505,10 @@ WRITE16_HANDLER( galpani3_regs1_address_w ) WRITE16_HANDLER( galpani3_regs1_go_w ) { UINT32 address = galpani3_regs1_address_regs[1]| (galpani3_regs1_address_regs[0]<<16); + UINT8* rledata = memory_region(space->machine,"gfx2"); printf("galpani3_regs1_go_w? %08x\n",address ); - + gp3_do_rle(address, galpani3_framebuffer1, rledata); } @@ -470,11 +521,10 @@ WRITE16_HANDLER( galpani3_regs2_address_w ) WRITE16_HANDLER( galpani3_regs2_go_w ) { UINT32 address = galpani3_regs2_address_regs[1]| (galpani3_regs2_address_regs[0]<<16); + UINT8* rledata = memory_region(space->machine,"gfx2"); printf("galpani3_regs2_go_w? %08x\n", address ); - - - + gp3_do_rle(address, galpani3_framebuffer2, rledata); } @@ -488,57 +538,10 @@ WRITE16_HANDLER( galpani3_regs3_address_w ) WRITE16_HANDLER( galpani3_regs3_go_w ) { UINT32 address = galpani3_regs3_address_regs[1]| (galpani3_regs3_address_regs[0]<<16); + UINT8* rledata = memory_region(space->machine,"gfx2"); printf("galpani3_regs3_go_w? %08x\n",address ); - - // this is WRONG.. - //if (address==0) - { - UINT8* rledata = memory_region(space->machine,"gfx2"); - int rlecount =0; - UINT32 dstaddress = 0; - - UINT8 thebyte; - - while (dstaddress<0x40000) - { - if (rlecount==0) - { - thebyte = rledata[address]; - - printf("thebyte is %02x",thebyte); - - if (thebyte & 0x80) - { - printf("(normal data)\n"); - galpani3_framebuffer3[dstaddress] = thebyte & 0x7f; - dstaddress++; - address++; - // normal data - } - else - { - printf("(rle command)\n"); - // rledata - rlecount = thebyte; - address++; - } - } - else - { - thebyte = rledata[address]; - galpani3_framebuffer3[dstaddress] = thebyte & 0x7f; - dstaddress++; - rlecount--; - - if (rlecount==0) - { - address++; - } - } - } - - } + gp3_do_rle(address, galpani3_framebuffer3, rledata); } static void set_color_555_gp3(running_machine *machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data) diff --git a/src/mame/video/suprnova.c b/src/mame/video/suprnova.c index d696b51c216..8ff286b98e4 100644 --- a/src/mame/video/suprnova.c +++ b/src/mame/video/suprnova.c @@ -322,13 +322,13 @@ static int skns_rle_decode ( running_machine *machine, int romoffset, int size, while(size>0) { UINT8 code = src[(romoffset++)%srcsize]; size -= (code & 0x7f) + 1; - if(code & 0x80) { + if(code & 0x80) { /* (code & 0x7f) normal values will follow */ code &= 0x7f; do { dst[(decodeoffset++)%SUPRNOVA_DECODE_BUFFER_SIZE] = src[(romoffset++)%srcsize]; code--; } while(code != 0xff); - } else { + } else { /* repeat next value (code & 0x7f) times */ UINT8 val = src[(romoffset++)%srcsize]; do { dst[(decodeoffset++)%SUPRNOVA_DECODE_BUFFER_SIZE] = val;