#include "driver.h" UINT16 *gotcha_fgvideoram,*gotcha_bgvideoram; static tilemap *fg_tilemap,*bg_tilemap; static int banksel,gfxbank[4]; /*************************************************************************** Callbacks for the TileMap code ***************************************************************************/ static TILEMAP_MAPPER( gotcha_tilemap_scan ) { return (col & 0x1f) | (row << 5) | ((col & 0x20) << 5); } INLINE void get_tile_info(running_machine *machine,tile_data *tileinfo,int tile_index,UINT16 *vram,int color_offs) { UINT16 data = vram[tile_index]; int code = (data & 0x3ff) | (gfxbank[(data & 0x0c00) >> 10] << 10); SET_TILE_INFO(0,code,(data >> 12) + color_offs,0); } static TILE_GET_INFO( fg_get_tile_info ) { get_tile_info(machine,tileinfo,tile_index,gotcha_fgvideoram, 0); } static TILE_GET_INFO( bg_get_tile_info ) { get_tile_info(machine,tileinfo,tile_index,gotcha_bgvideoram,16); } /*************************************************************************** Start the video hardware emulation. ***************************************************************************/ VIDEO_START( gotcha ) { fg_tilemap = tilemap_create(fg_get_tile_info,gotcha_tilemap_scan,TILEMAP_TYPE_PEN,16,16,64,32); bg_tilemap = tilemap_create(bg_get_tile_info,gotcha_tilemap_scan,TILEMAP_TYPE_PEN, 16,16,64,32); tilemap_set_transparent_pen(fg_tilemap,0); tilemap_set_scrolldx(fg_tilemap,-1,0); tilemap_set_scrolldx(bg_tilemap,-5,0); } WRITE16_HANDLER( gotcha_fgvideoram_w ) { COMBINE_DATA(&gotcha_fgvideoram[offset]); tilemap_mark_tile_dirty(fg_tilemap,offset); } WRITE16_HANDLER( gotcha_bgvideoram_w ) { COMBINE_DATA(&gotcha_bgvideoram[offset]); tilemap_mark_tile_dirty(bg_tilemap,offset); } WRITE16_HANDLER( gotcha_gfxbank_select_w ) { if (ACCESSING_MSB) banksel = (data & 0x0300) >> 8; } WRITE16_HANDLER( gotcha_gfxbank_w ) { if (ACCESSING_MSB) { if (gfxbank[banksel] != ((data & 0x0f00) >> 8)) { gfxbank[banksel] = (data & 0x0f00) >> 8; tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); } } } WRITE16_HANDLER( gotcha_scroll_w ) { static UINT16 scroll[4]; COMBINE_DATA(&scroll[offset]); switch (offset) { case 0: tilemap_set_scrollx(fg_tilemap,0,scroll[0]); break; case 1: tilemap_set_scrolly(fg_tilemap,0,scroll[1]); break; case 2: tilemap_set_scrollx(bg_tilemap,0,scroll[2]); break; case 3: tilemap_set_scrolly(bg_tilemap,0,scroll[3]); break; } } static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect) { int offs; for (offs = 0;offs < spriteram_size/2;offs += 4) { int sx,sy,code,color,flipx,flipy,height,y; sx = spriteram16[offs + 2]; sy = spriteram16[offs + 0]; code = spriteram16[offs + 1]; color = spriteram16[offs + 2] >> 9; height = 1 << ((spriteram16[offs + 0] & 0x0600) >> 9); flipx = spriteram16[offs + 0] & 0x2000; flipy = spriteram16[offs + 0] & 0x4000; for (y = 0;y < height;y++) { drawgfx(bitmap,machine->gfx[1], code + (flipy ? height-1 - y : y), color, flipx,flipy, 0x140-5 - ((sx + 0x10) & 0x1ff),0x100+1 - ((sy + 0x10 * (height - y)) & 0x1ff), cliprect,TRANSPARENCY_PEN,0); } } } VIDEO_UPDATE( gotcha ) { tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); tilemap_draw(bitmap,cliprect,fg_tilemap,0,0); draw_sprites(machine, bitmap,cliprect); return 0; }