diff options
Diffstat (limited to 'src/mame/video/galpanic.c')
-rw-r--r-- | src/mame/video/galpanic.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/src/mame/video/galpanic.c b/src/mame/video/galpanic.c new file mode 100644 index 00000000000..6ee7f201356 --- /dev/null +++ b/src/mame/video/galpanic.c @@ -0,0 +1,136 @@ +#include "driver.h" +#include "kan_pand.h" + +UINT16 *galpanic_bgvideoram,*galpanic_fgvideoram; +size_t galpanic_fgvideoram_size; + +static mame_bitmap *sprites_bitmap; + +VIDEO_START( galpanic ) +{ + tmpbitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format); + sprites_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format); + + pandora_start(0,0, -16); +} + +PALETTE_INIT( galpanic ) +{ + int i; + + /* first 1024 colors are dynamic */ + + /* initialize 555 RGB lookup */ + for (i = 0;i < 32768;i++) + palette_set_color_rgb(machine,i+1024,pal5bit(i >> 5),pal5bit(i >> 10),pal5bit(i >> 0)); +} + + + +WRITE16_HANDLER( galpanic_bgvideoram_w ) +{ + int sx,sy; + + + data = COMBINE_DATA(&galpanic_bgvideoram[offset]); + + sy = offset / 256; + sx = offset % 256; + + *BITMAP_ADDR16(tmpbitmap, sy, sx) = Machine->pens[1024 + (data >> 1)]; +} + +WRITE16_HANDLER( galpanic_paletteram_w ) +{ + data = COMBINE_DATA(&paletteram16[offset]); + /* bit 0 seems to be a transparency flag for the front bitmap */ + palette_set_color_rgb(Machine,offset,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1)); +} + + +static void comad_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + int offs; + int sx=0, sy=0; + + for (offs = 0;offs < spriteram_size/2;offs += 4) + { + int code,color,flipx,flipy; + + code = spriteram16[offs + 1] & 0x1fff; + color = (spriteram16[offs] & 0x003c) >> 2; + flipx = spriteram16[offs] & 0x0002; + flipy = spriteram16[offs] & 0x0001; + + if((spriteram16[offs] & 0x6000) == 0x6000) /* Link bits */ + { + sx += spriteram16[offs + 2] >> 6; + sy += spriteram16[offs + 3] >> 6; + } + else + { + sx = spriteram16[offs + 2] >> 6; + sy = spriteram16[offs + 3] >> 6; + } + + sx = (sx&0x1ff) - (sx&0x200); + sy = (sy&0x1ff) - (sy&0x200); + + drawgfx(bitmap,machine->gfx[0], + code, + color, + flipx,flipy, + sx,sy, + cliprect,TRANSPARENCY_PEN,0); + } +} + +static void draw_fgbitmap(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + int offs; + + for (offs = 0;offs < galpanic_fgvideoram_size/2;offs++) + { + int sx,sy,color; + + sx = offs % 256; + sy = offs / 256; + color = galpanic_fgvideoram[offs]; + if (color) + *BITMAP_ADDR16(bitmap, sy, sx) = machine->pens[color]; + } +} + +VIDEO_UPDATE( galpanic ) +{ + /* copy the temporary bitmap to the screen */ + copybitmap(bitmap,tmpbitmap,0,0,0,0,cliprect,TRANSPARENCY_NONE,0); + + draw_fgbitmap(machine, bitmap, cliprect); + + pandora_update(machine,bitmap,cliprect); + + return 0; +} + +VIDEO_UPDATE( comad ) +{ + /* copy the temporary bitmap to the screen */ + copybitmap(bitmap,tmpbitmap,0,0,0,0,cliprect,TRANSPARENCY_NONE,0); + + draw_fgbitmap(machine,bitmap,cliprect); + + +// if(galpanic_clear_sprites) + { + fillbitmap(sprites_bitmap,0,cliprect); + comad_draw_sprites(machine,bitmap,cliprect); + } +// else +// { +// /* keep sprites on the bitmap without clearing them */ +// comad_draw_sprites(machine,sprites_bitmap,0); +// copybitmap(bitmap,sprites_bitmap,0,0,0,0,cliprect,TRANSPARENCY_PEN,0); +// } + return 0; +} |