1 /***************************************************************************
2 
3 	Legionnaire / Heated Barrel video hardware (derived from D-Con)
4 
5 ***************************************************************************/
6 
7 #include "driver.h"
8 #include "vidhrdw/generic.h"
9 
10 data16_t *legionna_back_data,*legionna_fore_data,*legionna_mid_data,*legionna_scrollram16,*legionna_textram;
11 
12 static struct tilemap *background_layer,*foreground_layer,*midground_layer,*text_layer;
13 /*static int legionna_enable;*/
14 
15 /******************************************************************************/
16 
17 static UINT16 gfx_bank = 0;
18 
heatbrl_setgfxbank(UINT16 data)19 void heatbrl_setgfxbank(UINT16 data)
20 {
21 	gfx_bank = (data &0x4000) >> 2;
22 }
23 
24 
WRITE16_HANDLER(legionna_control_w)25 WRITE16_HANDLER( legionna_control_w )
26 {
27 #if 0
28 	if (ACCESSING_LSB)
29 	{
30 		legionna_enable=data;
31 		if ((legionna_enable&4)==4)
32 			tilemap_set_enable(foreground_layer,0);
33 		else
34 			tilemap_set_enable(foreground_layer,1);
35 
36 		if ((legionna_enable&2)==2)
37 			tilemap_set_enable(midground_layer,0);
38 		else
39 			tilemap_set_enable(midground_layer,1);
40 
41 		if ((legionna_enable&1)==1)
42 			tilemap_set_enable(background_layer,0);
43 		else
44 			tilemap_set_enable(background_layer,1);
45 	}
46 #endif
47 }
48 
WRITE16_HANDLER(legionna_background_w)49 WRITE16_HANDLER( legionna_background_w )
50 {
51 	int oldword = legionna_back_data[offset];
52 	COMBINE_DATA(&legionna_back_data[offset]);
53 	if (oldword != legionna_back_data[offset])
54 		tilemap_mark_tile_dirty(background_layer,offset);
55 }
56 
WRITE16_HANDLER(legionna_midground_w)57 WRITE16_HANDLER( legionna_midground_w )
58 {
59 	int oldword = legionna_mid_data[offset];
60 	COMBINE_DATA(&legionna_mid_data[offset]);
61 	if (oldword != legionna_mid_data[offset])
62 		tilemap_mark_tile_dirty(midground_layer,offset);
63 }
64 
WRITE16_HANDLER(legionna_foreground_w)65 WRITE16_HANDLER( legionna_foreground_w )
66 {
67 	int oldword = legionna_fore_data[offset];
68 	COMBINE_DATA(&legionna_fore_data[offset]);
69 	if (oldword != legionna_fore_data[offset])
70 		tilemap_mark_tile_dirty(foreground_layer,offset);
71 }
72 
WRITE16_HANDLER(legionna_text_w)73 WRITE16_HANDLER( legionna_text_w )
74 {
75 	int oldword = legionna_textram[offset];
76 	COMBINE_DATA(&legionna_textram[offset]);
77 	if (oldword != legionna_textram[offset])
78 		tilemap_mark_tile_dirty(text_layer,offset);
79 }
80 
get_back_tile_info(int tile_index)81 static void get_back_tile_info(int tile_index)
82 {
83 	int tile=legionna_back_data[tile_index];
84 	int color=(tile>>12)&0xf;
85 
86 	tile &= 0xfff;
87 	tile |= gfx_bank;		/* Heatbrl uses banking */
88 
89 	SET_TILE_INFO(1,tile,color,0)
90 }
91 
get_mid_tile_info(int tile_index)92 static void get_mid_tile_info(int tile_index)
93 {
94 	int tile=legionna_mid_data[tile_index];
95 	int color=(tile>>12)&0xf;
96 
97 	tile &= 0xfff;
98 
99 	SET_TILE_INFO(5,tile,color,0)
100 }
101 
get_mid_tile_info_cupsoc(int tile_index)102 static void get_mid_tile_info_cupsoc(int tile_index)
103 {
104 	int tile=legionna_mid_data[tile_index];
105 	int color=(tile>>12)&0xf;
106 
107 	tile &= 0xfff;
108 
109 	tile |= 0x1000;
110 
111 	SET_TILE_INFO(1,tile,color,0)
112 }
113 
get_fore_tile_info(int tile_index)114 static void get_fore_tile_info(int tile_index)	/* this is giving bad tiles... */
115 {
116 	int tile=legionna_fore_data[tile_index];
117 	int color=(tile>>12)&0xf;
118 
119 	/* legionnaire tile numbers / gfx set wrong, see screen after coin insertion*/
120 	tile &= 0xfff;
121 
122 	SET_TILE_INFO(4,tile,color,0)
123 }
124 
get_text_tile_info(int tile_index)125 static void get_text_tile_info(int tile_index)
126 {
127 	int tile = legionna_textram[tile_index];
128 	int color=(tile>>12)&0xf;
129 
130 	tile &= 0xfff;
131 
132 	SET_TILE_INFO(0,tile,color,0)
133 }
134 
VIDEO_START(legionna)135 VIDEO_START( legionna )
136 {
137 	background_layer = tilemap_create(get_back_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
138 	foreground_layer = tilemap_create(get_fore_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
139 	midground_layer =  tilemap_create(get_mid_tile_info, tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
140 	text_layer =       tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,  8,8,64,32);
141 
142 	if (!background_layer || !foreground_layer || !midground_layer || !text_layer)
143 		return 1;
144 
145 	legionna_scrollram16 = auto_malloc(0x60);
146 
147 	if (!legionna_scrollram16)	return 1;
148 
149 	tilemap_set_transparent_pen(background_layer,15);
150 	tilemap_set_transparent_pen(midground_layer,15);
151 	tilemap_set_transparent_pen(foreground_layer,15);
152 	tilemap_set_transparent_pen(text_layer,15);
153 
154 	return 0;
155 }
156 
VIDEO_START(cupsoc)157 VIDEO_START( cupsoc )
158 {
159 	background_layer = tilemap_create(get_back_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
160 	foreground_layer = tilemap_create(get_fore_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
161 	midground_layer =  tilemap_create(get_mid_tile_info_cupsoc, tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
162 	text_layer =       tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,  8,8,64,32);
163 
164 	if (!background_layer || !foreground_layer || !midground_layer || !text_layer)
165 		return 1;
166 
167 	legionna_scrollram16 = auto_malloc(0x60);
168 
169 	if (!legionna_scrollram16)	return 1;
170 
171 	tilemap_set_transparent_pen(background_layer,15);
172 	tilemap_set_transparent_pen(midground_layer,15);
173 	tilemap_set_transparent_pen(foreground_layer,15);
174 	tilemap_set_transparent_pen(text_layer,15);
175 
176 	return 0;
177 }
178 
179 
180 /*************************************************************************
181 
182 	Legionnaire Spriteram (similar to Dcon)
183 	---------------------
184 
185 	It has "big sprites" created by setting width or height >0. Tile
186 	numbers are read consecutively.
187 
188     +0   x....... ........  Sprite enable
189 	+0   .x...... ........  Flip x
190 	+0   ..x..... ........  Flip y ???
191 	+0   ...xxx.. ........  Width: do this many tiles horizontally
192 	+0   ......xx x.......  Height: do this many tiles vertically
193 	+0   ........ .?......  unused ?
194  	+0   ........ ..xxxxxx  Color bank
195 
196 	+1   .x...... ........  Priority? (1=high?)
197 	+1   ..xxxxxx xxxxxxxx  Tile number
198 	+2   xxxxxxxx xxxxxxxx  X coordinate (signed)
199 	+3   xxxxxxxx xxxxxxxx  Y coordinate (signed)
200 
201 *************************************************************************/
202 
draw_sprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect,int pri)203 static void draw_sprites(struct mame_bitmap *bitmap,const struct rectangle *cliprect,int pri)
204 {
205 	int offs,fx,fy,x,y,color,sprite;
206 	int dx,dy,ax,ay;
207 
208 	for (offs = 0x400-4;offs >= 0;offs -= 4)
209 	{
210 		UINT16 data = spriteram16[offs];
211 		if (!(data &0x8000)) continue;
212 
213 		sprite = spriteram16[offs+1];
214 		if ((sprite>>14)!=pri) continue;
215 
216 		sprite &= 0x3fff;
217 
218 		y = spriteram16[offs+3];
219 		x = spriteram16[offs+2];
220 
221 		if (x &0x8000)	x = -(0x200-(x &0x1ff));
222 		else	x &= 0x1ff;
223 		if (y &0x8000)	y = -(0x200-(y &0x1ff));
224 		else	y &= 0x1ff;
225 
226 		color = (data &0x3f) + 0x40;
227 		fx =  (data &0x4000) >> 14;
228 		fy =  (data &0x2000) >> 13;	/* ??? */
229 		dy = ((data &0x0380) >> 7)  + 1;
230 		dx = ((data &0x1c00) >> 10) + 1;
231 
232 		if (!fx)
233 		{
234 			for (ax=0; ax<dx; ax++)
235 				for (ay=0; ay<dy; ay++)
236 				{
237 					drawgfx(bitmap,Machine->gfx[3],
238 					sprite++,
239 					color,fx,fy,x+ax*16,y+ay*16,
240 					cliprect,TRANSPARENCY_PEN,15);
241 				}
242 		}
243 		else
244 		{
245 			for (ax=0; ax<dx; ax++)
246 				for (ay=0; ay<dy; ay++)
247 				{
248 					drawgfx(bitmap,Machine->gfx[3],
249 					sprite++,
250 					color,fx,fy,x+(dx-ax-1)*16,y+ay*16,
251 					cliprect,TRANSPARENCY_PEN,15);
252 				}
253 		}
254 	}
255 }
256 
257 
VIDEO_UPDATE(legionna)258 VIDEO_UPDATE( legionna )
259 {
260 #ifdef MAME_DEBUG
261 	static int dislayer[5];	/* Layer toggles to help get the layers correct */
262 #endif
263 
264 #ifdef MAME_DEBUG
265 	if (keyboard_pressed_memory (KEYCODE_Z))
266 	{
267 		dislayer[0] ^= 1;
268 		usrintf_showmessage("bg0: %01x",dislayer[0]);
269 	}
270 
271 	if (keyboard_pressed_memory (KEYCODE_X))
272 	{
273 		dislayer[1] ^= 1;
274 		usrintf_showmessage("bg1: %01x",dislayer[1]);
275 	}
276 
277 	if (keyboard_pressed_memory (KEYCODE_C))
278 	{
279 		dislayer[2] ^= 1;
280 		usrintf_showmessage("bg2: %01x",dislayer[2]);
281 	}
282 
283 	if (keyboard_pressed_memory (KEYCODE_V))
284 	{
285 		dislayer[3] ^= 1;
286 		usrintf_showmessage("sprites: %01x",dislayer[3]);
287 	}
288 
289 	if (keyboard_pressed_memory (KEYCODE_B))
290 	{
291 		dislayer[4] ^= 1;
292 		usrintf_showmessage("text: %01x",dislayer[4]);
293 	}
294 #endif
295 
296 	/* Setup the tilemaps */
297 	tilemap_set_scrollx( background_layer, 0, legionna_scrollram16[0] );
298 	tilemap_set_scrolly( background_layer, 0, legionna_scrollram16[1] );
299 	tilemap_set_scrollx( midground_layer,  0, legionna_scrollram16[2] );
300 	tilemap_set_scrolly( midground_layer,  0, legionna_scrollram16[3] );
301 	tilemap_set_scrollx( foreground_layer, 0, legionna_scrollram16[4] );
302 	tilemap_set_scrolly( foreground_layer, 0, legionna_scrollram16[5] );
303 
304 /*	if ((legionna_enable&1)!=1)*/
305 
306 	fillbitmap(bitmap,get_black_pen(),cliprect);	/* wrong color? */
307 
308 #ifdef MAME_DEBUG
309 	if (dislayer[2]==0)
310 #endif
311 	tilemap_draw(bitmap,cliprect,foreground_layer,TILEMAP_IGNORE_TRANSPARENCY,0);
312 
313 #ifdef MAME_DEBUG
314 	if (dislayer[1]==0)
315 #endif
316 	tilemap_draw(bitmap,cliprect,midground_layer,0,0);
317 
318 #ifdef MAME_DEBUG
319 	if (dislayer[0]==0)
320 #endif
321 	tilemap_draw(bitmap,cliprect,background_layer,0,0);
322 
323 	draw_sprites(bitmap,cliprect,2);
324 	draw_sprites(bitmap,cliprect,1);
325 	draw_sprites(bitmap,cliprect,0);
326 	draw_sprites(bitmap,cliprect,3);
327 
328 #ifdef MAME_DEBUG
329 	if (dislayer[4]==0)
330 #endif
331 	tilemap_draw(bitmap,cliprect,text_layer,0,0);
332 }
333 
VIDEO_UPDATE(godzilla)334 VIDEO_UPDATE( godzilla )
335 {
336 	tilemap_set_scrollx( text_layer, 0, 0 );
337 	tilemap_set_scrolly( text_layer, 0, 112 );
338 
339 	fillbitmap(bitmap,get_black_pen(),cliprect);
340 
341 	tilemap_draw(bitmap,cliprect,background_layer,0,0);
342 	draw_sprites(bitmap,cliprect,2);
343 	tilemap_draw(bitmap,cliprect,midground_layer,0,0);
344 	draw_sprites(bitmap,cliprect,1);
345 	tilemap_draw(bitmap,cliprect,foreground_layer,0,0);
346 	draw_sprites(bitmap,cliprect,0);
347 	draw_sprites(bitmap,cliprect,3);
348 	tilemap_draw(bitmap,cliprect,text_layer,0,0);
349 }
350 
VIDEO_UPDATE(sdgndmrb)351 VIDEO_UPDATE( sdgndmrb )
352 {
353 	/* Setup the tilemaps */
354 	tilemap_set_scrollx( background_layer, 0, legionna_scrollram16[0] );
355 	tilemap_set_scrolly( background_layer, 0, legionna_scrollram16[1] );
356 	tilemap_set_scrollx( midground_layer,  0, legionna_scrollram16[2] );
357 	tilemap_set_scrolly( midground_layer,  0, legionna_scrollram16[3] );
358 	tilemap_set_scrollx( foreground_layer, 0, legionna_scrollram16[4] );
359 	tilemap_set_scrolly( foreground_layer, 0, legionna_scrollram16[5] );
360 /*	tilemap_set_scrollx( text_layer,       0, 128                     ); // set to 128 instead of legionna_scrollram16[6] */
361 /*	tilemap_set_scrolly( text_layer,       0, 0                       ); // set to 0 instead of legionna_scrollram16[7] */
362 
363 	fillbitmap(bitmap,get_black_pen(),cliprect);
364 
365 	tilemap_draw(bitmap,cliprect,background_layer,0,0);
366 	draw_sprites(bitmap,cliprect,2);
367 	tilemap_draw(bitmap,cliprect,midground_layer,0,0);
368 	draw_sprites(bitmap,cliprect,1);
369 	tilemap_draw(bitmap,cliprect,foreground_layer,0,0);
370 	draw_sprites(bitmap,cliprect,0);
371 	draw_sprites(bitmap,cliprect,3);
372 	tilemap_draw(bitmap,cliprect,text_layer,0,0);
373 }
374