1 /***************************************************************************
2 
3 	D-Con video hardware.
4 
5 ***************************************************************************/
6 
7 #include "driver.h"
8 #include "vidhrdw/generic.h"
9 
10 static struct tilemap *background_layer,*foreground_layer,*midground_layer,*text_layer;
11 unsigned char *dcon_back_data,*dcon_fore_data,*dcon_mid_data,*dcon_scroll_ram;
12 static int dcon_enable;
13 
14 /******************************************************************************/
15 
WRITE_HANDLER(dcon_control_w)16 WRITE_HANDLER( dcon_control_w )
17 {
18 	dcon_enable=data;
19 	if ((dcon_enable&4)==4)
20 		tilemap_set_enable(foreground_layer,0);
21 	else
22 		tilemap_set_enable(foreground_layer,1);
23 
24 	if ((dcon_enable&2)==2)
25 		tilemap_set_enable(midground_layer,0);
26 	else
27 		tilemap_set_enable(midground_layer,1);
28 
29 	if ((dcon_enable&1)==1)
30 		tilemap_set_enable(background_layer,0);
31 	else
32 		tilemap_set_enable(background_layer,1);
33 }
34 
WRITE_HANDLER(dcon_background_w)35 WRITE_HANDLER( dcon_background_w )
36 {
37 	COMBINE_WORD_MEM(&dcon_back_data[offset],data);
38 	tilemap_mark_tile_dirty( background_layer,offset/2);
39 }
40 
WRITE_HANDLER(dcon_foreground_w)41 WRITE_HANDLER( dcon_foreground_w )
42 {
43 	COMBINE_WORD_MEM(&dcon_fore_data[offset],data);
44 	tilemap_mark_tile_dirty( foreground_layer,offset/2);
45 }
46 
WRITE_HANDLER(dcon_midground_w)47 WRITE_HANDLER( dcon_midground_w )
48 {
49 	COMBINE_WORD_MEM(&dcon_mid_data[offset],data);
50 	tilemap_mark_tile_dirty( midground_layer,offset/2);
51 }
52 
WRITE_HANDLER(dcon_text_w)53 WRITE_HANDLER( dcon_text_w )
54 {
55 	COMBINE_WORD_MEM(&videoram[offset],data);
56 	tilemap_mark_tile_dirty( text_layer,offset/2);
57 }
58 
get_back_tile_info(int tile_index)59 static void get_back_tile_info(int tile_index)
60 {
61 	int tile=READ_WORD(&dcon_back_data[2*tile_index]);
62 	int color=(tile>>12)&0xf;
63 
64 	tile&=0xfff;
65 
66 	SET_TILE_INFO(1,tile,color)
67 }
68 
get_fore_tile_info(int tile_index)69 static void get_fore_tile_info(int tile_index)
70 {
71 	int tile=READ_WORD(&dcon_fore_data[2*tile_index]);
72 	int color=(tile>>12)&0xf;
73 
74 	tile&=0xfff;
75 
76 	SET_TILE_INFO(2,tile,color)
77 }
78 
get_mid_tile_info(int tile_index)79 static void get_mid_tile_info(int tile_index)
80 {
81 	int tile=READ_WORD(&dcon_mid_data[2*tile_index]);
82 	int color=(tile>>12)&0xf;
83 
84 	tile&=0xfff;
85 
86 	SET_TILE_INFO(3,tile,color)
87 }
88 
get_text_tile_info(int tile_index)89 static void get_text_tile_info(int tile_index)
90 {
91 	int tile=READ_WORD(&videoram[2*tile_index]);
92 	int color=(tile>>12)&0xf;
93 
94 	tile&=0xfff;
95 
96 	SET_TILE_INFO(0,tile,color)
97 }
98 
dcon_vh_start(void)99 int dcon_vh_start(void)
100 {
101 	background_layer = tilemap_create(get_back_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     16,16,32,32);
102 	foreground_layer = tilemap_create(get_fore_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
103 	midground_layer =  tilemap_create(get_mid_tile_info, tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
104 	text_layer =       tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,  8,8,64,32);
105 
106 	if (!background_layer || !foreground_layer || !midground_layer || !text_layer)
107 		return 1;
108 
109 	midground_layer->transparent_pen = 15;
110 	foreground_layer->transparent_pen = 15;
111 	text_layer->transparent_pen = 15;
112 
113 	return 0;
114 }
115 
draw_sprites(struct osd_bitmap * bitmap,int pri)116 static void draw_sprites(struct osd_bitmap *bitmap,int pri)
117 {
118 	int offs,fx,fy,x,y,color,sprite;
119 	int dx,dy,ax,ay;
120 
121 	for (offs = 0x800-8;offs >= 0;offs -= 8)
122 	{
123 		if ((READ_WORD(&spriteram[offs+0])&0x8000)!=0x8000) continue;
124 		sprite = READ_WORD(&spriteram[offs+2]);
125 		if ((sprite>>14)!=pri) continue;
126 		sprite &= 0x3fff;
127 
128 		y = READ_WORD(&spriteram[offs+6]);
129 		x = READ_WORD(&spriteram[offs+4]);
130 
131 		if (x&0x8000) x=0-(0x200-(x&0x1ff));
132 		else x&=0x1ff;
133 		if (y&0x8000) y=0-(0x200-(y&0x1ff));
134 		else y&=0x1ff;
135 
136 		color = READ_WORD(&spriteram[offs+0])&0x3f;
137 		fx = 0; /* To do */
138 		fy = 0; /* To do */
139 		dy=((READ_WORD(&spriteram[offs+0])&0x0380)>>7)+1;
140 		dx=((READ_WORD(&spriteram[offs+0])&0x1c00)>>10)+1;
141 
142 		for (ax=0; ax<dx; ax++)
143 			for (ay=0; ay<dy; ay++) {
144 				drawgfx(bitmap,Machine->gfx[4],
145 				sprite++,
146 				color,fx,fy,x+ax*16,y+ay*16,
147 				&Machine->visible_area,TRANSPARENCY_PEN,15);
148 			}
149 	}
150 }
151 
mark_sprite_colours(void)152 static void mark_sprite_colours(void)
153 {
154 	int colmask[64],i,pal_base,color,offs,sprite,multi;
155 
156 	pal_base = Machine->drv->gfxdecodeinfo[4].color_codes_start;
157 	for (color = 0;color < 64;color++) colmask[color] = 0;
158 	for (offs = 8;offs <0x800;offs += 8)
159 	{
160 		color = READ_WORD(&spriteram[offs+0])&0x3f;
161 		sprite = READ_WORD(&spriteram[offs+2]);
162 		sprite &= 0x3fff;
163 		multi=(((READ_WORD(&spriteram[offs+0])&0x0380)>>7)+1)*(((READ_WORD(&spriteram[offs+0])&0x1c00)>>10)+1);
164 
165 		for (i=0; i<multi; i++)
166 			colmask[color] |= Machine->gfx[4]->pen_usage[(sprite+i)&0x3fff];
167 	}
168 	for (color = 0;color < 64;color++)
169 	{
170 		for (i = 0;i < 15;i++)
171 		{
172 			if (colmask[color] & (1 << i))
173 				palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
174 		}
175 	}
176 }
177 
dcon_vh_screenrefresh(struct osd_bitmap * bitmap,int full_refresh)178 void dcon_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
179 {
180 	/* Setup the tilemaps */
181 	tilemap_set_scrollx( background_layer,0, READ_WORD(&dcon_scroll_ram[0]) );
182 	tilemap_set_scrolly( background_layer,0, READ_WORD(&dcon_scroll_ram[2]) );
183 	tilemap_set_scrollx( midground_layer, 0, READ_WORD(&dcon_scroll_ram[4]) );
184 	tilemap_set_scrolly( midground_layer, 0, READ_WORD(&dcon_scroll_ram[6]) );
185 	tilemap_set_scrollx( foreground_layer,0, READ_WORD(&dcon_scroll_ram[8]) );
186 	tilemap_set_scrolly( foreground_layer,0, READ_WORD(&dcon_scroll_ram[0xa]) );
187 
188 	tilemap_update(ALL_TILEMAPS);
189 
190 	/* Build the dynamic palette */
191 	palette_init_used_colors();
192 	mark_sprite_colours();
193 
194 	if (palette_recalc())
195 		tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
196 
197 	tilemap_render(ALL_TILEMAPS);
198 
199 	if ((dcon_enable&1)!=1)
200 		tilemap_draw(bitmap,background_layer,0);
201 	else
202 		fillbitmap(bitmap,palette_transparent_pen,&Machine->visible_area);
203 
204 	draw_sprites(bitmap,2);
205 	tilemap_draw(bitmap,midground_layer,0);
206 	draw_sprites(bitmap,1);
207 	tilemap_draw(bitmap,foreground_layer,0);
208 	draw_sprites(bitmap,0);
209 	draw_sprites(bitmap,3);
210 	tilemap_draw(bitmap,text_layer,0);
211 }
212