1 /***************************************************************************
2 
3 	D-Con video hardware.
4 
5 ***************************************************************************/
6 
7 #include "driver.h"
8 #include "vidhrdw/generic.h"
9 
10 data16_t *dcon_back_data,*dcon_fore_data,*dcon_mid_data,*dcon_scroll_ram,*dcon_textram;
11 
12 static struct tilemap *background_layer,*foreground_layer,*midground_layer,*text_layer;
13 static data16_t dcon_enable;
14 static int dcon_gfx_bank_select;
15 
16 /******************************************************************************/
17 
READ16_HANDLER(dcon_control_r)18 READ16_HANDLER( dcon_control_r )
19 {
20 	return dcon_enable;
21 }
22 
WRITE16_HANDLER(dcon_control_w)23 WRITE16_HANDLER( dcon_control_w )
24 {
25 	if (ACCESSING_LSB)
26 	{
27 		dcon_enable=data;
28 		if ((dcon_enable&4)==4)
29 			tilemap_set_enable(foreground_layer,0);
30 		else
31 			tilemap_set_enable(foreground_layer,1);
32 
33 		if ((dcon_enable&2)==2)
34 			tilemap_set_enable(midground_layer,0);
35 		else
36 			tilemap_set_enable(midground_layer,1);
37 
38 		if ((dcon_enable&1)==1)
39 			tilemap_set_enable(background_layer,0);
40 		else
41 			tilemap_set_enable(background_layer,1);
42 	}
43 }
44 
WRITE16_HANDLER(dcon_gfxbank_w)45 WRITE16_HANDLER( dcon_gfxbank_w )
46 {
47 	if (data&1)
48 		dcon_gfx_bank_select=0x1000;
49 	else
50 		dcon_gfx_bank_select=0;
51 }
52 
WRITE16_HANDLER(dcon_background_w)53 WRITE16_HANDLER( dcon_background_w )
54 {
55 	int oldword = dcon_back_data[offset];
56 	COMBINE_DATA(&dcon_back_data[offset]);
57 	if (oldword != dcon_back_data[offset])
58 		tilemap_mark_tile_dirty(background_layer,offset);
59 }
60 
WRITE16_HANDLER(dcon_foreground_w)61 WRITE16_HANDLER( dcon_foreground_w )
62 {
63 	int oldword = dcon_fore_data[offset];
64 	COMBINE_DATA(&dcon_fore_data[offset]);
65 	if (oldword != dcon_fore_data[offset])
66 		tilemap_mark_tile_dirty(foreground_layer,offset);
67 }
68 
WRITE16_HANDLER(dcon_midground_w)69 WRITE16_HANDLER( dcon_midground_w )
70 {
71 	int oldword = dcon_mid_data[offset];
72 	COMBINE_DATA(&dcon_mid_data[offset]);
73 	if (oldword != dcon_mid_data[offset])
74 		tilemap_mark_tile_dirty(midground_layer,offset);
75 }
76 
WRITE16_HANDLER(dcon_text_w)77 WRITE16_HANDLER( dcon_text_w )
78 {
79 	int oldword = dcon_textram[offset];
80 	COMBINE_DATA(&dcon_textram[offset]);
81 	if (oldword != dcon_textram[offset])
82 		tilemap_mark_tile_dirty(text_layer,offset);
83 }
84 
get_back_tile_info(int tile_index)85 static void get_back_tile_info(int tile_index)
86 {
87 	int tile=dcon_back_data[tile_index];
88 	int color=(tile>>12)&0xf;
89 
90 	tile&=0xfff;
91 
92 	SET_TILE_INFO(
93 			1,
94 			tile,
95 			color,
96 			0)
97 }
98 
get_fore_tile_info(int tile_index)99 static void get_fore_tile_info(int tile_index)
100 {
101 	int tile=dcon_fore_data[tile_index];
102 	int color=(tile>>12)&0xf;
103 
104 	tile&=0xfff;
105 
106 	SET_TILE_INFO(
107 			2,
108 			tile,
109 			color,
110 			0)
111 }
112 
get_mid_tile_info(int tile_index)113 static void get_mid_tile_info(int tile_index)
114 {
115 	int tile=dcon_mid_data[tile_index];
116 	int color=(tile>>12)&0xf;
117 
118 	tile&=0xfff;
119 
120 	SET_TILE_INFO(
121 			3,
122 			tile|dcon_gfx_bank_select,
123 			color,
124 			0)
125 }
126 
get_text_tile_info(int tile_index)127 static void get_text_tile_info(int tile_index)
128 {
129 	int tile = dcon_textram[tile_index];
130 	int color=(tile>>12)&0xf;
131 
132 	tile&=0xfff;
133 
134 	SET_TILE_INFO(
135 			0,
136 			tile,
137 			color,
138 			0)
139 }
140 
VIDEO_START(dcon)141 VIDEO_START( dcon )
142 {
143 	background_layer = tilemap_create(get_back_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     16,16,32,32);
144 	foreground_layer = tilemap_create(get_fore_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
145 	midground_layer =  tilemap_create(get_mid_tile_info, tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
146 	text_layer =       tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,  8,8,64,32);
147 
148 	if (!background_layer || !foreground_layer || !midground_layer || !text_layer)
149 		return 1;
150 
151 	tilemap_set_transparent_pen(midground_layer,15);
152 	tilemap_set_transparent_pen(foreground_layer,15);
153 	tilemap_set_transparent_pen(text_layer,15);
154 
155 	dcon_gfx_bank_select = 0;
156 
157 	return 0;
158 }
159 
draw_sprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect,int pri)160 static void draw_sprites(struct mame_bitmap *bitmap,const struct rectangle *cliprect,int pri)
161 {
162 	int offs,fx,fy,x,y,color,sprite;
163 	int dx,dy,ax,ay;
164 
165 	for (offs = 0x400-4;offs >= 0;offs -= 4)
166 	{
167 		if ((spriteram16[offs+0]&0x8000)!=0x8000) continue;
168 		sprite = spriteram16[offs+1];
169 		if ((sprite>>14)!=pri) continue;
170 		sprite &= 0x3fff;
171 
172 		y = spriteram16[offs+3];
173 		x = spriteram16[offs+2];
174 
175 		if (x&0x8000) x=0-(0x200-(x&0x1ff));
176 		else x&=0x1ff;
177 		if (y&0x8000) y=0-(0x200-(y&0x1ff));
178 		else y&=0x1ff;
179 
180 		color = spriteram16[offs+0]&0x3f;
181 		fx = spriteram16[offs+0]&0x4000;
182 		fy = 0; /* To do - probably 0x2000 */
183 		dy=((spriteram16[offs+0]&0x0380)>>7)+1;
184 		dx=((spriteram16[offs+0]&0x1c00)>>10)+1;
185 
186 		for (ax=0; ax<dx; ax++)
187 			for (ay=0; ay<dy; ay++) {
188 				if (!fx)
189 					drawgfx(bitmap,Machine->gfx[4],
190 						sprite++,
191 						color,fx,fy,x+ax*16,y+ay*16,
192 						cliprect,TRANSPARENCY_PEN,15);
193 				else
194 					drawgfx(bitmap,Machine->gfx[4],
195 						sprite++,
196 						color,fx,fy,x+(dx-1-ax)*16,y+ay*16,
197 						cliprect,TRANSPARENCY_PEN,15);
198 			}
199 	}
200 }
201 
VIDEO_UPDATE(dcon)202 VIDEO_UPDATE( dcon )
203 {
204 	/* Setup the tilemaps */
205 	tilemap_set_scrollx( background_layer,0, dcon_scroll_ram[0] );
206 	tilemap_set_scrolly( background_layer,0, dcon_scroll_ram[1] );
207 	tilemap_set_scrollx( midground_layer, 0, dcon_scroll_ram[2] );
208 	tilemap_set_scrolly( midground_layer, 0, dcon_scroll_ram[3] );
209 	tilemap_set_scrollx( foreground_layer,0, dcon_scroll_ram[4] );
210 	tilemap_set_scrolly( foreground_layer,0, dcon_scroll_ram[5] );
211 
212 	if ((dcon_enable&1)!=1)
213 		tilemap_draw(bitmap,cliprect,background_layer,0,0);
214 	else
215 		fillbitmap(bitmap,Machine->pens[15],cliprect); /* Should always be black, not pen 15 */
216 
217 	draw_sprites(bitmap,cliprect,2);
218 	tilemap_draw(bitmap,cliprect,midground_layer,0,0);
219 	draw_sprites(bitmap,cliprect,1);
220 	tilemap_draw(bitmap,cliprect,foreground_layer,0,0);
221 	draw_sprites(bitmap,cliprect,0);
222 	draw_sprites(bitmap,cliprect,3);
223 	tilemap_draw(bitmap,cliprect,text_layer,0,0);
224 }
225 
VIDEO_UPDATE(sdgndmps)226 VIDEO_UPDATE( sdgndmps )
227 {
228 	static int last_gfx_bank=0;
229 
230 	/* Gfx banking */
231 	if (last_gfx_bank!=dcon_gfx_bank_select)
232 		tilemap_mark_all_tiles_dirty(midground_layer);
233 	last_gfx_bank=dcon_gfx_bank_select;
234 
235 	/* Setup the tilemaps */
236 	tilemap_set_scrollx( background_layer,0, dcon_scroll_ram[0]+128 );
237 	tilemap_set_scrolly( background_layer,0, dcon_scroll_ram[1] );
238 	tilemap_set_scrollx( midground_layer, 0, dcon_scroll_ram[2]+128 );
239 	tilemap_set_scrolly( midground_layer, 0, dcon_scroll_ram[3] );
240 	tilemap_set_scrollx( foreground_layer,0, dcon_scroll_ram[4]+128 );
241 	tilemap_set_scrolly( foreground_layer,0, dcon_scroll_ram[5] );
242 	tilemap_set_scrollx( text_layer,0, /*dcon_scroll_ram[6] + */ 128 );
243 	tilemap_set_scrolly( text_layer,0, /*dcon_scroll_ram[7] + */ 0 );
244 
245 	if ((dcon_enable&1)!=1)
246 		tilemap_draw(bitmap,cliprect,background_layer,0,0);
247 	else
248 		fillbitmap(bitmap,Machine->pens[15],cliprect); /* Should always be black, not pen 15 */
249 
250 	draw_sprites(bitmap,cliprect,2);
251 	tilemap_draw(bitmap,cliprect,midground_layer,0,0);
252 	draw_sprites(bitmap,cliprect,1);
253 	tilemap_draw(bitmap,cliprect,foreground_layer,0,0);
254 	draw_sprites(bitmap,cliprect,0);
255 	draw_sprites(bitmap,cliprect,3);
256 	tilemap_draw(bitmap,cliprect,text_layer,0,0);
257 }
258