1 #include "driver.h"
2 #include "vidhrdw/generic.h"
3 
4 
5 
6 unsigned char *lastday_txvideoram;
7 unsigned char *lastday_bgscroll,*lastday_fgscroll,*bluehawk_fg2scroll;
8 data16_t *rshark_scroll1,*rshark_scroll2,*rshark_scroll3,*rshark_scroll4;
9 static int tx_pri;
10 static int flytiger_pri;
11 static int sprites_disabled;
12 data8_t *paletteram_flytiger;
13 static data8_t flytiger_palette_bank;		/* Used by flytiger */
14 
15 
WRITE_HANDLER(lastday_ctrl_w)16 WRITE_HANDLER( lastday_ctrl_w )
17 {
18 	/* bits 0 and 1 are coin counters */
19 	coin_counter_w(0,data & 0x01);
20 	coin_counter_w(1,data & 0x02);
21 
22 	/* bit 3 is used but unknown */
23 
24 	/* bit 4 is used but unknown */
25 
26 	/* bit 6 is flip screen */
27 	flip_screen_set(data & 0x40);
28 }
29 
WRITE_HANDLER(pollux_ctrl_w)30 WRITE_HANDLER( pollux_ctrl_w )
31 {
32 	/* bit 0 is flip screen */
33 	flip_screen_set(data & 0x01);
34 
35 	/* bits 6 and 7 are coin counters */
36 	coin_counter_w(0,data & 0x80);
37 	coin_counter_w(1,data & 0x40);
38 
39 	/* bit 1 is used but unknown */
40 
41 	/* bit 2 is continuously toggled (unknown) */
42 }
43 
WRITE_HANDLER(primella_ctrl_w)44 WRITE_HANDLER( primella_ctrl_w )
45 {
46  	int bankaddress;
47 	unsigned char *RAM = memory_region(REGION_CPU1);
48 
49 	/* bits 0-2 select ROM bank */
50 	bankaddress = 0x10000 + (data & 0x07) * 0x4000;
51 	cpu_setbank(1,&RAM[bankaddress]);
52 
53 	/* bit 3 disables tx layer */
54 	tx_pri = data & 0x08;
55 
56 	/* bit 4 flips screen */
57 	flip_screen_set(data & 0x10);
58 
59 	/* bit 5 used but unknown */
60 
61 /*	log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: bankswitch = %02x\n",activecpu_get_pc(),data&0xe0);*/
62 }
63 
WRITE_HANDLER(paletteram_flytiger_w)64 WRITE_HANDLER( paletteram_flytiger_w )
65 {
66 	if (flytiger_palette_bank)
67 	{
68 		UINT16 value;
69 		paletteram_flytiger[offset] = data;
70 		value = paletteram_flytiger[offset & ~1] | (paletteram_flytiger[offset | 1] << 8);
71 		palette_set_color(offset/2, pal5bit(value >> 10), pal5bit(value >> 5), pal5bit(value >> 0));
72 	}
73 }
74 
WRITE_HANDLER(flytiger_ctrl_w)75 WRITE_HANDLER( flytiger_ctrl_w )
76 {
77 	/* bit 0 is flip screen */
78 	flip_screen_set(data & 0x01);
79 
80 	/* bits 1, 2 used but unknown */
81 
82 	/* bit 3 fg palette banking: trash protection? */
83 	flytiger_palette_bank = data & 0x08;
84 
85 	/* bit 4 changes tilemaps priority */
86 	flytiger_pri = data & 0x10;
87 }
88 
WRITE16_HANDLER(rshark_ctrl_w)89 WRITE16_HANDLER( rshark_ctrl_w )
90 {
91 	if (ACCESSING_LSB)
92 	{
93 		/* bit 0 flips screen */
94 		flip_screen_set(data & 0x01);
95 
96 		/* bit 4 used but unknown */
97 
98 		/* bit 5 used but unknown */
99 	}
100 }
101 
102 
draw_layer(struct mame_bitmap * bitmap,int gfx,const unsigned char * scroll,const unsigned char * tilemap,int transparency)103 static void draw_layer(struct mame_bitmap *bitmap,int gfx,const unsigned char *scroll,
104 		const unsigned char *tilemap,int transparency)
105 {
106 	int offs;
107 	int scrollx,scrolly;
108 
109 	scrollx = scroll[0] + (scroll[1] << 8);
110 	scrolly = scroll[3] + (scroll[4] << 8);
111 
112 	for (offs = 0;offs < 0x100;offs += 2)
113 	{
114 		int sx,sy,code,color,attr,flipx,flipy;
115 		int toffs = offs+((scrollx&~0x1f)>>1);
116 
117 		attr = tilemap[toffs];
118 		code = tilemap[toffs+1] | ((attr & 0x01) << 8) | ((attr & 0x80) << 2),
119 		color = (attr & 0x78) >> 3;
120 		sx = 32 * ((offs/2) / 8) - (scrollx & 0x1f);
121 		sy = (32 * ((offs/2) % 8) - scrolly) & 0xff;
122 		flipx = attr & 0x02;
123 		flipy = attr & 0x04;
124 		if (flip_screen)
125 		{
126 			sx = 512-32 - sx;
127 			sy = 256-32 - sy;
128 			flipx = !flipx;
129 			flipy = !flipy;
130 		}
131 
132 		drawgfx(bitmap,Machine->gfx[gfx],
133 				code,
134 				color,
135 				flipx,flipy,
136 				sx,sy,
137 				&Machine->visible_area,transparency,15);
138 		/* wraparound */
139 		if (scrolly & 0x1f)
140 		{
141 			drawgfx(bitmap,Machine->gfx[gfx],
142 					code,
143 					color,
144 					flipx,flipy,
145 					sx,((sy + 0x20) & 0xff) - 0x20,
146 					&Machine->visible_area,transparency,15);
147 		}
148 	}
149 }
150 
bluehawk_draw_layer(struct mame_bitmap * bitmap,int gfx,const unsigned char * scroll,const unsigned char * tilemap,int transparency)151 static void bluehawk_draw_layer(struct mame_bitmap *bitmap,int gfx,const unsigned char *scroll,
152 		const unsigned char *tilemap,int transparency)
153 {
154 	int offs;
155 	int scrollx,scrolly;
156 
157 	scrollx = scroll[0] + (scroll[1] << 8);
158 	scrolly = scroll[3] + (scroll[4] << 8);
159 
160 	for (offs = 0;offs < 0x100;offs += 2)
161 	{
162 		int sx,sy,code,color,attr,flipx,flipy;
163 		int toffs = offs+((scrollx&~0x1f)>>1);
164 
165 		attr = tilemap[toffs];
166 		code = tilemap[toffs+1] | ((attr & 0x03) << 8);
167 		color = (attr & 0x3c) >> 2;
168 		sx = 32 * ((offs/2) / 8) - (scrollx & 0x1f);
169 		sy = (32 * ((offs/2) % 8) - scrolly) & 0xff;
170 		flipx = attr & 0x40;
171 		flipy = attr & 0x80;
172 		if (flip_screen)
173 		{
174 			sx = 512-32 - sx;
175 			sy = 256-32 - sy;
176 			flipx = !flipx;
177 			flipy = !flipy;
178 		}
179 
180 		drawgfx(bitmap,Machine->gfx[gfx],
181 				code,
182 				color,
183 				flipx,flipy,
184 				sx,sy,
185 				&Machine->visible_area,transparency,15);
186 		/* wraparound */
187 		if (scrolly & 0x1f)
188 		{
189 			drawgfx(bitmap,Machine->gfx[gfx],
190 					code,
191 					color,
192 					flipx,flipy,
193 					sx,((sy + 0x20) & 0xff) - 0x20,
194 					&Machine->visible_area,transparency,15);
195 		}
196 	}
197 }
198 
bluehawk_draw_layer2(struct mame_bitmap * bitmap,int gfx,const unsigned char * scroll,const unsigned char * tilemap,int transparency)199 static void bluehawk_draw_layer2(struct mame_bitmap *bitmap,int gfx,const unsigned char *scroll,
200 		const unsigned char *tilemap,int transparency)
201 {
202 	int offs;
203 	int scrollx,scrolly;
204 
205 	scrollx = scroll[0] + (scroll[1] << 8);
206 	scrolly = scroll[3] + (scroll[4] << 8);
207 
208 	for (offs = 0;offs < 0x100;offs += 2)
209 	{
210 		int sx,sy,code,color,attr,flipx,flipy;
211 		int toffs = offs+((scrollx&~0x1f)>>1);
212 
213 		attr = tilemap[toffs];
214 		code = tilemap[toffs+1] | ((attr & 0x01) << 8);
215 		color = (attr & 0x78) >> 3;
216 		sx = 32 * ((offs/2) / 8) - (scrollx & 0x1f);
217 		sy = (32 * ((offs/2) % 8) - scrolly) & 0xff;
218 		flipx = 0;
219 		flipy = attr & 0x04;
220 		if (flip_screen)
221 		{
222 			sx = 512-32 - sx;
223 			sy = 256-32 - sy;
224 			flipx = !flipx;
225 			flipy = !flipy;
226 		}
227 
228 		drawgfx(bitmap,Machine->gfx[gfx],
229 				code,
230 				color,
231 				flipx,flipy,
232 				sx,sy,
233 				&Machine->visible_area,transparency,15);
234 		/* wraparound */
235 		if (scrolly & 0x1f)
236 		{
237 			drawgfx(bitmap,Machine->gfx[gfx],
238 					code,
239 					color,
240 					flipx,flipy,
241 					sx,((sy + 0x20) & 0xff) - 0x20,
242 					&Machine->visible_area,transparency,15);
243 		}
244 	}
245 }
246 
rshark_draw_layer(struct mame_bitmap * bitmap,int gfx,data16_t * scroll,const unsigned char * tilemap,const unsigned char * tilemap2,int transparency)247 static void rshark_draw_layer(struct mame_bitmap *bitmap,int gfx,data16_t *scroll,
248 		const unsigned char *tilemap,const unsigned char *tilemap2,int transparency)
249 {
250 	int offs;
251 	int scrollx,scrolly;
252 
253 	scrollx = (scroll[0]&0xff) + ((scroll[1]&0xff) << 8);
254 	scrolly = (scroll[3]&0xff) + ((scroll[4]&0xff) << 8);
255 
256 	for (offs = 0;offs < 0x800;offs += 2)
257 	{
258 		int sx,sy,code,color,attr,attr2,flipx,flipy;
259 		int toffs = offs+((scrollx&~0x0f)<<2);
260 
261 		attr = tilemap[toffs];
262 		attr2 = tilemap2[toffs/2];
263 		code = tilemap[toffs+1] | ((attr & 0x1f) << 8);
264 		color = attr2 & 0x0f;
265 		sx = 16 * ((offs/2) / 32) - (scrollx & 0x0f);
266 		sy = (16 * ((offs/2) % 32) - scrolly) & 0x1ff;
267 		if (sy > 256) sy -= 512;
268 		flipx = attr & 0x40;
269 		flipy = attr & 0x80;
270 		if (flip_screen)
271 		{
272 			sx = 512-16 - sx;
273 			sy = 256-16 - sy;
274 			flipx = !flipx;
275 			flipy = !flipy;
276 		}
277 
278 		drawgfx(bitmap,Machine->gfx[gfx],
279 				code,
280 				color,
281 				flipx,flipy,
282 				sx,sy,
283 				&Machine->visible_area,transparency,15);
284 	}
285 }
286 
287 
288 /* it's the same as draw_layer function for now... */
flytiger_draw_layer2(struct mame_bitmap * bitmap,int gfx,const unsigned char * scroll,const unsigned char * tilemap,int transparency)289 static void flytiger_draw_layer2(struct mame_bitmap *bitmap,int gfx,const unsigned char *scroll,
290 		const unsigned char *tilemap,int transparency)
291 {
292 	int offs;
293 	int scrollx,scrolly;
294 
295 	scrollx = scroll[0] + (scroll[1] << 8);
296 	scrolly = scroll[3] + (scroll[4] << 8);
297 
298 	for (offs = 0;offs < 0x100;offs += 2)
299 	{
300 		int sx,sy,code,color,attr,flipx,flipy;
301 		int toffs = offs+((scrollx&~0x1f)>>1);
302 
303 		attr = tilemap[toffs];
304 		code = tilemap[toffs+1] | ((attr & 0x01) << 8) | ((attr & 0x80) << 2),
305 		color = (attr & 0x78) >> 3;
306 		sx = 32 * ((offs/2) / 8) - (scrollx & 0x1f);
307 		sy = (32 * ((offs/2) % 8) - scrolly) & 0xff;
308 
309 		flipx = attr & 0x02;
310 		flipy = attr & 0x04;
311 		if (flip_screen)
312 		{
313 			sx = 512-32 - sx;
314 			sy = 256-32 - sy;
315 			flipx = !flipx;
316 			flipy = !flipy;
317 		}
318 
319 		drawgfx(bitmap,Machine->gfx[gfx],
320 				code,
321 				color,
322 				flipx,flipy,
323 				sx,sy,
324 				&Machine->visible_area,transparency,15);
325 		/* wraparound */
326 		if (scrolly & 0x1f)
327 		{
328 			drawgfx(bitmap,Machine->gfx[gfx],
329 					code,
330 					color,
331 					flipx,flipy,
332 					sx,((sy + 0x20) & 0xff) - 0x20,
333 					&Machine->visible_area,transparency,15);
334 		}
335 	}
336 }
337 
draw_tx(struct mame_bitmap * bitmap,int yoffset)338 static void draw_tx(struct mame_bitmap *bitmap,int yoffset)
339 {
340 	int offs;
341 
342 	for (offs = 0;offs < 0x800;offs++)
343 	{
344 		int sx,sy,attr;
345 
346 		attr = lastday_txvideoram[offs+0x800];
347 		sx = offs / 32;
348 		sy = offs % 32;
349 		if (flip_screen)
350 		{
351 			sx = 63 - sx;
352 			sy = 31 - sy;
353 		}
354 
355 		drawgfx(bitmap,Machine->gfx[0],
356 				lastday_txvideoram[offs] | ((attr & 0x0f) << 8),
357 				(attr & 0xf0) >> 4,
358 				flip_screen,flip_screen,
359 				8*sx,8*(sy + yoffset),
360 				&Machine->visible_area,TRANSPARENCY_PEN,15);
361 	}
362 }
363 
bluehawk_draw_tx(struct mame_bitmap * bitmap)364 static void bluehawk_draw_tx(struct mame_bitmap *bitmap)
365 {
366 	int offs;
367 
368 	for (offs = 0;offs < 0x1000;offs += 2)
369 	{
370 		int sx,sy,attr;
371 
372 		attr = lastday_txvideoram[offs+1];
373 		sx = (offs/2) / 32;
374 		sy = (offs/2) % 32;
375 		if (flip_screen)
376 		{
377 			sx = 63 - sx;
378 			sy = 31 - sy;
379 		}
380 
381 		drawgfx(bitmap,Machine->gfx[0],
382 				lastday_txvideoram[offs] | ((attr & 0x0f) << 8),
383 				(attr & 0xf0) >> 4,
384 				flip_screen,flip_screen,
385 				8*sx,8*sy,
386 				&Machine->visible_area,TRANSPARENCY_PEN,15);
387 	}
388 }
389 
draw_sprites(struct mame_bitmap * bitmap,int pollux_extensions)390 static void draw_sprites(struct mame_bitmap *bitmap,int pollux_extensions)
391 {
392 	int offs;
393 
394 	for (offs = spriteram_size-32;offs >= 0;offs -= 32)
395 	{
396 		int sx,sy,code,color;
397 		int flipx=0,flipy=0,height=0,y;
398 
399 		sx = buffered_spriteram[offs+3] | ((buffered_spriteram[offs+1] & 0x10) << 4);
400 		sy = buffered_spriteram[offs+2];
401 		code = buffered_spriteram[offs] | ((buffered_spriteram[offs+1] & 0xe0) << 3);
402 		color = buffered_spriteram[offs+1] & 0x0f;
403 
404 		if (pollux_extensions)
405 		{
406 			/* gulfstrm, pollux, bluehawk */
407 			code |= ((buffered_spriteram[offs+0x1c] & 0x01) << 11);
408 
409 			if (pollux_extensions >= 2)
410 			{
411 				/* pollux, bluehawk */
412 				height = (buffered_spriteram[offs+0x1c] & 0x70) >> 4;
413 				code &= ~height;
414 				if (pollux_extensions == 3)
415 				{
416 					/* bluehawk */
417 					sy += 6 - ((~buffered_spriteram[offs+0x1c] & 0x02) << 7);
418 					flipx = buffered_spriteram[offs+0x1c] & 0x08;
419 					flipy = buffered_spriteram[offs+0x1c] & 0x04;
420 				}
421 
422 				if (pollux_extensions == 4)
423 				{
424 					/* flytiger */
425 					sy -=(buffered_spriteram[offs+0x1c] & 0x02) << 7;
426 					flipx = buffered_spriteram[offs+0x1c] & 0x08;
427 					flipy = buffered_spriteram[offs+0x1c] & 0x04;
428 				}
429 			}
430 		}
431 
432 		if (flip_screen)
433 		{
434 			sx = 498 - sx;
435 			sy = 240-16*height - sy;
436 			flipx = !flipx;
437 			flipy = !flipy;
438 		}
439 
440 		for (y = 0;y <= height;y++)
441 		{
442 			drawgfx(bitmap,Machine->gfx[1],
443 					code+y,
444 					color,
445 					flipx,flipy,
446 					sx,flipy ? sy + 16*(height-y) : sy + 16*y,
447 					&Machine->visible_area,TRANSPARENCY_PEN,15);
448 		}
449 	}
450 }
451 
rshark_draw_sprites(struct mame_bitmap * bitmap)452 static void rshark_draw_sprites(struct mame_bitmap *bitmap)
453 {
454 	int offs;
455 
456 	for (offs = 0;offs < spriteram_size/2;offs += 8)
457 	{
458 		if (buffered_spriteram16[offs] & 0x0001)	/* enable */
459 		{
460 			int sx,sy,code,color;
461 			int flipx=0,flipy=0,width,height,x,y;
462 
463 			sx = buffered_spriteram16[offs+4] & 0x01ff;
464 			sy = (INT16)buffered_spriteram16[offs+6];
465 			code = buffered_spriteram16[offs+3];
466 			color = buffered_spriteram16[offs+7];
467 			width = buffered_spriteram16[offs+1] & 0x000f;
468 			height = (buffered_spriteram16[offs+1] & 0x00f0) >> 4;
469 
470 			if (flip_screen)
471 			{
472 				sx = 498-16*width - sx;
473 				sy = 240-16*height - sy;
474 				flipx = !flipx;
475 				flipy = !flipy;
476 			}
477 
478 			for (y = 0;y <= height;y++)
479 			{
480 				for (x = 0;x <= width;x++)
481 				{
482 					drawgfx(bitmap,Machine->gfx[0],
483 							code,
484 							color,
485 							flipx,flipy,
486 							flipx ? sx + 16*(width-x) : sx + 16*x,
487 							flipy ? sy + 16*(height-y) : sy + 16*y,
488 							&Machine->visible_area,TRANSPARENCY_PEN,15);
489 
490 					code++;
491 				}
492 			}
493 		}
494 	}
495 }
496 
497 
VIDEO_UPDATE(lastday)498 VIDEO_UPDATE( lastday )
499 {
500 	fillbitmap(bitmap, get_black_pen(), cliprect);
501 
502 	if(!(lastday_bgscroll[6] & 0x10))
503 		draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX5),TRANSPARENCY_NONE);
504 
505 	if(!(lastday_fgscroll[6] & 0x10))
506 		draw_layer(bitmap,3,lastday_fgscroll,memory_region(REGION_GFX6),TRANSPARENCY_PEN);
507 
508 	if(!sprites_disabled)
509 		draw_sprites(bitmap,0);
510 
511 	draw_tx(bitmap,-1);
512 }
513 
VIDEO_UPDATE(gulfstrm)514 VIDEO_UPDATE( gulfstrm )
515 {
516 	draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX5),TRANSPARENCY_NONE);
517 	draw_layer(bitmap,3,lastday_fgscroll,memory_region(REGION_GFX6),TRANSPARENCY_PEN);
518 	draw_sprites(bitmap,1);
519 	draw_tx(bitmap,-1);
520 }
521 
VIDEO_UPDATE(pollux)522 VIDEO_UPDATE( pollux )
523 {
524 	draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX5),TRANSPARENCY_NONE);
525 	draw_layer(bitmap,3,lastday_fgscroll,memory_region(REGION_GFX6),TRANSPARENCY_PEN);
526 	draw_sprites(bitmap,2);
527 	draw_tx(bitmap,0);
528 }
529 
VIDEO_UPDATE(flytiger)530 VIDEO_UPDATE( flytiger )
531 {
532 	fillbitmap(bitmap, get_black_pen(), cliprect);
533 
534 	if(flytiger_pri)
535 	{
536 		if(!(lastday_fgscroll[6] & 0x10))
537 			flytiger_draw_layer2(bitmap,3,lastday_fgscroll,memory_region(REGION_GFX4)+0x78000,TRANSPARENCY_NONE);
538 
539 		if(!(lastday_bgscroll[6] & 0x10))
540 			draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX3)+0x78000,TRANSPARENCY_PEN);
541 	}
542 	else
543 	{
544 		if(!(lastday_bgscroll[6] & 0x10))
545 			draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX3)+0x78000,TRANSPARENCY_NONE);
546 
547 		if(!(lastday_fgscroll[6] & 0x10))
548 			flytiger_draw_layer2(bitmap,3,lastday_fgscroll,memory_region(REGION_GFX4)+0x78000,TRANSPARENCY_PEN);
549 	}
550 
551 	draw_sprites(bitmap,4);
552 	draw_tx(bitmap,0);
553 }
554 
555 
VIDEO_UPDATE(bluehawk)556 VIDEO_UPDATE( bluehawk )
557 {
558 	bluehawk_draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX3)+0x78000,TRANSPARENCY_NONE);
559 	bluehawk_draw_layer(bitmap,3,lastday_fgscroll,memory_region(REGION_GFX4)+0x78000,TRANSPARENCY_PEN);
560 	draw_sprites(bitmap,3);
561 	bluehawk_draw_layer2(bitmap,4,bluehawk_fg2scroll,memory_region(REGION_GFX5)+0x38000,TRANSPARENCY_PEN);
562 	bluehawk_draw_tx(bitmap);
563 }
564 
VIDEO_UPDATE(primella)565 VIDEO_UPDATE( primella )
566 {
567 	bluehawk_draw_layer(bitmap,1,lastday_bgscroll,memory_region(REGION_GFX2)+memory_region_length(REGION_GFX2)-0x8000,TRANSPARENCY_NONE);
568 	if (tx_pri) bluehawk_draw_tx(bitmap);
569 	bluehawk_draw_layer(bitmap,2,lastday_fgscroll,memory_region(REGION_GFX3)+memory_region_length(REGION_GFX3)-0x8000,TRANSPARENCY_PEN);
570 	if (!tx_pri) bluehawk_draw_tx(bitmap);
571 }
572 
VIDEO_UPDATE(rshark)573 VIDEO_UPDATE( rshark )
574 {
575 	rshark_draw_layer(bitmap,4,rshark_scroll4,memory_region(REGION_GFX5),memory_region(REGION_GFX6)+0x60000,TRANSPARENCY_NONE);
576 	rshark_draw_layer(bitmap,3,rshark_scroll3,memory_region(REGION_GFX4),memory_region(REGION_GFX6)+0x40000,TRANSPARENCY_PEN);
577 	rshark_draw_layer(bitmap,2,rshark_scroll2,memory_region(REGION_GFX3),memory_region(REGION_GFX6)+0x20000,TRANSPARENCY_PEN);
578 	rshark_draw_layer(bitmap,1,rshark_scroll1,memory_region(REGION_GFX2),memory_region(REGION_GFX6)+0x00000,TRANSPARENCY_PEN);
579 	rshark_draw_sprites(bitmap);
580 }
581 
VIDEO_EOF(dooyong)582 VIDEO_EOF( dooyong )
583 {
584 	buffer_spriteram_w(0,0);
585 }
586 
VIDEO_EOF(rshark)587 VIDEO_EOF( rshark )
588 {
589 	buffer_spriteram16_w(0,0,0);
590 }
591