diff options
Diffstat (limited to 'src/mame/video/kickgoal.c')
-rw-r--r-- | src/mame/video/kickgoal.c | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/src/mame/video/kickgoal.c b/src/mame/video/kickgoal.c new file mode 100644 index 00000000000..e3ed91cc423 --- /dev/null +++ b/src/mame/video/kickgoal.c @@ -0,0 +1,257 @@ +/* Kick Goal - video */ + +#include "driver.h" + +extern UINT16 *kickgoal_fgram, *kickgoal_bgram, *kickgoal_bg2ram, *kickgoal_scrram; +static tilemap *kickgoal_fgtm, *kickgoal_bgtm, *kickgoal_bg2tm; + +/* FG */ +static TILE_GET_INFO( get_kickgoal_fg_tile_info ) +{ + int tileno = kickgoal_fgram[tile_index*2] & 0x0fff; + int color = kickgoal_fgram[tile_index*2+1] & 0x000f; + + SET_TILE_INFO(0,tileno + 0x7000,color + 0x00,0); +} + +/* BG */ +static TILE_GET_INFO( get_kickgoal_bg_tile_info ) +{ + int tileno = kickgoal_bgram[tile_index*2] & 0x0fff; + int color = kickgoal_bgram[tile_index*2+1] & 0x000f; + + SET_TILE_INFO(1,tileno + 0x1000,color + 0x10,0); +} + +/* BG 2 */ +static TILE_GET_INFO( get_kickgoal_bg2_tile_info ) +{ + int tileno = kickgoal_bg2ram[tile_index*2] & 0x07ff; + int color = kickgoal_bg2ram[tile_index*2+1] & 0x000f; + int flipx = kickgoal_bg2ram[tile_index*2+1] & 0x0020; + + SET_TILE_INFO(2,tileno + 0x800,color + 0x20,flipx ? TILE_FLIPX : 0); +} + + +static TILEMAP_MAPPER( tilemap_scan_kicksbg ) +{ + /* logical (col,row) -> memory offset */ + return col*8 + (row & 0x7) + ((row & 0x3c) >> 3) * 0x200; +} + +static TILEMAP_MAPPER( tilemap_scan_kicksbg2 ) +{ + /* logical (col,row) -> memory offset */ + return col*16 + (row & 0xf) + ((row & 0x70) >> 4) * 0x400; +} + +static TILEMAP_MAPPER( tilemap_scan_kicksfg ) +{ + /* logical (col,row) -> memory offset */ + return col*32 + (row & 0x1f) + ((row & 0x20) >> 5) * 0x800; +} + + +VIDEO_START( kickgoal ) +{ + kickgoal_fgtm = tilemap_create(get_kickgoal_fg_tile_info,tilemap_scan_kicksfg,TILEMAP_TYPE_PEN, 8, 16,64,64); + tilemap_set_transparent_pen(kickgoal_fgtm,15); + kickgoal_bgtm = tilemap_create(get_kickgoal_bg_tile_info,tilemap_scan_kicksbg,TILEMAP_TYPE_PEN, 16, 32,64,64); + tilemap_set_transparent_pen(kickgoal_bgtm,15); + kickgoal_bg2tm = tilemap_create(get_kickgoal_bg2_tile_info,tilemap_scan_kicksbg2,TILEMAP_TYPE_PEN, 32, 64,64,64); +} + + + +WRITE16_HANDLER( kickgoal_fgram_w ) +{ + kickgoal_fgram[offset] = data; + tilemap_mark_tile_dirty(kickgoal_fgtm,offset/2); +} + +WRITE16_HANDLER( kickgoal_bgram_w ) +{ + kickgoal_bgram[offset] = data; + tilemap_mark_tile_dirty(kickgoal_bgtm,offset/2); +} + +WRITE16_HANDLER( kickgoal_bg2ram_w ) +{ + kickgoal_bg2ram[offset] = data; + tilemap_mark_tile_dirty(kickgoal_bg2tm,offset/2); +} + + + +static void kickgoal_draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect) +{ + const gfx_element *gfx = machine->gfx[1]; + int offs; + + for (offs = 0;offs < spriteram_size/2;offs += 4) + { + int xpos = spriteram16[offs+3]; + int ypos = spriteram16[offs+0] & 0x00ff; + int tileno = spriteram16[offs+2] & 0x0fff; + int flipx = spriteram16[offs+1] & 0x0020; + int color = spriteram16[offs+1] & 0x000f; + + if (spriteram16[offs+0] & 0x0100) break; + + ypos *= 2; + + ypos = 0x200-ypos; + + drawgfx(bitmap,gfx, + tileno, + 0x30 + color, + flipx,0, + xpos-16+4,ypos-32, + cliprect,TRANSPARENCY_PEN,15); + } +} + + +VIDEO_UPDATE( kickgoal ) +{ + /* set scroll */ + tilemap_set_scrollx( kickgoal_fgtm, 0, kickgoal_scrram[0] ); + tilemap_set_scrolly( kickgoal_fgtm, 0, kickgoal_scrram[1]*2 ); + tilemap_set_scrollx( kickgoal_bgtm, 0, kickgoal_scrram[2] ); + tilemap_set_scrolly( kickgoal_bgtm, 0, kickgoal_scrram[3]*2 ); + tilemap_set_scrollx( kickgoal_bg2tm, 0, kickgoal_scrram[4] ); + tilemap_set_scrolly( kickgoal_bg2tm, 0, kickgoal_scrram[5]*2 ); + + /* draw */ + tilemap_draw(bitmap,cliprect,kickgoal_bg2tm,0,0); + tilemap_draw(bitmap,cliprect,kickgoal_bgtm,0,0); + + kickgoal_draw_sprites(machine,bitmap,cliprect); + + tilemap_draw(bitmap,cliprect,kickgoal_fgtm,0,0); + + /* + popmessage ("Regs %04x %04x %04x %04x %04x %04x %04x %04x", + kickgoal_scrram[0], + kickgoal_scrram[1], + kickgoal_scrram[2], + kickgoal_scrram[3], + kickgoal_scrram[4], + kickgoal_scrram[5], + kickgoal_scrram[6], + kickgoal_scrram[7]); + */ + return 0; +} + +/* Holywood Action */ + +/* FG */ +static TILE_GET_INFO( get_actionhw_fg_tile_info ) +{ + int tileno = kickgoal_fgram[tile_index*2] & 0x0fff; + int color = kickgoal_fgram[tile_index*2+1] & 0x000f; + + SET_TILE_INFO(0,tileno + 0x7000*2,color + 0x00,0); +} + +/* BG */ +static TILE_GET_INFO( get_actionhw_bg_tile_info ) +{ + int tileno = kickgoal_bgram[tile_index*2] & 0x1fff; + int color = kickgoal_bgram[tile_index*2+1] & 0x000f; + int flipx = kickgoal_bgram[tile_index*2+1] & 0x0020; + int flipy = kickgoal_bgram[tile_index*2+1] & 0x0040; + + SET_TILE_INFO(1,tileno + 0x0000,color + 0x10,(flipx ? TILE_FLIPX : 0) | (flipy ? TILE_FLIPY : 0)); +} + +/* BG 2 */ +static TILE_GET_INFO( get_actionhw_bg2_tile_info ) +{ + int tileno = kickgoal_bg2ram[tile_index*2] & 0x1fff; + int color = kickgoal_bg2ram[tile_index*2+1] & 0x000f; + int flipx = kickgoal_bg2ram[tile_index*2+1] & 0x0020; + int flipy = kickgoal_bg2ram[tile_index*2+1] & 0x0040; + + SET_TILE_INFO(1,tileno + 0x2000,color + 0x20,(flipx ? TILE_FLIPX : 0) | (flipy ? TILE_FLIPY : 0)); +} + + +static TILEMAP_MAPPER( tilemap_scan_actionhwbg2 ) +{ + /* logical (col,row) -> memory offset */ + return col*16 + (row & 0xf) + ((row & 0x70) >> 4) * 0x400; +} + +static TILEMAP_MAPPER( tilemap_scan_actionhwbg ) +{ + /* logical (col,row) -> memory offset */ + return col*16 + (row & 0xf) + ((row & 0x70) >> 4) * 0x400; +} + +static TILEMAP_MAPPER( tilemap_scan_actionhwfg ) +{ + /* logical (col,row) -> memory offset */ + return col*32 + (row & 0x1f) + ((row & 0x20) >> 5) * 0x800; +} + + +VIDEO_START( actionhw ) +{ + kickgoal_fgtm = tilemap_create(get_actionhw_fg_tile_info,tilemap_scan_actionhwfg,TILEMAP_TYPE_PEN, 8, 8,64,64); + kickgoal_bgtm = tilemap_create(get_actionhw_bg_tile_info,tilemap_scan_actionhwbg,TILEMAP_TYPE_PEN, 16,16,64,64); + kickgoal_bg2tm = tilemap_create(get_actionhw_bg2_tile_info,tilemap_scan_actionhwbg2,TILEMAP_TYPE_PEN, 16,16,64,64); + + tilemap_set_transparent_pen(kickgoal_fgtm,15); + tilemap_set_transparent_pen(kickgoal_bgtm,15); +} + + +static void actionhw_draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect) +{ + const gfx_element *gfx = machine->gfx[1]; + int offs; + + for (offs = 0;offs < spriteram_size/2;offs += 4) + { + int xpos = spriteram16[offs+3]; + int ypos = spriteram16[offs+0] & 0x00ff; + int tileno = spriteram16[offs+2] & 0x3fff; + int flipx = spriteram16[offs+1] & 0x0020; + int color = spriteram16[offs+1] & 0x000f; + + if (spriteram16[offs+0] & 0x0100) break; + + ypos = 0x110-ypos; + + drawgfx(bitmap,gfx, + tileno+0x4000, + 0x30 + color, + flipx,0, + xpos-16+4,ypos-32, + cliprect,TRANSPARENCY_PEN,15); + } +} + + +VIDEO_UPDATE( actionhw ) +{ + /* set scroll */ + tilemap_set_scrollx( kickgoal_fgtm, 0, kickgoal_scrram[0] ); + tilemap_set_scrolly( kickgoal_fgtm, 0, kickgoal_scrram[1] ); + tilemap_set_scrollx( kickgoal_bgtm, 0, kickgoal_scrram[2] ); + tilemap_set_scrolly( kickgoal_bgtm, 0, kickgoal_scrram[3] ); + tilemap_set_scrollx( kickgoal_bg2tm, 0, kickgoal_scrram[4] ); + tilemap_set_scrolly( kickgoal_bg2tm, 0, kickgoal_scrram[5] ); + + /* draw */ + tilemap_draw(bitmap,cliprect,kickgoal_bg2tm,0,0); + tilemap_draw(bitmap,cliprect,kickgoal_bgtm,0,0); + + actionhw_draw_sprites(machine,bitmap,cliprect); + + tilemap_draw(bitmap,cliprect,kickgoal_fgtm,0,0); + return 0; +} |