1 /***************************************************************************
2 
3 	Goal '92 video hardware
4 
5 ***************************************************************************/
6 
7 #include "driver.h"
8 #include "vidhrdw/generic.h"
9 
10 data16_t *goal92_back_data,*goal92_fore_data,*goal92_textram,*goal92_scrollram16;
11 
12 static struct tilemap *background_layer,*foreground_layer,*text_layer;
13 
14 static data16_t fg_bank = 0;
15 
READ16_HANDLER(goal92_fg_bank_r)16 READ16_HANDLER( goal92_fg_bank_r )
17 {
18 	return fg_bank;
19 }
20 
WRITE16_HANDLER(goal92_fg_bank_w)21 WRITE16_HANDLER( goal92_fg_bank_w )
22 {
23 	COMBINE_DATA(&fg_bank);
24 
25 	if(ACCESSING_LSB)
26 	{
27 		tilemap_mark_all_tiles_dirty(foreground_layer);
28 	}
29 }
30 
WRITE16_HANDLER(goal92_text_w)31 WRITE16_HANDLER( goal92_text_w )
32 {
33 	int oldword = goal92_textram[offset];
34 	COMBINE_DATA(&goal92_textram[offset]);
35 	if (oldword != goal92_textram[offset])
36 		tilemap_mark_tile_dirty(text_layer,offset);
37 }
38 
WRITE16_HANDLER(goal92_background_w)39 WRITE16_HANDLER( goal92_background_w )
40 {
41 	int oldword = goal92_back_data[offset];
42 	COMBINE_DATA(&goal92_back_data[offset]);
43 	if (oldword != goal92_back_data[offset])
44 		tilemap_mark_tile_dirty(background_layer,offset);
45 }
46 
WRITE16_HANDLER(goal92_foreground_w)47 WRITE16_HANDLER( goal92_foreground_w )
48 {
49 	int oldword = goal92_fore_data[offset];
50 	COMBINE_DATA(&goal92_fore_data[offset]);
51 	if (oldword != goal92_fore_data[offset])
52 		tilemap_mark_tile_dirty(foreground_layer,offset);
53 }
54 
get_text_tile_info(int tile_index)55 static void get_text_tile_info(int tile_index)
56 {
57 	int tile = goal92_textram[tile_index];
58 	int color=(tile>>12)&0xf;
59 
60 	tile &= 0xfff;
61 
62 	tile |= 0xc000;
63 
64 	SET_TILE_INFO(1,tile,color,0)
65 }
66 
get_back_tile_info(int tile_index)67 static void get_back_tile_info(int tile_index)
68 {
69 	int tile=goal92_back_data[tile_index];
70 	int color=(tile>>12)&0xf;
71 
72 	tile &= 0xfff;
73 
74 	SET_TILE_INFO(2,tile,color,0)
75 }
76 
get_fore_tile_info(int tile_index)77 static void get_fore_tile_info(int tile_index)
78 {
79 	int tile=goal92_fore_data[tile_index];
80 	int color=(tile>>12)&0xf;
81 	int region;
82 
83 	tile &= 0xfff;
84 
85 	if(fg_bank & 0xff)
86 	{
87 		region = 3;
88 		tile |= 0x1000;
89 	}
90 	else
91 	{
92 		region = 4;
93 		tile |= 0x2000;
94 	}
95 
96 	SET_TILE_INFO(region,tile,color,0)
97 }
98 
draw_sprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect,int pri)99 static void draw_sprites(struct mame_bitmap *bitmap,const struct rectangle *cliprect,int pri)
100 {
101 	int offs,fx,fy,x,y,color,sprite;
102 
103 	for (offs = 3;offs <= 0x400-5;offs += 4)
104 	{
105 		UINT16 data = buffered_spriteram16[offs+2];
106 
107 		y = buffered_spriteram16[offs+0];
108 
109 		if (y & 0x8000)
110 			break;
111 
112 		if (!(data & 0x8000))
113 			continue;
114 
115 		sprite = buffered_spriteram16[offs+1];
116 
117 		if ((sprite>>14)!=pri)
118 			continue;
119 
120 		x = buffered_spriteram16[offs+3];
121 
122 		sprite &= 0x1fff;
123 
124 		x &= 0x1ff;
125 		y &= 0x1ff;
126 
127 		color = (data & 0x3f) + 0x40;
128 		fx = (data & 0x4000) >> 14;
129 		fy = 0;
130 
131 		x -= 320/4-16-1;
132 
133 		y = 256-(y+7);
134 
135 		drawgfx(bitmap,Machine->gfx[0],
136 				sprite,
137 				color,fx,fy,x,y,
138 				cliprect,TRANSPARENCY_PEN,15);
139 	}
140 }
141 
142 
VIDEO_START(goal92)143 VIDEO_START( goal92 )
144 {
145 	background_layer = tilemap_create(get_back_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
146 	foreground_layer = tilemap_create(get_fore_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
147 	text_layer =       tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,  8,8,64,32);
148 
149 	buffered_spriteram16 = auto_malloc(0x400*2);
150 
151 	if (!background_layer || !foreground_layer || !text_layer || !buffered_spriteram16)
152 		return 1;
153 
154 	tilemap_set_transparent_pen(background_layer,15);
155 	tilemap_set_transparent_pen(foreground_layer,15);
156 	tilemap_set_transparent_pen(text_layer,15);
157 
158 	return 0;
159 }
160 
VIDEO_UPDATE(goal92)161 VIDEO_UPDATE( goal92 )
162 {
163 	tilemap_set_scrollx(background_layer, 0, goal92_scrollram16[0] + 60);
164 	tilemap_set_scrolly(background_layer, 0, goal92_scrollram16[1] + 8);
165 
166 	if(fg_bank & 0xff)
167 	{
168 		tilemap_set_scrollx(foreground_layer, 0, goal92_scrollram16[0] + 60);
169 		tilemap_set_scrolly(foreground_layer, 0, goal92_scrollram16[1] + 8);
170 	}
171 	else
172 	{
173 		tilemap_set_scrollx(foreground_layer, 0, goal92_scrollram16[2] + 60);
174 		tilemap_set_scrolly(foreground_layer, 0, goal92_scrollram16[3] + 8);
175 	}
176 
177 	fillbitmap(bitmap,get_black_pen(),cliprect);
178 
179 	tilemap_draw(bitmap,cliprect,background_layer,0,0);
180 	draw_sprites(bitmap,cliprect,2);
181 
182 	if(!(fg_bank & 0xff))
183 		draw_sprites(bitmap,cliprect,1);
184 
185 	tilemap_draw(bitmap,cliprect,foreground_layer,0,0);
186 
187 	if(fg_bank & 0xff)
188 		draw_sprites(bitmap,cliprect,1);
189 
190 	draw_sprites(bitmap,cliprect,0);
191 	draw_sprites(bitmap,cliprect,3);
192 	tilemap_draw(bitmap,cliprect,text_layer,0,0);
193 }
194 
VIDEO_EOF(goal92)195 VIDEO_EOF( goal92 )
196 {
197 	memcpy(buffered_spriteram16,spriteram16,0x400*2);
198 }
199