1 #include "driver.h"
2 #include "vidhrdw/generic.h"
3 #include "cpu/m6809/m6809.h"
4 #include "homedata.h"
5 
6 
7 data8_t *homedata_vreg;	/* pointer to RAM associated with 0x7ffx */
8 data8_t reikaids_which;
9 int homedata_visible_page;
10 int homedata_priority;
11 static int homedata_flipscreen;
12 
13 static data8_t	reikaids_gfx_bank[2];
14 static data8_t	pteacher_gfx_bank;
15 static data8_t	blitter_bank;
16 static int		blitter_param_count;
17 static data8_t	blitter_param[4];		/* buffers last 4 writes to 0x8006 */
18 
19 static struct tilemap *tilemap[2][4];
20 
21 
22 /*
23 	video control registers:
24 	0 xxxxxxxx  unknown
25 	1 x-------  flip screen
26 	  -xxxxxxx  unknown
27 	2 xxxxxxxx  unknown
28 	3 xxxxxxxx  related to visible area?
29 	4 ----xxxx	fine horiz scroll (sub-character, 8 or 12 pixels)
30 	  xxxx----  unknown
31 	5 xxxxxxxx  related to visible area?
32 	6 xxxxxxxx  related to visible area?
33 	7 xxxxxxxx  unknown
34 	8 xxxxxxxx  unknown
35 	9 xxxxxxxx  unknown
36 	a xxxxxxxx  unknown
37 	b xxxxxx--  horiz scroll (character resolution)
38 	c xxxxxxxx  might be bg layer horiz scroll (always 0 here but used by the older games)
39 	d xxxxxxxx  might be fg layer horiz scroll (always 0 here but always 4 in the older games)
40  */
41 
42 
43 /***************************************************************************
44 
45   Blitter
46 
47   This is probably work done by the GX61A01 custom chip found on all boards,
48   however the way it works is not exactly the same in all games.
49 
50 ***************************************************************************/
51 
mrokumei_handleblit(int rom_base)52 static void mrokumei_handleblit( int rom_base )
53 {
54 	int i;
55 	int DestParam;
56 	int SourceAddr;
57 	int DestAddr;
58 	int BaseAddr;
59 	int opcode,data,NumTiles;
60 	data8_t *pBlitData = memory_region(REGION_USER1) + rom_base;
61 
62 	DestParam =
63 		blitter_param[(blitter_param_count-4)&3]*256+
64 		blitter_param[(blitter_param_count-3)&3];
65 
66 	SourceAddr =
67 		blitter_param[(blitter_param_count-2)&3]*256+
68 		blitter_param[(blitter_param_count-1)&3];
69 
70 	/*  xxx-.----.----.---- not used?
71 	 *	---x.----.----.---- layer
72 	 *	----.xxxx.xxxx.xxxx addr
73 	 */
74 	BaseAddr= (DestParam&0x1000);
75 	DestAddr= (DestParam&0x0fff);
76 
77 //	logerror( "[blit bank %02x src %04x dst %04x]\n",blitter_bank,SourceAddr,DestParam);
78 
79 	if( homedata_visible_page == 0 )
80 	{
81 		BaseAddr += 0x2000;
82 	}
83 
84 	for(;;)
85 	{
86 		opcode = pBlitData[SourceAddr++];
87 		/* 00xxxxxx	RLE incrementing
88 		 * 01xxxxxx	Raw Run
89 		 * 1xxxxxxx	RLE constant data
90 		 */
91 		if( opcode == 0x00 )
92 		{
93  			/* end-of-graphic */
94  			goto finish;
95 		}
96 		data  = pBlitData[SourceAddr++];
97 
98 		if (opcode&0x80)
99 			NumTiles = 0x80-(opcode&0x7f);
100 		else
101 			NumTiles = 0x40-(opcode&0x3f);
102 
103 		for( i=0; i<NumTiles; i++ )
104 		{
105 			if( i!=0 )
106 			{
107 				switch( opcode&0xc0 )
108 				{
109 				case 0x40: // Raw Run
110 					data  = pBlitData[SourceAddr++];
111 					break;
112 
113 				case 0x00: // RLE incrementing
114 					data++;
115 					break;
116 				}
117 			} /* i!=0 */
118 
119 			if (data)	/* 00 is a nop */
120 				mrokumei_videoram_w( BaseAddr + DestAddr, data );
121 
122 			if (homedata_vreg[1] & 0x80)	/* flip screen */
123 			{
124 				DestAddr-=2;
125 				if (DestAddr < 0) goto finish;
126 			}
127 			else
128 			{
129 				DestAddr+=2;
130 				if (DestAddr >= 0x1000) goto finish;
131 			}
132 		} /* for( i=0; i<NumTiles; i++ ) */
133 	} /* for(;;) */
134 
135 finish:
136 	cpu_set_irq_line(0,M6809_FIRQ_LINE,HOLD_LINE);
137 }
138 
reikaids_handleblit(int rom_base)139 static void reikaids_handleblit( int rom_base )
140 {
141 	int i;
142 	UINT16 DestParam;
143 	int flipx;
144 	int SourceAddr, BaseAddr;
145 	int DestAddr;
146 	data8_t *pBlitData = memory_region(REGION_USER1) + rom_base;
147 
148 	int opcode,data,NumTiles;
149 
150 	DestParam =
151 		blitter_param[(blitter_param_count-4)&3]*256+
152 		blitter_param[(blitter_param_count-3)&3];
153 
154 	SourceAddr =
155 		blitter_param[(blitter_param_count-2)&3]*256+
156 		blitter_param[(blitter_param_count-1)&3];
157 
158 	/*	x---.----.----.---- flipx
159 	 * 	-x--.----.----.---- select: attr/tile
160 	 *	--*x.xxxx.*xxx.xxxx addr
161 	 */
162 	BaseAddr= (DestParam&0x4000);
163 	DestAddr= (DestParam&0x3fff);
164 	flipx	= (DestParam&0x8000);
165 
166 //	logerror( "[blit %02x %04x %04x]\n",blitter_bank,SourceAddr,DestParam);
167 
168 	if( homedata_visible_page == 0 )
169 	{
170 		BaseAddr += 0x2000<<2;
171 	}
172 
173 	for(;;)
174 	{
175 		opcode = pBlitData[SourceAddr++];
176 		/* 00xxxxxx	Raw Run
177 		 * 01xxxxxx	RLE incrementing
178 		 * 1xxxxxxx	RLE constant data
179 		 */
180 		if( opcode == 0x00 )
181 		{
182 			/* end-of-graphic */
183 			goto finish;
184 		}
185 
186 		data  = pBlitData[SourceAddr++];
187 
188 		if( (opcode&0xc0)==0x80 )
189 			NumTiles = 0x80 - (opcode&0x7f);
190 		else
191 			NumTiles = 0x40 - (opcode&0x3f);
192 
193 		for( i=0; i<NumTiles; i++ )
194 		{
195 			if( i!=0 )
196 			{
197 				switch( opcode&0xc0 )
198 				{
199 				case 0x00: // Raw Run
200 					data  = pBlitData[SourceAddr++];
201 					break;
202 
203 				case 0x40: // RLE incrementing
204 					data++;
205 					break;
206 				}
207 			} /* i!=0 */
208 
209 			if (data)	/* 00 is a nop */
210 			{
211 				int addr = BaseAddr + (DestAddr & 0x3fff);
212 				int dat = data;
213 
214 				if ((addr & 0x2080) == 0)
215 				{
216 					addr = ((addr & 0xc000) >> 2) | ((addr & 0x1f00) >> 1) | (addr & 0x7f);
217 
218 					if( flipx )
219 					{
220 						if ((BaseAddr & 0x4000) == 0) dat |= 0x80;
221 						addr ^= 0x007c;
222 					}
223 
224 					reikaids_videoram_w( addr, dat );
225 				}
226 			}
227 
228 			if (homedata_vreg[1] & 0x80)	/* flip screen */
229 				DestAddr-=4;
230 			else
231 				DestAddr+=4;
232 		} /* for( i=0; i<NumTiles; i++ ) */
233 	}
234 
235 finish:
236 	cpu_set_irq_line(0,M6809_FIRQ_LINE,HOLD_LINE);
237 }
238 
pteacher_handleblit(int rom_base)239 static void pteacher_handleblit( int rom_base )
240 {
241 	int i;
242 	int DestParam;
243 	int SourceAddr;
244 	int DestAddr, BaseAddr;
245 	int opcode,data,NumTiles;
246 	data8_t *pBlitData = memory_region(REGION_USER1) + rom_base;
247 
248 	DestParam =
249 		blitter_param[(blitter_param_count-4)&3]*256+
250 		blitter_param[(blitter_param_count-3)&3];
251 
252 	SourceAddr =
253 		blitter_param[(blitter_param_count-2)&3]*256+
254 		blitter_param[(blitter_param_count-1)&3];
255 
256 	/*  x---.----.----.---- not used?
257 	 *  -x--.----.----.---- layer	(0..1)
258 	 *	--*x.xxxx.*xxx.xxxx addr
259 	 */
260 	BaseAddr= (DestParam&0x4000);
261 	DestAddr= (DestParam&0x3fff);
262 
263 //	logerror( "[blit %02x %04x %04x]->%d\n",blitter_bank,SourceAddr,DestParam,homedata_visible_page);
264 
265 	if( homedata_visible_page == 0 )
266 	{
267 		BaseAddr += 0x2000<<2;
268 	}
269 
270 	for(;;)
271 	{
272 		opcode = pBlitData[SourceAddr++];
273 		/* 00xxxxxx	Raw Run
274 		 * 01xxxxxx	RLE incrementing
275 		 * 1xxxxxxx	RLE constant data
276 		 */
277 		if( opcode == 0x00 )
278 		{
279  			/* end-of-graphic */
280  			goto finish;
281 		}
282 		data  = pBlitData[SourceAddr++];
283 
284 		if (opcode & 0x80)
285 			NumTiles = 0x80-(opcode&0x7f);
286 		else
287 			NumTiles = 0x40-(opcode&0x3f);
288 
289 		for( i=0; i<NumTiles; i++ )
290 		{
291 			if( i!=0 )
292 			{
293 				switch( opcode&0xc0 )
294 				{
295 				case 0x00: // Raw Run
296 					data  = pBlitData[SourceAddr++];
297 					break;
298 
299 				case 0x40: // RLE incrementing
300 					data++;
301 					break;
302 				}
303 			} /* i!=0 */
304 
305 			if (data)	/* 00 is a nop */
306 			{
307 				int addr = BaseAddr + (DestAddr & 0x3fff);
308 
309 				if ((addr & 0x2080) == 0)
310 				{
311 					addr = ((addr & 0xc000) >> 2) | ((addr & 0x1f00) >> 1) | (addr & 0x7f);
312 					pteacher_videoram_w( addr, data );
313 				}
314 			}
315 
316 			if (homedata_vreg[1] & 0x80)	/* flip screen */
317 				DestAddr-=2;
318 			else
319 				DestAddr+=2;
320 		} /* for( i=0; i<NumTiles; i++ ) */
321 	} /* for(;;) */
322 
323 finish:
324 	cpu_set_irq_line(0,M6809_FIRQ_LINE,HOLD_LINE);
325 }
326 
327 
328 
329 
330 /***************************************************************************
331 
332   Palette setup
333 
334 ***************************************************************************/
335 
PALETTE_INIT(mrokumei)336 PALETTE_INIT( mrokumei )
337 {
338 	int i;
339 
340 	/* initialize 555 RGB palette */
341 	for (i = 0; i < 0x8000; i++)
342 	{
343 		int r,g,b;
344 		int color = color_prom[i*2] * 256 + color_prom[i*2+1];
345 		/* xxxx--------x--- red
346 		 * ----xxxx-----x-- green
347 		 * --------xxxx--x- blue
348 		 * ---------------x unused
349 		 */
350 		r = ((color >> 11) & 0x1e) | ((color >> 3) & 1);
351 		g = ((color >>  7) & 0x1e) | ((color >> 2) & 1);
352 		b = ((color >>  3) & 0x1e) | ((color >> 1) & 1);
353 
354 		r = (r << 3) | (r >> 2);
355 		g = (g << 3) | (g >> 2);
356 		b = (b << 3) | (b >> 2);
357 
358 		palette_set_color(i,r,g,b);
359 	}
360 }
361 
PALETTE_INIT(reikaids)362 PALETTE_INIT( reikaids )
363 {
364 	int i;
365 
366 	/* initialize 555 RGB palette */
367 	for (i = 0; i < 0x8000; i++)
368 	{
369 		int r,g,b;
370 		int color = color_prom[i*2] * 256 + color_prom[i*2+1];
371 		/* xxxx--------x--- green
372 		 * ----xxxx-----x-- red
373 		 * --------xxxx--x- blue
374 		 * ---------------x unused
375 		 */
376 		g = ((color >> 11) & 0x1e) | ((color >> 3) & 1);
377 		r = ((color >>  7) & 0x1e) | ((color >> 2) & 1);
378 		b = ((color >>  3) & 0x1e) | ((color >> 1) & 1);
379 
380 		r = (r << 3) | (r >> 2);
381 		g = (g << 3) | (g >> 2);
382 		b = (b << 3) | (b >> 2);
383 
384 		palette_set_color(i,r,g,b);
385 	}
386 }
387 
PALETTE_INIT(pteacher)388 PALETTE_INIT( pteacher )
389 {
390 	int i;
391 
392 	/* initialize 555 RGB palette */
393 	for (i = 0; i < 0x8000; i++)
394 	{
395 		int r,g,b;
396 		int color = color_prom[i*2] * 256 + color_prom[i*2+1];
397 		/* xxxxx----------- green
398 		 * -----xxxxx------ red
399 		 * ----------xxxxx- blue
400 		 * ---------------x unused
401 		 */
402 		g = ((color >> 11) & 0x1f);
403 		r = ((color >>  6) & 0x1f);
404 		b = ((color >>  1) & 0x1f);
405 
406 		r = (r << 3) | (r >> 2);
407 		g = (g << 3) | (g >> 2);
408 		b = (b << 3) | (b >> 2);
409 
410 		palette_set_color(i,r,g,b);
411 	}
412 }
413 
414 
415 
416 /***************************************************************************
417 
418   Callbacks for the TileMap code
419 
420 ***************************************************************************/
421 
mrokumei_info0(int tile_index,int page,int gfxbank)422 static INLINE void mrokumei_info0( int tile_index, int page, int gfxbank )
423 {
424 	int addr  = tile_index * 2 + 0x2000 * page;
425 	int attr  = videoram[addr];
426 	int code  = videoram[addr + 1] + ((attr & 0x03) << 8) + (gfxbank << 10);
427 	int color = (attr >> 2) + (gfxbank << 6);
428 
429 	SET_TILE_INFO( 0, code, color, homedata_flipscreen );
430 }
mrokumei_info1(int tile_index,int page,int gfxbank)431 static INLINE void mrokumei_info1( int tile_index, int page, int gfxbank )
432 {
433 	int addr  = tile_index * 2 + 0x1000 + 0x2000 * page;
434 	int attr  = videoram[addr];
435 	int code  = videoram[addr + 1] + ((attr & 0x07) << 8) + (gfxbank << 11);
436 	int color = (attr >> 3) + ((gfxbank & 3) << 6);
437 
438 	SET_TILE_INFO( 1, code, color, homedata_flipscreen );
439 }
440 
mrokumei_get_info0_0(int tile_index)441 static void mrokumei_get_info0_0(int tile_index) { mrokumei_info0( tile_index, 0,  blitter_bank & 0x03 ); }
mrokumei_get_info1_0(int tile_index)442 static void mrokumei_get_info1_0(int tile_index) { mrokumei_info0( tile_index, 1,  blitter_bank & 0x03 ); }
mrokumei_get_info0_1(int tile_index)443 static void mrokumei_get_info0_1(int tile_index) { mrokumei_info1( tile_index, 0, (blitter_bank & 0x38) >> 3 ); }
mrokumei_get_info1_1(int tile_index)444 static void mrokumei_get_info1_1(int tile_index) { mrokumei_info1( tile_index, 1, (blitter_bank & 0x38) >> 3 ); }
445 
446 
reikaids_info(int tile_index,int page,int layer,int gfxbank)447 static INLINE void reikaids_info( int tile_index, int page, int layer, int gfxbank )
448 {
449 	int addr  = tile_index * 4 + layer + 0x2000 * page;
450 	int attr  = videoram[addr];
451 	int code  = videoram[addr + 0x1000] + ((attr & 0x03) << 8) + (gfxbank << 10);
452 	int color = (attr & 0x7c) >> 2;
453 	int flags = homedata_flipscreen;
454 
455 	if (attr & 0x80) flags ^= TILE_FLIPX;
456 
457 	SET_TILE_INFO( layer, code, color, flags );
458 }
459 
460 	/* reikaids_gfx_bank[0]:
461 	 *		-xxx.x---	layer#1
462 	 *		----.-xxx	layer#3
463 	 *
464 	 * reikaids_gfx_bank[1]:
465 	 *		xxxx.x---	layer#0
466 	 *		----.-xxx	layer#2
467 	 */
reikaids_get_info0_0(int tile_index)468 static void reikaids_get_info0_0(int tile_index) { reikaids_info( tile_index, 0, 0,  (reikaids_gfx_bank[1]>>3)); }
reikaids_get_info1_0(int tile_index)469 static void reikaids_get_info1_0(int tile_index) { reikaids_info( tile_index, 1, 0,  (reikaids_gfx_bank[1]>>3)); }
reikaids_get_info0_1(int tile_index)470 static void reikaids_get_info0_1(int tile_index) { reikaids_info( tile_index, 0, 1, ((reikaids_gfx_bank[0]&0x78)>>3)); }
reikaids_get_info1_1(int tile_index)471 static void reikaids_get_info1_1(int tile_index) { reikaids_info( tile_index, 1, 1, ((reikaids_gfx_bank[0]&0x78)>>3)); }
reikaids_get_info0_2(int tile_index)472 static void reikaids_get_info0_2(int tile_index) { reikaids_info( tile_index, 0, 2,  (reikaids_gfx_bank[1]&0x7)); }
reikaids_get_info1_2(int tile_index)473 static void reikaids_get_info1_2(int tile_index) { reikaids_info( tile_index, 1, 2,  (reikaids_gfx_bank[1]&0x7)); }
reikaids_get_info0_3(int tile_index)474 static void reikaids_get_info0_3(int tile_index) { reikaids_info( tile_index, 0, 3,  (reikaids_gfx_bank[0]&0x7)); }
reikaids_get_info1_3(int tile_index)475 static void reikaids_get_info1_3(int tile_index) { reikaids_info( tile_index, 1, 3,  (reikaids_gfx_bank[0]&0x7)); }
476 
477 
pteacher_info(int tile_index,int page,int layer,int gfxbank)478 static INLINE void pteacher_info( int tile_index, int page, int layer, int gfxbank )
479 {
480 	int addr  = tile_index * 2 + 0x1000 * layer + 0x2000 * page;
481 	int attr  = videoram[addr];
482 	int code  = videoram[addr + 1] + ((attr & 0x07) << 8) + (gfxbank << 11);
483 	int color = (attr >> 3) + ((gfxbank & 1) << 5);
484 
485 	SET_TILE_INFO( layer, code, color, homedata_flipscreen );
486 }
487 
pteacher_get_info0_0(int tile_index)488 static void pteacher_get_info0_0(int tile_index) { pteacher_info( tile_index, 0, 0, pteacher_gfx_bank & 0x0f ); }
pteacher_get_info1_0(int tile_index)489 static void pteacher_get_info1_0(int tile_index) { pteacher_info( tile_index, 1, 0, pteacher_gfx_bank & 0x0f ); }
pteacher_get_info0_1(int tile_index)490 static void pteacher_get_info0_1(int tile_index) { pteacher_info( tile_index, 0, 1, pteacher_gfx_bank >> 4 ); }
pteacher_get_info1_1(int tile_index)491 static void pteacher_get_info1_1(int tile_index) { pteacher_info( tile_index, 1, 1, pteacher_gfx_bank >> 4 ); }
492 
493 
lemnangl_info(int tile_index,int page,int layer,int gfxset,int gfxbank)494 static INLINE void lemnangl_info( int tile_index, int page, int layer, int gfxset, int gfxbank )
495 {
496 	int addr  = tile_index * 2 + 0x1000 * layer + 0x2000 * page;
497 	int attr  = videoram[addr];
498 	int code  = videoram[addr + 1] + ((attr & 0x07) << 8) + (gfxbank << 11);
499 	int color = 16 * (attr >> 3) + gfxbank;
500 
501 	SET_TILE_INFO( 2*layer + gfxset, code, color, homedata_flipscreen );
502 }
503 
lemnangl_get_info0_0(int tile_index)504 static void lemnangl_get_info0_0(int tile_index) { lemnangl_info( tile_index, 0, 0,  blitter_bank & 1,       pteacher_gfx_bank & 0x0f ); }
lemnangl_get_info1_0(int tile_index)505 static void lemnangl_get_info1_0(int tile_index) { lemnangl_info( tile_index, 1, 0,  blitter_bank & 1,       pteacher_gfx_bank & 0x0f ); }
lemnangl_get_info0_1(int tile_index)506 static void lemnangl_get_info0_1(int tile_index) { lemnangl_info( tile_index, 0, 1, (blitter_bank & 2) >> 1, pteacher_gfx_bank >> 4 ); }
lemnangl_get_info1_1(int tile_index)507 static void lemnangl_get_info1_1(int tile_index) { lemnangl_info( tile_index, 1, 1, (blitter_bank & 2) >> 1, pteacher_gfx_bank >> 4 ); }
508 
509 
510 /***************************************************************************
511 
512   Start the video hardware emulation.
513 
514 ***************************************************************************/
515 
VIDEO_START(mrokumei)516 VIDEO_START( mrokumei )
517 {
518 	tilemap[0][0] = tilemap_create( mrokumei_get_info0_0, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64,32 );
519 	tilemap[0][1] = tilemap_create( mrokumei_get_info0_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64,32 );
520 	tilemap[1][0] = tilemap_create( mrokumei_get_info1_0, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64,32 );
521 	tilemap[1][1] = tilemap_create( mrokumei_get_info1_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64,32 );
522 
523 	if (!tilemap[0][0] || !tilemap[0][1] || !tilemap[1][0] || !tilemap[1][1])
524 		return 1;
525 
526 	tilemap_set_transparent_pen(tilemap[0][1],0);
527 	tilemap_set_transparent_pen(tilemap[1][1],0);
528 
529 	return 0;
530 }
531 
VIDEO_START(reikaids)532 VIDEO_START( reikaids )
533 {
534 	tilemap[0][0] = tilemap_create( reikaids_get_info0_0, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
535 	tilemap[0][1] = tilemap_create( reikaids_get_info0_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
536 	tilemap[0][2] = tilemap_create( reikaids_get_info0_2, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
537 	tilemap[0][3] = tilemap_create( reikaids_get_info0_3, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
538 	tilemap[1][0] = tilemap_create( reikaids_get_info1_0, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
539 	tilemap[1][1] = tilemap_create( reikaids_get_info1_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
540 	tilemap[1][2] = tilemap_create( reikaids_get_info1_2, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
541 	tilemap[1][3] = tilemap_create( reikaids_get_info1_3, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 32, 32 );
542 
543 	if (!tilemap[0][0] || !tilemap[0][1] || !tilemap[0][2] || !tilemap[0][3] ||
544 		!tilemap[1][0] || !tilemap[1][1] || !tilemap[1][2] || !tilemap[1][3])
545 		return 1;
546 
547 	tilemap_set_transparent_pen(tilemap[0][0],0xff);
548 	tilemap_set_transparent_pen(tilemap[0][1],0xff);
549 	tilemap_set_transparent_pen(tilemap[0][2],0xff);
550 	tilemap_set_transparent_pen(tilemap[0][3],0xff);
551 	tilemap_set_transparent_pen(tilemap[1][0],0xff);
552 	tilemap_set_transparent_pen(tilemap[1][1],0xff);
553 	tilemap_set_transparent_pen(tilemap[1][2],0xff);
554 	tilemap_set_transparent_pen(tilemap[1][3],0xff);
555 
556 	return 0;
557 }
558 
VIDEO_START(pteacher)559 VIDEO_START( pteacher )
560 {
561 	tilemap[0][0] = tilemap_create( pteacher_get_info0_0, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64,32 );
562 	tilemap[0][1] = tilemap_create( pteacher_get_info0_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64,32 );
563 	tilemap[1][0] = tilemap_create( pteacher_get_info1_0, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64,32 );
564 	tilemap[1][1] = tilemap_create( pteacher_get_info1_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64,32 );
565 
566 	if (!tilemap[0][0] || !tilemap[0][1] || !tilemap[1][0] || !tilemap[1][1])
567 		return 1;
568 
569 	tilemap_set_transparent_pen(tilemap[0][1],0xff);
570 	tilemap_set_transparent_pen(tilemap[1][1],0xff);
571 
572 	return 0;
573 }
574 
VIDEO_START(lemnangl)575 VIDEO_START( lemnangl )
576 {
577 	tilemap[0][0] = tilemap_create( lemnangl_get_info0_0, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64,32 );
578 	tilemap[0][1] = tilemap_create( lemnangl_get_info0_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64,32 );
579 	tilemap[1][0] = tilemap_create( lemnangl_get_info1_0, tilemap_scan_rows, TILEMAP_OPAQUE,      8, 8, 64,32 );
580 	tilemap[1][1] = tilemap_create( lemnangl_get_info1_1, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8, 64,32 );
581 
582 	if (!tilemap[0][0] || !tilemap[0][1] || !tilemap[1][0] || !tilemap[1][1])
583 		return 1;
584 
585 	tilemap_set_transparent_pen(tilemap[0][1],0x0f);
586 	tilemap_set_transparent_pen(tilemap[1][1],0x0f);
587 
588 	return 0;
589 }
590 
591 
592 
593 /***************************************************************************
594 
595   Memory handlers
596 
597 ***************************************************************************/
598 
WRITE_HANDLER(mrokumei_videoram_w)599 WRITE_HANDLER( mrokumei_videoram_w )
600 {
601 	if( videoram[offset] != data )
602 	{
603 		videoram[offset] = data;
604 		tilemap_mark_tile_dirty( tilemap[(offset & 0x2000) >> 13][(offset & 0x1000) >> 12], (offset & 0xffe) >> 1 );
605 	}
606 }
607 
WRITE_HANDLER(reikaids_videoram_w)608 WRITE_HANDLER( reikaids_videoram_w )
609 {
610 	if (videoram[offset] != data)
611 	{
612 		videoram[offset] = data;
613 		tilemap_mark_tile_dirty( tilemap[(offset & 0x2000) >> 13][offset & 3], (offset & 0xffc) >> 2 );
614 	}
615 }
616 
WRITE_HANDLER(pteacher_videoram_w)617 WRITE_HANDLER( pteacher_videoram_w )
618 {
619 	if( videoram[offset] != data )
620 	{
621 		videoram[offset] = data;
622 		tilemap_mark_tile_dirty( tilemap[(offset & 0x2000) >> 13][(offset & 0x1000) >> 12], (offset & 0xffe) >> 1 );
623 	}
624 }
625 
WRITE_HANDLER(reikaids_gfx_bank_w)626 WRITE_HANDLER( reikaids_gfx_bank_w )
627 {
628 
629 //logerror( "%04x: [setbank %02x]\n",activecpu_get_pc(),data);
630 
631 	if (reikaids_gfx_bank[reikaids_which] != data)
632 	{
633 		reikaids_gfx_bank[reikaids_which] = data;
634 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS );
635 	}
636 
637 	reikaids_which ^= 1;
638 }
639 
WRITE_HANDLER(pteacher_gfx_bank_w)640 WRITE_HANDLER( pteacher_gfx_bank_w )
641 {
642 //	logerror( "%04x: gfxbank:=%02x\n", activecpu_get_pc(), data );
643 	if (pteacher_gfx_bank != data)
644 	{
645 		pteacher_gfx_bank = data;
646 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS );
647 	}
648 }
649 
WRITE_HANDLER(homedata_blitter_param_w)650 WRITE_HANDLER( homedata_blitter_param_w )
651 {
652 //logerror("%04x: blitter_param_w %02x\n",activecpu_get_pc(),data);
653 	blitter_param[blitter_param_count] = data;
654 	blitter_param_count++;
655 	blitter_param_count&=3;
656 }
657 
WRITE_HANDLER(mrokumei_blitter_bank_w)658 WRITE_HANDLER( mrokumei_blitter_bank_w )
659 {
660 	/* --xxx--- layer 1 gfx bank
661 	   -----x-- blitter ROM bank
662 	   ------xx layer 0 gfx bank
663 	 */
664 
665 	if ((blitter_bank ^ data) & 0x3b)
666 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS);
667 
668 	blitter_bank = data;
669 }
670 
WRITE_HANDLER(reikaids_blitter_bank_w)671 WRITE_HANDLER( reikaids_blitter_bank_w )
672 {
673 	/* xxx----- priority control
674 	   ----x--- target page? what's this for?
675 	   ------xx blitter ROM bank
676 	 */
677 	blitter_bank = data;
678 }
679 
WRITE_HANDLER(pteacher_blitter_bank_w)680 WRITE_HANDLER( pteacher_blitter_bank_w )
681 {
682 	/* xxx----- blitter ROM bank
683 	   -----x-- pixel clock (normal/slow)
684 	   ------x- layer #1 gfx charset (lemnangl only)
685 	   -------x layer #0 gfx charset (lemnangl only)
686 	 */
687 
688 	if ((blitter_bank ^ data) & 0x03)
689 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS);
690 
691 	blitter_bank = data;
692 }
693 
WRITE_HANDLER(mrokumei_blitter_start_w)694 WRITE_HANDLER( mrokumei_blitter_start_w )
695 {
696 	if (data & 0x80) mrokumei_handleblit(((blitter_bank & 0x04) >> 2) * 0x10000);
697 
698 	/* bit 0 = bank switch; used by hourouki to access the
699 	   optional service mode ROM (not available in current dump) */
700 }
701 
WRITE_HANDLER(reikaids_blitter_start_w)702 WRITE_HANDLER( reikaids_blitter_start_w )
703 {
704 	reikaids_handleblit((blitter_bank & 3) * 0x10000);
705 }
706 
WRITE_HANDLER(pteacher_blitter_start_w)707 WRITE_HANDLER( pteacher_blitter_start_w )
708 {
709 	pteacher_handleblit((blitter_bank >> 5) * 0x10000 & (memory_region_length(REGION_USER1) - 1));
710 }
711 
712 
713 
714 /***************************************************************************
715 
716   Display refresh
717 
718 ***************************************************************************/
719 
VIDEO_UPDATE(mrokumei)720 VIDEO_UPDATE( mrokumei )
721 {
722 	int flags,width;
723 
724 	/* blank screen */
725 	if (homedata_vreg[0x3] == 0xc1 && homedata_vreg[0x4] == 0xc0 && homedata_vreg[0x5] == 0xff)
726 	{
727 		fillbitmap(bitmap,get_black_pen(),cliprect);
728 		return;
729 	}
730 
731 	flags = (homedata_vreg[1] & 0x80) ? (TILE_FLIPX | TILE_FLIPY) : 0;
732 	if (flags != homedata_flipscreen)
733 	{
734 		homedata_flipscreen = flags;
735 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS );
736 	}
737 
738 	switch (homedata_vreg[0x3])
739 	{
740 		case 0xb7: width = 54; break;	// mjclinic
741 		case 0xae: width = 52; break;	// mrokumei
742 		case 0x9f: width = 49; break;	// hourouki, mhgaiden, mjhokite
743 		case 0x96: width = 49; break;	// mjclinic
744 		default:
745 			if (homedata_vreg[0x3])
746 				usrintf_showmessage("unknown video control %02x %02x %02x %02x",
747 					homedata_vreg[0x3],
748 					homedata_vreg[0x4],
749 					homedata_vreg[0x5],
750 					homedata_vreg[0x6]);
751 			width = 54;
752 			break;
753 	}
754 	set_visible_area(0*8, width*8-1, 2*8, 30*8-1);
755 
756 	tilemap_set_scrollx(tilemap[homedata_visible_page][0],0,homedata_vreg[0xc] << 1);
757 
758 	tilemap_draw(bitmap, cliprect, tilemap[homedata_visible_page][0], 0, 0);
759 	tilemap_draw(bitmap, cliprect, tilemap[homedata_visible_page][1], 0, 0);
760 }
761 /*
762 VIDEO_UPDATE( reikaids )
763 {
764 	int flags;
765 	static int pritable[8][4] =
766 	{
767 		{ 3,1,0,2 },
768 		{ 1,3,0,2 },
769 		{ 0,3,1,2 },
770 		{ 0,1,3,2 },
771 		{ 3,0,1,2 },
772 		{ 1,0,3,2 },
773 		{ 2,3,1,0 },	// (bg color should be taken from 1)
774 		{ 3,1,2,0 },	// (bg color should be taken from 1)
775 	};
776 	int pri,i;
777 
778 
779 	flags = (homedata_vreg[1] & 0x80) ? (TILE_FLIPX | TILE_FLIPY) : 0;
780 	if (flags != homedata_flipscreen)
781 	{
782 		homedata_flipscreen = flags;
783 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS );
784 	}
785 
786 
787 	fillbitmap(bitmap,get_black_pen(),cliprect);
788 
789 	pri = (blitter_bank & 0x70) >> 4;
790 	for (i = 0;i < 4;i++)
791 		tilemap_draw(bitmap, cliprect, tilemap[homedata_visible_page][pritable[pri][3-i]], 0, 0);
792 }
793 
794 */
VIDEO_UPDATE(reikaids)795 VIDEO_UPDATE( reikaids )
796 {
797 	int flags;
798 	static int pritable[2][8][4] =	/* table of priorities derived from the PROM */
799 	{
800 	{
801 		{ 3,1,0,2 },
802 		{ 1,3,0,2 },
803 		{ 0,3,1,2 },
804 		{ 0,1,3,2 },
805 		{ 3,0,1,2 },
806 		{ 1,0,3,2 },
807 		{ 2,3,1,0 },	// (bg color should be taken from 1)
808 		{ 3,1,2,0 }	// (bg color should be taken from 1)
809 	},
810 	{
811 		{2,3,0,1},
812 		{2,0,3,1},
813 		{3,0,2,1},
814 		{0,3,2,1},
815 		{3,0,1,2},
816 		{2,1,3,0},
817 		{0,2,3,1},
818 		{3,2,0,1}
819 	},
820 	};
821 
822 	int pri,i;
823 
824 	flags = (homedata_vreg[1] & 0x80) ? (TILE_FLIPX | TILE_FLIPY) : 0;
825 	if (flags != homedata_flipscreen)
826 	{
827 		homedata_flipscreen = flags;
828 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS );
829 	}
830 
831 
832 	fillbitmap(bitmap,get_black_pen(),cliprect);
833 
834 	pri = (blitter_bank & 0x70) >> 4;
835 	for (i = 0;i < 4;i++)
836 		tilemap_draw(bitmap, cliprect, tilemap[homedata_visible_page][pritable[homedata_priority][pri][3-i]], 0, 0);
837 }
838 
839 
VIDEO_UPDATE(pteacher)840 VIDEO_UPDATE( pteacher )
841 {
842 	int flags,scroll_low,scroll_high;
843 
844 
845 	/* blank screen */
846 	if (homedata_vreg[0x3] == 0xc1 && homedata_vreg[0x4] == 0xc0 && homedata_vreg[0x5] == 0xff)
847 	{
848 		fillbitmap(bitmap,get_black_pen(),cliprect);
849 		return;
850 	}
851 
852 	flags = (homedata_vreg[1] & 0x80) ? (TILE_FLIPX | TILE_FLIPY) : 0;
853 	if (flags != homedata_flipscreen)
854 	{
855 		homedata_flipscreen = flags;
856 		tilemap_mark_all_tiles_dirty( ALL_TILEMAPS );
857 	}
858 
859 	/* bit 2 of blitter_bank stretches characters horizontally by 3/2,
860 	   so they look as if they were 12x8 instead of 8x8.
861 
862 	   However, the visible area can be further reduced by fudging with the video
863 	   registers, but I haven't figured out how they work exactly.
864 	   In most games it's like this (note that register 4 controls fine
865 	   scrolling):
866 
867 	   width      3  4  5  6
868 	   33*8    = a6 00 ef db (mjikaga)
869 	   35*8    = bc 0b ef f0
870 	   51*8    = a6 07 ef db (mjikaga)
871 	   54*8    = bc 07 ef e8
872 
873        but in mjkinjas it's
874 	   42*8    = f0 ae df cc
875 
876 	   note that mjkinjas has a 11MHz xtal instead of the 9MHz of all the others:
877 	   the two things are probably related, in fact 35 * 11 / 9 = 42.7777777.
878 
879 	   and it also seems that
880 	   blanked = c1 c0 ff --
881 	  */
882 
883 	if (blitter_bank & 0x04)
884 	{
885 		if (homedata_vreg[0x4] == 0xae || homedata_vreg[0x4] == 0xb8)
886 		{
887 			/* kludge for mjkinjas */
888 			set_visible_area(0*8, 42*8-1, 2*8, 30*8-1);
889 			scroll_low = 0;
890 		}
891 		else
892 		{
893 			if (homedata_vreg[0x3] == 0xa6)
894 				set_visible_area(0*8, 33*8-1, 2*8, 30*8-1);
895 			else
896 				set_visible_area(0*8, 35*8-1, 2*8, 30*8-1);
897 			scroll_low = (11 - (homedata_vreg[0x4] & 0x0f)) * 8 / 12;
898 		}
899 	}
900 	else
901 	{
902 		if (homedata_vreg[0x3] == 0xa6)
903 			set_visible_area(0*8, 51*8-1, 2*8, 30*8-1);
904 		else
905 			set_visible_area(0*8, 54*8-1, 2*8, 30*8-1);
906 		scroll_low = 7 - (homedata_vreg[0x4] & 0x0f);
907 	}
908 	scroll_high = homedata_vreg[0xb] >> 2;
909 
910 	tilemap_set_scrollx(tilemap[homedata_visible_page][0],0,scroll_high*8 + scroll_low);
911 	tilemap_set_scrollx(tilemap[homedata_visible_page][1],0,scroll_high*8 + scroll_low);
912 
913 	tilemap_draw(bitmap, cliprect, tilemap[homedata_visible_page][0], 0, 0);
914 	tilemap_draw(bitmap, cliprect, tilemap[homedata_visible_page][1], 0, 0);
915 }
916 
917 
VIDEO_EOF(homedata)918 VIDEO_EOF( homedata )
919 {
920 	homedata_visible_page ^= 1;
921 }
922