improvements to galpani3 rle blitter

This commit is contained in:
davidhay 2008-11-15 13:30:12 +00:00
parent bf8d2c9b0e
commit f00860abfc
2 changed files with 58 additions and 55 deletions

View File

@ -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)

View File

@ -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;