mirror of
https://github.com/holub/mame
synced 2025-05-20 20:58:51 +03:00
improvements to galpani3 rle blitter
This commit is contained in:
parent
bf8d2c9b0e
commit
f00860abfc
@ -446,6 +446,56 @@ UINT16 galpani3_regs1_address_regs[0x20];
|
|||||||
UINT16 galpani3_regs2_address_regs[0x20];
|
UINT16 galpani3_regs2_address_regs[0x20];
|
||||||
UINT16 galpani3_regs3_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 )
|
WRITE16_HANDLER( galpani3_regs1_address_w )
|
||||||
{
|
{
|
||||||
logerror("galpani3_regs1_address_w %04x\n",data);
|
logerror("galpani3_regs1_address_w %04x\n",data);
|
||||||
@ -455,9 +505,10 @@ WRITE16_HANDLER( galpani3_regs1_address_w )
|
|||||||
WRITE16_HANDLER( galpani3_regs1_go_w )
|
WRITE16_HANDLER( galpani3_regs1_go_w )
|
||||||
{
|
{
|
||||||
UINT32 address = galpani3_regs1_address_regs[1]| (galpani3_regs1_address_regs[0]<<16);
|
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 );
|
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 )
|
WRITE16_HANDLER( galpani3_regs2_go_w )
|
||||||
{
|
{
|
||||||
UINT32 address = galpani3_regs2_address_regs[1]| (galpani3_regs2_address_regs[0]<<16);
|
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 );
|
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 )
|
WRITE16_HANDLER( galpani3_regs3_go_w )
|
||||||
{
|
{
|
||||||
UINT32 address = galpani3_regs3_address_regs[1]| (galpani3_regs3_address_regs[0]<<16);
|
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 );
|
printf("galpani3_regs3_go_w? %08x\n",address );
|
||||||
|
gp3_do_rle(address, galpani3_framebuffer3, rledata);
|
||||||
// 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++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_color_555_gp3(running_machine *machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data)
|
static void set_color_555_gp3(running_machine *machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data)
|
||||||
|
@ -322,13 +322,13 @@ static int skns_rle_decode ( running_machine *machine, int romoffset, int size,
|
|||||||
while(size>0) {
|
while(size>0) {
|
||||||
UINT8 code = src[(romoffset++)%srcsize];
|
UINT8 code = src[(romoffset++)%srcsize];
|
||||||
size -= (code & 0x7f) + 1;
|
size -= (code & 0x7f) + 1;
|
||||||
if(code & 0x80) {
|
if(code & 0x80) { /* (code & 0x7f) normal values will follow */
|
||||||
code &= 0x7f;
|
code &= 0x7f;
|
||||||
do {
|
do {
|
||||||
dst[(decodeoffset++)%SUPRNOVA_DECODE_BUFFER_SIZE] = src[(romoffset++)%srcsize];
|
dst[(decodeoffset++)%SUPRNOVA_DECODE_BUFFER_SIZE] = src[(romoffset++)%srcsize];
|
||||||
code--;
|
code--;
|
||||||
} while(code != 0xff);
|
} while(code != 0xff);
|
||||||
} else {
|
} else { /* repeat next value (code & 0x7f) times */
|
||||||
UINT8 val = src[(romoffset++)%srcsize];
|
UINT8 val = src[(romoffset++)%srcsize];
|
||||||
do {
|
do {
|
||||||
dst[(decodeoffset++)%SUPRNOVA_DECODE_BUFFER_SIZE] = val;
|
dst[(decodeoffset++)%SUPRNOVA_DECODE_BUFFER_SIZE] = val;
|
||||||
|
Loading…
Reference in New Issue
Block a user