1 /***************************************************************************
2 
3   vidhrdw.c
4 
5   Functions to emulate the video hardware of the machine.
6 
7 ***************************************************************************/
8 
9 #include "driver.h"
10 
11 
12 
13 unsigned char *gundealr_bg_videoram,*gundealr_fg_videoram;
14 
15 static struct tilemap *bg_tilemap,*fg_tilemap;
16 static int flipscreen;
17 
18 
19 
20 /***************************************************************************
21 
22   Callbacks for the TileMap code
23 
24 ***************************************************************************/
25 
get_bg_tile_info(int tile_index)26 static void get_bg_tile_info(int tile_index)
27 {
28 	unsigned char attr = gundealr_bg_videoram[2*tile_index+1];
29 	SET_TILE_INFO(
30 			0,
31 			gundealr_bg_videoram[2*tile_index] + ((attr & 0x07) << 8),
32 			(attr & 0xf0) >> 4,
33 			0)
34 }
35 
gundealr_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)36 static UINT32 gundealr_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)
37 {
38 	/* logical (col,row) -> memory offset */
39 	return (row & 0x0f) + ((col & 0x3f) << 4) + ((row & 0x10) << 6);
40 }
41 
get_fg_tile_info(int tile_index)42 static void get_fg_tile_info(int tile_index)
43 {
44 	unsigned char attr = gundealr_fg_videoram[2*tile_index+1];
45 	SET_TILE_INFO(
46 			1,
47 			gundealr_fg_videoram[2*tile_index] + ((attr & 0x03) << 8),
48 			(attr & 0xf0) >> 4,
49 			0)
50 }
51 
52 
53 
54 /***************************************************************************
55 
56   Start the video hardware emulation.
57 
58 ***************************************************************************/
59 
VIDEO_START(gundealr)60 VIDEO_START( gundealr )
61 {
62 	bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_cols,TILEMAP_OPAQUE,      8, 8,32,32);
63 	fg_tilemap = tilemap_create(get_fg_tile_info,gundealr_scan,    TILEMAP_TRANSPARENT,16,16,64,32);
64 
65 	if (!bg_tilemap || !fg_tilemap)
66 		return 1;
67 
68 	tilemap_set_transparent_pen(fg_tilemap,15);
69 
70 	return 0;
71 }
72 
73 
74 
75 /***************************************************************************
76 
77   Memory handlers
78 
79 ***************************************************************************/
80 
WRITE_HANDLER(gundealr_bg_videoram_w)81 WRITE_HANDLER( gundealr_bg_videoram_w )
82 {
83 	if (gundealr_bg_videoram[offset] != data)
84 	{
85 		gundealr_bg_videoram[offset] = data;
86 		tilemap_mark_tile_dirty(bg_tilemap,offset/2);
87 	}
88 }
89 
WRITE_HANDLER(gundealr_fg_videoram_w)90 WRITE_HANDLER( gundealr_fg_videoram_w )
91 {
92 	if (gundealr_fg_videoram[offset] != data)
93 	{
94 		gundealr_fg_videoram[offset] = data;
95 		tilemap_mark_tile_dirty(fg_tilemap,offset/2);
96 	}
97 }
98 
WRITE_HANDLER(gundealr_paletteram_w)99 WRITE_HANDLER( gundealr_paletteram_w )
100 {
101 	int r,g,b,val;
102 
103 
104 	paletteram[offset] = data;
105 
106 	val = paletteram[offset & ~1];
107 	r = (val >> 4) & 0x0f;
108 	g = (val >> 0) & 0x0f;
109 
110 	val = paletteram[offset | 1];
111 	b = (val >> 4) & 0x0f;
112 	/* TODO: the bottom 4 bits are used as well, but I'm not sure about the meaning */
113 
114 	r = 0x11 * r;
115 	g = 0x11 * g;
116 	b = 0x11 * b;
117 
118 	palette_set_color(offset / 2,r,g,b);
119 }
120 
WRITE_HANDLER(gundealr_fg_scroll_w)121 WRITE_HANDLER( gundealr_fg_scroll_w )
122 {
123 	static unsigned char scroll[4];
124 
125 	scroll[offset] = data;
126 	tilemap_set_scrollx(fg_tilemap,0,scroll[1] | ((scroll[0] & 0x03) << 8));
127 	tilemap_set_scrolly(fg_tilemap,0,scroll[3] | ((scroll[2] & 0x03) << 8));
128 }
129 
WRITE_HANDLER(yamyam_fg_scroll_w)130 WRITE_HANDLER( yamyam_fg_scroll_w )
131 {
132 	static unsigned char scroll[4];
133 
134 	scroll[offset] = data;
135 	tilemap_set_scrollx(fg_tilemap,0,scroll[0] | ((scroll[1] & 0x03) << 8));
136 	tilemap_set_scrolly(fg_tilemap,0,scroll[2] | ((scroll[3] & 0x03) << 8));
137 }
138 
WRITE_HANDLER(gundealr_flipscreen_w)139 WRITE_HANDLER( gundealr_flipscreen_w )
140 {
141 	flipscreen = data;
142 	tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
143 }
144 
145 
146 
147 /***************************************************************************
148 
149   Display refresh
150 
151 ***************************************************************************/
152 
VIDEO_UPDATE(gundealr)153 VIDEO_UPDATE( gundealr )
154 {
155 	tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
156 	tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
157 }
158