summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/galpanic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/galpanic.c')
-rw-r--r--src/mame/video/galpanic.c136
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;
+}