summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/pktgaldx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/pktgaldx.c')
-rw-r--r--src/mame/video/pktgaldx.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/mame/video/pktgaldx.c b/src/mame/video/pktgaldx.c
new file mode 100644
index 00000000000..565fcc8f2b4
--- /dev/null
+++ b/src/mame/video/pktgaldx.c
@@ -0,0 +1,158 @@
+#include "driver.h"
+#include "deco16ic.h"
+
+UINT16* pcktgaldb_fgram;
+UINT16* pcktgaldb_sprites;
+
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect)
+{
+ int offs;
+ int flipscreen=!flip_screen;
+
+ for (offs = 0;offs < 0x400;offs += 4)
+ {
+ int x,y,sprite,colour,multi,fx,fy,inc,flash,mult;
+
+ sprite = spriteram16[offs+1];
+ if (!sprite) continue;
+
+ y = spriteram16[offs];
+ flash=y&0x1000;
+ if (flash && (cpu_getcurrentframe() & 1)) continue;
+
+ x = spriteram16[offs+2];
+ colour = (x >>9) & 0x1f;
+
+ fx = y & 0x2000;
+ fy = y & 0x4000;
+ multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */
+
+ x = x & 0x01ff;
+ y = y & 0x01ff;
+ if (x >= 320) x -= 512;
+ if (y >= 256) y -= 512;
+ y = 240 - y;
+ x = 304 - x;
+
+ if (x>320) continue;
+
+ sprite &= ~multi;
+ if (fy)
+ inc = -1;
+ else
+ {
+ sprite += multi;
+ inc = 1;
+ }
+
+ if (flipscreen)
+ {
+ y=240-y;
+ x=304-x;
+ if (fx) fx=0; else fx=1;
+ if (fy) fy=0; else fy=1;
+ mult=16;
+ }
+ else mult=-16;
+
+ while (multi >= 0)
+ {
+ drawgfx(bitmap,machine->gfx[2],
+ sprite - multi * inc,
+ colour,
+ fx,fy,
+ x,y + mult * multi,
+ cliprect,TRANSPARENCY_PEN,0);
+
+ multi--;
+ }
+ }
+}
+
+static int pktgaldx_bank_callback(const int bank)
+{
+ return ((bank>>4) & 0x7) * 0x1000;
+}
+
+/* Video on the orginal */
+VIDEO_START(pktgaldx)
+{
+ deco16_1_video_init();
+
+ deco16_set_tilemap_bank_callback(1,pktgaldx_bank_callback);
+}
+
+VIDEO_UPDATE(pktgaldx)
+{
+ flip_screen_set( deco16_pf12_control[0]&0x80 );
+ deco16_pf12_update(deco16_pf1_rowscroll,deco16_pf2_rowscroll);
+
+ fillbitmap(bitmap,machine->pens[0x0],cliprect); /* not Confirmed */
+ fillbitmap(priority_bitmap,0,NULL);
+
+ deco16_tilemap_2_draw(bitmap,cliprect,0,0);
+ draw_sprites(machine,bitmap,cliprect);
+ deco16_tilemap_1_draw(bitmap,cliprect,0,0);
+ return 0;
+}
+
+/* Video for the bootleg */
+VIDEO_START(pktgaldb)
+{
+}
+
+VIDEO_UPDATE(pktgaldb)
+{
+ int x,y;
+ int offset=0;
+ int tileno;
+ int colour;
+
+ fillbitmap(bitmap, get_black_pen(machine), cliprect);
+
+ /* the bootleg seems to treat the tilemaps as sprites */
+ for (offset = 0;offset<0x1600/2;offset+=8)
+ {
+ tileno = pcktgaldb_sprites[offset+3] | (pcktgaldb_sprites[offset+2]<<16);
+ colour = pcktgaldb_sprites[offset+1]>>1;
+ x = pcktgaldb_sprites[offset+0];
+ y = pcktgaldb_sprites[offset+4];
+
+ x-=0xc2;
+ y&=0x1ff;
+ y-=8;
+
+ drawgfx(bitmap,machine->gfx[0],tileno^0x1000,colour,0,0,x,y,cliprect,TRANSPARENCY_PEN,0);
+ }
+
+ for (offset = 0x1600/2;offset<0x2000/2;offset+=8)
+ {
+ tileno = pcktgaldb_sprites[offset+3] | (pcktgaldb_sprites[offset+2]<<16);
+ colour = pcktgaldb_sprites[offset+1]>>1;
+ x = pcktgaldb_sprites[offset+0]&0x1ff;
+ y = pcktgaldb_sprites[offset+4]&0x0ff;
+
+ x-=0xc2;
+ y&=0x1ff;
+ y-=8;
+
+ drawgfx(bitmap,machine->gfx[0],tileno^0x4000,colour,0,0,x,y,cliprect,TRANSPARENCY_PEN,0);
+ }
+
+ for (offset = 0x2000/2;offset<0x4000/2;offset+=8)
+ {
+ tileno = pcktgaldb_sprites[offset+3] | (pcktgaldb_sprites[offset+2]<<16);
+ colour = pcktgaldb_sprites[offset+1]>>1;
+ x = pcktgaldb_sprites[offset+0]&0x1ff;
+ y = pcktgaldb_sprites[offset+4]&0x0ff;
+
+ x-=0xc2;
+ y&=0x1ff;
+ y-=8;
+
+ drawgfx(bitmap,machine->gfx[0],tileno^0x3000,colour,0,0,x,y,cliprect,TRANSPARENCY_PEN,0);
+ }
+
+ return 0;
+}