summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/goal92.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/goal92.c')
-rw-r--r--src/mame/video/goal92.c187
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);
+}