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