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