1 #include "vidhrdw/generic.h"
2 
3 static struct tilemap *pf3_layer,*pf2_layer,*pf1_layer,*text_layer;
4 static int deadangle_tilebank, deadangle_oldtilebank;
5 data8_t *deadang_video_data,*deadang_scroll_ram;
6 
7 /******************************************************************************/
8 
WRITE_HANDLER(deadang_foreground_w)9 WRITE_HANDLER( deadang_foreground_w )
10 {
11 	deadang_video_data[offset]=data;
12 	tilemap_mark_tile_dirty( pf1_layer, offset/2 );
13 }
14 
WRITE_HANDLER(deadang_text_w)15 WRITE_HANDLER( deadang_text_w )
16 {
17 	videoram[offset]=data;
18 	tilemap_mark_tile_dirty( text_layer, offset/2 );
19 }
20 
WRITE_HANDLER(deadang_bank_w)21 WRITE_HANDLER( deadang_bank_w )
22 {
23 	deadangle_tilebank = data&1;
24 	if (deadangle_tilebank!=deadangle_oldtilebank) {
25 		deadangle_oldtilebank = deadangle_tilebank;
26 		tilemap_mark_all_tiles_dirty (pf1_layer);
27 	}
28 }
29 
30 /******************************************************************************/
31 
bg_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)32 static UINT32 bg_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)
33 {
34 	return (col&0xf) | ((row&0xf)<<4) | ((col&0x70)<<4) | ((row&0xf0)<<7);
35 }
36 
get_pf3_tile_info(int tile_index)37 static void get_pf3_tile_info( int tile_index )
38 {
39 	const data8_t *bgMap = memory_region(REGION_GFX6);
40 	int code=(bgMap[tile_index*2]<<8) | bgMap[tile_index*2+1];
41 	SET_TILE_INFO(4,code&0x7ff,code>>12,0);
42 }
43 
get_pf2_tile_info(int tile_index)44 static void get_pf2_tile_info( int tile_index )
45 {
46 	const data8_t *bgMap = memory_region(REGION_GFX7);
47 	int code=(bgMap[tile_index*2]<<8) | bgMap[tile_index*2+1];
48 	SET_TILE_INFO(3,code&0x7ff,code>>12,0);
49 }
50 
get_pf1_tile_info(int tile_index)51 static void get_pf1_tile_info( int tile_index )
52 {
53 	int offs=tile_index*2;
54 	int tile=deadang_video_data[offs]+(deadang_video_data[offs+1]<<8);
55 	int color=tile >> 12;
56 	tile=tile&0xfff;
57 
58 	SET_TILE_INFO(2,tile+deadangle_tilebank*0x1000,color,0)
59 }
60 
get_text_tile_info(int tile_index)61 static void get_text_tile_info( int tile_index )
62 {
63 	int offs=tile_index*2;
64 	int tile=videoram[offs]+((videoram[offs+1]&0xc0)<<2);
65 	int color=videoram[offs+1]&0xf;
66 
67 	SET_TILE_INFO(0,tile,color,0)
68 }
69 
VIDEO_START(deadang)70 VIDEO_START( deadang )
71 {
72 	pf3_layer = tilemap_create(get_pf3_tile_info,bg_scan,          TILEMAP_OPAQUE,     16,16,128,256);
73 	pf2_layer = tilemap_create(get_pf2_tile_info,bg_scan,          TILEMAP_TRANSPARENT,16,16,128,256);
74 	pf1_layer = tilemap_create(get_pf1_tile_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,16,16, 32, 32);
75 	text_layer = tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT, 8, 8, 32, 32);
76 
77 	if (!text_layer || !pf1_layer || !pf2_layer || !pf3_layer)
78 		return 1;
79 
80 	tilemap_set_transparent_pen(pf2_layer, 15);
81 	tilemap_set_transparent_pen(pf1_layer, 15);
82 	tilemap_set_transparent_pen(text_layer, 15);
83 
84 	return 0;
85 }
86 
draw_sprites(struct mame_bitmap * bitmap)87 static void draw_sprites(struct mame_bitmap *bitmap)
88 {
89 	int offs,fx,fy,x,y,color,sprite,pri;
90 
91 	for (offs = 0; offs<0x800; offs+=8)
92 	{
93 		/* Don't draw empty sprite table entries */
94 		if (spriteram[offs+7]!=0xf) continue;
95 
96 		switch (spriteram[offs+5]&0xc0) {
97 		default:
98 		case 0xc0: pri=0; break; /* Unknown */
99 		case 0x80: pri=0; break; /* Over all playfields */
100 		case 0x40: pri=0xf0; break; /* Under top playfield */
101 		case 0x00: pri=0xf0|0xcc; break; /* Under middle playfield */
102 		}
103 
104 		fx= spriteram[offs+1]&0x20;
105 		fy= spriteram[offs+1]&0x40;
106 		y = spriteram[offs+0];
107 		x = spriteram[offs+4];
108 		if (fy) fy=0; else fy=1;
109 		if (spriteram[offs+5]&1) x=0-(0xff-x);
110 
111 		color = (spriteram[offs+3]>>4)&0xf;
112 		sprite = (spriteram[offs+2]+(spriteram[offs+3]<<8))&0xfff;
113 
114 		if (flip_screen) {
115 			x=240-x;
116 			y=240-y;
117 			if (fx) fx=0; else fx=1;
118 			if (fy) fy=0; else fy=1;
119 		}
120 
121 		pdrawgfx(bitmap,Machine->gfx[1],
122 				sprite,
123 				color,fx,fy,x,y,
124 				&Machine->visible_area,TRANSPARENCY_PEN,15,pri);
125 	}
126 }
127 
VIDEO_UPDATE(deadang)128 VIDEO_UPDATE( deadang )
129 {
130 	/* Setup the tilemaps */
131 	tilemap_set_scrolly( pf3_layer,0, ((deadang_scroll_ram[0x02]&0xf0)<<4)+((deadang_scroll_ram[0x04]&0x7f)<<1)+((deadang_scroll_ram[0x04]&0x80)>>7) );
132 	tilemap_set_scrollx( pf3_layer,0, ((deadang_scroll_ram[0x12]&0xf0)<<4)+((deadang_scroll_ram[0x14]&0x7f)<<1)+((deadang_scroll_ram[0x14]&0x80)>>7) );
133 	tilemap_set_scrolly( pf1_layer,0, ((deadang_scroll_ram[0x22]&0x10)<<4)+((deadang_scroll_ram[0x24]&0x7f)<<1)+((deadang_scroll_ram[0x24]&0x80)>>7) );
134 	tilemap_set_scrollx( pf1_layer,0, ((deadang_scroll_ram[0x32]&0x10)<<4)+((deadang_scroll_ram[0x34]&0x7f)<<1)+((deadang_scroll_ram[0x34]&0x80)>>7) );
135 	tilemap_set_scrolly( pf2_layer,0, ((deadang_scroll_ram[0x42]&0xf0)<<4)+((deadang_scroll_ram[0x44]&0x7f)<<1)+((deadang_scroll_ram[0x44]&0x80)>>7) );
136 	tilemap_set_scrollx( pf2_layer,0, ((deadang_scroll_ram[0x52]&0xf0)<<4)+((deadang_scroll_ram[0x54]&0x7f)<<1)+((deadang_scroll_ram[0x54]&0x80)>>7) );
137 
138 	/* Control byte:
139 		0x01: Background playfield disable
140 		0x02: Middle playfield disable
141 		0x04: Top playfield disable
142 		0x08: ?  Toggles at start of game
143 		0x10: Sprite disable
144 		0x20: Unused?
145 		0x40: Flipscreen
146 		0x80: Always set?
147 	*/
148 	tilemap_set_enable(pf3_layer,!(deadang_scroll_ram[0x68]&1));
149 	tilemap_set_enable(pf1_layer,!(deadang_scroll_ram[0x68]&2));
150 	tilemap_set_enable(pf2_layer,!(deadang_scroll_ram[0x68]&4));
151 	flip_screen_set( deadang_scroll_ram[0x68]&0x40 );
152 
153 	fillbitmap(bitmap,get_black_pen(),cliprect);
154 	fillbitmap(priority_bitmap,0,cliprect);
155 	tilemap_draw(bitmap,cliprect,pf3_layer,0,1);
156 	tilemap_draw(bitmap,cliprect,pf1_layer,0,2);
157 	tilemap_draw(bitmap,cliprect,pf2_layer,0,4);
158 	if (!(deadang_scroll_ram[0x68]&0x10)) draw_sprites(bitmap);
159 	tilemap_draw(bitmap,cliprect,text_layer,0,0);
160 }
161