/*************************************************************************** Kick & Run - (c) 1987 Taito Ernesto Corvi ernesto@imagina.com Notes: - 4 players mode is not emulated. This involves some shared RAM and a subboard. There is additional code for a third Z80 in the bootleg version, I don't know if it's related or if its just a replacement for the 68705. - kicknrun does a PS4 STOP ERROR short after boot, but works afterwards. PS4 is the mcu. - Kiki Kaikai suffers from random lock-up's. It happens when the sound CPU misses CTS from YM2203. The processor will loop infinitely and the main CPU will in turn wait forever. It's difficult to meet the required level of synchronization. THis is kludged by filtering the 2203's busy signal. - KiKi KaiKai uses a custom 68701 MCU which isn't dumped. The bootleg Knight Boy replaces it with a 68705. The bootleg is NOT 100% equivalent to the original (a situation similar to Bubble Bobble): collision detection is imperfect, the player can't be killed by some enemies. I think the bootleggers put the custom mcu in a test rig, examined its bus activity and replicated the behaviour inaccurately because they coudln't figure it all out. Indeed, the 68705 code reads all the memory locations related to the missing collision detection, but does nothing with them. - In the KiKi KaiKai MCU simulation, I don't bother supporting the coinage dip switch settings. Therefore, it's hardwired to be 1 coin / 1 credit. - Kick and Run is a rom swap for Kiki KaiKai as the pal chips are all A85-0x A85 is the Taito rom code for Kiki KaiKai. Even the MCU is socketted! Note MCU labeling: Kick and RUN Bubble Bobble ------------- ------------ TAITO A87-01 TAITO A78-01 JPH1021P JPH1011P 185 185 PS4 J8648 PS4 J8635 ***************************************************************************/ #include "driver.h" #include "cpu/z80/z80.h" #include "cpu/m6805/m6805.h" #include "sound/2203intf.h" /* in machine/mexico86.c */ extern UINT8 *mexico86_protection_ram; WRITE8_HANDLER( mexico86_f008_w ); INTERRUPT_GEN( kikikai_interrupt ); INTERRUPT_GEN( mexico86_m68705_interrupt ); READ8_HANDLER( mexico86_68705_portA_r ); WRITE8_HANDLER( mexico86_68705_portA_w ); WRITE8_HANDLER( mexico86_68705_ddrA_w ); READ8_HANDLER( mexico86_68705_portB_r ); WRITE8_HANDLER( mexico86_68705_portB_w ); WRITE8_HANDLER( mexico86_68705_ddrB_w ); /* in video/mexico86.c */ extern UINT8 *mexico86_videoram,*mexico86_objectram; extern size_t mexico86_objectram_size; WRITE8_HANDLER( mexico86_bankswitch_w ); VIDEO_UPDATE( mexico86 ); VIDEO_UPDATE( kikikai ); //AT static READ8_HANDLER( kiki_2203_r ) { return(YM2203_status_port_0_r(0) & 0x7f); } //ZT static UINT8 *shared; static READ8_HANDLER( shared_r ) { return shared[offset]; } static WRITE8_HANDLER( shared_w ) { shared[offset] = data; } static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) AM_RANGE(0x8000, 0xbfff) AM_READ(MRA8_BANK1) /* banked roms */ AM_RANGE(0xc000, 0xe7ff) AM_READ(shared_r) /* shared with sound cpu */ AM_RANGE(0xe800, 0xe8ff) AM_READ(MRA8_RAM) /* protection ram */ AM_RANGE(0xe900, 0xefff) AM_READ(MRA8_RAM) AM_RANGE(0xf010, 0xf010) AM_READ(input_port_5_r) AM_RANGE(0xf800, 0xffff) AM_READ(MRA8_RAM) /* communication ram - to connect 4 players's subboard */ ADDRESS_MAP_END static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_WRITE(MWA8_ROM) AM_RANGE(0xc000, 0xe7ff) AM_WRITE(shared_w) AM_BASE(&shared) /* shared with sound cpu */ AM_RANGE(0xc000, 0xd4ff) AM_WRITE(MWA8_RAM) AM_BASE(&mexico86_videoram) //AT: corrected size AM_RANGE(0xd500, 0xd7ff) AM_WRITE(MWA8_RAM) AM_BASE(&mexico86_objectram) AM_SIZE(&mexico86_objectram_size) AM_RANGE(0xe800, 0xe8ff) AM_WRITE(MWA8_RAM) AM_BASE(&mexico86_protection_ram) /* shared with mcu */ AM_RANGE(0xe900, 0xefff) AM_WRITE(MWA8_RAM) AM_RANGE(0xf000, 0xf000) AM_WRITE(mexico86_bankswitch_w) /* program and gfx ROM banks */ AM_RANGE(0xf008, 0xf008) AM_WRITE(mexico86_f008_w) /* cpu reset lines + other unknown stuff */ AM_RANGE(0xf018, 0xf018) AM_WRITE(MWA8_NOP) // watchdog_reset_w }, AM_RANGE(0xf800, 0xffff) AM_WRITE(MWA8_RAM) /* communication ram */ ADDRESS_MAP_END static ADDRESS_MAP_START( sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) AM_RANGE(0x8000, 0xa7ff) AM_READ(shared_r) AM_RANGE(0xa800, 0xbfff) AM_READ(MRA8_RAM) AM_RANGE(0xc000, 0xc000) AM_READ(kiki_2203_r) //AT AM_RANGE(0xc001, 0xc001) AM_READ(YM2203_read_port_0_r) ADDRESS_MAP_END static ADDRESS_MAP_START( sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) AM_RANGE(0x8000, 0xa7ff) AM_WRITE(shared_w) AM_RANGE(0xa800, 0xbfff) AM_WRITE(MWA8_RAM) AM_RANGE(0xc000, 0xc000) AM_WRITE(YM2203_control_port_0_w) AM_RANGE(0xc001, 0xc001) AM_WRITE(YM2203_write_port_0_w) ADDRESS_MAP_END static ADDRESS_MAP_START( m68705_readmem, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(11) ) AM_RANGE(0x0000, 0x0000) AM_READ(mexico86_68705_portA_r) AM_RANGE(0x0001, 0x0001) AM_READ(mexico86_68705_portB_r) AM_RANGE(0x0002, 0x0002) AM_READ(input_port_0_r) /* COIN */ AM_RANGE(0x0010, 0x007f) AM_READ(MRA8_RAM) AM_RANGE(0x0080, 0x07ff) AM_READ(MRA8_ROM) ADDRESS_MAP_END static ADDRESS_MAP_START( m68705_writemem, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(11) ) AM_RANGE(0x0000, 0x0000) AM_WRITE(mexico86_68705_portA_w) AM_RANGE(0x0001, 0x0001) AM_WRITE(mexico86_68705_portB_w) AM_RANGE(0x0004, 0x0004) AM_WRITE(mexico86_68705_ddrA_w) AM_RANGE(0x0005, 0x0005) AM_WRITE(mexico86_68705_ddrB_w) AM_RANGE(0x000a, 0x000a) AM_WRITE(MWA8_NOP) /* looks like a bug in the code, writes to */ /* 0x0a (=10dec) instead of 0x10 */ AM_RANGE(0x0010, 0x007f) AM_WRITE(MWA8_RAM) AM_RANGE(0x0080, 0x07ff) AM_WRITE(MWA8_ROM) ADDRESS_MAP_END static ADDRESS_MAP_START( sub_cpu_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x3fff) AM_ROM ADDRESS_MAP_END static INPUT_PORTS_START( mexico86 ) PORT_START /* IN0 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service 2 */ PORT_START /* IN2 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START /* When Bit 1 is On, the machine waits a signal from another one */ /* Seems like if you can join two cabinets, one as master */ /* and the other as slave, probably to play four players */ PORT_DIPNAME( 0x01, 0x01, "System Selection" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) // Screen ? PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // this should be Demo Sounds, but doesn't work? PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) ) PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_START PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPSETTING( 0x03, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x01, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) PORT_DIPNAME( 0x0c, 0x08, "Playing Time" ) PORT_DIPSETTING( 0x00, "40 Seconds" ) PORT_DIPSETTING( 0x0c, "One Minute" ) PORT_DIPSETTING( 0x08, "One Minute and 20 Sec." ) PORT_DIPSETTING( 0x04, "One Minute and 40 Sec." ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) /* The following dip seems to be related with the first one */ PORT_DIPNAME( 0x20, 0x20, "System Selection" ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x00, "Number of Matches" ) PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x40, "6" ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Players ) ) PORT_DIPSETTING( 0x80, "2" ) PORT_DIPSETTING( 0x00, "4" ) PORT_START /* the following is actually service coin 1 */ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Advance") PORT_CODE(KEYCODE_F1) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END static INPUT_PORTS_START( kikikai ) PORT_START /* IN0 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START /* IN2 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) //AT PORT_START /* DSW0 */ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) #if 0 // old coinage settings PORT_DIPNAME( 0x30, 0x30, "Coin 1" ) PORT_DIPSETTING( 0x30, "A:1C/1C B:1C/1C" ) PORT_DIPSETTING( 0x20, "A:1C/2C B:2C/1C" ) PORT_DIPSETTING( 0x10, "A:2C/1C B:3C/1C" ) PORT_DIPSETTING( 0x00, "A:2C/3C B:4C/1C" ) PORT_DIPNAME( 0xc0, 0xc0, "Coin 2" ) PORT_DIPSETTING( 0xc0, "A:1C/1C B:1C/2C" ) PORT_DIPSETTING( 0x80, "A:1C/2C B:1C/3C" ) PORT_DIPSETTING( 0x40, "A:2C/1C B:1C/4C" ) PORT_DIPSETTING( 0x00, "A:2C/3C B:1C/6C" ) #endif // coinage copied from Japanese manual but type B doesn't work PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) ) PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_START /* DSW1 */ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPSETTING( 0x02, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x03, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x01, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x00, "50000 100000" ) PORT_DIPSETTING( 0x0c, "70000 150000" ) PORT_DIPSETTING( 0x08, "70000 200000" ) PORT_DIPSETTING( 0x04, "100000 300000" ) PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x30, "3" ) PORT_DIPSETTING( 0x20, "4" ) PORT_DIPSETTING( 0x10, "5" ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x40, "A" ) PORT_DIPSETTING( 0x00, "B" ) PORT_DIPNAME( 0x80, 0x00, "Number Match" ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) //ZT PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END static const gfx_layout charlayout = { 8,8, 4*2048, 4, { 0x20000*8, 0x20000*8+4, 0, 4 }, { 3, 2, 1, 0, 8+3, 8+2, 8+1, 8+0 }, { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, 16*8 }; static GFXDECODE_START( mexico86 ) GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 16 ) GFXDECODE_END static struct YM2203interface ym2203_interface = { input_port_3_r, input_port_4_r }; static MACHINE_DRIVER_START( mexico86 ) /* basic machine hardware */ MDRV_CPU_ADD_TAG("main",Z80, 24000000/4) /* 6 MHz, Uses clock divided 24MHz OSC */ MDRV_CPU_PROGRAM_MAP(readmem,writemem) MDRV_CPU_ADD(Z80, 8000000/2) /* 4 MHz, Uses 8Mhz OSC */ MDRV_CPU_PROGRAM_MAP(sound_readmem,sound_writemem) MDRV_CPU_VBLANK_INT(irq0_line_hold,1) MDRV_CPU_ADD_TAG("mcu", M68705, 4000000/M68705_CLOCK_DIVIDER) /* xtal is 4MHz, divided by 4 internally */ MDRV_CPU_PROGRAM_MAP(m68705_readmem,m68705_writemem) MDRV_CPU_VBLANK_INT(mexico86_m68705_interrupt,2) MDRV_CPU_ADD_TAG("sub", Z80, 24000000/4) /* 6 MHz, Uses clock divided 24MHz OSC */ MDRV_CPU_PROGRAM_MAP(sub_cpu_map,0) MDRV_CPU_VBLANK_INT(irq0_line_hold,1) MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION /* frames per second, vblank duration */) MDRV_INTERLEAVE(100) /* 100 CPU slices per frame - an high value to ensure proper */ /* synchronization of the CPUs */ /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_SIZE(32*8, 32*8) MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MDRV_GFXDECODE(mexico86) MDRV_PALETTE_LENGTH(256) MDRV_PALETTE_INIT(RRRR_GGGG_BBBB) MDRV_VIDEO_UPDATE(mexico86) /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") MDRV_SOUND_ADD(YM2203, 3000000) MDRV_SOUND_CONFIG(ym2203_interface) MDRV_SOUND_ROUTE(0, "mono", 0.30) MDRV_SOUND_ROUTE(1, "mono", 0.30) MDRV_SOUND_ROUTE(2, "mono", 0.30) MDRV_SOUND_ROUTE(3, "mono", 1.00) MACHINE_DRIVER_END static MACHINE_DRIVER_START( knightb ) /* basic machine hardware */ MDRV_IMPORT_FROM(mexico86) MDRV_CPU_REMOVE("sub") /* video hardware */ MDRV_VIDEO_UPDATE(kikikai) MACHINE_DRIVER_END static MACHINE_DRIVER_START( kikikai ) /* basic machine hardware */ MDRV_IMPORT_FROM(knightb) MDRV_CPU_MODIFY("main") MDRV_CPU_VBLANK_INT(kikikai_interrupt, 1) // IRQs should be triggered by the MCU, but we don't have it MDRV_CPU_REMOVE("mcu") // we don't have code for the 68701 /* video hardware */ MDRV_VIDEO_UPDATE(kikikai) MACHINE_DRIVER_END /*************************************************************************** Game driver(s) ***************************************************************************/ ROM_START( kikikai ) ROM_REGION( 0x28000, REGION_CPU1, 0 ) ROM_LOAD( "a85-17.h16", 0x00000, 0x08000, CRC(c141d5ab) SHA1(fe3622ba283e514416c43a44f83f922a958b27cd) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a85-16.h18", 0x10000, 0x10000, CRC(4094d750) SHA1(05e0ad177a3eb144b203784ecb6242a0fc5c4d4d) ) /* banked at 0x8000 */ ROM_COPY( REGION_CPU1, 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems ROM_REGION( 0x10000, REGION_CPU2, 0 ) ROM_LOAD( "a85-11.f6", 0x0000, 0x8000, CRC(cc3539db) SHA1(4239a40fdee65cba613e4b4ec54cf7899480e366) ) ROM_REGION( 0x0800, REGION_CPU3, 0 ) /* 2k for the microcontroller (MC6801U4 type MCU) */ ROM_LOAD( "a85-01.g8", 0x0000, 0x0800, NO_DUMP ) ROM_REGION( 0x40000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT ) ROM_LOAD( "a85-15.a1", 0x00000, 0x10000, CRC(aebc8c32) SHA1(77347cf5780f084a77123eb636cd0bad672a39e8) ) ROM_LOAD( "a85-14.a3", 0x10000, 0x10000, CRC(a9df0453) SHA1(a5e9cd6266ab3ae46cd1b35a4603e13a2ca023fb) ) ROM_LOAD( "a85-13.a4", 0x20000, 0x10000, CRC(3eeaf878) SHA1(f8ae8938a8358d1222e9fdf7bc0094ac13faf404) ) ROM_LOAD( "a85-12.a6", 0x30000, 0x10000, CRC(91e58067) SHA1(c7eb9bf650039254fb7664758938b1012eacc597) ) ROM_REGION( 0x0300, REGION_PROMS, 0 ) ROM_LOAD( "a85-08.g15", 0x0000, 0x0100, CRC(d15f61a8) SHA1(945c8aa26c85269c10373218bef13e04e25eb1e4) ) /* all proms are 63S141AN or compatible type */ ROM_LOAD( "a85-10.g12", 0x0100, 0x0100, CRC(8fc3fa86) SHA1(d4d86f8e147bbf2a370de428ac20a28b0f146782) ) ROM_LOAD( "a85-09.g14", 0x0200, 0x0100, CRC(b931c94d) SHA1(fb554084f34c602d1ff7806fb945a06cf14332af) ) ROM_END ROM_START( knightb ) ROM_REGION( 0x28000, REGION_CPU1, 0 ) ROM_LOAD( "a85-17.h16", 0x00000, 0x08000, CRC(c141d5ab) SHA1(fe3622ba283e514416c43a44f83f922a958b27cd) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a85-16.h18", 0x10000, 0x10000, CRC(4094d750) SHA1(05e0ad177a3eb144b203784ecb6242a0fc5c4d4d) ) /* banked at 0x8000 */ ROM_COPY( REGION_CPU1, 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems ROM_REGION( 0x10000, REGION_CPU2, 0 ) ROM_LOAD( "a85-11.f6", 0x0000, 0x8000, CRC(cc3539db) SHA1(4239a40fdee65cba613e4b4ec54cf7899480e366) ) ROM_REGION( 0x0800, REGION_CPU3, 0 ) /* 2k for the microcontroller */ ROM_LOAD( "knightb.uc", 0x0000, 0x0800, CRC(3cc2bbe4) SHA1(af018a1e0655b66fd859617a3bd0c01a4967c0e6) ) ROM_REGION( 0x40000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT ) ROM_LOAD( "knightb.d", 0x00000, 0x10000, CRC(53ecdb3f) SHA1(f8b4822926f3712a426c014759b1cf382a7ad9d1) ) ROM_LOAD( "a85-14.a3", 0x10000, 0x10000, CRC(a9df0453) SHA1(a5e9cd6266ab3ae46cd1b35a4603e13a2ca023fb) ) ROM_LOAD( "knightb.b", 0x20000, 0x10000, CRC(63ad7df3) SHA1(8ce149b63032bcdd596a3fa52baba2f2c154e84e) ) ROM_LOAD( "a85-12.a6", 0x30000, 0x10000, CRC(91e58067) SHA1(c7eb9bf650039254fb7664758938b1012eacc597) ) ROM_REGION( 0x0300, REGION_PROMS, 0 ) ROM_LOAD( "a85-08.g15", 0x0000, 0x0100, CRC(d15f61a8) SHA1(945c8aa26c85269c10373218bef13e04e25eb1e4) ) /* all proms are 63S141AN or compatible type */ ROM_LOAD( "a85-10.g12", 0x0100, 0x0100, CRC(8fc3fa86) SHA1(d4d86f8e147bbf2a370de428ac20a28b0f146782) ) ROM_LOAD( "a85-09.g14", 0x0200, 0x0100, CRC(b931c94d) SHA1(fb554084f34c602d1ff7806fb945a06cf14332af) ) ROM_END ROM_START( kicknrun ) ROM_REGION( 0x28000, REGION_CPU1, 0 ) ROM_LOAD( "a87-08.h16", 0x00000, 0x08000, CRC(715e1b04) SHA1(60b7259758ec73f1cc945556e9c2b25766b745a8) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a87-07.h18", 0x10000, 0x10000, CRC(6cb6ebfe) SHA1(fca61fc2ad8fadc1e15b9ff84c7469b68d16e885) ) /* banked at 0x8000 */ ROM_COPY( REGION_CPU1, 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems ROM_REGION( 0x10000, REGION_CPU2, 0 ) ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) ) ROM_REGION( 0x0800, REGION_CPU3, 0 ) /* 2k for the microcontroller (MC6801U4 type MCU) */ /* MCU labeled TAITO A78 01, JPH1021P, 185, PS4 */ ROM_LOAD( "a87-01.g8", 0x0000, 0x0800, BAD_DUMP CRC(8e821fa0) SHA1(331f5da31d8767674e2b5bf0e7f5b5ad2535e044) ) /* manually crafted from the Mexico '86 one */ ROM_REGION( 0x10000, REGION_CPU4, 0 ) /* 64k for the cpu on the sub board */ ROM_LOAD( "a87-09-1", 0x0000, 0x4000, CRC(6a2ad32f) SHA1(42d4b97b25d219902ad215793f1d2c006ffe94dc) ) ROM_REGION( 0x40000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT ) ROM_LOAD( "a87-05.a1", 0x08000, 0x08000, CRC(4eee3a8a) SHA1(2f0e4c2fb6cba48d0e2b95927fc14f0038557371) ) ROM_CONTINUE( 0x00000, 0x08000 ) ROM_LOAD( "a87-04.a3", 0x10000, 0x08000, CRC(8b438d20) SHA1(12e615f34b7e732157f893b97c9b7e99e9ef7d62) ) ROM_RELOAD( 0x18000, 0x08000 ) ROM_LOAD( "a87-03.a4", 0x28000, 0x08000, CRC(f42e8a88) SHA1(db2702141981ba368bdc665443a8a0662266e6d9) ) ROM_CONTINUE( 0x20000, 0x08000 ) ROM_LOAD( "a87-02.a6", 0x30000, 0x08000, CRC(64f1a85f) SHA1(04fb9824450812b08f7e6fc57e0af828be9bd575) ) ROM_RELOAD( 0x38000, 0x08000 ) ROM_REGION( 0x0300, REGION_PROMS, 0 ) ROM_LOAD( "a87-10.g15", 0x0000, 0x0100, CRC(be6eb1f0) SHA1(f4d00e9b12bf116bf84edb2ff6caab158094b668) ) /* all proms are 63S141AN or compatible type */ ROM_LOAD( "a87-12.g12", 0x0100, 0x0100, CRC(3e953444) SHA1(e9c84ca9390fd7c73738a8b681a02e87fbd51bb4) ) ROM_LOAD( "a87-11.g14", 0x0200, 0x0100, CRC(14f6c28d) SHA1(8c60974e4607906a3f77260bdd0704af60d596fc) ) ROM_END ROM_START( kicknruu ) ROM_REGION( 0x28000, REGION_CPU1, 0 ) ROM_LOAD( "a87-23.h16", 0x00000, 0x08000, CRC(37182560) SHA1(8db393131f50af88b2e7489d6aae65bad0a5a65b) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a87-22.h18", 0x10000, 0x10000, CRC(3b5a8354) SHA1(e0db4cb0657989d5a21f9a8d4e8f842adba636ad) ) /* banked at 0x8000 */ ROM_COPY( REGION_CPU1, 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems ROM_REGION( 0x10000, REGION_CPU2, 0 ) ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) ) ROM_REGION( 0x0800, REGION_CPU3, 0 ) /* 2k for the microcontroller (MC6801U4 type MCU) */ /* MCU labeled TAITO A78 01, JPH1021P, 185, PS4 */ ROM_LOAD( "a87-01.g8", 0x0000, 0x0800, BAD_DUMP CRC(8e821fa0) SHA1(331f5da31d8767674e2b5bf0e7f5b5ad2535e044) ) /* manually crafted from the Mexico '86 one */ ROM_REGION( 0x10000, REGION_CPU4, 0 ) /* 64k for the cpu on the sub board */ ROM_LOAD( "a87-09-1", 0x0000, 0x4000, CRC(6a2ad32f) SHA1(42d4b97b25d219902ad215793f1d2c006ffe94dc) ) ROM_REGION( 0x40000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT ) ROM_LOAD( "a87-05.a1", 0x08000, 0x08000, CRC(4eee3a8a) SHA1(2f0e4c2fb6cba48d0e2b95927fc14f0038557371) ) ROM_CONTINUE( 0x00000, 0x08000 ) ROM_LOAD( "a87-04.a3", 0x10000, 0x08000, CRC(8b438d20) SHA1(12e615f34b7e732157f893b97c9b7e99e9ef7d62) ) ROM_RELOAD( 0x18000, 0x08000 ) ROM_LOAD( "a87-03.a4", 0x28000, 0x08000, CRC(f42e8a88) SHA1(db2702141981ba368bdc665443a8a0662266e6d9) ) ROM_CONTINUE( 0x20000, 0x08000 ) ROM_LOAD( "a87-02.a6", 0x30000, 0x08000, CRC(64f1a85f) SHA1(04fb9824450812b08f7e6fc57e0af828be9bd575) ) ROM_RELOAD( 0x38000, 0x08000 ) ROM_REGION( 0x0300, REGION_PROMS, 0 ) ROM_LOAD( "a87-10.g15", 0x0000, 0x0100, CRC(be6eb1f0) SHA1(f4d00e9b12bf116bf84edb2ff6caab158094b668) ) /* all proms are 63S141AN or compatible type */ ROM_LOAD( "a87-12.g12", 0x0100, 0x0100, CRC(3e953444) SHA1(e9c84ca9390fd7c73738a8b681a02e87fbd51bb4) ) ROM_LOAD( "a87-11.g14", 0x0200, 0x0100, CRC(14f6c28d) SHA1(8c60974e4607906a3f77260bdd0704af60d596fc) ) ROM_END ROM_START( mexico86 ) ROM_REGION( 0x28000, REGION_CPU1, 0 ) ROM_LOAD( "2_g.bin", 0x00000, 0x08000, CRC(2bbfe0fb) SHA1(8f047e001ea8e49d28f73e546c82812af1c2533c) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "1_f.bin", 0x10000, 0x10000, CRC(0b93e68e) SHA1(c6fbcce83103e3e71a7a1ef9f18a10622ed6b951) ) /* banked at 0x8000 */ ROM_COPY( REGION_CPU1, 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems ROM_REGION( 0x10000, REGION_CPU2, 0 ) ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) ) ROM_REGION( 0x0800, REGION_CPU3, 0 ) /* 2k for the microcontroller */ ROM_LOAD( "68_h.bin", 0x0000, 0x0800, CRC(ff92f816) SHA1(0015c3f2ed014052b3fa376409e3a7cca36fac72) ) ROM_REGION( 0x10000, REGION_CPU4, 0 ) /* 64k for the cpu on the sub board */ ROM_LOAD( "a87-09-1", 0x0000, 0x4000, CRC(6a2ad32f) SHA1(42d4b97b25d219902ad215793f1d2c006ffe94dc) ) ROM_REGION( 0x40000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT ) ROM_LOAD( "4_d.bin", 0x08000, 0x08000, CRC(57cfdbca) SHA1(89c305c380c3de14a956ee4bc85d3a0d343b638e) ) ROM_CONTINUE( 0x00000, 0x08000 ) ROM_LOAD( "5_c.bin", 0x10000, 0x08000, CRC(e42fa143) SHA1(02d7e0e01af1cecc3952f6355987118098d346c3) ) ROM_RELOAD( 0x18000, 0x08000 ) ROM_LOAD( "6_b.bin", 0x28000, 0x08000, CRC(a4607989) SHA1(6832147603a146c34cc1809e839c8e034d0dacc5) ) ROM_CONTINUE( 0x20000, 0x08000 ) ROM_LOAD( "7_a.bin", 0x30000, 0x08000, CRC(245036b1) SHA1(108d9959de869b4fdf766abeade1486acec13bf2) ) ROM_RELOAD( 0x38000, 0x08000 ) ROM_REGION( 0x0300, REGION_PROMS, 0 ) ROM_LOAD( "a87-10.g15", 0x0000, 0x0100, CRC(be6eb1f0) SHA1(f4d00e9b12bf116bf84edb2ff6caab158094b668) ) /* all proms are 63S141AN or compatible type */ ROM_LOAD( "a87-12.g12", 0x0100, 0x0100, CRC(3e953444) SHA1(e9c84ca9390fd7c73738a8b681a02e87fbd51bb4) ) ROM_LOAD( "a87-11.g14", 0x0200, 0x0100, CRC(14f6c28d) SHA1(8c60974e4607906a3f77260bdd0704af60d596fc) ) ROM_END GAME( 1986, kikikai, 0, kikikai, kikikai, 0, ROT90, "Taito Corporation", "KiKi KaiKai", 0 ) GAME( 1986, knightb, kikikai, knightb, kikikai, 0, ROT90, "bootleg", "Knight Boy", 0 ) GAME( 1986, kicknrun, 0, mexico86, mexico86, 0, ROT0, "Taito Corporation", "Kick and Run (World)", 0 ) GAME( 1986, kicknruu, kicknrun, mexico86, mexico86, 0, ROT0, "Taito America Corp", "Kick and Run (US)", 0 ) GAME( 1986, mexico86, kicknrun, mexico86, mexico86, 0, ROT0, "bootleg", "Mexico 86", 0 )