/***************************************************************************
Goal '92 video hardware
***************************************************************************/
#include "driver.h"
UINT16 *goal92_back_data,*goal92_fore_data,*goal92_textram,*goal92_scrollram16;
static tilemap *background_layer,*foreground_layer,*text_layer;
static UINT16 fg_bank = 0;
READ16_HANDLER( goal92_fg_bank_r )
{
return fg_bank;
}
WRITE16_HANDLER( goal92_fg_bank_w )
{
COMBINE_DATA(&fg_bank);
if(ACCESSING_LSB)
{
tilemap_mark_all_tiles_dirty(foreground_layer);
}
}
WRITE16_HANDLER( goal92_text_w )
{
COMBINE_DATA(&goal92_textram[offset]);
tilemap_mark_tile_dirty(text_layer,offset);
}
WRITE16_HANDLER( goal92_background_w )
{
COMBINE_DATA(&goal92_back_data[offset]);
tilemap_mark_tile_dirty(background_layer,offset);
}
WRITE16_HANDLER( goal92_foreground_w )
{
COMBINE_DATA(&goal92_fore_data[offset]);
tilemap_mark_tile_dirty(foreground_layer,offset);
}
static TILE_GET_INFO( get_text_tile_info )
{
int tile = goal92_textram[tile_index];
int color=(tile>>12)&0xf;
tile &= 0xfff;
tile |= 0xc000;
SET_TILE_INFO(1,tile,color,0);
}
static TILE_GET_INFO( get_back_tile_info )
{
int tile=goal92_back_data[tile_index];
int color=(tile>>12)&0xf;
tile &= 0xfff;
SET_TILE_INFO(2,tile,color,0);
}
static TILE_GET_INFO( get_fore_tile_info )
{
int tile=goal92_fore_data[tile_index];
int color=(tile>>12)&0xf;
int region;
tile &= 0xfff;
if(fg_bank & 0xff)
{
region = 3;
tile |= 0x1000;
}
else
{
region = 4;
tile |= 0x2000;
}
SET_TILE_INFO(region,tile,color,0);
}
static void draw_sprites(running_machine *machine,mame_bitmap *bitmap,const rectangle *cliprect,int pri)
{
int offs,fx,fy,x,y,color,sprite;
for (offs = 3;offs <= 0x400-5;offs += 4)
{
UINT16 data = buffered_spriteram16[offs+2];
y = buffered_spriteram16[offs+0];
if (y & 0x8000)
break;
if (!(data & 0x8000))
continue;
sprite = buffered_spriteram16[offs+1];
if ((sprite>>14)!=pri)
continue;
x = buffered_spriteram16[offs+3];
sprite &= 0x1fff;
x &= 0x1ff;
y &= 0x1ff;
color = (data & 0x3f) + 0x40;
fx = (data & 0x4000) >> 14;
fy = 0;
x -= 320/4-16-1;
y = 256-(y+7);
drawgfx(bitmap,machine->gfx[0],
sprite,
color,fx,fy,x,y,
cliprect,TRANSPARENCY_PEN,15);
}
}
VIDEO_START( goal92 )
{
background_layer = tilemap_create(get_back_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32);
foreground_layer = tilemap_create(get_fore_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32);
text_layer = tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8,8,64,32);
buffered_spriteram16 = auto_malloc(0x400*2);
tilemap_set_transparent_pen(background_layer,15);
tilemap_set_transparent_pen(foreground_layer,15);
tilemap_set_transparent_pen(text_layer,15);
}
VIDEO_UPDATE( goal92 )
{
tilemap_set_scrollx(background_layer, 0, goal92_scrollram16[0] + 60);
tilemap_set_scrolly(background_layer, 0, goal92_scrollram16[1] + 8);
if(fg_bank & 0xff)
{
tilemap_set_scrollx(foreground_layer, 0, goal92_scrollram16[0] + 60);
tilemap_set_scrolly(foreground_layer, 0, goal92_scrollram16[1] + 8);
}
else
{
tilemap_set_scrollx(foreground_layer, 0, goal92_scrollram16[2] + 60);
tilemap_set_scrolly(foreground_layer, 0, goal92_scrollram16[3] + 8);
}
fillbitmap(bitmap,get_black_pen(machine),cliprect);
tilemap_draw(bitmap,cliprect,background_layer,0,0);
draw_sprites(machine,bitmap,cliprect,2);
if(!(fg_bank & 0xff))
draw_sprites(machine,bitmap,cliprect,1);
tilemap_draw(bitmap,cliprect,foreground_layer,0,0);
if(fg_bank & 0xff)
draw_sprites(machine,bitmap,cliprect,1);
draw_sprites(machine,bitmap,cliprect,0);
draw_sprites(machine,bitmap,cliprect,3);
tilemap_draw(bitmap,cliprect,text_layer,0,0);
return 0;
}
VIDEO_EOF( goal92 )
{
memcpy(buffered_spriteram16,spriteram16,0x400*2);
}