diff options
Diffstat (limited to 'src/mame/video/goal92.c')
-rw-r--r-- | src/mame/video/goal92.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/mame/video/goal92.c b/src/mame/video/goal92.c new file mode 100644 index 00000000000..38728c50b38 --- /dev/null +++ b/src/mame/video/goal92.c @@ -0,0 +1,187 @@ +/*************************************************************************** + + 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); +} |