1 /***************************************************************************
2
3 Legend of Kage
4 (C)1985 Taito
5 CPU: Z80 (x2), MC68705
6 Sound: YM2203 (x2)
7
8 Phil Stroffolino
9 pjstroff@hotmail.com
10
11 TODO:
12 - Note that all the bootlegs are derived from a different version of the
13 original which hasn't been found yet.
14 - SOUND: lots of unknown writes to the YM2203 I/O ports
15 - lkage is verfied to be an original set, but it seems to work regardless of what
16 the mcu does. Moreover, the mcu returns a checksum which is different from the
17 one I think the game expects (89, while the game seems to expect 5d). But the
18 game works anyway, it never gives the usual Taito "BAD HW" message.
19 - sprite and tilemap placement is most certainly wrong
20
21 Take the following observations with a grain of salt (might not be true):
22 - attract mode is bogus (observe the behavior of the player)
23 - the second stage isn't supposed to have (red) Samurai, only Ninja.
24 - The final stage is almost impossible in MAME! On the arcade, I could make my
25 way to the top fairly easily, but in MAME I have to use invulnerability.
26
27 ***************************************************************************/
28
29 #include "driver.h"
30 #include "vidhrdw/generic.h"
31 #include "cpu/z80/z80.h"
32 #include "cpu/m6805/m6805.h"
33
34
35 extern unsigned char *lkage_scroll, *lkage_vreg;
36 WRITE_HANDLER( lkage_videoram_w );
37 VIDEO_START( lkage );
38 VIDEO_UPDATE( lkage );
39
40 READ_HANDLER( lkage_68705_portA_r );
41 WRITE_HANDLER( lkage_68705_portA_w );
42 READ_HANDLER( lkage_68705_portB_r );
43 WRITE_HANDLER( lkage_68705_portB_w );
44 READ_HANDLER( lkage_68705_portC_r );
45 WRITE_HANDLER( lkage_68705_portC_w );
46 WRITE_HANDLER( lkage_68705_ddrA_w );
47 WRITE_HANDLER( lkage_68705_ddrB_w );
48 WRITE_HANDLER( lkage_68705_ddrC_w );
49 WRITE_HANDLER( lkage_mcu_w );
50 READ_HANDLER( lkage_mcu_r );
51 READ_HANDLER( lkage_mcu_status_r );
52
53
54 static int sound_nmi_enable,pending_nmi;
55
nmi_callback(int param)56 static void nmi_callback(int param)
57 {
58 if (sound_nmi_enable) cpu_set_irq_line(1,IRQ_LINE_NMI,PULSE_LINE);
59 else pending_nmi = 1;
60 }
61
WRITE_HANDLER(lkage_sound_command_w)62 static WRITE_HANDLER( lkage_sound_command_w )
63 {
64 soundlatch_w(offset,data);
65 timer_set(TIME_NOW,data,nmi_callback);
66 }
67
WRITE_HANDLER(lkage_sh_nmi_disable_w)68 static WRITE_HANDLER( lkage_sh_nmi_disable_w )
69 {
70 sound_nmi_enable = 0;
71 }
72
WRITE_HANDLER(lkage_sh_nmi_enable_w)73 static WRITE_HANDLER( lkage_sh_nmi_enable_w )
74 {
75 sound_nmi_enable = 1;
76 if (pending_nmi)
77 { /* probably wrong but commands may go lost otherwise */
78 cpu_set_irq_line(1,IRQ_LINE_NMI,PULSE_LINE);
79 pending_nmi = 0;
80 }
81 }
82
83
84
MEMORY_READ_START(readmem)85 static MEMORY_READ_START( readmem )
86 { 0x0000, 0xdfff, MRA_ROM },
87 { 0xe000, 0xe7ff, MRA_RAM },
88 { 0xe800, 0xefff, paletteram_r },
89 { 0xf000, 0xf003, MRA_RAM },
90 { 0xf062, 0xf062, lkage_mcu_r },
91 { 0xf080, 0xf080, input_port_0_r }, /* DSW1 */
92 { 0xf081, 0xf081, input_port_1_r }, /* DSW2 (coinage) */
93 { 0xf082, 0xf082, input_port_2_r }, /* DSW3 */
94 { 0xf083, 0xf083, input_port_3_r }, /* start buttons, insert coin, tilt */
95 { 0xf084, 0xf084, input_port_4_r }, /* P1 controls */
96 { 0xf086, 0xf086, input_port_5_r }, /* P2 controls */
97 { 0xf087, 0xf087, lkage_mcu_status_r },
98 // { 0xf0a3, 0xf0a3, MRA_NOP }, /* unknown */
99 { 0xf0c0, 0xf0c5, MRA_RAM },
100 { 0xf100, 0xf15f, MRA_RAM },
101 { 0xf400, 0xffff, MRA_RAM },
102 MEMORY_END
103
104 static MEMORY_WRITE_START( writemem )
105 { 0x0000, 0xdfff, MWA_ROM },
106 { 0xe000, 0xe7ff, MWA_RAM },
107 { 0xe800, 0xefff, MWA_RAM, &paletteram },
108 // paletteram_xxxxRRRRGGGGBBBB_w, &paletteram },
109 { 0xf000, 0xf003, MWA_RAM, &lkage_vreg }, /* video registers */
110 { 0xf060, 0xf060, lkage_sound_command_w },
111 { 0xf061, 0xf061, MWA_NOP }, /* unknown */
112 { 0xf062, 0xf062, lkage_mcu_w },
113 // { 0xf063, 0xf063, MWA_NOP }, /* unknown */
114 // { 0xf0a2, 0xf0a2, MWA_NOP }, /* unknown */
115 // { 0xf0a3, 0xf0a3, MWA_NOP }, /* unknown */
116 { 0xf0c0, 0xf0c5, MWA_RAM, &lkage_scroll }, /* scrolling */
117 // { 0xf0e1, 0xf0e1, MWA_NOP }, /* unknown */
118 { 0xf100, 0xf15f, MWA_RAM, &spriteram }, /* spriteram */
119 { 0xf400, 0xffff, lkage_videoram_w, &videoram }, /* videoram */
120 MEMORY_END
121
122 static READ_HANDLER( port_fetch_r )
123 {
124 return memory_region(REGION_USER1)[offset];
125 }
126
PORT_READ_START(readport)127 static PORT_READ_START( readport )
128 { 0x4000, 0x7fff, port_fetch_r },
129 PORT_END
130
131
132 static MEMORY_READ_START( m68705_readmem )
133 { 0x0000, 0x0000, lkage_68705_portA_r },
134 { 0x0001, 0x0001, lkage_68705_portB_r },
135 { 0x0002, 0x0002, lkage_68705_portC_r },
136 { 0x0010, 0x007f, MRA_RAM },
137 { 0x0080, 0x07ff, MRA_ROM },
138 MEMORY_END
139
140 static MEMORY_WRITE_START( m68705_writemem )
141 { 0x0000, 0x0000, lkage_68705_portA_w },
142 { 0x0001, 0x0001, lkage_68705_portB_w },
143 { 0x0002, 0x0002, lkage_68705_portC_w },
144 { 0x0004, 0x0004, lkage_68705_ddrA_w },
145 { 0x0005, 0x0005, lkage_68705_ddrB_w },
146 { 0x0006, 0x0006, lkage_68705_ddrC_w },
147 { 0x0010, 0x007f, MWA_RAM },
148 { 0x0080, 0x07ff, MWA_ROM },
149 MEMORY_END
150
151
152
153 /***************************************************************************/
154
155 /* sound section is almost identical to Bubble Bobble, YM2203 instead of YM3526 */
156
157 static MEMORY_READ_START( readmem_sound )
158 { 0x0000, 0x7fff, MRA_ROM },
159 { 0x8000, 0x87ff, MRA_RAM },
160 { 0x9000, 0x9000, YM2203_status_port_0_r },
161 { 0xa000, 0xa000, YM2203_status_port_1_r },
162 { 0xb000, 0xb000, soundlatch_r },
163 { 0xb001, 0xb001, MRA_NOP }, /* ??? */
164 { 0xe000, 0xefff, MRA_ROM }, /* space for diagnostic ROM? */
165 MEMORY_END
166
167 static MEMORY_WRITE_START( writemem_sound )
168 { 0x0000, 0x7fff, MWA_ROM },
169 { 0x8000, 0x87ff, MWA_RAM },
170 { 0x9000, 0x9000, YM2203_control_port_0_w },
171 { 0x9001, 0x9001, YM2203_write_port_0_w },
172 { 0xa000, 0xa000, YM2203_control_port_1_w },
173 { 0xa001, 0xa001, YM2203_write_port_1_w },
174 { 0xb000, 0xb000, MWA_NOP }, /* ??? */
175 { 0xb001, 0xb001, lkage_sh_nmi_enable_w },
176 { 0xb002, 0xb002, lkage_sh_nmi_disable_w },
177 { 0xe000, 0xefff, MWA_ROM }, /* space for diagnostic ROM? */
178 MEMORY_END
179
180 /***************************************************************************/
181
182 INPUT_PORTS_START( lkage )
183 PORT_START /* DSW1 */
184 PORT_DIPNAME( 0x03, 0x03, DEF_STR( Bonus_Life ) )
185 PORT_DIPSETTING( 0x03, "10000" ) /* unconfirmed */
186 PORT_DIPSETTING( 0x02, "15000" ) /* unconfirmed */
187 PORT_DIPSETTING( 0x01, "20000" ) /* unconfirmed */
188 PORT_DIPSETTING( 0x00, "24000" ) /* unconfirmed */
189 PORT_DIPNAME( 0x04, 0x04, DEF_STR( Free_Play ) )
190 PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
191 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
192 PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) )
193 PORT_DIPSETTING( 0x18, "3" )
194 PORT_DIPSETTING( 0x10, "4" )
195 PORT_DIPSETTING( 0x08, "5" )
196 PORT_BITX(0, 0x00, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "255", IP_KEY_NONE, IP_JOY_NONE )
197 PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
198 PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
199 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
200 PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
201 PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
202 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
203 PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) )
204 PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
205 PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) )
206
207 PORT_START /* DSW2 */
208 PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) )
209 PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) )
210 PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) )
211 PORT_DIPSETTING( 0x0d, DEF_STR( 7C_1C ) )
212 PORT_DIPSETTING( 0x0c, DEF_STR( 6C_1C ) )
213 PORT_DIPSETTING( 0x0b, DEF_STR( 5C_1C ) )
214 PORT_DIPSETTING( 0x0a, DEF_STR( 4C_1C ) )
215 PORT_DIPSETTING( 0x09, DEF_STR( 3C_1C ) )
216 PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) )
217 PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
218 PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
219 PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
220 PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) )
221 PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) )
222 PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) )
223 PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) )
224 PORT_DIPSETTING( 0x07, DEF_STR( 1C_8C ) )
225 PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) )
226 PORT_DIPSETTING( 0xf0, DEF_STR( 9C_1C ) )
227 PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C ) )
228 PORT_DIPSETTING( 0xd0, DEF_STR( 7C_1C ) )
229 PORT_DIPSETTING( 0xc0, DEF_STR( 6C_1C ) )
230 PORT_DIPSETTING( 0xb0, DEF_STR( 5C_1C ) )
231 PORT_DIPSETTING( 0xa0, DEF_STR( 4C_1C ) )
232 PORT_DIPSETTING( 0x90, DEF_STR( 3C_1C ) )
233 PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
234 PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
235 PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
236 PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) )
237 PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) )
238 PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) )
239 PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) )
240 PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) )
241 PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) )
242
243 PORT_START /* DSW3 */
244 PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
245 PORT_DIPSETTING( 0x03, "Easiest" ) /* unconfirmed */
246 PORT_DIPSETTING( 0x02, "Easy" ) /* unconfirmed */
247 PORT_DIPSETTING( 0x01, "Normal" ) /* unconfirmed */
248 PORT_DIPSETTING( 0x00, "Hard" ) /* unconfirmed */
249 PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
250 PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
251 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
252 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
253 PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
254 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
255 PORT_DIPNAME( 0x10, 0x10, "Coinage Display" )
256 PORT_DIPSETTING( 0x10, "Coins/Credits" )
257 PORT_DIPSETTING( 0x00, "Insert Coin" )
258 PORT_DIPNAME( 0x20, 0x20, "Year Display" )
259 PORT_DIPSETTING( 0x00, "1985" )
260 PORT_DIPSETTING( 0x20, "MCMLXXXIV" )
261 PORT_BITX( 0x40, 0x40, IPT_DIPSWITCH_NAME | IPF_CHEAT, "Invulnerability", IP_KEY_NONE, IP_JOY_NONE )
262 PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
263 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
264 PORT_DIPNAME( 0x80, 0x80, "Coin Slots" )
265 PORT_DIPSETTING( 0x80, "A and B" )
266 PORT_DIPSETTING( 0x00, "A only" )
267
268 PORT_START /* Service */
269 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
270 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
271 PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 )
272 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT )
273 PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
274 PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
275 PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
276 PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
277
278 PORT_START /* IN1 */
279 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
280 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
281 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
282 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
283 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
284 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
285 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
286 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
287
288 PORT_START /* IN2 */
289 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
290 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
291 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
292 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
293 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
294 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
295 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
296 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
297 INPUT_PORTS_END
298
299
300
301 static struct GfxLayout tile_layout =
302 {
303 8,8,
304 RGN_FRAC(1,4),
305 4,
306 { RGN_FRAC(1,4),RGN_FRAC(0,4),RGN_FRAC(3,4),RGN_FRAC(2,4) },
307 { 7, 6, 5, 4, 3, 2, 1, 0 },
308 { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
309 8*8
310 };
311
312 static struct GfxLayout sprite_layout =
313 {
314 16,16,
315 RGN_FRAC(1,4),
316 4,
317 { RGN_FRAC(1,4),RGN_FRAC(0,4),RGN_FRAC(3,4),RGN_FRAC(2,4) },
318 { 7, 6, 5, 4, 3, 2, 1, 0,
319 64+7, 64+6, 64+5, 64+4, 64+3, 64+2, 64+1, 64+0 },
320 { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
321 128+0*8, 128+1*8, 128+2*8, 128+3*8, 128+4*8, 128+5*8, 128+6*8, 128+7*8 },
322 32*8
323 };
324
325
326 static struct GfxDecodeInfo gfxdecodeinfo[] =
327 {
328 { REGION_GFX1, 0x0000, &tile_layout, 128, 3 },
329 { REGION_GFX1, 0x0000, &sprite_layout, 0, 8 },
330 { -1 }
331 };
332
333
334
irqhandler(int irq)335 static void irqhandler(int irq)
336 {
337 cpu_set_irq_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE);
338 }
339
340 static struct YM2203interface ym2203_interface =
341 {
342 2, /* 2 chips */
343 4000000, /* 4 MHz ? (hand tuned) */
344 { YM2203_VOL(40,15), YM2203_VOL(40,15) },
345 { 0 },
346 { 0 },
347 { 0 },
348 { 0 },
349 { irqhandler }
350 };
351
352
353
354 static MACHINE_DRIVER_START( lkage )
355
356 /* basic machine hardware */
357 MDRV_CPU_ADD(Z80,6000000)
358 MDRV_CPU_FLAGS(CPU_16BIT_PORT) /* ??? */
359 MDRV_CPU_MEMORY(readmem,writemem)
360 MDRV_CPU_PORTS(readport,0)
361 MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
362
363 MDRV_CPU_ADD(Z80, 6000000)
364 MDRV_CPU_FLAGS(CPU_AUDIO_CPU) /* ??? */
365 MDRV_CPU_MEMORY(readmem_sound,writemem_sound)
366 /* IRQs are triggered by the YM2203 */
367 MDRV_CPU_ADD(M68705,4000000/2) /* ??? */
368 MDRV_CPU_MEMORY(m68705_readmem,m68705_writemem)
369
370 MDRV_FRAMES_PER_SECOND(60)
371 MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION)
372
373 /* video hardware */
374 MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
375 MDRV_SCREEN_SIZE(32*8, 32*8)
376 MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
377 MDRV_GFXDECODE(gfxdecodeinfo)
378 MDRV_PALETTE_LENGTH(176)
379 /*
380 there are actually 1024 colors in paletteram, however, we use a 100% correct
381 reduced "virtual palette" to achieve some optimizations in the video driver.
382 */
383
384 MDRV_VIDEO_START(lkage)
385 MDRV_VIDEO_UPDATE(lkage)
386
387 /* sound hardware */
388 MDRV_SOUND_ADD(YM2203, ym2203_interface)
389 MACHINE_DRIVER_END
390
391
392 static MACHINE_DRIVER_START( lkageb )
393
394 /* basic machine hardware */
395 MDRV_CPU_ADD(Z80,6000000)
396 MDRV_CPU_FLAGS(CPU_16BIT_PORT) /* ??? */
397 MDRV_CPU_MEMORY(readmem,writemem)
398 MDRV_CPU_PORTS(readport,0)
399 MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
400
401 MDRV_CPU_ADD(Z80, 6000000)
402 MDRV_CPU_FLAGS(CPU_AUDIO_CPU) /* ??? */
403 MDRV_CPU_MEMORY(readmem_sound,writemem_sound)
404 /* IRQs are triggered by the YM2203 */
405 MDRV_FRAMES_PER_SECOND(60)
406 MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION)
407
408 /* video hardware */
409 MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
410 MDRV_SCREEN_SIZE(32*8, 32*8)
411 MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
412 MDRV_GFXDECODE(gfxdecodeinfo)
413 MDRV_PALETTE_LENGTH(176)
414 /*
415 there are actually 1024 colors in paletteram, however, we use a 100% correct
416 reduced "virtual palette" to achieve some optimizations in the video driver.
417 */
418
419 MDRV_VIDEO_START(lkage)
420 MDRV_VIDEO_UPDATE(lkage)
421
422 /* sound hardware */
423 MDRV_SOUND_ADD(YM2203, ym2203_interface)
424 MACHINE_DRIVER_END
425
426
427
428 ROM_START( lkage )
429 ROM_REGION( 0x14000, REGION_CPU1, 0 ) /* Z80 code (main CPU) */
430 ROM_LOAD( "a54-01-1.37", 0x0000, 0x8000, CRC(973da9c5) SHA1(ad3b5d6a329b784e47be563c6f8dc628f32ba0a5) )
431 ROM_LOAD( "a54-02-1.38", 0x8000, 0x8000, CRC(27b509da) SHA1(c623950bd7dd2b5699ca948e3731455964106b89) )
432
433 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 code (sound CPU) */
434 ROM_LOAD( "a54-04.54", 0x0000, 0x8000, CRC(541faf9a) SHA1(b142ff3bd198f700697ec06ea92db3109ab5818e) )
435
436 ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* 68705 MCU code */
437 ROM_LOAD( "a54-09.53", 0x0000, 0x0800, CRC(0e8b8846) SHA1(a4a105462b0127229bb7edfadd2e581c7e40f1cc) )
438
439 ROM_REGION( 0x4000, REGION_USER1, 0 ) /* data */
440 ROM_LOAD( "a54-03.51", 0x0000, 0x4000, CRC(493e76d8) SHA1(13c6160edd94ba2801fd89bb33bcae3a1e3454ff) )
441
442 ROM_REGION( 0x10000, REGION_GFX1, ROMREGION_DISPOSE )
443 ROM_LOAD( "a54-05-1.84", 0x0000, 0x4000, CRC(0033c06a) SHA1(89964503fc338817c6511fd15942741996b7037a) )
444 ROM_LOAD( "a54-06-1.85", 0x4000, 0x4000, CRC(9f04d9ad) SHA1(3b9a4d30348fd02e5c8ae94655548bd4a02dd65d) )
445 ROM_LOAD( "a54-07-1.86", 0x8000, 0x4000, CRC(b20561a4) SHA1(0d6d83dfae79ea133e37704ca47426b4c978fb36) )
446 ROM_LOAD( "a54-08-1.87", 0xc000, 0x4000, CRC(3ff3b230) SHA1(ffcd964efb0af32b5d7a70305dfda615ea95acbe) )
447
448 ROM_REGION( 0x0200, REGION_PROMS, 0 )
449 ROM_LOAD( "a54-10.2", 0x0000, 0x0200, CRC(17dfbd14) SHA1(f8f0b6dfedd4ba108dad43ccc7697ef4ab9cbf86) ) /* unknown */
450 ROM_END
451
452 ROM_START( lkageb )
453 ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* Z80 code (main CPU) */
454 ROM_LOAD( "ic37_1", 0x0000, 0x8000, CRC(05694f7b) SHA1(08a3796d6cf04d64db52ed8208a51084c420e10a) )
455 ROM_LOAD( "ic38_2", 0x8000, 0x8000, CRC(22efe29e) SHA1(f7a29d54081ca7509e822ad8823ec977bccc4a40) )
456
457 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 code (sound CPU) */
458 ROM_LOAD( "a54-04.54", 0x0000, 0x8000, CRC(541faf9a) SHA1(b142ff3bd198f700697ec06ea92db3109ab5818e) )
459
460 ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* 68705 MCU code */
461 ROM_LOAD( "mcu", 0x0000, 0x0800, NO_DUMP )
462
463 ROM_REGION( 0x4000, REGION_USER1, 0 ) /* data */
464 ROM_LOAD( "a54-03.51", 0x0000, 0x4000, CRC(493e76d8) SHA1(13c6160edd94ba2801fd89bb33bcae3a1e3454ff) )
465
466 ROM_REGION( 0x10000, REGION_GFX1, ROMREGION_DISPOSE )
467 ROM_LOAD( "ic93_5", 0x0000, 0x4000, CRC(76753e52) SHA1(13f61969d59b055a5ab40237148e091d7cabe190) )
468 ROM_LOAD( "ic94_6", 0x4000, 0x4000, CRC(f33c015c) SHA1(756326daab255d3a36d97e51ee141b9f7157f12e) )
469 ROM_LOAD( "ic95_7", 0x8000, 0x4000, CRC(0e02c2e8) SHA1(1d8a817ba66cf26a4fe51ae00874c0fe6e7cebe3) )
470 ROM_LOAD( "ic96_8", 0xc000, 0x4000, CRC(4ef5f073) SHA1(dfd234542b28cff74692a1c381772da01e8bb4a7) )
471
472 ROM_REGION( 0x0200, REGION_PROMS, 0 )
473 ROM_LOAD( "a54-10.2", 0x0000, 0x0200, CRC(17dfbd14) SHA1(f8f0b6dfedd4ba108dad43ccc7697ef4ab9cbf86) ) /* unknown */
474 ROM_END
475
476 ROM_START( lkageb2 )
477 ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* Z80 code (main CPU) */
478 ROM_LOAD( "lok.a", 0x0000, 0x8000, CRC(866df793) SHA1(44a9a773d7bbfc5f9d53f56682438ef8b23ecbd6) )
479 ROM_LOAD( "lok.b", 0x8000, 0x8000, CRC(fba9400f) SHA1(fedcb9b717feaeec31afda098f0ac2744df6c7be) )
480
481 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 code (sound CPU) */
482 ROM_LOAD( "a54-04.54", 0x0000, 0x8000, CRC(541faf9a) SHA1(b142ff3bd198f700697ec06ea92db3109ab5818e) )
483
484 ROM_REGION( 0x4000, REGION_USER1, 0 ) /* data */
485 ROM_LOAD( "a54-03.51", 0x0000, 0x4000, CRC(493e76d8) SHA1(13c6160edd94ba2801fd89bb33bcae3a1e3454ff) )
486
487 ROM_REGION( 0x10000, REGION_GFX1, ROMREGION_DISPOSE )
488 ROM_LOAD( "ic93_5", 0x0000, 0x4000, CRC(76753e52) SHA1(13f61969d59b055a5ab40237148e091d7cabe190) )
489 ROM_LOAD( "ic94_6", 0x4000, 0x4000, CRC(f33c015c) SHA1(756326daab255d3a36d97e51ee141b9f7157f12e) )
490 ROM_LOAD( "ic95_7", 0x8000, 0x4000, CRC(0e02c2e8) SHA1(1d8a817ba66cf26a4fe51ae00874c0fe6e7cebe3) )
491 ROM_LOAD( "ic96_8", 0xc000, 0x4000, CRC(4ef5f073) SHA1(dfd234542b28cff74692a1c381772da01e8bb4a7) )
492
493 ROM_REGION( 0x0200, REGION_PROMS, 0 )
494 ROM_LOAD( "a54-10.2", 0x0000, 0x0200, CRC(17dfbd14) SHA1(f8f0b6dfedd4ba108dad43ccc7697ef4ab9cbf86) ) /* unknown */
495 ROM_END
496
497 ROM_START( lkageb3 )
498 ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* Z80 code (main CPU) */
499 ROM_LOAD( "z1.bin", 0x0000, 0x8000, CRC(60cac488) SHA1(b61df14159f37143b1faed22d77fc7be31602022) )
500 ROM_LOAD( "z2.bin", 0x8000, 0x8000, CRC(22c95f17) SHA1(8ca438d508a36918778651adf599cf45a7c4a5d7) )
501
502 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 code (sound CPU) */
503 ROM_LOAD( "a54-04.54", 0x0000, 0x8000, CRC(541faf9a) SHA1(b142ff3bd198f700697ec06ea92db3109ab5818e) )
504
505 ROM_REGION( 0x4000, REGION_USER1, 0 ) /* data */
506 ROM_LOAD( "a54-03.51", 0x0000, 0x4000, CRC(493e76d8) SHA1(13c6160edd94ba2801fd89bb33bcae3a1e3454ff) )
507
508 ROM_REGION( 0x10000, REGION_GFX1, ROMREGION_DISPOSE )
509 ROM_LOAD( "ic93_5", 0x0000, 0x4000, CRC(76753e52) SHA1(13f61969d59b055a5ab40237148e091d7cabe190) )
510 ROM_LOAD( "ic94_6", 0x4000, 0x4000, CRC(f33c015c) SHA1(756326daab255d3a36d97e51ee141b9f7157f12e) )
511 ROM_LOAD( "ic95_7", 0x8000, 0x4000, CRC(0e02c2e8) SHA1(1d8a817ba66cf26a4fe51ae00874c0fe6e7cebe3) )
512 ROM_LOAD( "ic96_8", 0xc000, 0x4000, CRC(4ef5f073) SHA1(dfd234542b28cff74692a1c381772da01e8bb4a7) )
513
514 ROM_REGION( 0x0200, REGION_PROMS, 0 )
515 ROM_LOAD( "a54-10.2", 0x0000, 0x0200, CRC(17dfbd14) SHA1(f8f0b6dfedd4ba108dad43ccc7697ef4ab9cbf86) ) /* unknown */
516 ROM_END
517
518 static unsigned char mcu_val;
519
520 /*Note:This probably uses another MCU dump,which is undumped.*/
521
READ_HANDLER(fake_mcu_r)522 static READ_HANDLER( fake_mcu_r )
523 {
524 switch(mcu_val)
525 {
526 /*These are for the attract mode*/
527 case 0x01: return (mcu_val-1);
528 case 0x90: return (mcu_val+0x43);
529 /*Gameplay Protection,checked in this order at a start of a play*/
530 case 0xa6: return (mcu_val+0x27);
531 case 0x34: return (mcu_val+0x7f);
532 case 0x48: return (mcu_val+0xb7);
533
534 default: return (mcu_val);
535 }
536 }
537
WRITE_HANDLER(fake_mcu_w)538 static WRITE_HANDLER( fake_mcu_w )
539 {
540 //if(data != 1 && data != 0xa6 && data != 0x34 && data != 0x48)
541 // usrintf_showmessage("PC = %04x %02x",activecpu_get_pc(),data);
542
543 mcu_val = data;
544 }
545
READ_HANDLER(fake_status_r)546 static READ_HANDLER( fake_status_r )
547 {
548 static int res = 3;// cpu data/mcu ready status
549
550 return res;
551 }
552
DRIVER_INIT(lkageb)553 DRIVER_INIT( lkageb )
554 {
555 install_mem_read_handler (0,0xf062,0xf062,fake_mcu_r);
556 install_mem_read_handler (0,0xf087,0xf087,fake_status_r);
557 install_mem_write_handler(0,0xf062,0xf062,fake_mcu_w );
558 }
559
560
561 GAME( 1984, lkage, 0, lkage, lkage, 0, ROT0, "Taito Corporation", "The Legend of Kage" )
562 GAME( 1984, lkageb, lkage, lkageb, lkage, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 1)" )
563 GAME( 1984, lkageb2, lkage, lkageb, lkage, 0, ROT0, "bootleg", "The Legend of Kage (bootleg set 2)" )
564 GAME( 1984, lkageb3, lkage, lkageb, lkage, 0, ROT0, "bootleg", "The Legend of Kage (bootleg set 3)" )
565