summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/playmark.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/playmark.c')
-rw-r--r--src/mame/video/playmark.c477
1 files changed, 477 insertions, 0 deletions
diff --git a/src/mame/video/playmark.c b/src/mame/video/playmark.c
new file mode 100644
index 00000000000..577ac076305
--- /dev/null
+++ b/src/mame/video/playmark.c
@@ -0,0 +1,477 @@
+#include "driver.h"
+
+UINT16 *bigtwin_bgvideoram;
+UINT16 *wbeachvl_videoram1,*wbeachvl_videoram2,*wbeachvl_videoram3;
+UINT16 *wbeachvl_rowscroll;
+
+static int bgscrollx,bgscrolly,bg_enable,bg_full_size;
+static int fgscrollx,fg_rowscroll_enable;
+static tilemap *tx_tilemap,*fg_tilemap,*bg_tilemap;
+
+static int xoffset = 0;
+static int yoffset = 0;
+static int txt_tile_offset = 0;
+static int pri_masks[3];
+static UINT16 playmark_scroll[7];
+
+
+/***************************************************************************
+
+ Callbacks for the TileMap code
+
+***************************************************************************/
+
+static TILE_GET_INFO( bigtwin_get_tx_tile_info )
+{
+ UINT16 code = wbeachvl_videoram1[2*tile_index];
+ UINT16 color = wbeachvl_videoram1[2*tile_index+1];
+ SET_TILE_INFO(
+ 2,
+ code,
+ color,
+ 0);
+}
+
+static TILE_GET_INFO( bigtwin_get_fg_tile_info )
+{
+ UINT16 code = wbeachvl_videoram2[2*tile_index];
+ UINT16 color = wbeachvl_videoram2[2*tile_index+1];
+ SET_TILE_INFO(
+ 1,
+ code,
+ color,
+ 0);
+}
+
+static TILE_GET_INFO( wbeachvl_get_tx_tile_info )
+{
+ UINT16 code = wbeachvl_videoram1[2*tile_index];
+ UINT16 color = wbeachvl_videoram1[2*tile_index+1];
+
+ SET_TILE_INFO(
+ 2,
+ code,
+ color / 4,
+ 0);
+}
+
+static TILE_GET_INFO( wbeachvl_get_fg_tile_info )
+{
+ UINT16 code = wbeachvl_videoram2[2*tile_index];
+ UINT16 color = wbeachvl_videoram2[2*tile_index+1];
+
+ SET_TILE_INFO(
+ 1,
+ code & 0x7fff,
+ color / 4 + 8,
+ (code & 0x8000) ? TILE_FLIPX : 0);
+}
+
+static TILE_GET_INFO( wbeachvl_get_bg_tile_info )
+{
+ UINT16 code = wbeachvl_videoram3[2*tile_index];
+ UINT16 color = wbeachvl_videoram3[2*tile_index+1];
+
+ SET_TILE_INFO(
+ 1,
+ code & 0x7fff,
+ color / 4,
+ (code & 0x8000) ? TILE_FLIPX : 0);
+}
+
+static TILE_GET_INFO( hrdtimes_get_tx_tile_info )
+{
+ int code = wbeachvl_videoram1[tile_index] & 0x03ff;
+ int colr = wbeachvl_videoram1[tile_index] & 0xe000;
+
+ SET_TILE_INFO(2,code + txt_tile_offset,colr >> 13,0);
+}
+
+static TILE_GET_INFO( hrdtimes_get_fg_tile_info )
+{
+ int code = wbeachvl_videoram2[tile_index] & 0x1fff;
+ int colr = wbeachvl_videoram2[tile_index] & 0xe000;
+
+ SET_TILE_INFO(1,code + 0x2000,(colr >> 13) + 8,0);
+}
+
+static TILE_GET_INFO( hrdtimes_get_bg_tile_info )
+{
+ int code = wbeachvl_videoram3[tile_index] & 0x1fff;
+ int colr = wbeachvl_videoram3[tile_index] & 0xe000;
+
+ SET_TILE_INFO(1,code,colr >> 13,0);
+}
+
+/***************************************************************************
+
+ Start the video hardware emulation.
+
+***************************************************************************/
+
+VIDEO_START( bigtwin )
+{
+ tx_tilemap = tilemap_create(bigtwin_get_tx_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,32);
+ fg_tilemap = tilemap_create(bigtwin_get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16,32,32);
+
+ tilemap_set_transparent_pen(tx_tilemap,0);
+
+ pri_masks[0] = 0;
+ pri_masks[1] = 0;
+ pri_masks[2] = 0;
+}
+
+
+VIDEO_START( wbeachvl )
+{
+ tx_tilemap = tilemap_create(wbeachvl_get_tx_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,32);
+ fg_tilemap = tilemap_create(wbeachvl_get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,64,32);
+ bg_tilemap = tilemap_create(wbeachvl_get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16,64,32);
+
+ tilemap_set_transparent_pen(tx_tilemap,0);
+ tilemap_set_transparent_pen(fg_tilemap,0);
+
+ pri_masks[0] = 0xfff0;
+ pri_masks[1] = 0xfffc;
+ pri_masks[2] = 0;
+}
+
+VIDEO_START( excelsr )
+{
+ tx_tilemap = tilemap_create(bigtwin_get_tx_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32);
+ fg_tilemap = tilemap_create(bigtwin_get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16,32,32);
+
+ tilemap_set_transparent_pen(tx_tilemap,0);
+
+ pri_masks[0] = 0;
+ pri_masks[1] = 0xfffc;
+ pri_masks[2] = 0xfff0;
+}
+
+VIDEO_START( hotmind )
+{
+ tx_tilemap = tilemap_create(hrdtimes_get_tx_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,64);
+ fg_tilemap = tilemap_create(hrdtimes_get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32);
+ bg_tilemap = tilemap_create(hrdtimes_get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16,32,32);
+
+ tilemap_set_transparent_pen(tx_tilemap,0);
+ tilemap_set_transparent_pen(fg_tilemap,0);
+
+ tilemap_set_scrolldx(tx_tilemap, -14, -14);
+ tilemap_set_scrolldx(fg_tilemap, -14, -14);
+ tilemap_set_scrolldx(bg_tilemap, -14, -14);
+
+ xoffset = -9;
+ yoffset = -8;
+ txt_tile_offset = 0x9000;
+
+ pri_masks[0] = 0xfff0;
+ pri_masks[1] = 0xfffc;
+ pri_masks[2] = 0;
+}
+
+VIDEO_START( hrdtimes )
+{
+ tx_tilemap = tilemap_create(hrdtimes_get_tx_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,64);
+ fg_tilemap = tilemap_create(hrdtimes_get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32);
+ bg_tilemap = tilemap_create(hrdtimes_get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16,32,32);
+
+ tilemap_set_transparent_pen(tx_tilemap,0);
+ tilemap_set_transparent_pen(fg_tilemap,0);
+
+ tilemap_set_scrolldx(tx_tilemap, -14, -14);
+ tilemap_set_scrolldx(fg_tilemap, -10, -10);
+ tilemap_set_scrolldx(bg_tilemap, -12, -12);
+
+ xoffset = -8;
+ yoffset = -8;
+ txt_tile_offset = 0xfc00;
+
+ pri_masks[0] = 0xfff0;
+ pri_masks[1] = 0xfffc;
+ pri_masks[2] = 0;
+}
+
+/***************************************************************************
+
+ Memory handlers
+
+***************************************************************************/
+
+WRITE16_HANDLER( wbeachvl_txvideoram_w )
+{
+ COMBINE_DATA(&wbeachvl_videoram1[offset]);
+ tilemap_mark_tile_dirty(tx_tilemap,offset / 2);
+}
+
+WRITE16_HANDLER( wbeachvl_fgvideoram_w )
+{
+ COMBINE_DATA(&wbeachvl_videoram2[offset]);
+ tilemap_mark_tile_dirty(fg_tilemap,offset / 2);
+}
+
+WRITE16_HANDLER( wbeachvl_bgvideoram_w )
+{
+ COMBINE_DATA(&wbeachvl_videoram3[offset]);
+ tilemap_mark_tile_dirty(bg_tilemap,offset / 2);
+}
+
+WRITE16_HANDLER( hrdtimes_txvideoram_w )
+{
+ COMBINE_DATA(&wbeachvl_videoram1[offset]);
+ tilemap_mark_tile_dirty(tx_tilemap,offset);
+}
+
+WRITE16_HANDLER( hrdtimes_fgvideoram_w )
+{
+ COMBINE_DATA(&wbeachvl_videoram2[offset]);
+ tilemap_mark_tile_dirty(fg_tilemap,offset);
+}
+
+WRITE16_HANDLER( hrdtimes_bgvideoram_w )
+{
+ COMBINE_DATA(&wbeachvl_videoram3[offset]);
+ tilemap_mark_tile_dirty(bg_tilemap,offset);
+}
+
+
+WRITE16_HANDLER( bigtwin_paletteram_w )
+{
+ int r,g,b,val;
+
+ COMBINE_DATA(&paletteram16[offset]);
+
+ val = paletteram16[offset];
+ r = (val >> 11) & 0x1e;
+ g = (val >> 7) & 0x1e;
+ b = (val >> 3) & 0x1e;
+
+ r |= ((val & 0x08) >> 3);
+ g |= ((val & 0x04) >> 2);
+ b |= ((val & 0x02) >> 1);
+
+ palette_set_color_rgb(Machine,offset,pal5bit(r),pal5bit(g),pal5bit(b));
+}
+
+WRITE16_HANDLER( bigtwin_scroll_w )
+{
+ data = COMBINE_DATA(&playmark_scroll[offset]);
+
+ switch (offset)
+ {
+ case 0: tilemap_set_scrollx(tx_tilemap,0,data+2); break;
+ case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
+ case 2: bgscrollx = -(data+4); break;
+ case 3: bgscrolly = (-data) & 0x1ff;
+ bg_enable = data & 0x0200;
+ bg_full_size = data & 0x0400;
+ break;
+ case 4: tilemap_set_scrollx(fg_tilemap,0,data+6); break;
+ case 5: tilemap_set_scrolly(fg_tilemap,0,data); break;
+ }
+}
+
+WRITE16_HANDLER( wbeachvl_scroll_w )
+{
+ data = COMBINE_DATA(&playmark_scroll[offset]);
+
+ switch (offset)
+ {
+ case 0: tilemap_set_scrollx(tx_tilemap,0,data+2); break;
+ case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
+ case 2: fgscrollx = data+4;break;
+ case 3: tilemap_set_scrolly(fg_tilemap,0,data & 0x3ff);
+ fg_rowscroll_enable = data & 0x0800;
+ break;
+ case 4: tilemap_set_scrollx(bg_tilemap,0,data+6); break;
+ case 5: tilemap_set_scrolly(bg_tilemap,0,data); break;
+ }
+}
+
+WRITE16_HANDLER( excelsr_scroll_w )
+{
+ data = COMBINE_DATA(&playmark_scroll[offset]);
+
+ switch (offset)
+ {
+ case 0: tilemap_set_scrollx(tx_tilemap,0,data+2); break;
+ case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
+ case 2: bgscrollx = -data; break;
+ case 3: bgscrolly = (-data+2)& 0x1ff;
+ bg_enable = data & 0x0200;
+ bg_full_size = data & 0x0400;
+ break;
+ case 4: tilemap_set_scrollx(fg_tilemap,0,data+6); break;
+ case 5: tilemap_set_scrolly(fg_tilemap,0,data); break;
+ }
+}
+
+WRITE16_HANDLER( hrdtimes_scroll_w )
+{
+ data = COMBINE_DATA(&playmark_scroll[offset]);
+
+ switch (offset)
+ {
+ case 0: tilemap_set_scrollx(tx_tilemap,0,data); break;
+ case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
+ case 2: tilemap_set_scrollx(fg_tilemap,0,data); break;
+ case 3: tilemap_set_scrolly(fg_tilemap,0,data); break;
+ case 4: tilemap_set_scrollx(bg_tilemap,0,data); break;
+ case 5: tilemap_set_scrolly(bg_tilemap,0,data); break;
+ }
+}
+
+/***************************************************************************
+
+ Display refresh
+
+***************************************************************************/
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int codeshift)
+{
+ int offs, start_offset = spriteram_size/2 - 4;
+ int height = machine->gfx[0]->height;
+ int colordiv = machine->gfx[0]->color_granularity / 16;
+
+ // find the "end of list" to draw the sprites in reverse order
+ for (offs = 4;offs < spriteram_size/2;offs += 4)
+ {
+ if (spriteram16[offs+3-4] == 0x2000) /* end of list marker */
+ {
+ start_offset = offs - 4;
+ break;
+ }
+ }
+
+ for (offs = start_offset;offs >= 4;offs -= 4)
+ {
+ int sx,sy,code,color,flipx,pri;
+
+ sy = spriteram16[offs+3-4]; /* -4? what the... ??? */
+
+ flipx = sy & 0x4000;
+ sx = (spriteram16[offs+1] & 0x01ff) - 16-7;
+ sy = (256-8-height - sy) & 0xff;
+ code = spriteram16[offs+2] >> codeshift;
+ color = ((spriteram16[offs+1] & 0x3e00) >> 9) / colordiv;
+ pri = (spriteram16[offs+1] & 0x8000) >> 15;
+
+ if(!pri && (color & 0x0c) == 0x0c)
+ pri = 2;
+
+ pdrawgfx(bitmap,machine->gfx[0],
+ code,
+ color,
+ flipx,0,
+ sx + xoffset,sy + yoffset,
+ cliprect,TRANSPARENCY_PEN,0,pri_masks[pri]);
+ }
+}
+
+static void draw_bitmap(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ int x,y,count;
+ int color;
+ UINT8 *pri;
+
+ count = 0;
+ for (y=0;y<512;y++)
+ {
+ for (x=0;x<512;x++)
+ {
+ color = bigtwin_bgvideoram[count] & 0xff;
+
+ if(color)
+ {
+ if(bg_full_size)
+ {
+ *BITMAP_ADDR16(bitmap, (y + bgscrolly) & 0x1ff, (x + bgscrollx) & 0x1ff) = machine->pens[0x100 + color];
+
+ pri = BITMAP_ADDR8(priority_bitmap, (y + bgscrolly) & 0x1ff, 0);
+ pri[(x + bgscrollx) & 0x1ff] |= 2;
+ }
+ else
+ {
+ /* 50% size */
+ if(!(x % 2) && !(y % 2))
+ {
+ *BITMAP_ADDR16(bitmap, (y / 2 + bgscrolly) & 0x1ff, (x / 2 + bgscrollx) & 0x1ff) = machine->pens[0x100 + color];
+
+ pri = BITMAP_ADDR8(priority_bitmap, (y / 2 + bgscrolly) & 0x1ff, 0);
+ pri[(x / 2 + bgscrollx) & 0x1ff] |= 2;
+ }
+ }
+ }
+
+ count++;
+ }
+ }
+}
+
+VIDEO_UPDATE( bigtwin )
+{
+ fillbitmap(priority_bitmap,0,cliprect);
+
+ tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
+ if (bg_enable)
+ draw_bitmap(machine, bitmap, cliprect);
+ draw_sprites(machine, bitmap,cliprect,4);
+ tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
+ return 0;
+}
+
+VIDEO_UPDATE( excelsr )
+{
+ fillbitmap(priority_bitmap,0,cliprect);
+
+ tilemap_draw(bitmap,cliprect,fg_tilemap,0,1);
+ if (bg_enable)
+ draw_bitmap(machine, bitmap, cliprect);
+ tilemap_draw(bitmap,cliprect,tx_tilemap,0,4);
+ draw_sprites(machine,bitmap,cliprect,2);
+ return 0;
+}
+
+VIDEO_UPDATE( wbeachvl )
+{
+ if (fg_rowscroll_enable)
+ {
+ int i;
+
+ tilemap_set_scroll_rows(fg_tilemap,512);
+ for (i = 0;i < 256;i++)
+ tilemap_set_scrollx(fg_tilemap,i+1,wbeachvl_rowscroll[8*i]);
+ }
+ else
+ {
+ tilemap_set_scroll_rows(fg_tilemap,1);
+ tilemap_set_scrollx(fg_tilemap,0,fgscrollx);
+ }
+
+ fillbitmap(priority_bitmap,0,cliprect);
+
+ tilemap_draw(bitmap,cliprect,bg_tilemap,0,1);
+ tilemap_draw(bitmap,cliprect,fg_tilemap,0,2);
+ draw_sprites(machine,bitmap,cliprect,0);
+ tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
+ return 0;
+}
+
+VIDEO_UPDATE( hrdtimes )
+{
+ fillbitmap(priority_bitmap,0,cliprect);
+
+ // video enabled
+ if(playmark_scroll[6] & 1)
+ {
+ tilemap_draw(bitmap,cliprect,bg_tilemap,0,1);
+ tilemap_draw(bitmap,cliprect,fg_tilemap,0,2);
+ draw_sprites(machine,bitmap,cliprect,2);
+ tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
+ }
+ else
+ {
+ fillbitmap(bitmap,get_black_pen(machine),cliprect);
+ }
+ return 0;
+}