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