1 #include "../vidhrdw/cninja.c"
2 
3 /***************************************************************************
4 
5   Edward Randy      (c) 1990 Data East Corporation (World version)
6   Edward Randy      (c) 1990 Data East Corporation (Japanese version)
7   Caveman Ninja     (c) 1991 Data East Corporation (World version)
8   Caveman Ninja     (c) 1991 Data East Corporation (USA version)
9   Joe & Mac         (c) 1991 Data East Corporation (Japanese version)
10   Stone Age         (Italian bootleg)
11 
12   Edward Randy runs on the same board as Caveman Ninja but one custom chip
13   is different.  The chip controls protection and also seems to affect the
14   memory map.
15 
16 
17 Sound (Original):
18   Hu6280 CPU
19   YM2151 (music)
20   YM2203C (effects)
21   2 Oki ADPCM chips
22 
23 Sound (Bootleg):
24   Z80 (Program ripped from Block Out!)
25   YM2151
26   Oki chip
27 
28 Caveman Ninja Issues:
29   End of level 2 is corrupt.
30 
31   Emulation by Bryan McPhail, mish@tendril.co.uk
32 
33 ***************************************************************************/
34 
35 #include "driver.h"
36 #include "vidhrdw/generic.h"
37 #include "cpu/h6280/h6280.h"
38 #include "cpu/z80/z80.h"
39 
40 /* Video emulation definitions */
41 extern unsigned char *cninja_pf1_rowscroll,*cninja_pf2_rowscroll;
42 extern unsigned char *cninja_pf3_rowscroll,*cninja_pf4_rowscroll;
43 extern unsigned char *cninja_pf1_data,*cninja_pf2_data;
44 extern unsigned char *cninja_pf3_data,*cninja_pf4_data;
45 
46 int  cninja_vh_start(void);
47 int  edrandy_vh_start(void);
48 int  stoneage_vh_start(void);
49 void cninja_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
50 
51 READ_HANDLER( cninja_pf3_rowscroll_r );
52 READ_HANDLER( cninja_pf1_data_r );
53 
54 WRITE_HANDLER( cninja_pf1_data_w );
55 WRITE_HANDLER( cninja_pf2_data_w );
56 WRITE_HANDLER( cninja_pf3_data_w );
57 WRITE_HANDLER( cninja_pf4_data_w );
58 WRITE_HANDLER( cninja_control_0_w );
59 WRITE_HANDLER( cninja_control_1_w );
60 
61 WRITE_HANDLER( cninja_pf1_rowscroll_w );
62 WRITE_HANDLER( cninja_pf2_rowscroll_w );
63 WRITE_HANDLER( cninja_pf3_rowscroll_w );
64 WRITE_HANDLER( cninja_pf4_rowscroll_w );
65 
66 WRITE_HANDLER( cninja_palette_24bit_w );
67 
68 static int loopback[0x100];
69 static unsigned char *cninja_ram;
70 
71 /**********************************************************************************/
72 
WRITE_HANDLER(cninja_sound_w)73 static WRITE_HANDLER( cninja_sound_w )
74 {
75 	soundlatch_w(0,data&0xff);
76 	cpu_cause_interrupt(1,H6280_INT_IRQ1);
77 }
78 
WRITE_HANDLER(stoneage_sound_w)79 static WRITE_HANDLER( stoneage_sound_w )
80 {
81 	soundlatch_w(0,data&0xff);
82 	cpu_cause_interrupt(1,Z80_NMI_INT);
83 }
84 
WRITE_HANDLER(cninja_loopback_w)85 static WRITE_HANDLER( cninja_loopback_w )
86 {
87 	COMBINE_WORD_MEM(&loopback[offset],data);
88 #if 0
89 	if ((offset>0x22 || offset<0x8) && (offset>0x94 || offset<0x80)
90 && offset!=0x36 && offset!=0x9e && offset!=0x76 && offset!=0x58 && offset!=0x56
91 && offset!=0x2c && offset!=0x34
92 && (offset>0xb0 || offset<0xa0) /* in game prot writes */
93 )
94 logerror("Protection PC %06x: warning - write %04x to %04x\n",cpu_get_pc(),data,offset);
95 #endif
96 }
97 
READ_HANDLER(cninja_prot_r)98 static READ_HANDLER( cninja_prot_r )
99 {
100  	switch (offset) {
101 		case 0x80: /* Master level control */
102 			return READ_WORD(&loopback[0]);
103 
104 		case 0xde: /* Restart position control */
105 			return READ_WORD(&loopback[2]);
106 
107 		case 0xe6: /* The number of credits in the system. */
108 			return READ_WORD(&loopback[4]);
109 
110 		case 0x86: /* End of game check.  See 0x1814 */
111 			return READ_WORD(&loopback[6]);
112 
113 		/* Video registers */
114 		case 0x5a: /* Moved to 0x140000 on int */
115 			return READ_WORD(&loopback[0x10]);
116 		case 0x84: /* Moved to 0x14000a on int */
117 			return READ_WORD(&loopback[0x12]);
118 		case 0x20: /* Moved to 0x14000c on int */
119 			return READ_WORD(&loopback[0x14]);
120 		case 0x72: /* Moved to 0x14000e on int */
121 			return READ_WORD(&loopback[0x16]);
122 		case 0xdc: /* Moved to 0x150000 on int */
123 			return READ_WORD(&loopback[0x18]);
124 		case 0x6e: /* Moved to 0x15000a on int */
125 			return READ_WORD(&loopback[0x1a]); /* Not used on bootleg */
126 		case 0x6c: /* Moved to 0x15000c on int */
127 			return READ_WORD(&loopback[0x1c]);
128 		case 0x08: /* Moved to 0x15000e on int */
129 			return READ_WORD(&loopback[0x1e]);
130 
131 		case 0x36: /* Dip switches */
132 			return (readinputport(3) + (readinputport(4) << 8));
133 
134 		case 0x1c8: /* Coins */
135 			return readinputport(2);
136 
137 		case 0x22c: /* Player 1 & 2 input ports */
138 			return (readinputport(0) + (readinputport(1) << 8));
139 	}
140 	//logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",cpu_get_pc(),offset);
141 	return 0;
142 }
143 
READ_HANDLER(edrandy_prot_r)144 static READ_HANDLER( edrandy_prot_r )
145 {
146  	switch (offset) {
147 		/* Video registers */
148 		case 0x32a: /* Moved to 0x140006 on int */
149 			return READ_WORD(&loopback[0x80]);
150 		case 0x380: /* Moved to 0x140008 on int */
151 			return READ_WORD(&loopback[0x84]);
152 		case 0x63a: /* Moved to 0x150002 on int */
153 			return READ_WORD(&loopback[0x88]);
154 		case 0x42a: /* Moved to 0x150004 on int */
155 			return READ_WORD(&loopback[0x8c]);
156 		case 0x030: /* Moved to 0x150006 on int */
157 			return READ_WORD(&loopback[0x90]);
158 		case 0x6b2: /* Moved to 0x150008 on int */
159 			return READ_WORD(&loopback[0x94]);
160 
161 
162 
163 
164 case 0x6c4: /* dma enable, bit 7 set, below bit 5 */
165 case 0x33e: return READ_WORD(&loopback[0x2c]); /* allows video registers */
166 
167 
168 
169 
170 		/* memcpy selectors, transfer occurs in interrupt */
171 		case 0x32e: return READ_WORD(&loopback[0x8]); /* src msb */
172 		case 0x6d8: return READ_WORD(&loopback[0xa]); /* src lsb */
173 		case 0x010: return READ_WORD(&loopback[0xc]); /* dst msb */
174 		case 0x07a: return READ_WORD(&loopback[0xe]); /* src lsb */
175 
176 		case 0x37c: return READ_WORD(&loopback[0x10]); /* src msb */
177 		case 0x250: return READ_WORD(&loopback[0x12]);
178 		case 0x04e: return READ_WORD(&loopback[0x14]);
179 		case 0x5ba: return READ_WORD(&loopback[0x16]);
180 		case 0x5f4: return READ_WORD(&loopback[0x18]); /* length */
181 
182 		case 0x38c: return READ_WORD(&loopback[0x1a]); /* src msb */
183 		case 0x02c: return READ_WORD(&loopback[0x1c]);
184 		case 0x1e6: return READ_WORD(&loopback[0x1e]);
185 		case 0x3e4: return READ_WORD(&loopback[0x20]);
186 		case 0x174: return READ_WORD(&loopback[0x22]); /* length */
187 
188 		/* Player 1 & 2 controls, read in IRQ then written *back* to protection device */
189 		case 0x50: /* written to 9e byte */
190 			return readinputport(0);
191 		case 0x6f8: /* written to 76 byte */
192 			return readinputport(1);
193 		/* Controls are *really* read here! */
194 		case 0x6fa:
195 			return (READ_WORD(&loopback[0x9e])&0xff00) | ((READ_WORD(&loopback[0x76])>>8)&0xff);
196 		/* These two go to the low bytes of 9e and 76.. */
197 		case 0xc6: return 0;
198 		case 0x7bc: return 0;
199 		case 0x5c: /* After coin insert, high 0x8000 bit set starts game */
200 			return READ_WORD(&loopback[0x76]);
201 		case 0x3a6: /* Top byte OR'd with above, masked to 7 */
202 			return READ_WORD(&loopback[0x9e]);
203 
204 //		case 0xac: /* Dip switches */
205 
206 		case 0xc2: /* Dip switches */
207 			return (readinputport(3) + (readinputport(4) << 8));
208 		case 0x5d4: /* The state of the dips _last_ frame */
209 			return READ_WORD(&loopback[0x34]);
210 
211 		case 0x76a: /* Coins */
212 			return readinputport(2);
213 
214 
215 
216 case 0x156: /* Interrupt regulate */
217 
218 //logerror("Int stop %04x\n",READ_WORD(&loopback[0x1a]));
219 
220 cpu_spinuntil_int();
221 //return readinputport(2);
222 
223 	/* 4058 or 4056? */
224 	return READ_WORD(&loopback[0x36])>>8;
225 
226 
227 
228 
229 #if 0
230 
231 // 5d4 == 80 when coin is inserted
232 
233 // 284 == LOOKUP TABLE IMPROTANT (0 4 8 etc
234 case 0x284: return 0;
235 
236 
237 
238 case 0x2f6: /* btst 2, jsr 11a if set */
239 if (READ_WORD(&loopback[0x40])) return 0xffff;
240 return 0;//READ_WORD(&loopback[0x40]);//0;
241 
242 
243 //case 0x5d4:
244 //case 0xc2: return READ_WORD(&loopback[0x40]);//0; /* Screen flip related?! */
245 
246 
247 
248 
249 //case 0x33e:
250 //case 0x6c4:
251 //	case 0x6f8: /* Player 1 & 2 input ports */
252 
253 
254 // return value 36 is important
255 
256 
257 /*
258 
259 6006 written to 0x40 at end of japan screen
260 
261 
262 */
263 
264 
265 
266 //case 0xc2:
267 //case 0x5c: /* 9cde */
268 //case 0x5d4:
269 //return READ_WORD(&loopback[0x40]);//0;
270 
271 //case 0x6fa:
272 
273 
274 
275 
276 
277 /* in game prot */
278 case 0x102: return READ_WORD(&loopback[0xa0]);
279 case 0x15a: return READ_WORD(&loopback[0xa2]);
280 case 0x566: return READ_WORD(&loopback[0xa4]);
281 case 0xd2: return READ_WORD(&loopback[0xa6]);
282 case 0x4a6: return READ_WORD(&loopback[0xa8]);
283 case 0x3dc: return READ_WORD(&loopback[0xb0]);
284 case 0x2a0: return READ_WORD(&loopback[0xb2]);
285 //case 0x392: return READ_WORD(&loopback[0xa0]);
286 
287 
288 		case 0x3b2: return READ_WORD(&loopback[0xd0]);
289 
290 /* Enemy power related HIGH WORD*/
291 		case 0x440: return READ_WORD(&loopback[0xd2]);/* Enemy power related LOW WORD*/
292 			return 0;
293 
294 //case 0x6fa:
295 //return rand()%0xffff;
296 
297 //case 0x5d4: /* Top byte:  Player 1?  lsl.4 then mask 3 for fire buttons? */
298 //case 0x5d4:
299 
300 		return 0xffff;//(readinputport(0) + (readinputport(1) << 8));
301 #endif
302 	}
303 
304 //	logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",cpu_get_pc(),offset);
305 	return 0;
306 }
307 
308 #if 0
309 static WRITE_HANDLER( log_m_w )
310 {
311 	logerror("INTERRUPT %06x: warning - write address %04x\n",cpu_get_pc(),offset);
312 
313 }
314 #endif
315 
316 /**********************************************************************************/
317 
318 static struct MemoryReadAddress cninja_readmem[] =
319 {
320 	{ 0x000000, 0x0bffff, MRA_ROM },
321 	{ 0x144000, 0x144fff, cninja_pf1_data_r },
322 	{ 0x15c000, 0x15c7ff, cninja_pf3_rowscroll_r },
323 	{ 0x184000, 0x187fff, MRA_BANK1 },
324 	{ 0x190004, 0x190005, MRA_NOP }, /* Seemingly unused */
325 	{ 0x19c000, 0x19dfff, paletteram_word_r },
326 	{ 0x1a4000, 0x1a47ff, MRA_BANK2 }, /* Sprites */
327 	{ 0x1bc000, 0x1bcfff, cninja_prot_r }, /* Protection device */
328 	{ -1 }  /* end of table */
329 };
330 
331 static struct MemoryWriteAddress cninja_writemem[] =
332 {
333 	{ 0x000000, 0x0bffff, MWA_ROM },
334 
335 	{ 0x140000, 0x14000f, cninja_control_1_w },
336 	{ 0x144000, 0x144fff, cninja_pf1_data_w, &cninja_pf1_data },
337 	{ 0x146000, 0x146fff, cninja_pf4_data_w, &cninja_pf4_data },
338 	{ 0x14c000, 0x14c7ff, cninja_pf1_rowscroll_w, &cninja_pf1_rowscroll },
339 	{ 0x14e000, 0x14e7ff, cninja_pf4_rowscroll_w, &cninja_pf4_rowscroll },
340 
341 	{ 0x150000, 0x15000f, cninja_control_0_w },
342 	{ 0x154000, 0x154fff, cninja_pf3_data_w, &cninja_pf3_data },
343 	{ 0x156000, 0x156fff, cninja_pf2_data_w, &cninja_pf2_data },
344 	{ 0x15c000, 0x15c7ff, cninja_pf3_rowscroll_w, &cninja_pf3_rowscroll },
345 	{ 0x15e000, 0x15e7ff, cninja_pf2_rowscroll_w, &cninja_pf2_rowscroll },
346 
347 	{ 0x184000, 0x187fff, MWA_BANK1, &cninja_ram }, /* Main ram */
348 	{ 0x190000, 0x190007, MWA_NOP }, /* IRQ Ack + DMA flags? */
349 	{ 0x19c000, 0x19dfff, cninja_palette_24bit_w, &paletteram },
350 	{ 0x1a4000, 0x1a47ff, MWA_BANK2, &spriteram, &spriteram_size },
351 	{ 0x1b4000, 0x1b4001, buffer_spriteram_w }, /* DMA flag */
352 	{ 0x1bc000, 0x1bc0ff, cninja_loopback_w }, /* Protection writes */
353 	{ 0x308000, 0x308fff, MWA_NOP }, /* Bootleg only */
354 	{ -1 }  /* end of table */
355 };
356 
357 static struct MemoryReadAddress edrandy_readmem[] =
358 {
359 	{ 0x000000, 0x0fffff, MRA_ROM },
360 	{ 0x144000, 0x144fff, cninja_pf1_data_r },
361 	{ 0x15c000, 0x15c7ff, cninja_pf3_rowscroll_r },
362 	{ 0x188000, 0x189fff, paletteram_word_r },
363 	{ 0x194000, 0x197fff, MRA_BANK1 },
364 	{ 0x198000, 0x198fff, edrandy_prot_r }, /* Protection device */
365 	{ 0x1bc000, 0x1bc7ff, MRA_BANK2 }, /* Sprites */
366 	{ -1 }  /* end of table */
367 };
368 
369 static struct MemoryWriteAddress edrandy_writemem[] =
370 {
371 	{ 0x000000, 0x0fffff, MWA_ROM },
372 
373 	{ 0x140000, 0x14000f, cninja_control_1_w },
374 	{ 0x144000, 0x144fff, cninja_pf1_data_w, &cninja_pf1_data },
375 	{ 0x146000, 0x146fff, cninja_pf4_data_w, &cninja_pf4_data },
376 	{ 0x14c000, 0x14c7ff, cninja_pf1_rowscroll_w, &cninja_pf1_rowscroll },
377 	{ 0x14e000, 0x14e7ff, cninja_pf4_rowscroll_w, &cninja_pf4_rowscroll },
378 
379 	{ 0x150000, 0x15000f, cninja_control_0_w },
380 	{ 0x154000, 0x154fff, cninja_pf3_data_w, &cninja_pf3_data },
381 	{ 0x156000, 0x156fff, cninja_pf2_data_w, &cninja_pf2_data },
382 	{ 0x15c000, 0x15c7ff, cninja_pf3_rowscroll_w, &cninja_pf3_rowscroll },
383 	{ 0x15e000, 0x15e7ff, cninja_pf2_rowscroll_w, &cninja_pf2_rowscroll },
384 
385 	{ 0x188000, 0x189fff, cninja_palette_24bit_w, &paletteram },
386 	{ 0x194000, 0x197fff, MWA_BANK1, &cninja_ram }, /* Main ram */
387 	{ 0x198064, 0x198065, cninja_sound_w }, /* Soundlatch is amongst protection */
388 	{ 0x198000, 0x1980ff, cninja_loopback_w }, /* Protection writes */
389 	{ 0x1a4000, 0x1a4007, MWA_NOP }, /* IRQ Ack + DMA flags? */
390 	{ 0x1ac000, 0x1ac001, buffer_spriteram_w }, /* DMA flag */
391 	{ 0x1bc000, 0x1bc7ff, MWA_BANK2, &spriteram, &spriteram_size },
392 	{ -1 }  /* end of table */
393 };
394 
395 /******************************************************************************/
396 
WRITE_HANDLER(YM2151_w)397 static WRITE_HANDLER( YM2151_w )
398 {
399 	switch (offset) {
400 	case 0:
401 		YM2151_register_port_0_w(0,data);
402 		break;
403 	case 1:
404 		YM2151_data_port_0_w(0,data);
405 		break;
406 	}
407 }
408 
WRITE_HANDLER(YM2203_w)409 static WRITE_HANDLER( YM2203_w )
410 {
411 	switch (offset) {
412 	case 0:
413 		YM2203_control_port_0_w(0,data);
414 		break;
415 	case 1:
416 		YM2203_write_port_0_w(0,data);
417 		break;
418 	}
419 }
420 
421 static struct MemoryReadAddress sound_readmem[] =
422 {
423 	{ 0x000000, 0x00ffff, MRA_ROM },
424 	{ 0x100000, 0x100001, YM2203_status_port_0_r },
425 	{ 0x110000, 0x110001, YM2151_status_port_0_r },
426 	{ 0x120000, 0x120001, OKIM6295_status_0_r },
427 	{ 0x130000, 0x130001, OKIM6295_status_1_r },
428 	{ 0x140000, 0x140001, soundlatch_r },
429 	{ 0x1f0000, 0x1f1fff, MRA_BANK8 },
430 	{ -1 }  /* end of table */
431 };
432 
433 static struct MemoryWriteAddress sound_writemem[] =
434 {
435 	{ 0x000000, 0x00ffff, MWA_ROM },
436 	{ 0x100000, 0x100001, YM2203_w },
437 	{ 0x110000, 0x110001, YM2151_w },
438 	{ 0x120000, 0x120001, OKIM6295_data_0_w },
439 	{ 0x130000, 0x130001, OKIM6295_data_1_w },
440 	{ 0x1f0000, 0x1f1fff, MWA_BANK8 },
441 	{ 0x1fec00, 0x1fec01, H6280_timer_w },
442 	{ 0x1ff402, 0x1ff403, H6280_irq_status_w },
443     { -1 }  /* end of table */
444 };
445 
446 static struct MemoryReadAddress stoneage_s_readmem[] =
447 {
448 	{ 0x0000, 0x7fff, MRA_ROM },
449 	{ 0x8000, 0x87ff, MRA_RAM },
450 	{ 0x8801, 0x8801, YM2151_status_port_0_r },
451 	{ 0xa000, 0xa000, soundlatch_r },
452 	{ 0x9800, 0x9800, OKIM6295_status_0_r },
453 	{ -1 }  /* end of table */
454 };
455 
456 static struct MemoryWriteAddress stoneage_s_writemem[] =
457 {
458 	{ 0x0000, 0x7fff, MWA_ROM },
459 	{ 0x8000, 0x87ff, MWA_RAM },
460 	{ 0x8800, 0x8800, YM2151_register_port_0_w },
461 	{ 0x8801, 0x8801, YM2151_data_port_0_w },
462 	{ 0x9800, 0x9800, OKIM6295_data_0_w },
463 	{ -1 }  /* end of table */
464 };
465 
466 /**********************************************************************************/
467 
468 #define PORTS_COINS \
469 	PORT_START \
470 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY ) \
471 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY ) \
472 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY ) \
473 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) \
474 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) \
475 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) \
476 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) \
477 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) \
478 	PORT_START \
479 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 ) \
480 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 ) \
481 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 ) \
482 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 ) \
483 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) \
484 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) \
485 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) \
486 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) \
487 	PORT_START \
488 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) \
489 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) \
490 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) \
491 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VBLANK ) \
492 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN )
493 
494 INPUT_PORTS_START( cninja )
495 
496 	PORTS_COINS
497 
498 	PORT_START	/* Dip switch bank 1 */
499 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
500 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
501 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
502 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
503 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
504 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
505 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
506 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_5C ) )
507 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_6C ) )
508 	PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) )
509 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
510 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
511 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
512 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
513 	PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
514 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
515 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_5C ) )
516 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_6C ) )
517 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
518 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
519 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
520 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
521 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
522 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
523 
524 	PORT_START	/* Dip switch bank 2 */
525 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
526 	PORT_DIPSETTING(    0x01, "1" )
527 	PORT_DIPSETTING(    0x00, "2" )
528 	PORT_DIPSETTING(    0x03, "3" )
529 	PORT_DIPSETTING(    0x02, "4" )
530 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
531 	PORT_DIPSETTING(    0x08, "Easy" )
532 	PORT_DIPSETTING(    0x0c, "Normal" )
533 	PORT_DIPSETTING(    0x04, "Hard" )
534 	PORT_DIPSETTING(    0x00, "Hardest" )
535 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
536 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
537 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
538 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
539 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
540 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
541 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
542 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
543 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
544 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
545 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
546 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
547 INPUT_PORTS_END
548 
549 INPUT_PORTS_START( cninjau )
550 
551 	PORTS_COINS
552 
553 	PORT_START	/* Dip switch bank 1 */
554 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
555 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
556 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
557 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
558 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
559 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
560 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
561 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_5C ) )
562 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_6C ) )
563 	PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) )
564 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
565 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
566 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
567 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
568 	PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
569 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
570 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_5C ) )
571 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_6C ) )
572 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
573 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
574 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
575 	PORT_DIPNAME( 0x80, 0x80, "Credit(s) to Start" )
576 	PORT_DIPSETTING(    0x80, "1" )
577 	PORT_DIPSETTING(    0x00, "2" )
578 /* Also, if Coin A and B are on 1/1, 0x00 gives 2 to start, 1 to continue */
579 
580 	PORT_START	/* Dip switch bank 2 */
581 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
582 	PORT_DIPSETTING(    0x01, "1" )
583 	PORT_DIPSETTING(    0x00, "2" )
584 	PORT_DIPSETTING(    0x03, "3" )
585 	PORT_DIPSETTING(    0x02, "4" )
586 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
587 	PORT_DIPSETTING(    0x08, "Easy" )
588 	PORT_DIPSETTING(    0x0c, "Normal" )
589 	PORT_DIPSETTING(    0x04, "Hard" )
590 	PORT_DIPSETTING(    0x00, "Hardest" )
591 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
592 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
593 	PORT_DIPSETTING(    0x10, DEF_STR( On ) )
594 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
595 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
596 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
597 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
598 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
599 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
600 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
601 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
602 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
603 INPUT_PORTS_END
604 
605 /**********************************************************************************/
606 
607 static struct GfxLayout charlayout =
608 {
609 	8,8,	/* 8*8 chars */
610 	4096,
611 	4,		/* 4 bits per pixel  */
612 	{ 0x08000*8, 0x18000*8, 0x00000*8, 0x10000*8 },
613 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
614 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
615 	8*8	/* every char takes 8 consecutive bytes */
616 };
617 
618 static struct GfxLayout spritelayout =
619 {
620 	16,16,
621 	0x4000,  /* A lotta sprites.. */
622 	4,
623 	{ 8, 0, 0x100000*8+8, 0x100000*8 },
624 	{ 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7,
625 		0, 1, 2, 3, 4, 5, 6, 7 },
626 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
627 			8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
628 	64*8
629 };
630 
631 static struct GfxLayout spritelayout2 =
632 {
633 	16,16,
634 	0xa000,  /* A lotta sprites.. */
635 	4,
636 	{ 8, 0, 0x280000*8+8, 0x280000*8 },
637 	{ 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7,
638 		0, 1, 2, 3, 4, 5, 6, 7 },
639 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
640 			8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
641 	64*8
642 };
643 
644 static struct GfxLayout tilelayout =
645 {
646 	16,16,
647 	4096,
648 	4,
649 	{ 0x40000*8+8, 0x40000*8, 8, 0,  },
650 	{ 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7,
651 		0, 1, 2, 3, 4, 5, 6, 7 },
652 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
653 			8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
654 	64*8
655 };
656 
657 /* Areas 1536-2048 & 1024-1280 seem to be always empty */
658 static struct GfxDecodeInfo gfxdecodeinfo[] =
659 {
660 	{ REGION_GFX1, 0, &charlayout,    0, 16 },	/* Characters 8x8 */
661 	{ REGION_GFX2, 0, &tilelayout,  512, 64 },	/* Tiles 16x16 (BASE 1280) */
662 	{ REGION_GFX3, 0, &tilelayout,  512, 64 },	/* Tiles 16x16 */
663 	{ REGION_GFX4, 0, &tilelayout,  256, 16 },	/* Tiles 16x16 */
664 	{ REGION_GFX5, 0, &spritelayout,768, 16 },	/* Sprites 16x16 */
665 	{ -1 } /* end of array */
666 };
667 
668 static struct GfxDecodeInfo gfxdecodeinfo2[] =
669 {
670 	{ REGION_GFX1, 0, &charlayout,     0, 16 },	/* Characters 8x8 */
671 	{ REGION_GFX2, 0, &tilelayout,   512, 64 },	/* Tiles 16x16 (BASE 1280) */
672 	{ REGION_GFX3, 0, &tilelayout,   512, 64 },	/* Tiles 16x16 */
673 	{ REGION_GFX4, 0, &tilelayout,   256, 16 },	/* Tiles 16x16 */
674 	{ REGION_GFX5, 0, &spritelayout2,768, 16 },	/* Sprites 16x16 */
675 	{ -1 } /* end of array */
676 };
677 
678 /**********************************************************************************/
679 
680 static struct YM2203interface ym2203_interface =
681 {
682 	1,
683 	32220000/8,	/* Accurate, audio section crystal is 32.220 MHz */
684 	{ YM2203_VOL(40,40) },
685 	{ 0 },
686 	{ 0 },
687 	{ 0 },
688 	{ 0 }
689 };
690 
sound_irq(int state)691 static void sound_irq(int state)
692 {
693 	cpu_set_irq_line(1,1,state); /* IRQ 2 */
694 }
695 
sound_irq2(int state)696 static void sound_irq2(int state)
697 {
698 	cpu_set_irq_line(1,0,state);
699 }
700 
WRITE_HANDLER(sound_bankswitch_w)701 static WRITE_HANDLER( sound_bankswitch_w )
702 {
703 	/* the second OKIM6295 ROM is bank switched */
704 	OKIM6295_set_bank_base(1, ALL_VOICES, (data & 1) * 0x40000);
705 }
706 
707 static struct YM2151interface ym2151_interface =
708 {
709 	1,
710 	32220000/9, /* Accurate, audio section crystal is 32.220 MHz */
711 	{ YM3012_VOL(45,MIXER_PAN_LEFT,45,MIXER_PAN_RIGHT) },
712 	{ sound_irq },
713 	{ sound_bankswitch_w }
714 };
715 
716 static struct YM2151interface ym2151_interface2 =
717 {
718 	1,
719 	3579545,	/* 3.579545 Mhz (?) */
720 	{ YM3012_VOL(50,MIXER_PAN_CENTER,50,MIXER_PAN_CENTER) },
721 	{ sound_irq2 }
722 };
723 
724 static struct OKIM6295interface okim6295_interface =
725 {
726 	2,              /* 2 chips */
727 	{ 7757, 15514 },/* Frequency */
728 	{ REGION_SOUND1, REGION_SOUND2 },       /* memory regions 3 & 4 */
729 	{ 50, 25 }		/* Note!  Keep chip 1 (voices) louder than chip 2 */
730 };
731 
732 /**********************************************************************************/
733 
734 static struct MachineDriver machine_driver_cninja =
735 {
736 	/* basic machine hardware */
737 	{
738 		{
739 			CPU_M68000,
740 			12000000,
741 			cninja_readmem,cninja_writemem,0,0,
742 			m68_level5_irq,1
743 		},
744 		{
745 			CPU_H6280 | CPU_AUDIO_CPU,
746 			32220000/8,	/* Accurate */
747 			sound_readmem,sound_writemem,0,0,
748 			ignore_interrupt,0
749 		}
750 	},
751 	58, 529,
752 	1,	/* 1 CPU slice per frame - interleaving is forced when a sound command is written */
753 	0,
754 
755 	/* video hardware */
756 	32*8, 32*8, { 0*8, 32*8-1, 1*8, 31*8-1 },
757 
758 	gfxdecodeinfo,
759 	2048, 2048,
760 	0,
761 
762 	VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE | VIDEO_UPDATE_BEFORE_VBLANK | VIDEO_BUFFERS_SPRITERAM,
763 	0,
764 	cninja_vh_start,
765 	0,
766 	cninja_vh_screenrefresh,
767 
768 	/* sound hardware */
769 	0,0,0,0, /* Mono */
770   	{
771 		{
772 			SOUND_YM2203,
773 			&ym2203_interface
774 		},
775 		{
776 			SOUND_YM2151,
777 			&ym2151_interface
778 		},
779 		{
780 			SOUND_OKIM6295,
781 			&okim6295_interface
782 		}
783 	}
784 };
785 
786 static struct MachineDriver machine_driver_stoneage =
787 {
788 	/* basic machine hardware */
789 	{
790 		{
791 			CPU_M68000,
792 			12000000,
793 			cninja_readmem,cninja_writemem,0,0,
794 			m68_level5_irq,1
795 		},
796 		{
797 			CPU_Z80 | CPU_AUDIO_CPU,
798 			3579545,
799 			stoneage_s_readmem,stoneage_s_writemem,0,0,
800 			ignore_interrupt,0
801 		}
802 	},
803 	58, 529,
804 	1,	/* 1 CPU slice per frame - interleaving is forced when a sound command is written */
805 	0,
806 
807 	/* video hardware */
808 	32*8, 32*8, { 0*8, 32*8-1, 1*8, 31*8-1 },
809 
810 	gfxdecodeinfo,
811 	2048, 2048,
812 	0,
813 
814 	VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE | VIDEO_UPDATE_BEFORE_VBLANK | VIDEO_BUFFERS_SPRITERAM,
815 	0,
816 	stoneage_vh_start,
817 	0,
818 	cninja_vh_screenrefresh,
819 
820 	/* sound hardware */
821 	0,0,0,0, /* Mono */
822 	{
823 		{
824 			SOUND_YM2151,
825 			&ym2151_interface2
826 		},
827 		{
828 			SOUND_OKIM6295,
829 			&okim6295_interface
830 		}
831 	}
832 };
833 
834 static struct MachineDriver machine_driver_edrandy =
835 {
836 	/* basic machine hardware */
837 	{
838 		{
839 			CPU_M68000,
840 			12000000,
841 			edrandy_readmem,edrandy_writemem,0,0,
842 			m68_level5_irq,1
843 		},
844 		{
845 			CPU_H6280 | CPU_AUDIO_CPU,
846 			32220000/8,	/* Accurate */
847 			sound_readmem,sound_writemem,0,0,
848 			ignore_interrupt,0
849 		}
850 	},
851 	58, 529,
852 	1,	/* 1 CPU slice per frame - interleaving is forced when a sound command is written */
853 	0,
854 
855 	/* video hardware */
856 	32*8, 32*8, { 0*8, 32*8-1, 1*8, 31*8-1 },
857 
858 	gfxdecodeinfo2,
859 	2048, 2048,
860 	0,
861 
862 	VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE | VIDEO_UPDATE_BEFORE_VBLANK | VIDEO_BUFFERS_SPRITERAM,
863 	0,
864 	edrandy_vh_start,
865 	0,
866 	cninja_vh_screenrefresh,
867 
868 	/* sound hardware */
869 	0,0,0,0, /* Mono */
870   	{
871 		{
872 			SOUND_YM2203,
873 			&ym2203_interface
874 		},
875 		{
876 			SOUND_YM2151,
877 			&ym2151_interface
878 		},
879 		{
880 			SOUND_OKIM6295,
881 			&okim6295_interface
882 		}
883 	}
884 };
885 
886 /**********************************************************************************/
887 
888 ROM_START( cninja )
889 	ROM_REGION( 0xc0000, REGION_CPU1 ) /* 68000 code */
890 	ROM_LOAD_EVEN( "gn02rev3.bin", 0x00000, 0x20000, 0x39aea12a )
891 	ROM_LOAD_ODD ( "gn05rev2.bin", 0x00000, 0x20000, 0x0f4360ef )
892 	ROM_LOAD_EVEN( "gn01rev2.bin", 0x40000, 0x20000, 0xf740ef7e )
893 	ROM_LOAD_ODD ( "gn04rev2.bin", 0x40000, 0x20000, 0xc98fcb62 )
894 	ROM_LOAD_EVEN( "gn-00.rom",    0x80000, 0x20000, 0x0b110b16 )
895 	ROM_LOAD_ODD ( "gn-03.rom",    0x80000, 0x20000, 0x1e28e697 )
896 
897 	ROM_REGION( 0x10000, REGION_CPU2 ) /* Sound CPU */
898 	ROM_LOAD( "gl-07.rom",  0x00000,  0x10000,  0xca8bef96 )
899 
900 	ROM_REGION( 0x020000, REGION_GFX1 | REGIONFLAG_DISPOSE )
901 	ROM_LOAD( "gl-08.rom",  0x00000,  0x10000,  0x33a2b400 )	/* chars */
902 	ROM_LOAD( "gl-09.rom",  0x10000,  0x10000,  0x5a2d4752 )
903 
904 	ROM_REGION( 0x080000, REGION_GFX2 | REGIONFLAG_DISPOSE )
905 	ROM_LOAD( "mag-00.rom", 0x000000, 0x80000,  0xa8f05d33 )	/* tiles 1 */
906 
907 	ROM_REGION( 0x080000, REGION_GFX3 | REGIONFLAG_DISPOSE )
908 	ROM_LOAD( "mag-01.rom", 0x000000, 0x80000,  0x5b399eed )	/* tiles 2 */
909 
910 	ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
911 	ROM_LOAD( "mag-02.rom", 0x000000, 0x80000,  0xde89c69a )	/* tiles 3 */
912 
913 	ROM_REGION( 0x200000, REGION_GFX5 | REGIONFLAG_DISPOSE )
914 	ROM_LOAD( "mag-03.rom", 0x000000, 0x80000,  0x2220eb9f )	/* sprites */
915 	ROM_LOAD( "mag-04.rom", 0x080000, 0x80000,  0x144b94cc )
916 	ROM_LOAD( "mag-05.rom", 0x100000, 0x80000,  0x56a53254 )
917 	ROM_LOAD( "mag-06.rom", 0x180000, 0x80000,  0x82d44749 )
918 
919 	ROM_REGION( 0x20000, REGION_SOUND1 ) /* Oki samples */
920 	ROM_LOAD( "gl-06.rom",  0x00000,  0x20000,  0xd92e519d )
921 
922 	ROM_REGION( 0x80000, REGION_SOUND2 ) /* Extra Oki samples */
923 	ROM_LOAD( "mag-07.rom", 0x00000,  0x80000,  0x08eb5264 )	/* banked */
924 ROM_END
925 
ROM_START(cninja0)926 ROM_START( cninja0 )
927 	ROM_REGION( 0xc0000, REGION_CPU1 ) /* 68000 code */
928 	ROM_LOAD_EVEN( "gn-02.rom", 0x00000, 0x20000, 0xccc59524 )
929 	ROM_LOAD_ODD ( "gn-05.rom", 0x00000, 0x20000, 0xa002cbe4 )
930 	ROM_LOAD_EVEN( "gn-01.rom", 0x40000, 0x20000, 0x18f0527c )
931 	ROM_LOAD_ODD ( "gn-04.rom", 0x40000, 0x20000, 0xea4b6d53 )
932 	ROM_LOAD_EVEN( "gn-00.rom", 0x80000, 0x20000, 0x0b110b16 )
933 	ROM_LOAD_ODD ( "gn-03.rom", 0x80000, 0x20000, 0x1e28e697 )
934 
935 	ROM_REGION( 0x10000, REGION_CPU2 ) /* Sound CPU */
936 	ROM_LOAD( "gl-07.rom",  0x00000,  0x10000,  0xca8bef96 )
937 
938 	ROM_REGION( 0x020000, REGION_GFX1 | REGIONFLAG_DISPOSE )
939 	ROM_LOAD( "gl-08.rom",  0x00000,  0x10000,  0x33a2b400 )	/* chars */
940 	ROM_LOAD( "gl-09.rom",  0x10000,  0x10000,  0x5a2d4752 )
941 
942 	ROM_REGION( 0x080000, REGION_GFX2 | REGIONFLAG_DISPOSE )
943 	ROM_LOAD( "mag-00.rom", 0x000000, 0x80000,  0xa8f05d33 )	/* tiles 1 */
944 
945 	ROM_REGION( 0x080000, REGION_GFX3 | REGIONFLAG_DISPOSE )
946 	ROM_LOAD( "mag-01.rom", 0x000000, 0x80000,  0x5b399eed )	/* tiles 2 */
947 
948 	ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
949 	ROM_LOAD( "mag-02.rom", 0x000000, 0x80000,  0xde89c69a )	/* tiles 3 */
950 
951 	ROM_REGION( 0x200000, REGION_GFX5 | REGIONFLAG_DISPOSE )
952 	ROM_LOAD( "mag-03.rom", 0x000000, 0x80000,  0x2220eb9f )	/* sprites */
953 	ROM_LOAD( "mag-04.rom", 0x080000, 0x80000,  0x144b94cc )
954 	ROM_LOAD( "mag-05.rom", 0x100000, 0x80000,  0x56a53254 )
955 	ROM_LOAD( "mag-06.rom", 0x180000, 0x80000,  0x82d44749 )
956 
957 	ROM_REGION( 0x20000, REGION_SOUND1 ) /* Oki samples */
958 	ROM_LOAD( "gl-06.rom",  0x00000,  0x20000,  0xd92e519d )
959 
960 	ROM_REGION( 0x80000, REGION_SOUND2 ) /* Extra Oki samples */
961 	ROM_LOAD( "mag-07.rom", 0x00000,  0x80000,  0x08eb5264 )	/* banked */
962 ROM_END
963 
964 ROM_START( cninjau )
965 	ROM_REGION( 0xc0000, REGION_CPU1 ) /* 68000 code */
966 	ROM_LOAD_EVEN( "gm02-3.1k", 0x00000, 0x20000, 0xd931c3b1 )
967 	ROM_LOAD_ODD ( "gm05-2.3k", 0x00000, 0x20000, 0x7417d3fb )
968 	ROM_LOAD_EVEN( "gm01-2.1j", 0x40000, 0x20000, 0x72041f7e )
969 	ROM_LOAD_ODD ( "gm04-2.3j", 0x40000, 0x20000, 0x2104d005 )
970 	ROM_LOAD_EVEN( "gn-00.rom", 0x80000, 0x20000, 0x0b110b16 )
971 	ROM_LOAD_ODD ( "gn-03.rom", 0x80000, 0x20000, 0x1e28e697 )
972 
973 	ROM_REGION( 0x10000, REGION_CPU2 ) /* Sound CPU */
974 	ROM_LOAD( "gl-07.rom",  0x00000,  0x10000,  0xca8bef96 )
975 
976 	ROM_REGION( 0x020000, REGION_GFX1 | REGIONFLAG_DISPOSE )
977 	ROM_LOAD( "gl-08.rom",  0x00000,  0x10000,  0x33a2b400 )	/* chars */
978 	ROM_LOAD( "gl-09.rom",  0x10000,  0x10000,  0x5a2d4752 )
979 
980 	ROM_REGION( 0x080000, REGION_GFX2 | REGIONFLAG_DISPOSE )
981 	ROM_LOAD( "mag-00.rom", 0x000000, 0x80000,  0xa8f05d33 )	/* tiles 1 */
982 
983 	ROM_REGION( 0x080000, REGION_GFX3 | REGIONFLAG_DISPOSE )
984 	ROM_LOAD( "mag-01.rom", 0x000000, 0x80000,  0x5b399eed )	/* tiles 2 */
985 
986 	ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
987 	ROM_LOAD( "mag-02.rom", 0x000000, 0x80000,  0xde89c69a )	/* tiles 3 */
988 
989 	ROM_REGION( 0x200000, REGION_GFX5 | REGIONFLAG_DISPOSE )
990 	ROM_LOAD( "mag-03.rom", 0x000000, 0x80000,  0x2220eb9f )	/* sprites */
991 	ROM_LOAD( "mag-04.rom", 0x080000, 0x80000,  0x144b94cc )
992 	ROM_LOAD( "mag-05.rom", 0x100000, 0x80000,  0x56a53254 )
993 	ROM_LOAD( "mag-06.rom", 0x180000, 0x80000,  0x82d44749 )
994 
995 	ROM_REGION( 0x20000, REGION_SOUND1 ) /* Oki samples */
996 	ROM_LOAD( "gl-06.rom",  0x00000,  0x20000,  0xd92e519d )
997 
998 	ROM_REGION( 0x80000, REGION_SOUND2 ) /* Extra Oki samples */
999 	ROM_LOAD( "mag-07.rom", 0x00000,  0x80000,  0x08eb5264 )	/* banked */
1000 ROM_END
1001 
1002 ROM_START( joemac )
1003 	ROM_REGION( 0xc0000, REGION_CPU1 ) /* 68000 code */
1004 	ROM_LOAD_EVEN( "gl02-2.k1", 0x00000, 0x20000,  0x80da12e2 )
1005 	ROM_LOAD_ODD ( "gl05-2.k3", 0x00000, 0x20000,  0xfe4dbbbb )
1006 	ROM_LOAD_EVEN( "gl01-2.j1", 0x40000, 0x20000,  0x0b245307 )
1007 	ROM_LOAD_ODD ( "gl04-2.j3", 0x40000, 0x20000,  0x1b331f61 )
1008 	ROM_LOAD_EVEN( "gn-00.rom", 0x80000, 0x20000,  0x0b110b16 )
1009 	ROM_LOAD_ODD ( "gn-03.rom", 0x80000, 0x20000,  0x1e28e697 )
1010 
1011 	ROM_REGION( 0x10000, REGION_CPU2 ) /* Sound CPU */
1012 	ROM_LOAD( "gl-07.rom",  0x00000,  0x10000,  0xca8bef96 )
1013 
1014 	ROM_REGION( 0x020000, REGION_GFX1 | REGIONFLAG_DISPOSE )
1015 	ROM_LOAD( "gl-08.rom",  0x00000,  0x10000,  0x33a2b400 )	/* chars */
1016 	ROM_LOAD( "gl-09.rom",  0x10000,  0x10000,  0x5a2d4752 )
1017 
1018 	ROM_REGION( 0x080000, REGION_GFX2 | REGIONFLAG_DISPOSE )
1019 	ROM_LOAD( "mag-00.rom", 0x000000, 0x80000,  0xa8f05d33 )	/* tiles 1 */
1020 
1021 	ROM_REGION( 0x080000, REGION_GFX3 | REGIONFLAG_DISPOSE )
1022 	ROM_LOAD( "mag-01.rom", 0x000000, 0x80000,  0x5b399eed )	/* tiles 2 */
1023 
1024 	ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
1025 	ROM_LOAD( "mag-02.rom", 0x000000, 0x80000,  0xde89c69a )	/* tiles 3 */
1026 
1027 	ROM_REGION( 0x200000, REGION_GFX5 | REGIONFLAG_DISPOSE )
1028 	ROM_LOAD( "mag-03.rom", 0x000000, 0x80000,  0x2220eb9f )	/* sprites */
1029 	ROM_LOAD( "mag-04.rom", 0x080000, 0x80000,  0x144b94cc )
1030 	ROM_LOAD( "mag-05.rom", 0x100000, 0x80000,  0x56a53254 )
1031 	ROM_LOAD( "mag-06.rom", 0x180000, 0x80000,  0x82d44749 )
1032 
1033 	ROM_REGION( 0x20000, REGION_SOUND1 ) /* Oki samples */
1034 	ROM_LOAD( "gl-06.rom",  0x00000,  0x20000,  0xd92e519d )
1035 
1036 	ROM_REGION( 0x80000, REGION_SOUND2 ) /* Extra Oki samples */
1037 	ROM_LOAD( "mag-07.rom", 0x00000,  0x80000,  0x08eb5264 )	/* banked */
1038 ROM_END
1039 
1040 ROM_START( stoneage )
1041 	ROM_REGION( 0xc0000, REGION_CPU1 ) /* 68000 code */
1042 	ROM_LOAD_EVEN( "sa_1_019.bin", 0x00000, 0x20000,  0x7fb8c44f )
1043 	ROM_LOAD_ODD ( "sa_1_033.bin", 0x00000, 0x20000,  0x961c752b )
1044 	ROM_LOAD_EVEN( "sa_1_018.bin", 0x40000, 0x20000,  0xa4043022 )
1045 	ROM_LOAD_ODD ( "sa_1_032.bin", 0x40000, 0x20000,  0xf52a3286 )
1046 	ROM_LOAD_EVEN( "sa_1_017.bin", 0x80000, 0x20000,  0x08d6397a )
1047 	ROM_LOAD_ODD ( "sa_1_031.bin", 0x80000, 0x20000,  0x103079f5 )
1048 
1049 	ROM_REGION( 0x10000, REGION_CPU2 ) /* Sound CPU */
1050 	ROM_LOAD( "sa_1_012.bin",  0x00000,  0x10000, 0x56058934 )
1051 
1052 	ROM_REGION( 0x020000, REGION_GFX1 | REGIONFLAG_DISPOSE )
1053 	ROM_LOAD( "gl-08.rom",  0x00000,  0x10000,  0x33a2b400 )	/* chars */
1054 	ROM_LOAD( "gl-09.rom",  0x10000,  0x10000,  0x5a2d4752 )
1055 
1056 	/* The bootleg graphics are stored in a different arrangement but
1057 		seem to be the same as the original set */
1058 
1059 	ROM_REGION( 0x080000, REGION_GFX2 | REGIONFLAG_DISPOSE )
1060 	ROM_LOAD( "mag-00.rom", 0x000000, 0x80000,  0xa8f05d33 )	/* tiles 1 */
1061 
1062 	ROM_REGION( 0x080000, REGION_GFX3 | REGIONFLAG_DISPOSE )
1063 	ROM_LOAD( "mag-01.rom", 0x000000, 0x80000,  0x5b399eed )	/* tiles 2 */
1064 
1065 	ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
1066 	ROM_LOAD( "mag-02.rom", 0x000000, 0x80000,  0xde89c69a )	/* tiles 3 */
1067 
1068 	ROM_REGION( 0x200000, REGION_GFX5 | REGIONFLAG_DISPOSE )
1069 	ROM_LOAD( "mag-03.rom", 0x000000, 0x80000,  0x2220eb9f )	/* sprites */
1070 	ROM_LOAD( "mag-04.rom", 0x080000, 0x80000,  0x144b94cc )
1071 	ROM_LOAD( "mag-05.rom", 0x100000, 0x80000,  0x56a53254 )
1072 	ROM_LOAD( "mag-06.rom", 0x180000, 0x80000,  0x82d44749 )
1073 
1074 	ROM_REGION( 0x40000, REGION_SOUND1 ) /* Oki samples */
1075 	ROM_LOAD( "sa_1_069.bin",  0x00000,  0x40000, 0x2188f3ca )
1076 
1077 	/* No extra Oki samples in the bootleg */
1078 ROM_END
1079 
1080 ROM_START( edrandy )
1081 	ROM_REGION( 0x100000, REGION_CPU1 ) /* 68000 code */
1082   	ROM_LOAD_EVEN( "gg-00-2", 0x00000, 0x20000, 0xce1ba964 )
1083   	ROM_LOAD_ODD ( "gg-04-2", 0x00000, 0x20000, 0x24caed19 )
1084 	ROM_LOAD_EVEN( "gg-01-2", 0x40000, 0x20000, 0x33677b80 )
1085  	ROM_LOAD_ODD ( "gg-05-2", 0x40000, 0x20000, 0x79a68ca6 )
1086 	ROM_LOAD_EVEN( "ge-02",   0x80000, 0x20000, 0xc2969fbb )
1087 	ROM_LOAD_ODD ( "ge-06",   0x80000, 0x20000, 0x5c2e6418 )
1088 	ROM_LOAD_EVEN( "ge-03",   0xc0000, 0x20000, 0x5e7b19a8 )
1089 	ROM_LOAD_ODD ( "ge-07",   0xc0000, 0x20000, 0x5eb819a1 )
1090 
1091 	ROM_REGION( 0x10000, REGION_CPU2 )	/* Sound CPU */
1092 	ROM_LOAD( "ge-09",    0x00000, 0x10000, 0x9f94c60b )
1093 
1094 	ROM_REGION( 0x020000, REGION_GFX1 | REGIONFLAG_DISPOSE )
1095 	ROM_LOAD( "gg-11",    0x000000, 0x10000, 0xee567448 )
1096   	ROM_LOAD( "gg-10",    0x010000, 0x10000, 0xb96c6cbe )
1097 
1098 	ROM_REGION( 0x080000, REGION_GFX2 | REGIONFLAG_DISPOSE )
1099 	ROM_LOAD( "mad-00",   0x000000, 0x80000, 0x3735b22d ) /* tiles 1 */
1100 
1101 	ROM_REGION( 0x080000, REGION_GFX3 | REGIONFLAG_DISPOSE )
1102 	ROM_LOAD( "mad-01",   0x000000, 0x80000, 0x7bb13e1c ) /* tiles 2 */
1103 
1104 	ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
1105 	ROM_LOAD( "mad-02",   0x000000, 0x80000, 0x6c76face ) /* tiles 3 */
1106 
1107 	ROM_REGION( 0x500000, REGION_GFX5 | REGIONFLAG_DISPOSE )
1108 	ROM_LOAD( "mad-03",   0x000000, 0x80000, 0xc0bff892 ) /* sprites */
1109 	ROM_LOAD( "mad-04",   0x080000, 0x80000, 0x464f3eb9 )
1110 	ROM_LOAD( "mad-07",   0x100000, 0x80000, 0xac03466e )
1111 	ROM_LOAD( "mad-10",   0x180000, 0x80000, 0x42da8ef0 )
1112 	ROM_LOAD( "mad-09",   0x200000, 0x80000, 0x930f4900 )
1113 	ROM_LOAD( "mad-05",   0x280000, 0x80000, 0x3f2ccf95 )
1114 	ROM_LOAD( "mad-06",   0x300000, 0x80000, 0x60871f77 )
1115 	ROM_LOAD( "mad-08",   0x380000, 0x80000, 0x1b420ec8 )
1116 	ROM_LOAD( "mad-11",   0x400000, 0x80000, 0x03c1f982 )
1117 	ROM_LOAD( "mad-12",   0x480000, 0x80000, 0xa0bd62b6 )
1118 
1119 	ROM_REGION( 0x20000, REGION_SOUND1 )	/* ADPCM samples */
1120 	ROM_LOAD( "ge-08",    0x00000, 0x20000, 0xdfe28c7b )
1121 
1122 	ROM_REGION( 0x80000, REGION_SOUND2 ) /* Extra Oki samples */
1123 	ROM_LOAD( "mad-13", 0x00000, 0x80000, 0x6ab28eba )	/* banked */
1124 ROM_END
1125 
1126 ROM_START( edrandyj )
1127 	ROM_REGION( 0x100000, REGION_CPU1 ) /* 68000 code */
1128   	ROM_LOAD_EVEN( "ge-00-2",   0x00000, 0x20000, 0xb3d2403c )
1129   	ROM_LOAD_ODD ( "ge-04-2",   0x00000, 0x20000, 0x8a9624d6 )
1130 	ROM_LOAD_EVEN( "ge-01-2",   0x40000, 0x20000, 0x84360123 )
1131  	ROM_LOAD_ODD ( "ge-05-2",   0x40000, 0x20000, 0x0bf85d9d )
1132 	ROM_LOAD_EVEN( "ge-02",     0x80000, 0x20000, 0xc2969fbb )
1133 	ROM_LOAD_ODD ( "ge-06",     0x80000, 0x20000, 0x5c2e6418 )
1134 	ROM_LOAD_EVEN( "ge-03",     0xc0000, 0x20000, 0x5e7b19a8 )
1135 	ROM_LOAD_ODD ( "ge-07",     0xc0000, 0x20000, 0x5eb819a1 )
1136 
1137 	ROM_REGION( 0x10000, REGION_CPU2 )	/* Sound CPU */
1138 	ROM_LOAD( "ge-09",    0x00000, 0x10000, 0x9f94c60b )
1139 
1140 	ROM_REGION( 0x020000, REGION_GFX1 | REGIONFLAG_DISPOSE )
1141 	ROM_LOAD( "ge-10",    0x000000, 0x10000, 0x2528d795 )
1142   	ROM_LOAD( "ge-11",    0x010000, 0x10000, 0xe34a931e )
1143 
1144 	ROM_REGION( 0x080000, REGION_GFX2 | REGIONFLAG_DISPOSE )
1145 	ROM_LOAD( "mad-00",   0x000000, 0x80000, 0x3735b22d ) /* tiles 1 */
1146 
1147 	ROM_REGION( 0x080000, REGION_GFX3 | REGIONFLAG_DISPOSE )
1148 	ROM_LOAD( "mad-01",   0x000000, 0x80000, 0x7bb13e1c ) /* tiles 2 */
1149 
1150 	ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
1151 	ROM_LOAD( "mad-02",   0x000000, 0x80000, 0x6c76face ) /* tiles 3 */
1152 
1153 	ROM_REGION( 0x500000, REGION_GFX5 | REGIONFLAG_DISPOSE )
1154 	ROM_LOAD( "mad-03",   0x000000, 0x80000, 0xc0bff892 ) /* sprites */
1155 	ROM_LOAD( "mad-04",   0x080000, 0x80000, 0x464f3eb9 )
1156 	ROM_LOAD( "mad-07",   0x100000, 0x80000, 0xac03466e )
1157 	ROM_LOAD( "mad-10",   0x180000, 0x80000, 0x42da8ef0 )
1158 	ROM_LOAD( "mad-09",   0x200000, 0x80000, 0x930f4900 )
1159 	ROM_LOAD( "mad-05",   0x280000, 0x80000, 0x3f2ccf95 )
1160 	ROM_LOAD( "mad-06",   0x300000, 0x80000, 0x60871f77 )
1161 	ROM_LOAD( "mad-08",   0x380000, 0x80000, 0x1b420ec8 )
1162 	ROM_LOAD( "mad-11",   0x400000, 0x80000, 0x03c1f982 )
1163 	ROM_LOAD( "mad-12",   0x480000, 0x80000, 0xa0bd62b6 )
1164 
1165 	ROM_REGION( 0x20000, REGION_SOUND1 )	/* ADPCM samples */
1166 	ROM_LOAD( "ge-08",    0x00000, 0x20000, 0xdfe28c7b )
1167 
1168 	ROM_REGION( 0x80000, REGION_SOUND2 ) /* Extra Oki samples */
1169 	ROM_LOAD( "mad-13", 0x00000, 0x80000, 0x6ab28eba )	/* banked */
1170 ROM_END
1171 
1172 /**********************************************************************************/
1173 
1174 static void cninja_patch(void)
1175 {
1176 	unsigned char *RAM = memory_region(REGION_CPU1);
1177 	int i;
1178 
1179 	for (i=0; i<0x80000; i+=2) {
1180 		int aword=READ_WORD(&RAM[i]);
1181 
1182 		if (aword==0x66ff || aword==0x67ff) {
1183 			int doublecheck=READ_WORD(&RAM[i-8]);
1184 
1185 			/* Cmpi + btst controlling opcodes */
1186 			if (doublecheck==0xc39 || doublecheck==0x839) {
1187 
1188 				WRITE_WORD (&RAM[i],0x4E71);
1189 		        WRITE_WORD (&RAM[i-2],0x4E71);
1190 		        WRITE_WORD (&RAM[i-4],0x4E71);
1191 		        WRITE_WORD (&RAM[i-6],0x4E71);
1192 		        WRITE_WORD (&RAM[i-8],0x4E71);
1193 			}
1194 		}
1195 	}
1196 }
1197 
1198 #if 0
1199 static void edrandyj_patch(void)
1200 {
1201 //	unsigned char *RAM = memory_region(REGION_CPU1);
1202 
1203 //	WRITE_WORD (&RAM[0x98cc],0x4E71);
1204 //	WRITE_WORD (&RAM[0x98ce],0x4E71);
1205 
1206 }
1207 #endif
1208 
1209 /**********************************************************************************/
1210 
init_cninja(void)1211 static void init_cninja(void)
1212 {
1213 	install_mem_write_handler(0, 0x1bc0a8, 0x1bc0a9, cninja_sound_w);
1214 	cninja_patch();
1215 }
1216 
init_stoneage(void)1217 static void init_stoneage(void)
1218 {
1219 	install_mem_write_handler(0, 0x1bc0a8, 0x1bc0a9, stoneage_sound_w);
1220 }
1221 
1222 /**********************************************************************************/
1223 
1224 GAME( 1991, cninja,   0,       cninja,   cninja,  cninja,   ROT0, "Data East Corporation", "Caveman Ninja (World revision 3)" )
1225 GAME( 1991, cninja0,  cninja,  cninja,   cninja,  cninja,   ROT0, "Data East Corporation", "Caveman Ninja (World revision 0)" )
1226 GAME( 1991, cninjau,  cninja,  cninja,   cninjau, cninja,   ROT0, "Data East Corporation", "Caveman Ninja (US)" )
1227 GAME( 1991, joemac,   cninja,  cninja,   cninja,  cninja,   ROT0, "Data East Corporation", "Joe & Mac (Japan)" )
1228 GAME( 1991, stoneage, cninja,  stoneage, cninja,  stoneage, ROT0, "bootleg", "Stoneage" )
1229 GAMEX(1990, edrandy,  0,       edrandy,  cninja,  0,        ROT0, "Data East Corporation", "Edward Randy (World)", GAME_NOT_WORKING )
1230 GAMEX(1990, edrandyj, edrandy, edrandy,  cninja,  0,        ROT0, "Data East Corporation", "Edward Randy (Japan)", GAME_NOT_WORKING )
1231