summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/mexico86.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/mexico86.c')
-rw-r--r--src/mame/drivers/mexico86.c611
1 files changed, 611 insertions, 0 deletions
diff --git a/src/mame/drivers/mexico86.c b/src/mame/drivers/mexico86.c
new file mode 100644
index 00000000000..8184c056af3
--- /dev/null
+++ b/src/mame/drivers/mexico86.c
@@ -0,0 +1,611 @@
+/***************************************************************************
+
+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 )