diff options
Diffstat (limited to 'src/mame/drivers/ninjakid.c')
-rw-r--r-- | src/mame/drivers/ninjakid.c | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/src/mame/drivers/ninjakid.c b/src/mame/drivers/ninjakid.c new file mode 100644 index 00000000000..96fb981d15f --- /dev/null +++ b/src/mame/drivers/ninjakid.c @@ -0,0 +1,336 @@ +/******************************************************************************* + Ninja Kid / Ninjakun Majou no Bouken | (c) 1984 UPL / Taito +******************************************************************************** + Driver by David Haywood + with help from Steph and Phil Stroffolino + + Last Changes: 5 Mar 2001 + + This driver was started after interest was shown in the game by a poster at + various messageboards going under the name of 'ninjakid' I decided to attempt + a driver for this game to gain some experience with Z80 & Multi-processor + games. + +Hold P1 Start after a reset to skip the startup memory tests. + +Change Log: +5 Mar - Added Saved State Support (DJH) +8 Jun - Added palette animation, Fixed FG priority. (Uki) +9 Jun - Fixed BG scroll handling, Fixed CPU clock. +*******************************************************************************/ + +#include "driver.h" +#include "cpu/z80/z80.h" +#include "sound/ay8910.h" + +extern WRITE8_HANDLER( ninjakid_bg_videoram_w ); +extern WRITE8_HANDLER( ninjakid_fg_videoram_w ); +extern READ8_HANDLER( ninjakid_bg_videoram_r ); + +extern READ8_HANDLER( ninjakun_io_8000_r ); +extern WRITE8_HANDLER( ninjakun_io_8000_w ); + +extern VIDEO_START( ninjakid ); +extern VIDEO_UPDATE( ninjakid ); +extern WRITE8_HANDLER( ninjakun_flipscreen_w ); + +extern WRITE8_HANDLER( ninjakun_paletteram_w ); + +/******************************************************************************/ + +static UINT8 *ninjakid_gfx_rom; + +static READ8_HANDLER( ninjakid_shared_rom_r ){ + return ninjakid_gfx_rom[offset]; +} + +/* working RAM is shared, but an address line is inverted */ +static UINT8 *shareram; + +static WRITE8_HANDLER( shareram_w ){ + shareram[offset^0x400] = data; +} +static READ8_HANDLER( shareram_r ){ + return shareram[offset^0x400]; +} + +/******************************************************************************* + 0xA000 Read / Write Handlers +*******************************************************************************/ + +static UINT8 ninjakun_io_a002_ctrl; + +static READ8_HANDLER( ninjakun_io_A002_r ){ + return ninjakun_io_a002_ctrl | readinputport(2); /* vblank */ +} + +static WRITE8_HANDLER( cpu1_A002_w ){ + if( data == 0x80 ) ninjakun_io_a002_ctrl |= 0x04; + if( data == 0x40 ) ninjakun_io_a002_ctrl &= ~0x08; +} + +static WRITE8_HANDLER( cpu2_A002_w ){ + if( data == 0x40 ) ninjakun_io_a002_ctrl |= 0x08; + if( data == 0x80 ) ninjakun_io_a002_ctrl &= ~0x04; +} + +/******************************************************************************* + Init +*******************************************************************************/ + +static MACHINE_START( ninjakid ) +{ + /* Save State Stuff */ + state_save_register_global(ninjakun_io_a002_ctrl); +} + +/******************************************************************************* + Memory Maps +*******************************************************************************/ + +static ADDRESS_MAP_START( ninjakid_primary_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) + AM_RANGE(0x8000, 0x8003) AM_READ(ninjakun_io_8000_r) + AM_RANGE(0xa000, 0xa000) AM_READ(input_port_0_r) + AM_RANGE(0xa001, 0xa001) AM_READ(input_port_1_r) + AM_RANGE(0xa002, 0xa002) AM_READ(ninjakun_io_A002_r) + AM_RANGE(0xc000, 0xc7ff) AM_READ(MRA8_RAM) /* tilemaps */ + AM_RANGE(0xc800, 0xcfff) AM_READ(ninjakid_bg_videoram_r) + AM_RANGE(0xd000, 0xd7ff) AM_READ(MRA8_RAM) /* spriteram */ + AM_RANGE(0xd800, 0xd9ff) AM_READ(paletteram_r) + AM_RANGE(0xe000, 0xe7ff) AM_READ(MRA8_RAM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ninjakid_primary_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0x2000, 0x7fff) AM_WRITE(MWA8_ROM) AM_BASE(&ninjakid_gfx_rom) + AM_RANGE(0x8000, 0x8003) AM_WRITE(ninjakun_io_8000_w) + AM_RANGE(0xa002, 0xa002) AM_WRITE(cpu1_A002_w) + AM_RANGE(0xa003, 0xa003) AM_WRITE(ninjakun_flipscreen_w) + AM_RANGE(0xc000, 0xc7ff) AM_WRITE(ninjakid_fg_videoram_w) AM_BASE(&videoram) + AM_RANGE(0xc800, 0xcfff) AM_WRITE(ninjakid_bg_videoram_w) + AM_RANGE(0xd000, 0xd7ff) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) + AM_RANGE(0xd800, 0xd9ff) AM_WRITE(ninjakun_paletteram_w) AM_BASE(&paletteram) + AM_RANGE(0xe000, 0xe7ff) AM_WRITE(MWA8_RAM) AM_BASE(&shareram) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ninjakid_secondary_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_READ(MRA8_ROM) + AM_RANGE(0x2000, 0x7fff) AM_READ(ninjakid_shared_rom_r) + AM_RANGE(0x8000, 0x8003) AM_READ(ninjakun_io_8000_r) + AM_RANGE(0xa000, 0xa000) AM_READ(input_port_0_r) + AM_RANGE(0xa001, 0xa001) AM_READ(input_port_1_r) + AM_RANGE(0xa002, 0xa002) AM_READ(ninjakun_io_A002_r) + AM_RANGE(0xc000, 0xc7ff) AM_READ(videoram_r) /* tilemaps */ + AM_RANGE(0xc800, 0xcfff) AM_READ(ninjakid_bg_videoram_r) + AM_RANGE(0xd000, 0xd7ff) AM_READ(spriteram_r) /* shareram */ + AM_RANGE(0xd800, 0xd9ff) AM_READ(paletteram_r) + AM_RANGE(0xe000, 0xe7ff) AM_READ(shareram_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ninjakid_secondary_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0x8000, 0x8003) AM_WRITE(ninjakun_io_8000_w) + AM_RANGE(0xa002, 0xa002) AM_WRITE(cpu2_A002_w) + AM_RANGE(0xa003, 0xa003) AM_WRITE(ninjakun_flipscreen_w) + AM_RANGE(0xc000, 0xc7ff) AM_WRITE(ninjakid_fg_videoram_w) + AM_RANGE(0xc800, 0xcfff) AM_WRITE(ninjakid_bg_videoram_w) + AM_RANGE(0xd000, 0xd7ff) AM_WRITE(spriteram_w) /* shareram */ + AM_RANGE(0xd800, 0xd9ff) AM_WRITE(ninjakun_paletteram_w) + AM_RANGE(0xe000, 0xe7ff) AM_WRITE(shareram_w) +ADDRESS_MAP_END + +/******************************************************************************* + GFX Decoding Information +*******************************************************************************/ + +static const gfx_layout tile_layout = +{ + 8,8, /* tile size */ + 0x400, /* number of tiles */ + 4, /* bits per pixel */ + { 0, 1, 2, 3 }, /* plane offsets */ + { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 }, /* x offsets */ + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, /* y offsets */ + 256 +}; + +static const gfx_layout sprite_layout = +{ + 16,16, /* tile size */ + 0x100, /* number of tiles */ + 4, /* bits per pixel */ + { 0, 1, 2, 3 }, /* plane offsets */ + { + 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4, + 256+0*4, 256+1*4, 256+2*4, 256+3*4, 256+4*4, 256+5*4, 256+6*4, 256+7*4, + }, /* x offsets */ + { + 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, + 512+0*32, 512+1*32, 512+2*32, 512+3*32, 512+4*32, 512+5*32, 512+6*32, 512+7*32 + }, /* y offsets */ + 1024 +}; + +static GFXDECODE_START( ninjakid ) + GFXDECODE_ENTRY( REGION_GFX1, 0, tile_layout, 0x000, 0x10 ) + GFXDECODE_ENTRY( REGION_GFX2, 0, tile_layout, 0x100, 0x10 ) + GFXDECODE_ENTRY( REGION_GFX1, 0, sprite_layout, 0x200, 0x10 ) +GFXDECODE_END + +/******************************************************************************* + Machine Driver Structure(s) +*******************************************************************************/ + +static MACHINE_DRIVER_START( ninjakid ) + + /* basic machine hardware */ + MDRV_CPU_ADD(Z80, 3000000) /* 3.00MHz */ + MDRV_CPU_PROGRAM_MAP(ninjakid_primary_readmem,ninjakid_primary_writemem) + MDRV_CPU_VBLANK_INT(irq0_line_hold,1) + + MDRV_CPU_ADD(Z80, 3000000) /* 3.00MHz */ + MDRV_CPU_PROGRAM_MAP(ninjakid_secondary_readmem,ninjakid_secondary_writemem) + MDRV_CPU_VBLANK_INT(irq0_line_hold,4) /* ? */ + + MDRV_SCREEN_REFRESH_RATE(60) + + MDRV_MACHINE_START(ninjakid) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(100) /* 100 CPU slices per frame */ + + /* 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, 4*8, (32-4)*8-1 ) + MDRV_GFXDECODE(ninjakid) + MDRV_PALETTE_LENGTH(768) + + MDRV_VIDEO_START(ninjakid) + MDRV_VIDEO_UPDATE(ninjakid) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 6000000/2) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + + MDRV_SOUND_ADD(AY8910, 6000000/2) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +MACHINE_DRIVER_END + +/******************************************************************************* + Rom Definitions +*******************************************************************************/ + +ROM_START( ninjakun ) /* Original Board? */ + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* Main CPU */ + ROM_LOAD( "ninja-1.7a", 0x0000, 0x02000, CRC(1c1dc141) SHA1(423d3ed35e73a8d5bfce075a889b0322b207bd0d) ) + ROM_LOAD( "ninja-2.7b", 0x2000, 0x02000, CRC(39cc7d37) SHA1(7f0d0e1e92cb6a57f15eb7fc51a67112f1c5fc8e) ) + ROM_LOAD( "ninja-3.7d", 0x4000, 0x02000, CRC(d542bfe3) SHA1(3814d8f5b1acda21438fff4f71670fa653dc7b30) ) + ROM_LOAD( "ninja-4.7e", 0x6000, 0x02000, CRC(a57385c6) SHA1(77925a281e64889bfe967c3d42a388529aaf7eb6) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Secondary CPU */ + ROM_LOAD( "ninja-5.7h", 0x0000, 0x02000, CRC(164a42c4) SHA1(16b434b33b76b878514f67c23315d4c6da7bfc9e) ) + + ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE ) /* Graphics */ + ROM_LOAD16_BYTE( "ninja-6.7n", 0x0000, 0x02000, CRC(a74c4297) SHA1(87184d14c67331f2c8a2412e28f31427eddae799) ) + ROM_LOAD16_BYTE( "ninja-7.7p", 0x0001, 0x02000, CRC(53a72039) SHA1(d77d608ce9388a8956831369badd88a8eda8e102) ) + ROM_LOAD16_BYTE( "ninja-8.7s", 0x4000, 0x02000, CRC(4a99d857) SHA1(6aadb6a5c721a161a5c1bef5569c1e323e380cff) ) + ROM_LOAD16_BYTE( "ninja-9.7t", 0x4001, 0x02000, CRC(dede49e4) SHA1(8ce4bc02ec583b3885ca63fb5e2d5dad185fe192) ) + + ROM_REGION( 0x08000, REGION_GFX2, ROMREGION_DISPOSE ) /* Graphics */ + ROM_LOAD16_BYTE( "ninja-10.2c", 0x0000, 0x02000, CRC(0d55664a) SHA1(955a607b4401ce9f3f807d53833a766152b0ef9b) ) + ROM_LOAD16_BYTE( "ninja-11.2d", 0x0001, 0x02000, CRC(12ff9597) SHA1(10b572844ab32e3ae54abe3600fecc1a811ac713) ) + ROM_LOAD16_BYTE( "ninja-12.4c", 0x4000, 0x02000, CRC(e9b75807) SHA1(cf4c8ac962f785e9de5502df58eab9b3725aaa28) ) + ROM_LOAD16_BYTE( "ninja-13.4d", 0x4001, 0x02000, CRC(1760ed2c) SHA1(ee4c8efcce483c8051873714856824a1a1e14b61) ) +ROM_END + +/******************************************************************************* + Input Ports +******************************************************************************** + 2 Sets of Controls + 2 Sets of Dipsiwtches +*******************************************************************************/ + +static INPUT_PORTS_START( ninjakid ) + PORT_START_TAG("IN0") /* 0xa000 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY /* "XPOS1" */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") /* 0xa001 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_2WAY PORT_COCKTAIL /* "YPOS1" */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_2WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_SERVICE( 0x40, IP_ACTIVE_HIGH ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) + + PORT_START_TAG("IN2") /* 0xa002 */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_VBLANK ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x06, 0x04, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x04, "3" ) + PORT_DIPSETTING( 0x06, "4" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x08, 0x08, "First Bonus" ) + PORT_DIPSETTING( 0x08, "30000" ) + PORT_DIPSETTING( 0x00, "40000" ) + PORT_DIPNAME( 0x30, 0x30, "Second Bonus" ) + PORT_DIPSETTING( 0x00, "No Bonus" ) + PORT_DIPSETTING( 0x10, "Every 30000" ) + PORT_DIPSETTING( 0x30, "Every 50000" ) + PORT_DIPSETTING( 0x20, "Every 70000" ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 4C_2C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 2C_2C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_2C ) ) + PORT_DIPNAME( 0x08, 0x08, "High Score Names" ) + PORT_DIPSETTING( 0x00, "3 Letters" ) + PORT_DIPSETTING( 0x08, "8 Letters" ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Allow_Continue ) ) + PORT_DIPSETTING( 0x10, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )/* Probably Unused */ + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Endless Game (If Free Play)" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +/******************************************************************************* + Game Drivers +*******************************************************************************/ + +GAME( 1984, ninjakun, 0, ninjakid, ninjakid, 0, ROT0, "[UPL] (Taito license)", "Ninjakun Majou no Bouken", 0 ) |