1 /******************************************************************************
2 
3 	Video Hardware for Video System Mahjong series.
4 
5 	Driver by Takahiro Nogi <nogi@kt.rim.or.jp> 2001/02/04 -
6 
7 ******************************************************************************/
8 
9 #include "driver.h"
10 #include "vidhrdw/generic.h"
11 
12 
13 static int fromanc2_dispvram, fromanc2_dispvram_old;
14 static int fromanc2_scrollx[2][4], fromanc2_scrolly[2][4];
15 static int fromanc2_gfxbank[2][4];
16 static data16_t *fromanc2_paletteram[2];
17 static data16_t *fromanc2_videoram[2][4];
18 static struct tilemap *fromanc2_tilemap[2][4];
19 
20 
21 /******************************************************************************
22 
23 
24 
25 ******************************************************************************/
fromanc2_set_dispvram_w(int vram)26 void fromanc2_set_dispvram_w(int vram)
27 {
28 	fromanc2_dispvram = (vram ? 1 : 0);
29 
30 	if (fromanc2_dispvram_old != fromanc2_dispvram) {
31 		fromanc2_dispvram_old = fromanc2_dispvram;
32 
33 		if (fromanc2_tilemap[fromanc2_dispvram][0]) tilemap_mark_all_tiles_dirty(fromanc2_tilemap[fromanc2_dispvram][0]);
34 		if (fromanc2_tilemap[fromanc2_dispvram][1]) tilemap_mark_all_tiles_dirty(fromanc2_tilemap[fromanc2_dispvram][1]);
35 		if (fromanc2_tilemap[fromanc2_dispvram][2]) tilemap_mark_all_tiles_dirty(fromanc2_tilemap[fromanc2_dispvram][2]);
36 		if (fromanc2_tilemap[fromanc2_dispvram][3]) tilemap_mark_all_tiles_dirty(fromanc2_tilemap[fromanc2_dispvram][3]);
37 	}
38 }
39 
40 /******************************************************************************
41 
42   Callbacks for the TileMap code
43 
44 ******************************************************************************/
45 
fromanc2_get_tile_info(int tile_index,int vram,int layer)46 static INLINE void fromanc2_get_tile_info(int tile_index, int vram, int layer)
47 {
48 	int tile, color;
49 
50 	tile  = (fromanc2_videoram[vram][layer][tile_index] & 0x3fff) | (fromanc2_gfxbank[vram][layer] << 14);
51 	color = ((fromanc2_videoram[vram][layer][tile_index] & 0xc000) >> 14) | (0x10 * vram);
52 
53 	SET_TILE_INFO(layer, tile, color, 0)
54 }
55 
fromanc2_get_v0_l0_tile_info(int tile_index)56 static void fromanc2_get_v0_l0_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 0, 0); }
fromanc2_get_v0_l1_tile_info(int tile_index)57 static void fromanc2_get_v0_l1_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 0, 1); }
fromanc2_get_v0_l2_tile_info(int tile_index)58 static void fromanc2_get_v0_l2_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 0, 2); }
fromanc2_get_v0_l3_tile_info(int tile_index)59 static void fromanc2_get_v0_l3_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 0, 3); }
fromanc2_get_v1_l0_tile_info(int tile_index)60 static void fromanc2_get_v1_l0_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 1, 0); }
fromanc2_get_v1_l1_tile_info(int tile_index)61 static void fromanc2_get_v1_l1_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 1, 1); }
fromanc2_get_v1_l2_tile_info(int tile_index)62 static void fromanc2_get_v1_l2_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 1, 2); }
fromanc2_get_v1_l3_tile_info(int tile_index)63 static void fromanc2_get_v1_l3_tile_info(int tile_index) { fromanc2_get_tile_info(tile_index, 1, 3); }
64 
65 
fromancr_get_tile_info(int tile_index,int vram,int layer)66 static INLINE void fromancr_get_tile_info(int tile_index, int vram, int layer)
67 {
68 	int tile, color;
69 
70 	tile  = fromanc2_videoram[vram][layer][tile_index] | (fromanc2_gfxbank[vram][layer] << 16);
71 	color = vram;
72 
73 	SET_TILE_INFO(layer, tile, color, 0)
74 }
75 
fromancr_get_v0_l0_tile_info(int tile_index)76 static void fromancr_get_v0_l0_tile_info(int tile_index) { fromancr_get_tile_info(tile_index, 0, 0); }
fromancr_get_v0_l1_tile_info(int tile_index)77 static void fromancr_get_v0_l1_tile_info(int tile_index) { fromancr_get_tile_info(tile_index, 0, 1); }
fromancr_get_v0_l2_tile_info(int tile_index)78 static void fromancr_get_v0_l2_tile_info(int tile_index) { fromancr_get_tile_info(tile_index, 0, 2); }
fromancr_get_v1_l0_tile_info(int tile_index)79 static void fromancr_get_v1_l0_tile_info(int tile_index) { fromancr_get_tile_info(tile_index, 1, 0); }
fromancr_get_v1_l1_tile_info(int tile_index)80 static void fromancr_get_v1_l1_tile_info(int tile_index) { fromancr_get_tile_info(tile_index, 1, 1); }
fromancr_get_v1_l2_tile_info(int tile_index)81 static void fromancr_get_v1_l2_tile_info(int tile_index) { fromancr_get_tile_info(tile_index, 1, 2); }
82 
83 
84 /******************************************************************************
85 
86   Memory handlers
87 
88 ******************************************************************************/
89 
READ16_HANDLER(fromanc2_paletteram_0_r)90 READ16_HANDLER( fromanc2_paletteram_0_r )
91 {
92 	return fromanc2_paletteram[0][offset];
93 }
94 
READ16_HANDLER(fromanc2_paletteram_1_r)95 READ16_HANDLER( fromanc2_paletteram_1_r )
96 {
97 	return fromanc2_paletteram[1][offset];
98 }
99 
WRITE16_HANDLER(fromanc2_paletteram_0_w)100 WRITE16_HANDLER( fromanc2_paletteram_0_w )
101 {
102 	UINT16 color;
103 	UINT8 r, g, b;
104 
105 	COMBINE_DATA(&fromanc2_paletteram[0][offset]);
106 
107 	/* GGGG_GRRR_RRBB_BBBx*/
108 	r = (data >>  6) & 0x1f;
109 	g = (data >> 11) & 0x1f;
110 	b = (data >>  1) & 0x1f;
111 
112 	r = (r << 3) | (r >> 2);
113 	g = (g << 3) | (g >> 2);
114 	b = (b << 3) | (b >> 2);
115 
116 	color = ((offset & 0x0700) << 1) + (offset & 0x00ff);
117 	palette_set_color(0x000 + color, r, g, b);
118 }
119 
WRITE16_HANDLER(fromanc2_paletteram_1_w)120 WRITE16_HANDLER( fromanc2_paletteram_1_w )
121 {
122 	UINT16 color;
123 	UINT8 r, g, b;
124 
125 	COMBINE_DATA(&fromanc2_paletteram[1][offset]);
126 
127 	/* GGGG_GRRR_RRBB_BBBx*/
128 	r = (data >>  6) & 0x1f;
129 	g = (data >> 11) & 0x1f;
130 	b = (data >>  1) & 0x1f;
131 
132 	r = (r << 3) | (r >> 2);
133 	g = (g << 3) | (g >> 2);
134 	b = (b << 3) | (b >> 2);
135 
136 	color = ((offset & 0x0700) << 1) + (offset & 0x00ff);
137 	palette_set_color(0x100 + color, r, g, b);
138 }
139 
140 
READ16_HANDLER(fromancr_paletteram_0_r)141 READ16_HANDLER( fromancr_paletteram_0_r )
142 {
143 	return fromanc2_paletteram[0][offset];
144 }
145 
READ16_HANDLER(fromancr_paletteram_1_r)146 READ16_HANDLER( fromancr_paletteram_1_r )
147 {
148 	return fromanc2_paletteram[1][offset];
149 }
150 
WRITE16_HANDLER(fromancr_paletteram_0_w)151 WRITE16_HANDLER( fromancr_paletteram_0_w )
152 {
153 	UINT16 color;
154 	UINT8 r, g, b;
155 
156 	COMBINE_DATA(&fromanc2_paletteram[0][offset]);
157 
158 	/* xGGG_GGRR_RRRB_BBBB*/
159 	r = (data >>  5) & 0x1f;
160 	g = (data >> 10) & 0x1f;
161 	b = (data >>  0) & 0x1f;
162 
163 	r = (r << 3) | (r >> 2);
164 	g = (g << 3) | (g >> 2);
165 	b = (b << 3) | (b >> 2);
166 
167 	color = ((offset & 0x0700) << 1) + (offset & 0x00ff);
168 	palette_set_color(0x000 + color, r, g, b);
169 }
170 
WRITE16_HANDLER(fromancr_paletteram_1_w)171 WRITE16_HANDLER( fromancr_paletteram_1_w )
172 {
173 	UINT16 color;
174 	UINT8 r, g, b;
175 
176 	COMBINE_DATA(&fromanc2_paletteram[1][offset]);
177 
178 	/* xGGG_GGRR_RRRB_BBBB*/
179 	r = (data >>  5) & 0x1f;
180 	g = (data >> 10) & 0x1f;
181 	b = (data >>  0) & 0x1f;
182 
183 	r = (r << 3) | (r >> 2);
184 	g = (g << 3) | (g >> 2);
185 	b = (b << 3) | (b >> 2);
186 
187 	color = ((offset & 0x0700) << 1) + (offset & 0x00ff);
188 	palette_set_color(0x100 + color, r, g, b);
189 }
190 
191 
READ16_HANDLER(fromanc4_paletteram_0_r)192 READ16_HANDLER( fromanc4_paletteram_0_r )
193 {
194 	return fromanc2_paletteram[0][offset];
195 }
196 
READ16_HANDLER(fromanc4_paletteram_1_r)197 READ16_HANDLER( fromanc4_paletteram_1_r )
198 {
199 	return fromanc2_paletteram[1][offset];
200 }
201 
WRITE16_HANDLER(fromanc4_paletteram_0_w)202 WRITE16_HANDLER( fromanc4_paletteram_0_w )
203 {
204 	UINT16 color;
205 	UINT8 r, g, b;
206 
207 	COMBINE_DATA(&fromanc2_paletteram[0][offset]);
208 
209 	/* xRRR_RRGG_GGGB_BBBB*/
210 	r = (data >> 10) & 0x1f;
211 	g = (data >>  5) & 0x1f;
212 	b = (data >>  0) & 0x1f;
213 
214 	r = (r << 3) | (r >> 2);
215 	g = (g << 3) | (g >> 2);
216 	b = (b << 3) | (b >> 2);
217 
218 	color = ((offset & 0x0700) << 1) + (offset & 0x00ff);
219 	palette_set_color(0x000 + color, r, g, b);
220 }
221 
WRITE16_HANDLER(fromanc4_paletteram_1_w)222 WRITE16_HANDLER( fromanc4_paletteram_1_w )
223 {
224 	UINT16 color;
225 	UINT8 r, g, b;
226 
227 	COMBINE_DATA(&fromanc2_paletteram[1][offset]);
228 
229 	/* xRRR_RRGG_GGGB_BBBB*/
230 	r = (data >> 10) & 0x1f;
231 	g = (data >>  5) & 0x1f;
232 	b = (data >>  0) & 0x1f;
233 
234 	r = (r << 3) | (r >> 2);
235 	g = (g << 3) | (g >> 2);
236 	b = (b << 3) | (b >> 2);
237 
238 	color = ((offset & 0x0700) << 1) + (offset & 0x00ff);
239 	palette_set_color(0x100 + color, r, g, b);
240 }
241 
242 
fromanc2_dispvram_w(offs_t offset,data16_t data,data16_t mem_mask,int vram,int layer)243 static INLINE void fromanc2_dispvram_w(offs_t offset, data16_t data, data16_t mem_mask, int vram, int layer)
244 {
245 	layer += (offset < 0x1000) ? 0 : 1;
246 
247 	COMBINE_DATA(&fromanc2_videoram[vram][layer][offset & 0x0fff]);
248 	tilemap_mark_tile_dirty(fromanc2_tilemap[vram][layer], offset & 0x0fff);
249 }
250 
WRITE16_HANDLER(fromanc2_videoram_0_w)251 WRITE16_HANDLER( fromanc2_videoram_0_w ) { fromanc2_dispvram_w(offset, data, mem_mask, 0, 0); }
WRITE16_HANDLER(fromanc2_videoram_1_w)252 WRITE16_HANDLER( fromanc2_videoram_1_w ) { fromanc2_dispvram_w(offset, data, mem_mask, 0, 2); }
WRITE16_HANDLER(fromanc2_videoram_2_w)253 WRITE16_HANDLER( fromanc2_videoram_2_w ) { fromanc2_dispvram_w(offset, data, mem_mask, 1, 0); }
WRITE16_HANDLER(fromanc2_videoram_3_w)254 WRITE16_HANDLER( fromanc2_videoram_3_w ) { fromanc2_dispvram_w(offset, data, mem_mask, 1, 2); }
255 
WRITE16_HANDLER(fromanc2_gfxreg_0_w)256 WRITE16_HANDLER( fromanc2_gfxreg_0_w )
257 {
258 	switch (offset) {
259 		case 0x00:	fromanc2_scrollx[0][0] = -(data - 0x000); break;
260 		case 0x01:	fromanc2_scrolly[0][0] = -(data - 0x000); break;
261 		case 0x02:	fromanc2_scrollx[0][1] = -(data - 0x004); break;
262 		case 0x03:	fromanc2_scrolly[0][1] = -(data - 0x000); break;
263 		/* offset 0x04 - 0x11 unknown*/
264 		default:	break;
265 	}
266 }
267 
WRITE16_HANDLER(fromanc2_gfxreg_1_w)268 WRITE16_HANDLER( fromanc2_gfxreg_1_w )
269 {
270 	switch (offset) {
271 		case 0x00:	fromanc2_scrollx[1][0] = -(data - 0x1be); break;
272 		case 0x01:	fromanc2_scrolly[1][0] = -(data - 0x1ef); break;
273 		case 0x02:	fromanc2_scrollx[1][1] = -(data - 0x1c2); break;
274 		case 0x03:	fromanc2_scrolly[1][1] = -(data - 0x1ef); break;
275 		/* offset 0x04 - 0x11 unknown*/
276 		default:	break;
277 	}
278 }
279 
WRITE16_HANDLER(fromanc2_gfxreg_2_w)280 WRITE16_HANDLER( fromanc2_gfxreg_2_w )
281 {
282 	switch (offset) {
283 		case 0x00:	fromanc2_scrollx[0][2] = -(data - 0x1c0); break;
284 		case 0x01:	fromanc2_scrolly[0][2] = -(data - 0x1ef); break;
285 		case 0x02:	fromanc2_scrollx[0][3] = -(data - 0x1c3); break;
286 		case 0x03:	fromanc2_scrolly[0][3] = -(data - 0x1ef); break;
287 		/* offset 0x04 - 0x11 unknown*/
288 		default:	break;
289 	}
290 }
291 
WRITE16_HANDLER(fromanc2_gfxreg_3_w)292 WRITE16_HANDLER( fromanc2_gfxreg_3_w )
293 {
294 	switch (offset) {
295 		case 0x00:	fromanc2_scrollx[1][2] = -(data - 0x1bf); break;
296 		case 0x01:	fromanc2_scrolly[1][2] = -(data - 0x1ef); break;
297 		case 0x02:	fromanc2_scrollx[1][3] = -(data - 0x1c3); break;
298 		case 0x03:	fromanc2_scrolly[1][3] = -(data - 0x1ef); break;
299 		/* offset 0x04 - 0x11 unknown*/
300 		default:	break;
301 	}
302 }
303 
WRITE16_HANDLER(fromanc2_gfxbank_0_w)304 WRITE16_HANDLER( fromanc2_gfxbank_0_w )
305 {
306 	fromanc2_gfxbank[0][0] = (data & 0x000f) >>  0;
307 	fromanc2_gfxbank[0][1] = (data & 0x00f0) >>  4;
308 	fromanc2_gfxbank[0][2] = (data & 0x0f00) >>  8;
309 	fromanc2_gfxbank[0][3] = (data & 0xf000) >> 12;
310 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][0]);
311 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][1]);
312 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][2]);
313 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][3]);
314 }
315 
WRITE16_HANDLER(fromanc2_gfxbank_1_w)316 WRITE16_HANDLER( fromanc2_gfxbank_1_w )
317 {
318 	fromanc2_gfxbank[1][0] = (data & 0x000f) >>  0;
319 	fromanc2_gfxbank[1][1] = (data & 0x00f0) >>  4;
320 	fromanc2_gfxbank[1][2] = (data & 0x0f00) >>  8;
321 	fromanc2_gfxbank[1][3] = (data & 0xf000) >> 12;
322 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][0]);
323 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][1]);
324 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][2]);
325 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][3]);
326 }
327 
328 
fromancr_vram_w(offs_t offset,data16_t data,data16_t mem_mask,int layer)329 static INLINE void fromancr_vram_w(offs_t offset, data16_t data, data16_t mem_mask, int layer)
330 {
331 	int vram = (offset < 0x1000) ? 0 : 1;
332 
333 	COMBINE_DATA(&fromanc2_videoram[vram][layer][offset & 0x0fff]);
334 	tilemap_mark_tile_dirty(fromanc2_tilemap[vram][layer], offset & 0x0fff);
335 }
336 
WRITE16_HANDLER(fromancr_videoram_0_w)337 WRITE16_HANDLER( fromancr_videoram_0_w ) { fromancr_vram_w(offset, data, mem_mask, 1); }
WRITE16_HANDLER(fromancr_videoram_1_w)338 WRITE16_HANDLER( fromancr_videoram_1_w ) { fromancr_vram_w(offset, data, mem_mask, 0); }
WRITE16_HANDLER(fromancr_videoram_2_w)339 WRITE16_HANDLER( fromancr_videoram_2_w ) { fromancr_vram_w(offset, data, mem_mask, 2); }
340 
WRITE16_HANDLER(fromancr_gfxreg_0_w)341 WRITE16_HANDLER( fromancr_gfxreg_0_w )
342 {
343 	switch (offset) {
344 		case 0x00:	fromanc2_scrollx[0][0] = -(data - 0x1bf); break;
345 		case 0x01:	fromanc2_scrolly[0][0] = -(data - 0x1ef); break;
346 		case 0x02:	fromanc2_scrollx[1][0] = -(data - 0x1c3); break;
347 		case 0x03:	fromanc2_scrolly[1][0] = -(data - 0x1ef); break;
348 		/* offset 0x04 - 0x11 unknown*/
349 		default:	break;
350 	}
351 }
352 
WRITE16_HANDLER(fromancr_gfxreg_1_w)353 WRITE16_HANDLER( fromancr_gfxreg_1_w )
354 {
355 	switch (offset) {
356 		case 0x00:	fromanc2_scrollx[0][1] = -(data - 0x000); break;
357 		case 0x01:	fromanc2_scrolly[0][1] = -(data - 0x000); break;
358 		case 0x02:	fromanc2_scrollx[1][1] = -(data - 0x004); break;
359 		case 0x03:	fromanc2_scrolly[1][1] = -(data - 0x000); break;
360 		/* offset 0x04 - 0x11 unknown*/
361 		default:	break;
362 	}
363 }
364 
fromancr_gfxbank_w(int data)365 void fromancr_gfxbank_w(int data)
366 {
367 	fromanc2_gfxbank[0][0] = (data & 0x0010) >>  4;	/* BG (1P)*/
368 	fromanc2_gfxbank[0][1] = (data & 0xf000) >> 12;	/* FG (1P)*/
369 	fromanc2_gfxbank[1][0] = (data & 0x0008) >>  3;	/* BG (2P)*/
370 	fromanc2_gfxbank[1][1] = (data & 0x0f00) >>  8;	/* FG (2P)*/
371 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][0]);
372 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][1]);
373 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][0]);
374 	tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][1]);
375 }
376 
377 
fromanc4_vram_w(offs_t offset,data16_t data,data16_t mem_mask,int layer)378 static INLINE void fromanc4_vram_w(offs_t offset, data16_t data, data16_t mem_mask, int layer)
379 {
380 	int vram = (offset < 0x4000) ? 0 : 1;
381 
382 	COMBINE_DATA(&fromanc2_videoram[vram][layer][offset & 0x3fff]);
383 	tilemap_mark_tile_dirty(fromanc2_tilemap[vram][layer], offset & 0x3fff);
384 }
385 
WRITE16_HANDLER(fromanc4_videoram_0_w)386 WRITE16_HANDLER( fromanc4_videoram_0_w ) { fromanc4_vram_w(offset, data, mem_mask, 2); }
WRITE16_HANDLER(fromanc4_videoram_1_w)387 WRITE16_HANDLER( fromanc4_videoram_1_w ) { fromanc4_vram_w(offset, data, mem_mask, 1); }
WRITE16_HANDLER(fromanc4_videoram_2_w)388 WRITE16_HANDLER( fromanc4_videoram_2_w ) { fromanc4_vram_w(offset, data, mem_mask, 0); }
389 
WRITE16_HANDLER(fromanc4_gfxreg_0_w)390 WRITE16_HANDLER( fromanc4_gfxreg_0_w )
391 {
392 	switch (offset) {
393 		case 0x00:	fromanc2_scrollx[0][2] = -(data - 0xfbb); break;
394 		case 0x01:	fromanc2_scrolly[0][2] = -(data - 0x1e4); break;
395 		case 0x02:	fromanc2_scrollx[1][2] = -(data - 0xfbb); break;
396 		case 0x03:	fromanc2_scrolly[1][2] = -(data - 0x1e4); break;
397 		case 0x05:	fromanc2_gfxbank[0][2] = (data & 0x000f) >> 0;
398 					fromanc2_gfxbank[1][2] = (data & 0x0f00) >> 8;
399 					tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][2]);
400 					tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][2]);
401 					break;
402 		/* offset 0x04, 0x06 - 0x11 unknown*/
403 		default:	break;
404 	}
405 }
406 
WRITE16_HANDLER(fromanc4_gfxreg_1_w)407 WRITE16_HANDLER( fromanc4_gfxreg_1_w )
408 {
409 	switch (offset) {
410 		case 0x00:	fromanc2_scrollx[0][1] = -(data - 0xfba); break;
411 		case 0x01:	fromanc2_scrolly[0][1] = -(data - 0x1e4); break;
412 		case 0x02:	fromanc2_scrollx[1][1] = -(data - 0xfba); break;
413 		case 0x03:	fromanc2_scrolly[1][1] = -(data - 0x1e4); break;
414 		case 0x05:	fromanc2_gfxbank[0][1] = (data & 0x000f) >> 0;
415 					fromanc2_gfxbank[1][1] = (data & 0x0f00) >> 8;
416 					tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][1]);
417 					tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][1]);
418 					break;
419 		/* offset 0x04, 0x06 - 0x11 unknown*/
420 		default:	break;
421 	}
422 }
423 
WRITE16_HANDLER(fromanc4_gfxreg_2_w)424 WRITE16_HANDLER( fromanc4_gfxreg_2_w )
425 {
426 	switch (offset) {
427 		case 0x00:	fromanc2_scrollx[0][0] = -(data - 0xfbb); break;
428 		case 0x01:	fromanc2_scrolly[0][0] = -(data - 0x1e4); break;
429 		case 0x02:	fromanc2_scrollx[1][0] = -(data - 0xfbb); break;
430 		case 0x03:	fromanc2_scrolly[1][0] = -(data - 0x1e4); break;
431 		case 0x05:	fromanc2_gfxbank[0][0] = (data & 0x000f) >> 0;
432 					fromanc2_gfxbank[1][0] = (data & 0x0f00) >> 8;
433 					tilemap_mark_all_tiles_dirty(fromanc2_tilemap[0][0]);
434 					tilemap_mark_all_tiles_dirty(fromanc2_tilemap[1][0]);
435 					break;
436 		/* offset 0x04, 0x06 - 0x11 unknown*/
437 		default:	break;
438 	}
439 }
440 
441 
442 /******************************************************************************
443 
444   Start the video hardware emulation.
445 
446 ******************************************************************************/
447 
VIDEO_START(fromanc2)448 VIDEO_START( fromanc2 )
449 {
450 	fromanc2_tilemap[0][0] = tilemap_create(fromanc2_get_v0_l0_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64, 64);
451 	fromanc2_tilemap[0][1] = tilemap_create(fromanc2_get_v0_l1_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
452 	fromanc2_tilemap[0][2] = tilemap_create(fromanc2_get_v0_l2_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
453 	fromanc2_tilemap[0][3] = tilemap_create(fromanc2_get_v0_l3_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
454 	fromanc2_tilemap[1][0] = tilemap_create(fromanc2_get_v1_l0_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64, 64);
455 	fromanc2_tilemap[1][1] = tilemap_create(fromanc2_get_v1_l1_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
456 	fromanc2_tilemap[1][2] = tilemap_create(fromanc2_get_v1_l2_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
457 	fromanc2_tilemap[1][3] = tilemap_create(fromanc2_get_v1_l3_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
458 
459 	fromanc2_videoram[0][0] = auto_malloc((64 * 64) * sizeof(data16_t));
460 	fromanc2_videoram[0][1] = auto_malloc((64 * 64) * sizeof(data16_t));
461 	fromanc2_videoram[0][2] = auto_malloc((64 * 64) * sizeof(data16_t));
462 	fromanc2_videoram[0][3] = auto_malloc((64 * 64) * sizeof(data16_t));
463 	fromanc2_videoram[1][0] = auto_malloc((64 * 64) * sizeof(data16_t));
464 	fromanc2_videoram[1][1] = auto_malloc((64 * 64) * sizeof(data16_t));
465 	fromanc2_videoram[1][2] = auto_malloc((64 * 64) * sizeof(data16_t));
466 	fromanc2_videoram[1][3] = auto_malloc((64 * 64) * sizeof(data16_t));
467 
468 	fromanc2_paletteram[0] = auto_malloc(0x800 * 2);
469 	fromanc2_paletteram[1] = auto_malloc(0x800 * 2);
470 
471 	if (!fromanc2_tilemap[0][0] ||
472 		!fromanc2_tilemap[0][1] ||
473 		!fromanc2_tilemap[0][2] ||
474 		!fromanc2_tilemap[0][3] ||
475 		!fromanc2_tilemap[1][0] ||
476 		!fromanc2_tilemap[1][1] ||
477 		!fromanc2_tilemap[1][2] ||
478 		!fromanc2_tilemap[1][3] ||
479 		!fromanc2_videoram[0][0] ||
480 		!fromanc2_videoram[0][1] ||
481 		!fromanc2_videoram[0][2] ||
482 		!fromanc2_videoram[0][3] ||
483 		!fromanc2_videoram[1][0] ||
484 		!fromanc2_videoram[1][1] ||
485 		!fromanc2_videoram[1][2] ||
486 		!fromanc2_videoram[1][3] ||
487 		!fromanc2_paletteram[0] ||
488 		!fromanc2_paletteram[1]) {
489 		return 1;
490 	}
491 
492 	tilemap_set_transparent_pen(fromanc2_tilemap[0][1], 0x000);
493 	tilemap_set_transparent_pen(fromanc2_tilemap[0][2], 0x000);
494 	tilemap_set_transparent_pen(fromanc2_tilemap[0][3], 0x000);
495 	tilemap_set_transparent_pen(fromanc2_tilemap[1][1], 0x000);
496 	tilemap_set_transparent_pen(fromanc2_tilemap[1][2], 0x000);
497 	tilemap_set_transparent_pen(fromanc2_tilemap[1][3], 0x000);
498 
499 	fromanc2_dispvram = 0;
500 
501 	return 0;
502 }
503 
VIDEO_START(fromancr)504 VIDEO_START( fromancr )
505 {
506 	fromanc2_tilemap[0][0] = tilemap_create(fromancr_get_v0_l0_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64, 64);
507 	fromanc2_tilemap[0][1] = tilemap_create(fromancr_get_v0_l1_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
508 	fromanc2_tilemap[0][2] = tilemap_create(fromancr_get_v0_l2_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
509 	fromanc2_tilemap[0][3] = 0;
510 	fromanc2_tilemap[1][0] = tilemap_create(fromancr_get_v1_l0_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64, 64);
511 	fromanc2_tilemap[1][1] = tilemap_create(fromancr_get_v1_l1_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
512 	fromanc2_tilemap[1][2] = tilemap_create(fromancr_get_v1_l2_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64, 64);
513 	fromanc2_tilemap[1][3] = 0;
514 
515 	fromanc2_videoram[0][0] = auto_malloc((64 * 64) * sizeof(data16_t));
516 	fromanc2_videoram[0][1] = auto_malloc((64 * 64) * sizeof(data16_t));
517 	fromanc2_videoram[0][2] = auto_malloc((64 * 64) * sizeof(data16_t));
518 	fromanc2_videoram[1][0] = auto_malloc((64 * 64) * sizeof(data16_t));
519 	fromanc2_videoram[1][1] = auto_malloc((64 * 64) * sizeof(data16_t));
520 	fromanc2_videoram[1][2] = auto_malloc((64 * 64) * sizeof(data16_t));
521 
522 	fromanc2_paletteram[0] = auto_malloc(0x800 * 2);
523 	fromanc2_paletteram[1] = auto_malloc(0x800 * 2);
524 
525 	if (!fromanc2_tilemap[0][0] ||
526 		!fromanc2_tilemap[0][1] ||
527 		!fromanc2_tilemap[0][2] ||
528 		!fromanc2_tilemap[1][0] ||
529 		!fromanc2_tilemap[1][1] ||
530 		!fromanc2_tilemap[1][2] ||
531 		!fromanc2_videoram[0][0] ||
532 		!fromanc2_videoram[0][1] ||
533 		!fromanc2_videoram[0][2] ||
534 		!fromanc2_videoram[1][0] ||
535 		!fromanc2_videoram[1][1] ||
536 		!fromanc2_videoram[1][2] ||
537 		!fromanc2_paletteram[0] ||
538 		!fromanc2_paletteram[1]) {
539 		return 1;
540 	}
541 
542 	tilemap_set_transparent_pen(fromanc2_tilemap[0][1], 0x0ff);
543 	tilemap_set_transparent_pen(fromanc2_tilemap[0][2], 0x0ff);
544 	tilemap_set_transparent_pen(fromanc2_tilemap[1][1], 0x0ff);
545 	tilemap_set_transparent_pen(fromanc2_tilemap[1][2], 0x0ff);
546 
547 	fromanc2_dispvram = 0;
548 
549 	return 0;
550 }
551 
552 
VIDEO_START(fromanc4)553 VIDEO_START( fromanc4 )
554 {
555 	fromanc2_tilemap[0][0] = tilemap_create(fromancr_get_v0_l0_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 256, 64);
556 	fromanc2_tilemap[0][1] = tilemap_create(fromancr_get_v0_l1_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 256, 64);
557 	fromanc2_tilemap[0][2] = tilemap_create(fromancr_get_v0_l2_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 256, 64);
558 	fromanc2_tilemap[0][3] = 0;
559 	fromanc2_tilemap[1][0] = tilemap_create(fromancr_get_v1_l0_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 256, 64);
560 	fromanc2_tilemap[1][1] = tilemap_create(fromancr_get_v1_l1_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 256, 64);
561 	fromanc2_tilemap[1][2] = tilemap_create(fromancr_get_v1_l2_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 256, 64);
562 	fromanc2_tilemap[1][3] = 0;
563 
564 	fromanc2_videoram[0][0] = auto_malloc((256 * 64) * sizeof(data16_t));
565 	fromanc2_videoram[0][1] = auto_malloc((256 * 64) * sizeof(data16_t));
566 	fromanc2_videoram[0][2] = auto_malloc((256 * 64) * sizeof(data16_t));
567 	fromanc2_videoram[1][0] = auto_malloc((256 * 64) * sizeof(data16_t));
568 	fromanc2_videoram[1][1] = auto_malloc((256 * 64) * sizeof(data16_t));
569 	fromanc2_videoram[1][2] = auto_malloc((256 * 64) * sizeof(data16_t));
570 
571 	fromanc2_paletteram[0] = auto_malloc(0x800 * 2);
572 	fromanc2_paletteram[1] = auto_malloc(0x800 * 2);
573 
574 	if (!fromanc2_tilemap[0][0] ||
575 		!fromanc2_tilemap[0][1] ||
576 		!fromanc2_tilemap[0][2] ||
577 		!fromanc2_tilemap[1][0] ||
578 		!fromanc2_tilemap[1][1] ||
579 		!fromanc2_tilemap[1][2] ||
580 		!fromanc2_videoram[0][0] ||
581 		!fromanc2_videoram[0][1] ||
582 		!fromanc2_videoram[0][2] ||
583 		!fromanc2_videoram[1][0] ||
584 		!fromanc2_videoram[1][1] ||
585 		!fromanc2_videoram[1][2] ||
586 		!fromanc2_paletteram[0] ||
587 		!fromanc2_paletteram[1]) {
588 		return 1;
589 	}
590 
591 	tilemap_set_transparent_pen(fromanc2_tilemap[0][1], 0x000);
592 	tilemap_set_transparent_pen(fromanc2_tilemap[0][2], 0x000);
593 	tilemap_set_transparent_pen(fromanc2_tilemap[1][1], 0x000);
594 	tilemap_set_transparent_pen(fromanc2_tilemap[1][2], 0x000);
595 
596 	fromanc2_dispvram = 0;
597 
598 	return 0;
599 }
600 
601 /******************************************************************************
602 
603   Display refresh
604 
605 ******************************************************************************/
606 
VIDEO_UPDATE(fromanc2)607 VIDEO_UPDATE( fromanc2 )
608 {
609 	if (fromanc2_tilemap[fromanc2_dispvram][0]) {
610 		tilemap_set_scrollx(fromanc2_tilemap[fromanc2_dispvram][0], 0, -fromanc2_scrollx[fromanc2_dispvram][0]);
611 		tilemap_set_scrolly(fromanc2_tilemap[fromanc2_dispvram][0], 0, -fromanc2_scrolly[fromanc2_dispvram][0]);
612 	 	tilemap_draw(bitmap,cliprect, fromanc2_tilemap[fromanc2_dispvram][0], 0, 0);
613 	}
614 	if (fromanc2_tilemap[fromanc2_dispvram][1]) {
615 		tilemap_set_scrollx(fromanc2_tilemap[fromanc2_dispvram][1], 0, -fromanc2_scrollx[fromanc2_dispvram][1]);
616 		tilemap_set_scrolly(fromanc2_tilemap[fromanc2_dispvram][1], 0, -fromanc2_scrolly[fromanc2_dispvram][1]);
617 	 	tilemap_draw(bitmap,cliprect, fromanc2_tilemap[fromanc2_dispvram][1], 0, 0);
618 	}
619 	if (fromanc2_tilemap[fromanc2_dispvram][2]) {
620 		tilemap_set_scrollx(fromanc2_tilemap[fromanc2_dispvram][2], 0, -fromanc2_scrollx[fromanc2_dispvram][2]);
621 		tilemap_set_scrolly(fromanc2_tilemap[fromanc2_dispvram][2], 0, -fromanc2_scrolly[fromanc2_dispvram][2]);
622 	 	tilemap_draw(bitmap,cliprect, fromanc2_tilemap[fromanc2_dispvram][2], 0, 0);
623 	}
624 	if (fromanc2_tilemap[fromanc2_dispvram][3]) {
625 		tilemap_set_scrollx(fromanc2_tilemap[fromanc2_dispvram][3], 0, -fromanc2_scrollx[fromanc2_dispvram][3]);
626 		tilemap_set_scrolly(fromanc2_tilemap[fromanc2_dispvram][3], 0, -fromanc2_scrolly[fromanc2_dispvram][3]);
627 	 	tilemap_draw(bitmap,cliprect, fromanc2_tilemap[fromanc2_dispvram][3], 0, 0);
628 	}
629 }
630