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