diff options
Diffstat (limited to 'src/mame/drivers/mexico86.c')
-rw-r--r-- | src/mame/drivers/mexico86.c | 611 |
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 ) |