diff options
Diffstat (limited to 'src/mame/video/deadang.c')
-rw-r--r-- | src/mame/video/deadang.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/mame/video/deadang.c b/src/mame/video/deadang.c new file mode 100644 index 00000000000..420053ee5a6 --- /dev/null +++ b/src/mame/video/deadang.c @@ -0,0 +1,158 @@ +#include "driver.h" + +static tilemap *pf3_layer,*pf2_layer,*pf1_layer,*text_layer; +static int deadangle_tilebank, deadangle_oldtilebank; +UINT16 *deadang_video_data,*deadang_scroll_ram; + +/******************************************************************************/ + +WRITE16_HANDLER( deadang_foreground_w ) +{ + COMBINE_DATA(&deadang_video_data[offset]); + tilemap_mark_tile_dirty( pf1_layer, offset ); +} + +WRITE16_HANDLER( deadang_text_w ) +{ + COMBINE_DATA(&videoram16[offset]); + tilemap_mark_tile_dirty( text_layer, offset ); +} + +WRITE16_HANDLER( deadang_bank_w ) +{ + if (ACCESSING_LSB) + { + deadangle_tilebank = data&1; + if (deadangle_tilebank!=deadangle_oldtilebank) + { + deadangle_oldtilebank = deadangle_tilebank; + tilemap_mark_all_tiles_dirty (pf1_layer); + } + } +} + +/******************************************************************************/ + +static TILEMAP_MAPPER( bg_scan ) +{ + return (col&0xf) | ((row&0xf)<<4) | ((col&0x70)<<4) | ((row&0xf0)<<7); +} + +static TILE_GET_INFO( get_pf3_tile_info ) +{ + const UINT16 *bgMap = (const UINT16 *)memory_region(REGION_GFX6); + int code= bgMap[tile_index]; + SET_TILE_INFO(4,code&0x7ff,code>>12,0); +} + +static TILE_GET_INFO( get_pf2_tile_info ) +{ + const UINT16 *bgMap = (const UINT16 *)memory_region(REGION_GFX7); + int code= bgMap[tile_index]; + SET_TILE_INFO(3,code&0x7ff,code>>12,0); +} + +static TILE_GET_INFO( get_pf1_tile_info ) +{ + int tile=deadang_video_data[tile_index]; + int color=tile >> 12; + tile=tile&0xfff; + + SET_TILE_INFO(2,tile+deadangle_tilebank*0x1000,color,0); +} + +static TILE_GET_INFO( get_text_tile_info ) +{ + int tile=(videoram16[tile_index] & 0xff) | ((videoram16[tile_index] >> 6) & 0x300); + int color=(videoram16[tile_index] >> 8)&0xf; + + SET_TILE_INFO(0,tile,color,0); +} + +VIDEO_START( deadang ) +{ + pf3_layer = tilemap_create(get_pf3_tile_info,bg_scan, TILEMAP_TYPE_PEN, 16,16,128,256); + pf2_layer = tilemap_create(get_pf2_tile_info,bg_scan, TILEMAP_TYPE_PEN,16,16,128,256); + pf1_layer = tilemap_create(get_pf1_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,16,16, 32, 32); + text_layer = tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8, 32, 32); + + tilemap_set_transparent_pen(pf2_layer, 15); + tilemap_set_transparent_pen(pf1_layer, 15); + tilemap_set_transparent_pen(text_layer, 15); +} + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + int offs,fx,fy,x,y,color,sprite,pri; + + for (offs = 0; offs<0x800/2; offs+=4) + { + /* Don't draw empty sprite table entries */ + if ((spriteram16[offs+3] & 0xff00)!=0xf00) continue; + + switch (spriteram16[offs+2]&0xc000) { + default: + case 0xc000: pri=0; break; /* Unknown */ + case 0x8000: pri=0; break; /* Over all playfields */ + case 0x4000: pri=0xf0; break; /* Under top playfield */ + case 0x0000: pri=0xf0|0xcc; break; /* Under middle playfield */ + } + + fx= spriteram16[offs+0]&0x2000; + fy= spriteram16[offs+0]&0x4000; + y = spriteram16[offs+0] & 0xff; + x = spriteram16[offs+2] & 0xff; + if (fy) fy=0; else fy=1; + if (spriteram16[offs+2]&0x100) x=0-(0xff-x); + + color = (spriteram16[offs+1]>>12)&0xf; + sprite = spriteram16[offs+1]&0xfff; + + if (flip_screen) { + x=240-x; + y=240-y; + if (fx) fx=0; else fx=1; + if (fy) fy=0; else fy=1; + } + + pdrawgfx(bitmap,machine->gfx[1], + sprite, + color,fx,fy,x,y, + cliprect,TRANSPARENCY_PEN,15,pri); + } +} + +VIDEO_UPDATE( deadang ) +{ + /* Setup the tilemaps */ + tilemap_set_scrolly( pf3_layer,0, ((deadang_scroll_ram[0x01]&0xf0)<<4)+((deadang_scroll_ram[0x02]&0x7f)<<1)+((deadang_scroll_ram[0x02]&0x80)>>7) ); + tilemap_set_scrollx( pf3_layer,0, ((deadang_scroll_ram[0x09]&0xf0)<<4)+((deadang_scroll_ram[0x0a]&0x7f)<<1)+((deadang_scroll_ram[0x0a]&0x80)>>7) ); + tilemap_set_scrolly( pf1_layer,0, ((deadang_scroll_ram[0x11]&0x10)<<4)+((deadang_scroll_ram[0x12]&0x7f)<<1)+((deadang_scroll_ram[0x12]&0x80)>>7) ); + tilemap_set_scrollx( pf1_layer,0, ((deadang_scroll_ram[0x19]&0x10)<<4)+((deadang_scroll_ram[0x1a]&0x7f)<<1)+((deadang_scroll_ram[0x1a]&0x80)>>7) ); + tilemap_set_scrolly( pf2_layer,0, ((deadang_scroll_ram[0x21]&0xf0)<<4)+((deadang_scroll_ram[0x22]&0x7f)<<1)+((deadang_scroll_ram[0x22]&0x80)>>7) ); + tilemap_set_scrollx( pf2_layer,0, ((deadang_scroll_ram[0x29]&0xf0)<<4)+((deadang_scroll_ram[0x2a]&0x7f)<<1)+((deadang_scroll_ram[0x2a]&0x80)>>7) ); + + /* Control byte: + 0x01: Background playfield disable + 0x02: Middle playfield disable + 0x04: Top playfield disable + 0x08: ? Toggles at start of game + 0x10: Sprite disable + 0x20: Unused? + 0x40: Flipscreen + 0x80: Always set? + */ + tilemap_set_enable(pf3_layer,!(deadang_scroll_ram[0x34]&1)); + tilemap_set_enable(pf1_layer,!(deadang_scroll_ram[0x34]&2)); + tilemap_set_enable(pf2_layer,!(deadang_scroll_ram[0x34]&4)); + flip_screen_set( deadang_scroll_ram[0x34]&0x40 ); + + fillbitmap(bitmap,get_black_pen(machine),cliprect); + fillbitmap(priority_bitmap,0,cliprect); + tilemap_draw(bitmap,cliprect,pf3_layer,0,1); + tilemap_draw(bitmap,cliprect,pf1_layer,0,2); + tilemap_draw(bitmap,cliprect,pf2_layer,0,4); + if (!(deadang_scroll_ram[0x34]&0x10)) draw_sprites(machine,bitmap,cliprect); + tilemap_draw(bitmap,cliprect,text_layer,0,0); + return 0; +} |