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 /* legionna_scrollram16[6] */);
361 // tilemap_set_scrolly( text_layer, 0, 0 /* 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
375