summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/ninjakd2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/ninjakd2.c')
-rw-r--r--src/mame/drivers/ninjakd2.c703
1 files changed, 703 insertions, 0 deletions
diff --git a/src/mame/drivers/ninjakd2.c b/src/mame/drivers/ninjakd2.c
new file mode 100644
index 00000000000..8ebf0ad7505
--- /dev/null
+++ b/src/mame/drivers/ninjakd2.c
@@ -0,0 +1,703 @@
+/***************************************************************************
+
+ *****************************
+ *** NINJA KID II hardware *** (by Roberto Ventura)
+ *****************************
+
+Game authors:
+Game design: Tsutomu Fuzisawa
+Program design: Satoru Kinjo
+Char. design: Tsutomu Fizisawa
+Char. design: Akemi Tsunoda
+Sound compose: Tsutomu Fuzisawa
+Bgm create: Mecano Associate
+Data make: Takashi Hayashi
+
+General aspect.
+
+The game is driven by a fast Z80 CPU.
+Screen resolution is 256x192.
+768 colors on screen.
+96 sprites.
+
+Rom Contents:
+
+NK2_01.ROM Main CPU program ROM
+NK2_02.ROM CPU banked data ROM 0 (banks 0 and 1)
+NK2_03.ROM CPU banked data ROM 1 (banks 2 and 3)
+NK2_04.ROM CPU banked data ROM 2 (banks 4 and 5)
+NK2_05.ROM CPU banked data ROM 3 (banks 6 and 7)
+NK2_06.ROM Sound CPU program ROM (encrypted)
+NK2_07.ROM Sprites data ROM 1
+NK2_08.ROM Sprites data ROM 0
+NK2_09.ROM Raw PCM samples (complete?)
+NK2_10.ROM Background data ROM 1
+NK2_11.ROM Background data ROM 0
+NK2_12.ROM Foreground data ROM
+
+*** MEMORY MAP ***
+
+0000-7fff Main CPU ROM
+8000-bfff Banked CPU ROM
+c000-c7ff I/O
+c800-cdff Color RAM
+d000-d7ff "FRONT" tile map
+d800-dfff "BACK" tile map
+e000-efff Main RAM
+f400-f7ff ??? screen frame ???
+f800-f9ff CPU Stack
+fa00-ffff Sprite registers (misc RAM)
+
+
+1) CPU
+
+1 OSC 12 MHz
+1 OSC 5 MHz
+2 YM 2203C.......CaBBe!.
+
+The Z80 runs in IM0,the game expects execution of RST10 each
+frame.
+
+Game level maps,additional code and data are available to main
+program via CPU banking at lacations 8000-bf00
+
+In two of the sets, the encrypted sound program ROM is replaced with a
+double-sized decrypted version. I don0t know if they are bootlegs or originals.
+
+
+
+2) I/O
+
+c000 "KEYCOIN" button
+
+ 76543210
+ || | ||
+ || | |^-COIN 1
+ || | ^--COIN 2
+ || ^-----TEST MODE (on the fly,to be pressed during boot)
+ |^-------START 1
+ ^--------START 2
+
+
+c001 "PAD1"
+c002 "PAD2"
+
+ 76543210
+ ||||||
+ |||||^-RIGHT
+ ||||^--LEFT
+ |||^---DOWN
+ ||^----UP
+ |^-----FIRE 0
+ ^------FIRE 1
+
+
+c003 "DIPSW1"
+
+ 76543210
+ ||||||||
+ |||||||^-UNUSED?
+ ||||||^-->EXTRA
+ |||||^--->LIVES
+ ||||^----CONTINUE MODE
+ |||^-----DEMO SOUND
+ ||^------NORMAL/HARD
+ |^-------LIVES 3/4
+ ^--------ENGLISH/JAP
+
+
+c004 "DIPSW2"
+
+ 76543210
+ ||||||||
+ |||||||^-TEST MODE
+ ||||||^--TABLE/UPRIGHT
+ |||||^---"CREDIT SERVICE"
+ ||||^---->
+ |||^----->>
+ ||^------>>> coin/credit configurations
+ |^------->>
+ ^-------->
+
+c200 Sound command
+ This byte is written when game plays sound effects...
+ it is set when music or sound effects (both pcm and fm) are triggered;
+ I guess it is read by another CPU,then.
+
+c201 Unknown,but used.
+
+c202 Bank selector (0 to 7)
+
+c203 Sprite 'overdraw'
+ this is the most interesting feature of the game,when set
+ the sprites drawn in the previous frame remain on the
+ screen,so the game can perform special effects such as the
+ 'close up' when you die or the "infinite balls" appearing
+ when an extra weapon is collected.
+ Appears to work like a xor mask,a sprite removes older
+ sprite 'bitmap' when present;other memory locations connected to
+ this function may be f400-f7ff...should be investigated more.
+ -mmmh... I believe this is sci-fiction for a non-bitmap game...
+
+C208 Scroll X 0-7
+
+C209 Scroll X MSB
+
+C20A Scroll Y 0-7
+
+C20B Scroll Y MSB
+
+C20C Background ENABLE
+ when set to zero the background is totally black,but
+ sprites are drawn correctly.
+
+
+3) COLOR RAM
+
+The palette system is dynamic,the game can show up to 768 different
+colors on screen.
+
+Palette depth is 12 bits as usual,two consecutive bytes are used for each
+color code.
+
+format: RRRRGGGGBBBB0000
+
+Colors are organized in palettes,since graphics is 4 bits (16 colors)
+each palette takes 32 bytes,the three different layers,BACK,SPRITES and
+FRONT don't share any color,each has its own 256 color space,hence the
+768 colors on screen.
+
+c800-c9ff Background palettes
+ca00-cbff Sprites palettes
+cc00-cdff Foreground palettes
+
+
+4) TILE-BASED LAYERS
+
+The tile format for background and foreground is the same,the
+only difference is that background tiles are 16x16 pixels while foreground
+tiles are only 8x8.
+
+Background virtual screen is 512x512 pixels scrollable.
+
+Two consecutive tiles bytes identify one tile.
+
+ O7 O6 O5 O4 O3 O2 O1 O0 gfx Offset
+ O9 O8 FY FX C3 C2 C1 C0 Attibute
+
+ O= GFX offset (1024 tiles)
+ F= Flip X and Y
+ C= Color palette selector
+
+
+5) SPRITES
+
+Five bytes identify each sprite,but the registers actually used
+are placed at intervals of 16.
+Some of the remaining bytes are used (e.g. fa00),their meaning is totally
+unknown to me,they seem to be related to the surprising additional sprite
+feature of the game,but maybe they're just random writes in RAM.
+
+The first sprite data is located at fa0b,then fa1b and so on.
+
+
+0b Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Y coord
+0c X7 X6 X5 X4 X3 X2 X1 X0 X coord
+0d O9 O8 FY FX -- -- EN X8 hi gfx - FLIP - Enable - hi X
+0e O7 O6 O5 O4 O3 O2 O1 O0 gfx - offset
+0f -- -- -- -- C3 C2 C1 C0 color
+
+ Y= Y coordinate
+ X= X coordinate (X8 is used to clip sprite on the left)
+ O= Gfx offset (1024 sprites)
+ F= Flip
+ EN= Enable (this is maybe the Y8 coordinate bit,but it isn't set
+ accordingly in the test mode
+ C= Color palette selector
+
+***************************************************************************/
+
+
+#include "driver.h"
+#include "sound/2203intf.h"
+#include "sound/samples.h"
+#include "machine/mc8123.h"
+
+extern WRITE8_HANDLER( ninjakd2_bgvideoram_w );
+extern WRITE8_HANDLER( ninjakd2_fgvideoram_w );
+extern WRITE8_HANDLER( ninjakd2_scrollx_w );
+extern WRITE8_HANDLER( ninjakd2_scrolly_w );
+extern WRITE8_HANDLER( ninjakd2_sprite_overdraw_w );
+extern WRITE8_HANDLER( ninjakd2_background_enable_w );
+extern VIDEO_START( ninjakd2 );
+extern VIDEO_UPDATE( ninjakd2 );
+
+extern UINT8 *ninjakd2_bg_videoram, *ninjakd2_fg_videoram;
+
+static int ninjakd2_bank_latch = 255;
+static INT16 *sampledata[8];
+static int samplelen[8];
+
+static void ninjakd2_init_samples(void)
+{
+ int i,n;
+ UINT8 *source = memory_region(REGION_SOUND1);
+ static const int sample_info [9][2] = { {0x0000,0x0A00},{0x0A00,0x1D00},{0x2700,0x1700},
+ {0x3E00,0x1500},{0x5300,0x0B00},{0x5E00,0x0A00},{0x6800,0x0E00},{0x7600,0x1E00},{0xF000,0x0400} };
+
+ for (i=0;i<8;i++)
+ {
+ sampledata[i] = auto_malloc(sample_info[i][1] * sizeof(sampledata[0]));
+ samplelen[i] = sample_info[i][1];
+ for (n=0; n<sample_info[i][1]; n++)
+ sampledata[i][n] = (INT8)(source[sample_info[i][0]+n] ^ 0x80) * 256;
+ }
+}
+
+
+static INTERRUPT_GEN( ninjakd2_interrupt )
+{
+ cpunum_set_input_line_and_vector(0, 0, HOLD_LINE, 0xd7); /* RST 10h */
+}
+
+#ifdef UNUSED_FUNCTION
+READ8_HANDLER( ninjakd2_bankselect_r )
+{
+ return ninjakd2_bank_latch;
+}
+#endif
+
+static WRITE8_HANDLER( ninjakd2_bankselect_w )
+{
+ UINT8 *ROM = memory_region(REGION_CPU1);
+ int bankaddress;
+
+ if (data != ninjakd2_bank_latch)
+ {
+ ninjakd2_bank_latch = data;
+
+ bankaddress = 0x10000 + ((data & 0x7) * 0x4000);
+ memory_set_bankptr(1,&ROM[bankaddress]); /* Select 8 banks of 16k */
+ }
+}
+
+static WRITE8_HANDLER( ninjakd2_pcm_play_w )
+{
+ int i;
+ static const int sample_no[9] = { 0x00,0x0A,0x27,0x3E,0x53,0x5E,0x68,0x76,0xF0 };
+
+ for(i=0;i<9;i++)
+ if (sample_no[i]==data) break;
+
+ if (i==8)
+ sample_stop(0);
+ else
+ sample_start_raw(0,sampledata[i],samplelen[i],16000,0);
+}
+
+static ADDRESS_MAP_START( ninjakd2_main_cpu, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1)
+ AM_RANGE(0xc000, 0xc000) AM_READ(input_port_2_r)
+ AM_RANGE(0xc001, 0xc001) AM_READ(input_port_0_r)
+ AM_RANGE(0xc002, 0xc002) AM_READ(input_port_1_r)
+ AM_RANGE(0xc003, 0xc003) AM_READ(input_port_3_r)
+ AM_RANGE(0xc004, 0xc004) AM_READ(input_port_4_r)
+ AM_RANGE(0xc200, 0xc200) AM_WRITE(soundlatch_w)
+ AM_RANGE(0xc201, 0xc201) AM_WRITENOP // unknown but used
+ AM_RANGE(0xc202, 0xc202) AM_WRITE(ninjakd2_bankselect_w)
+ AM_RANGE(0xc203, 0xc203) AM_WRITE(ninjakd2_sprite_overdraw_w)
+ AM_RANGE(0xc208, 0xc209) AM_WRITE(ninjakd2_scrollx_w)
+ AM_RANGE(0xc20a, 0xc20b) AM_WRITE(ninjakd2_scrolly_w)
+ AM_RANGE(0xc20c, 0xc20c) AM_WRITE(ninjakd2_background_enable_w)
+ AM_RANGE(0xc800, 0xcdff) AM_RAM AM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE(&paletteram)
+ AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_WRITE(ninjakd2_fgvideoram_w) AM_BASE(&ninjakd2_fg_videoram)
+ AM_RANGE(0xd800, 0xdfff) AM_RAM AM_WRITE(ninjakd2_bgvideoram_w) AM_BASE(&ninjakd2_bg_videoram)
+ AM_RANGE(0xe000, 0xf9ff) AM_RAM
+ AM_RANGE(0xfa00, 0xffff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( ninjakd2_sound_cpu, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0xbfff) AM_ROM
+ AM_RANGE(0xc000, 0xc7ff) AM_RAM
+ AM_RANGE(0xe000, 0xe000) AM_READ(soundlatch_r)
+ AM_RANGE(0xefee, 0xefee) AM_NOP /* CHIP COMMAND ?? */
+ AM_RANGE(0xeff5, 0xeff6) AM_WRITENOP /* SAMPLE FREQUENCY ??? */
+ AM_RANGE(0xf000, 0xf000) AM_WRITE(ninjakd2_pcm_play_w) /* PCM SAMPLE OFFSET*256 */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( ninjakd2_sound_io, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x00) AM_WRITE(YM2203_control_port_0_w)
+ AM_RANGE(0x01, 0x01) AM_WRITE(YM2203_write_port_0_w)
+ AM_RANGE(0x80, 0x80) AM_WRITE(YM2203_control_port_1_w)
+ AM_RANGE(0x81, 0x81) AM_WRITE(YM2203_write_port_1_w)
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( ninjakd2 )
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ 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 /* player 2 controls */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) /* keep pressed during boot to enter service mode */
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
+
+ PORT_START /* dsw1 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:2,3")
+ PORT_DIPSETTING( 0x04, "20000 50000" )
+ PORT_DIPSETTING( 0x06, "30000 50000" )
+ PORT_DIPSETTING( 0x02, "50000 100000" )
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x20, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hard ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x40, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Language ) ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( English ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Japanese ) )
+
+ PORT_START /* dsw2 */
+ PORT_SERVICE_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW2:1" )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x04, 0x00, "Credit Service" ) PORT_DIPLOCATION("SW2:3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:4,5")
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:6,7,8")
+ PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0xe0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0xa0, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_4C ) )
+INPUT_PORTS_END
+
+
+
+static const gfx_layout charlayout =
+{
+ 8,8, /* 8*8 characters */
+ 1024, /* 1024 characters */
+ 4, /* 4 bits per pixel */
+ {0,1,2,3 }, /* the bitplanes are packed in one nibble */
+ {0, 4, 16384*8+0, 16384*8+4, 8, 12, 16384*8+8, 16384*8+12 },
+ {16*0, 16*1, 16*2, 16*3, 16*4, 16*5, 16*6, 16*7 },
+ 8*16
+};
+
+static const gfx_layout spritelayout =
+{
+ 16,16, /* 16*16 characters */
+ 1024, /* 1024 sprites */
+ 4, /* 4 bits per pixel */
+ {0,1,2,3}, /* the bitplanes are packed in one nibble */
+ {0, 4, 65536*8+0, 65536*8+4, 8, 12, 65536*8+8, 65536*8+12,
+ 16*8+0, 16*8+4, 16*8+65536*8+0, 16*8+65536*8+4, 16*8+8, 16*8+12, 16*8+65536*8+8, 16*8+65536*8+12},
+ {16*0, 16*1, 16*2, 16*3, 16*4, 16*5, 16*6, 16*7,
+ 32*8+16*0, 32*8+16*1, 32*8+16*2, 32*8+16*3, 32*8+16*4, 32*8+16*5, 32*8+16*6, 32*8+16*7},
+ 8*64
+};
+
+static GFXDECODE_START( ninjakd2 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, spritelayout, 0*16, 16 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, spritelayout, 16*16, 16 )
+ GFXDECODE_ENTRY( REGION_GFX3, 0, charlayout, 32*16, 16 )
+GFXDECODE_END
+
+static struct Samplesinterface samples_interface =
+{
+ 1, /* 1 channel */
+ NULL,
+ ninjakd2_init_samples
+};
+
+/* handler called by the 2203 emulator when the internal timers cause an IRQ */
+static void irqhandler(int irq)
+{
+ cpunum_set_input_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE);
+}
+
+static struct YM2203interface ym2203_interface =
+{
+ 0,0,0,0,irqhandler
+};
+
+
+static MACHINE_DRIVER_START( ninjakd2 )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 12000000/2) /* 12000000/2 ??? */
+ MDRV_CPU_PROGRAM_MAP(ninjakd2_main_cpu,0) /* very sensitive to these settings */
+ MDRV_CPU_VBLANK_INT(ninjakd2_interrupt,1)
+
+ MDRV_CPU_ADD(Z80, 5000000)
+ /* audio CPU */ /* 5mhz crystal ??? */
+ MDRV_CPU_PROGRAM_MAP(ninjakd2_sound_cpu,0)
+ MDRV_CPU_IO_MAP(ninjakd2_sound_io,0)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(10000))
+
+ /* 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, 28*8-1)
+ MDRV_GFXDECODE(ninjakd2)
+ MDRV_PALETTE_LENGTH(768)
+
+ MDRV_VIDEO_START(ninjakd2)
+ MDRV_VIDEO_UPDATE(ninjakd2)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM2203, 1500000)
+ MDRV_SOUND_CONFIG(ym2203_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+
+ MDRV_SOUND_ADD(YM2203, 1500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+
+ MDRV_SOUND_ADD(SAMPLES, 0)
+ MDRV_SOUND_CONFIG(samples_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+MACHINE_DRIVER_END
+
+
+
+ROM_START( ninjakd2 )
+ ROM_REGION( 0x30000, REGION_CPU1, 0 )
+ ROM_LOAD( "nk2_01.rom", 0x00000, 0x8000, CRC(3cdbb906) SHA1(f48f82528b5fc581ee3b1ccd0ef9cdecc7249bb3) )
+ ROM_LOAD( "nk2_02.rom", 0x10000, 0x8000, CRC(b5ce9a1a) SHA1(295a7e1d41e1a8ee45f1250086a0c9314837eded) )
+ ROM_LOAD( "nk2_03.rom", 0x18000, 0x8000, CRC(ad275654) SHA1(7d29a17132adb19aeee9b98be5b76bd6e91f308e) )
+ ROM_LOAD( "nk2_04.rom", 0x20000, 0x8000, CRC(e7692a77) SHA1(84beb8b02c564bffa9cc00313214e8f109bd40f9) )
+ ROM_LOAD( "nk2_05.rom", 0x28000, 0x8000, CRC(5dac9426) SHA1(0916cddbbe1e93c32b96fe28e145d34b2a892e80) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "nk2_06.rom", 0x0000, 0x10000, CRC(d3a18a79) SHA1(e4df713f89d8a8b43ef831b14864c50ec9b53f0b) ) // sound z80 code encrypted
+
+ ROM_REGION( 0x2000, REGION_USER1, 0 ) /* MC8123 key */
+ ROM_LOAD( "ninjakd2.key", 0x0000, 0x2000, CRC(ec25318f) SHA1(619da3f69f9919e1457f79ee1d38e7ec80c4ebb0) )
+
+ ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_11.rom", 0x00000, 0x4000, CRC(41a714b3) SHA1(b05f48d71a9837914c12c13e0b479c8a6dc8c25e) ) /* background tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_10.rom", 0x08000, 0x4000, CRC(c913c4ab) SHA1(f822c5621b3e32c1a284f6367bdcace81c1c74b3) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_08.rom", 0x00000, 0x4000, CRC(1b79c50a) SHA1(8954bc51cb9fbbe16b09381f35c84ccc56a803f3) ) /* sprites tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_07.rom", 0x08000, 0x4000, CRC(0be5cd13) SHA1(8f94a8fef6668aaf13329715fee81302dbd6c685) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x08000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_12.rom", 0x00000, 0x02000, CRC(db5657a9) SHA1(abbb033edb9a5a0c66ee5981d1e4df1ab334a82d) ) /* foreground tiles */
+ ROM_CONTINUE( 0x04000, 0x02000)
+ ROM_CONTINUE( 0x02000, 0x02000)
+ ROM_CONTINUE( 0x06000, 0x02000)
+
+ ROM_REGION( 0x10000, REGION_SOUND1, 0 )
+ ROM_LOAD( "nk2_09.rom", 0x0000, 0x10000, CRC(c1d2d170) SHA1(0f325815086fde90fd85360d3660042b0b68ba96) ) /* raw pcm samples */
+ROM_END
+
+ROM_START( ninjak2a )
+ ROM_REGION( 0x30000, REGION_CPU1, 0 )
+ ROM_LOAD( "nk2_01.bin", 0x00000, 0x8000, CRC(e6adca65) SHA1(33d483dde0853f37455cde32b461f4e919601b4b) )
+ ROM_LOAD( "nk2_02.bin", 0x10000, 0x8000, CRC(d9284bd1) SHA1(e790fb1a718a1f7997931f2f390fe053655f231d) )
+ ROM_LOAD( "nk2_03.rom", 0x18000, 0x8000, CRC(ad275654) SHA1(7d29a17132adb19aeee9b98be5b76bd6e91f308e) )
+ ROM_LOAD( "nk2_04.rom", 0x20000, 0x8000, CRC(e7692a77) SHA1(84beb8b02c564bffa9cc00313214e8f109bd40f9) )
+ ROM_LOAD( "nk2_05.bin", 0x28000, 0x8000, CRC(960725fb) SHA1(160c8bfaf089cbeeef2023f12379793079bff93b) )
+
+ ROM_REGION( 2*0x10000, REGION_CPU2, 0 ) /* 64k for code + 64k for decrypted opcodes */
+ ROM_LOAD( "nk2_06.bin", 0x10000, 0x8000, CRC(7bfe6c9e) SHA1(aef8cbeb0024939bf65f77113a5cf777f6613722) ) /* decrypted opcodes */
+ ROM_CONTINUE( 0x00000, 0x8000 ) /* decrypted data */
+
+ ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_11.rom", 0x00000, 0x4000, CRC(41a714b3) SHA1(b05f48d71a9837914c12c13e0b479c8a6dc8c25e) ) /* background tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_10.rom", 0x08000, 0x4000, CRC(c913c4ab) SHA1(f822c5621b3e32c1a284f6367bdcace81c1c74b3) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_08.rom", 0x00000, 0x4000, CRC(1b79c50a) SHA1(8954bc51cb9fbbe16b09381f35c84ccc56a803f3) ) /* sprites tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_07.rom", 0x08000, 0x4000, CRC(0be5cd13) SHA1(8f94a8fef6668aaf13329715fee81302dbd6c685) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x08000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_12.rom", 0x00000, 0x02000, CRC(db5657a9) SHA1(abbb033edb9a5a0c66ee5981d1e4df1ab334a82d) ) /* foreground tiles */
+ ROM_CONTINUE( 0x04000, 0x02000)
+ ROM_CONTINUE( 0x02000, 0x02000)
+ ROM_CONTINUE( 0x06000, 0x02000)
+
+ ROM_REGION( 0x10000, REGION_SOUND1, 0 )
+ ROM_LOAD( "nk2_09.rom", 0x0000, 0x10000, CRC(c1d2d170) SHA1(0f325815086fde90fd85360d3660042b0b68ba96) ) /* raw pcm samples */
+ROM_END
+
+ROM_START( ninjak2b )
+ ROM_REGION( 0x30000, REGION_CPU1, 0 )
+ ROM_LOAD( "1.3s", 0x00000, 0x8000, CRC(cb4f4624) SHA1(4fc66641adc0a2c0eca332f27c5777df62fa507b) )
+ ROM_LOAD( "2.3q", 0x10000, 0x8000, CRC(0ad0c100) SHA1(c5bbc107ba07bd6950bb4d7377e827c084b8229b) )
+ ROM_LOAD( "nk2_03.rom", 0x18000, 0x8000, CRC(ad275654) SHA1(7d29a17132adb19aeee9b98be5b76bd6e91f308e) )
+ ROM_LOAD( "nk2_04.rom", 0x20000, 0x8000, CRC(e7692a77) SHA1(84beb8b02c564bffa9cc00313214e8f109bd40f9) )
+ ROM_LOAD( "nk2_05.rom", 0x28000, 0x8000, CRC(5dac9426) SHA1(0916cddbbe1e93c32b96fe28e145d34b2a892e80) )
+
+ ROM_REGION( 2*0x10000, REGION_CPU2, 0 ) /* 64k for code + 64k for decrypted opcodes */
+ ROM_LOAD( "nk2_06.bin", 0x10000, 0x8000, CRC(7bfe6c9e) SHA1(aef8cbeb0024939bf65f77113a5cf777f6613722) ) /* decrypted opcodes */
+ ROM_CONTINUE( 0x00000, 0x8000 ) /* decrypted data */
+
+ ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_11.rom", 0x00000, 0x4000, CRC(41a714b3) SHA1(b05f48d71a9837914c12c13e0b479c8a6dc8c25e) ) /* background tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_10.rom", 0x08000, 0x4000, CRC(c913c4ab) SHA1(f822c5621b3e32c1a284f6367bdcace81c1c74b3) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_08.rom", 0x00000, 0x4000, CRC(1b79c50a) SHA1(8954bc51cb9fbbe16b09381f35c84ccc56a803f3) ) /* sprites tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_07.rom", 0x08000, 0x4000, CRC(0be5cd13) SHA1(8f94a8fef6668aaf13329715fee81302dbd6c685) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x08000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_12.rom", 0x00000, 0x02000, CRC(db5657a9) SHA1(abbb033edb9a5a0c66ee5981d1e4df1ab334a82d) ) /* foreground tiles */
+ ROM_CONTINUE( 0x04000, 0x02000)
+ ROM_CONTINUE( 0x02000, 0x02000)
+ ROM_CONTINUE( 0x06000, 0x02000)
+
+ ROM_REGION( 0x10000, REGION_SOUND1, 0 )
+ ROM_LOAD( "nk2_09.rom", 0x0000, 0x10000, CRC(c1d2d170) SHA1(0f325815086fde90fd85360d3660042b0b68ba96) ) /* raw pcm samples */
+ROM_END
+
+ROM_START( rdaction )
+ ROM_REGION( 0x30000, REGION_CPU1, 0 )
+ ROM_LOAD( "1.3u", 0x00000, 0x8000, CRC(5c475611) SHA1(2da88a95b5d68b259c8ae48af1438a82a1d601c1) )
+ ROM_LOAD( "2.3s", 0x10000, 0x8000, CRC(a1e23bd2) SHA1(c3b6574dc9fa66b4f41c37754a0d20a865f8bc28) )
+ ROM_LOAD( "nk2_03.rom", 0x18000, 0x8000, CRC(ad275654) SHA1(7d29a17132adb19aeee9b98be5b76bd6e91f308e) )
+ ROM_LOAD( "nk2_04.rom", 0x20000, 0x8000, CRC(e7692a77) SHA1(84beb8b02c564bffa9cc00313214e8f109bd40f9) )
+ ROM_LOAD( "nk2_05.bin", 0x28000, 0x8000, CRC(960725fb) SHA1(160c8bfaf089cbeeef2023f12379793079bff93b) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for code + 64k for decrypted opcodes */
+ ROM_LOAD( "nk2_06.rom", 0x0000, 0x10000, CRC(d3a18a79) SHA1(e4df713f89d8a8b43ef831b14864c50ec9b53f0b) ) // sound z80 code encrypted
+
+ ROM_REGION( 0x2000, REGION_USER1, 0 ) /* MC8123 key */
+ ROM_LOAD( "ninjakd2.key", 0x0000, 0x2000, CRC(ec25318f) SHA1(619da3f69f9919e1457f79ee1d38e7ec80c4ebb0) )
+
+ ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_11.rom", 0x00000, 0x4000, CRC(41a714b3) SHA1(b05f48d71a9837914c12c13e0b479c8a6dc8c25e) ) /* background tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_10.rom", 0x08000, 0x4000, CRC(c913c4ab) SHA1(f822c5621b3e32c1a284f6367bdcace81c1c74b3) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "nk2_08.rom", 0x00000, 0x4000, CRC(1b79c50a) SHA1(8954bc51cb9fbbe16b09381f35c84ccc56a803f3) ) /* sprites tiles */
+ ROM_CONTINUE( 0x10000, 0x4000)
+ ROM_CONTINUE( 0x04000, 0x4000)
+ ROM_CONTINUE( 0x14000, 0x4000)
+ ROM_LOAD( "nk2_07.rom", 0x08000, 0x4000, CRC(0be5cd13) SHA1(8f94a8fef6668aaf13329715fee81302dbd6c685) )
+ ROM_CONTINUE( 0x18000, 0x4000)
+ ROM_CONTINUE( 0x0c000, 0x4000)
+ ROM_CONTINUE( 0x1c000, 0x4000)
+
+ ROM_REGION( 0x08000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "12.5n", 0x00000, 0x02000, CRC(0936b365) SHA1(3705f42b76ab474357e77c1a9b8e3755c7ab2c0c) ) /* foreground tiles */
+ ROM_CONTINUE( 0x04000, 0x02000)
+ ROM_CONTINUE( 0x02000, 0x02000)
+ ROM_CONTINUE( 0x06000, 0x02000)
+
+ ROM_REGION( 0x10000, REGION_SOUND1, 0 )
+ ROM_LOAD( "nk2_09.rom", 0x0000, 0x10000, CRC(c1d2d170) SHA1(0f325815086fde90fd85360d3660042b0b68ba96) ) /* raw pcm samples */
+ROM_END
+
+
+
+static DRIVER_INIT( ninjakd2 )
+{
+ mc8123_decrypt_rom(1, memory_region(REGION_USER1), 0, 0);
+}
+
+static DRIVER_INIT( bootleg )
+{
+ memory_set_decrypted_region(1, 0x0000, 0x7fff, memory_region(REGION_CPU2) + 0x10000);
+}
+
+
+
+GAME( 1987, ninjakd2, 0, ninjakd2, ninjakd2, ninjakd2, ROT0, "UPL", "Ninja-Kid II (set 1)", 0 )
+GAME( 1987, ninjak2a, ninjakd2, ninjakd2, ninjakd2, bootleg, ROT0, "UPL", "Ninja-Kid II (set 2)", 0 )
+GAME( 1987, ninjak2b, ninjakd2, ninjakd2, ninjakd2, bootleg, ROT0, "UPL", "Ninja-Kid II (set 3)", 0 )
+GAME( 1987, rdaction, ninjakd2, ninjakd2, ninjakd2, ninjakd2, ROT0, "UPL (World Games license)", "Rad Action", 0 )