summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/karnov.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/karnov.c')
-rw-r--r--src/mame/drivers/karnov.c1029
1 files changed, 1029 insertions, 0 deletions
diff --git a/src/mame/drivers/karnov.c b/src/mame/drivers/karnov.c
new file mode 100644
index 00000000000..0a13ef25c08
--- /dev/null
+++ b/src/mame/drivers/karnov.c
@@ -0,0 +1,1029 @@
+/***************************************************************************
+
+ Karnov (USA version) (c) 1987 Data East USA
+ Karnov (Japanese version) (c) 1987 Data East Corporation
+ Wonder Planet (Japanese version) (c) 1987 Data East Corporation
+ Chelnov (World version) (c) 1987 Data East Corporation
+ Chelnov (USA version) (c) 1988 Data East USA
+ Chelnov (Japanese version) (c) 1987 Data East Corporation
+
+
+ Emulation by Bryan McPhail, mish@tendril.co.uk
+
+
+ NOTE! Karnov USA & Karnov Japan sets have different gameplay!
+ and Chelnov USA & Chelnov Japan sets have different gameplay!
+
+ These games use a 68000 main processor with a 6502, YM2203C and YM3526 for
+ sound. Karnov was a major pain to get going because of the
+ 'protection' on the main player sprite, probably connected to the Intel
+ microcontroller on the board. The game is very sensitive to the wrong values
+ at the input ports...
+
+ There is another Karnov rom set - a bootleg version of the Japanese roms with
+ the Data East copyright removed - not supported because the original Japanese
+ roms work fine.
+
+ One of the two color PROMs for chelnov and chelnoj is different; one is most
+ likely a bad read, but I don't know which one.
+
+ Thanks to Oliver Stabel <stabel@rhein-neckar.netsurf.de> for confirming some
+ of the sprite & control information :)
+
+ Cheats:
+
+ Karnov - put 0x30 at 0x60201 to skip a level
+ Chelnov - level number at 0x60189 - enter a value at cartoon intro
+
+*******************************************************************************/
+
+#include "driver.h"
+#include "sound/2203intf.h"
+#include "sound/3812intf.h"
+
+PALETTE_INIT( karnov );
+VIDEO_UPDATE( karnov );
+WRITE16_HANDLER( karnov_playfield_w );
+WRITE16_HANDLER( karnov_videoram_w );
+void karnov_flipscreen_w(int data);
+
+VIDEO_START( karnov );
+VIDEO_START( wndrplnt );
+
+enum { KARNOV=0, KARNOVJ, CHELNOV, CHELNOVJ, CHELNOVW, WNDRPLNT };
+
+static UINT16 i8751_return,i8751_needs_ack,i8751_coin_pending,i8751_command_queue;
+static UINT16 *karnov_ram;
+extern UINT16 karnov_scroll[2], *karnov_pf_data;
+static int microcontroller_id,coin_mask;
+
+/******************************************************************************/
+
+/* Emulation of the protected microcontroller - for coins & general protection */
+static void karnov_i8751_w(int data)
+{
+ /* Pending coin operations may cause protection commands to be queued */
+ if (i8751_needs_ack) {
+ i8751_command_queue=data;
+ return;
+ }
+
+ i8751_return=0;
+ if (data==0x100 && microcontroller_id==KARNOVJ) i8751_return=0x56a; /* Japan version */
+ if (data==0x100 && microcontroller_id==KARNOV) i8751_return=0x56b; /* USA version */
+ if ((data&0xf00)==0x300) i8751_return=(data&0xff)*0x12; /* Player sprite mapping */
+
+ /* I'm not sure the ones marked ^ appear in the right order */
+ if (data==0x400) i8751_return=0x4000; /* Get The Map... */
+ if (data==0x402) i8751_return=0x40a6; /* Ancient Ruins */
+ if (data==0x403) i8751_return=0x4054; /* Forest... */
+ if (data==0x404) i8751_return=0x40de; /* ^Rocky hills */
+ if (data==0x405) i8751_return=0x4182; /* Sea */
+ if (data==0x406) i8751_return=0x41ca; /* Town */
+ if (data==0x407) i8751_return=0x421e; /* Desert */
+ if (data==0x401) i8751_return=0x4138; /* ^Whistling wind */
+ if (data==0x408) i8751_return=0x4276; /* ^Heavy Gates */
+
+// if (!i8751_return && data!=0x300) logerror("CPU %04x - Unknown Write %02x intel\n",activecpu_get_pc(),data);
+
+ cpunum_set_input_line(0,6,HOLD_LINE); /* Signal main cpu task is complete */
+ i8751_needs_ack=1;
+}
+
+static void wndrplnt_i8751_w(int data)
+{
+ /* The last command hasn't been ACK'd (probably a conflict with coin command) */
+ if (i8751_needs_ack) {
+ i8751_command_queue=data;
+ return;
+ }
+
+ i8751_return=0;
+ if (data==0x100) i8751_return=0x67a;
+ if (data==0x200) i8751_return=0x214;
+ if (data==0x300) i8751_return=0x17; /* Copyright text on title screen */
+// if (data==0x300) i8751_return=0x1; /* (USA) Copyright text on title screen */
+
+ /* The game writes many values in the 0x600 range, but only a specific mask
+ matters for the return value */
+ if ((data&0x600)==0x600) {
+ switch (data&0x18) {
+ case 0x00: i8751_return=0x4d53; break;
+ case 0x08: i8751_return=0x4b54; break;
+ case 0x10: i8751_return=0x5453; break;
+ case 0x18: i8751_return=0x5341; break;
+ }
+ }
+// else logerror("CPU %04x - Unknown Write %02x intel\n",activecpu_get_pc(),data);
+
+ /* These are 68k function call addresses - different address for each power-up */
+ if (data==0x400) i8751_return=0x594;
+ if (data==0x401) i8751_return=0x5ea;
+ if (data==0x402) i8751_return=0x628;
+ if (data==0x403) i8751_return=0x66c;
+ if (data==0x404) i8751_return=0x6a4;
+ if (data==0x405) i8751_return=0x6a4;
+ if (data==0x406) i8751_return=0x6a4;
+
+ /* This is 68k program code which is executed every frame */
+ if (data==0x50c) i8751_return=0x13fc;
+ if (data==0x50b) i8751_return=0x00ff;
+ if (data==0x50a) i8751_return=0x0006;
+ if (data==0x509) i8751_return=0x0000;
+ if (data==0x508) i8751_return=0x4a39;
+ if (data==0x507) i8751_return=0x0006;
+ if (data==0x506) i8751_return=0x0000;
+ if (data==0x505) i8751_return=0x66f8;
+ if (data==0x504) i8751_return=0x4a39;
+ if (data==0x503) i8751_return=0x000c;
+ if (data==0x502) i8751_return=0x0003;
+ if (data==0x501) i8751_return=0x6bf8;
+ if (data==0x500) i8751_return=0x4e75;
+
+ cpunum_set_input_line(0,6,HOLD_LINE); /* Signal main cpu task is complete */
+ i8751_needs_ack=1;
+}
+
+static void chelnov_i8751_w(int data)
+{
+ static int level;
+
+ /* Pending coin operations may cause protection commands to be queued */
+ if (i8751_needs_ack) {
+ i8751_command_queue=data;
+ return;
+ }
+
+ i8751_return=0;
+ if (data==0x200 && microcontroller_id==CHELNOVJ) i8751_return=0x7734; /* Japan version */
+ if (data==0x200 && microcontroller_id==CHELNOV) i8751_return=0x783e; /* USA version */
+ if (data==0x200 && microcontroller_id==CHELNOVW) i8751_return=0x7736; /* World version */
+ if (data==0x100 && microcontroller_id==CHELNOVJ) i8751_return=0x71a; /* Japan version */
+ if (data==0x100 && microcontroller_id==CHELNOV) i8751_return=0x71b; /* USA version */
+ if (data==0x100 && microcontroller_id==CHELNOVW) i8751_return=0x71c; /* World version */
+
+ if (data>=0x6000 && data<0x8000) i8751_return=1; /* patched */
+ if ((data&0xf000)==0x1000) level=1; /* Level 1 */
+ if ((data&0xf000)==0x2000) level++; /* Level Increment */
+ if ((data&0xf000)==0x3000) { /* Sprite table mapping */
+ int b=data&0xff;
+ switch (level) {
+ case 1: /* Level 1, Sprite mapping tables */
+ if (microcontroller_id==CHELNOV) { /* USA */
+ if (b<2) i8751_return=0;
+ else if (b<6) i8751_return=1;
+ else if (b<0xb) i8751_return=2;
+ else if (b<0xf) i8751_return=3;
+ else if (b<0x13) i8751_return=4;
+ else i8751_return=5;
+ } else { /* Japan, World */
+ if (b<3) i8751_return=0;
+ else if (b<8) i8751_return=1;
+ else if (b<0xc) i8751_return=2;
+ else if (b<0x10) i8751_return=3;
+ else if (b<0x19) i8751_return=4;
+ else if (b<0x1b) i8751_return=5;
+ else if (b<0x22) i8751_return=6;
+ else if (b<0x28) i8751_return=7;
+ else i8751_return=8;
+ }
+ break;
+ case 2: /* Level 2, Sprite mapping tables, USA & Japan are the same */
+ if (b<3) i8751_return=0;
+ else if (b<9) i8751_return=1;
+ else if (b<0x11) i8751_return=2;
+ else if (b<0x1b) i8751_return=3;
+ else if (b<0x21) i8751_return=4;
+ else if (b<0x28) i8751_return=5;
+ else i8751_return=6;
+ break;
+ case 3: /* Level 3, Sprite mapping tables, USA & Japan are the same */
+ if (b<5) i8751_return=0;
+ else if (b<9) i8751_return=1;
+ else if (b<0xd) i8751_return=2;
+ else if (b<0x11) i8751_return=3;
+ else if (b<0x1b) i8751_return=4;
+ else if (b<0x1c) i8751_return=5;
+ else if (b<0x22) i8751_return=6;
+ else if (b<0x27) i8751_return=7;
+ else i8751_return=8;
+ break;
+ case 4: /* Level 4, Sprite mapping tables, USA & Japan are the same */
+ if (b<4) i8751_return=0;
+ else if (b<0xc) i8751_return=1;
+ else if (b<0xf) i8751_return=2;
+ else if (b<0x19) i8751_return=3;
+ else if (b<0x1c) i8751_return=4;
+ else if (b<0x22) i8751_return=5;
+ else if (b<0x29) i8751_return=6;
+ else i8751_return=7;
+ break;
+ case 5: /* Level 5, Sprite mapping tables */
+ if (b<7) i8751_return=0;
+ else if (b<0xe) i8751_return=1;
+ else if (b<0x14) i8751_return=2;
+ else if (b<0x1a) i8751_return=3;
+ else if (b<0x23) i8751_return=4;
+ else if (b<0x27) i8751_return=5;
+ else i8751_return=6;
+ break;
+ case 6: /* Level 6, Sprite mapping tables */
+ if (b<3) i8751_return=0;
+ else if (b<0xb) i8751_return=1;
+ else if (b<0x11) i8751_return=2;
+ else if (b<0x17) i8751_return=3;
+ else if (b<0x1d) i8751_return=4;
+ else if (b<0x24) i8751_return=5;
+ else i8751_return=6;
+ break;
+ case 7: /* Level 7, Sprite mapping tables */
+ if (b<5) i8751_return=0;
+ else if (b<0xb) i8751_return=1;
+ else if (b<0x11) i8751_return=2;
+ else if (b<0x1a) i8751_return=3;
+ else if (b<0x21) i8751_return=4;
+ else if (b<0x27) i8751_return=5;
+ else i8751_return=6;
+ break;
+ }
+ }
+
+// logerror("CPU %04x - Unknown Write %02x intel\n",activecpu_get_pc(),data);
+
+ cpunum_set_input_line(0,6,HOLD_LINE); /* Signal main cpu task is complete */
+ i8751_needs_ack=1;
+}
+
+/******************************************************************************/
+
+static WRITE16_HANDLER( karnov_control_w )
+{
+ /* Mnemonics filled in from the schematics, brackets are my comments */
+ switch (offset<<1) {
+ case 0: /* SECLR (Interrupt ack for Level 6 i8751 interrupt) */
+ cpunum_set_input_line(0,6,CLEAR_LINE);
+
+ if (i8751_needs_ack) {
+ /* If a command and coin insert happen at once, then the i8751 will queue the
+ coin command until the previous command is ACK'd */
+ if (i8751_coin_pending) {
+ i8751_return=i8751_coin_pending;
+ cpunum_set_input_line(0,6,HOLD_LINE);
+ i8751_coin_pending=0;
+ } else if (i8751_command_queue) {
+ /* Pending control command - just write it back as SECREQ */
+ i8751_needs_ack=0;
+ karnov_control_w(3,i8751_command_queue,0xffff);
+ i8751_command_queue=0;
+ } else {
+ i8751_needs_ack=0;
+ }
+ }
+ return;
+
+ case 2: /* SONREQ (Sound CPU byte) */
+ soundlatch_w(0,data&0xff);
+ cpunum_set_input_line (1, INPUT_LINE_NMI, PULSE_LINE);
+ break;
+
+ case 4: /* DM (DMA to buffer spriteram) */
+ buffer_spriteram16_w(0,0,0);
+ break;
+
+ case 6: /* SECREQ (Interrupt & Data to i8751) */
+ if (microcontroller_id==KARNOV || microcontroller_id==KARNOVJ) karnov_i8751_w(data);
+ if (microcontroller_id==CHELNOV || microcontroller_id==CHELNOVJ || microcontroller_id==CHELNOVW) chelnov_i8751_w(data);
+ if (microcontroller_id==WNDRPLNT) wndrplnt_i8751_w(data);
+ break;
+
+ case 8: /* HSHIFT (9 bits) - Top bit indicates video flip */
+ COMBINE_DATA(&karnov_scroll[0]);
+ karnov_flipscreen_w(data>>15);
+ break;
+
+ case 0xa: /* VSHIFT */
+ COMBINE_DATA(&karnov_scroll[1]);
+ break;
+
+ case 0xc: /* SECR (Reset i8751) */
+ logerror("Reset i8751\n");
+ i8751_needs_ack=0;
+ i8751_coin_pending=0;
+ i8751_command_queue=0;
+ i8751_return=0;
+ break;
+
+ case 0xe: /* INTCLR (Interrupt ack for Level 7 vbl interrupt) */
+ cpunum_set_input_line(0,7,CLEAR_LINE);
+ break;
+ }
+}
+
+/******************************************************************************/
+
+static READ16_HANDLER( karnov_control_r )
+{
+ switch (offset<<1) {
+ case 0: /* Player controls */
+ return ( readinputportbytag("IN0") + (readinputportbytag("IN1")<<8));
+ case 2: /* Start buttons & VBL */
+ return readinputportbytag("IN2");
+ case 4: /* Dipswitch A & B */
+ return ( readinputportbytag("DSW1") + (readinputportbytag("DSW2")<<8));
+ case 6: /* i8751 return values */
+ return i8751_return;
+ }
+
+ return ~0;
+}
+
+/******************************************************************************/
+
+static ADDRESS_MAP_START( karnov_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x05ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x060000, 0x063fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x080000, 0x080fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x0a0000, 0x0a07ff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x0c0000, 0x0c0007) AM_READ(karnov_control_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( karnov_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x05ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x060000, 0x063fff) AM_WRITE(MWA16_RAM) AM_BASE(&karnov_ram)
+ AM_RANGE(0x080000, 0x080fff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ AM_RANGE(0x0a0000, 0x0a07ff) AM_WRITE(karnov_videoram_w) AM_BASE(&videoram16)
+ AM_RANGE(0x0a0800, 0x0a0fff) AM_WRITE(karnov_videoram_w) /* Wndrplnt Mirror */
+ AM_RANGE(0x0a1000, 0x0a1fff) AM_WRITE(karnov_playfield_w) AM_BASE(&karnov_pf_data)
+ AM_RANGE(0x0c0000, 0x0c000f) AM_WRITE(karnov_control_w)
+ADDRESS_MAP_END
+
+/******************************************************************************/
+
+static ADDRESS_MAP_START( karnov_s_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x05ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x0800, 0x0800) AM_READ(soundlatch_r)
+ AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( karnov_s_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x05ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1000, 0x1000) AM_WRITE(YM2203_control_port_0_w) /* OPN */
+ AM_RANGE(0x1001, 0x1001) AM_WRITE(YM2203_write_port_0_w)
+ AM_RANGE(0x1800, 0x1800) AM_WRITE(YM3526_control_port_0_w) /* OPL */
+ AM_RANGE(0x1801, 0x1801) AM_WRITE(YM3526_write_port_0_w)
+ AM_RANGE(0x8000, 0xffff) AM_WRITE(MWA8_ROM)
+ADDRESS_MAP_END
+
+/******************************************************************************/
+#define INPUTS\
+ PORT_START_TAG("IN0") /* Player 1 controls */\
+ 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_BUTTON3 )\
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 4 on karnov schematics */\
+ PORT_START_TAG("IN1") /* Player 2 controls */\
+ 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_BUTTON1 ) PORT_COCKTAIL\
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL\
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL\
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 4 on karnov schematics */\
+ PORT_START_TAG("IN2") /* start buttons */\
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) /* PL1 Button 5 on karnov schematics */\
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* PL2 Button 5 on karnov schematics */\
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )\
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )\
+ 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_HIGH, IPT_VBLANK )\
+ PORT_START_TAG("FAKE") /* Dummy input for i8751 */\
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 )\
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )\
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 )
+
+
+static INPUT_PORTS_START( karnov )
+INPUTS
+ PORT_START_TAG("DSW1")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:3,4")
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+/* 0x80 called No Die Mode according to the manual, but it doesn't seem
+to have any effect */
+
+ PORT_START_TAG("DSW2")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPSETTING( 0x01, "1" )
+ PORT_DIPSETTING( 0x03, "3" )
+ PORT_DIPSETTING( 0x02, "5" )
+ PORT_DIPSETTING( 0x00, "Infinite (Cheat)")
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4")
+ PORT_DIPSETTING( 0x0c, "50 K" )
+ PORT_DIPSETTING( 0x08, "70 K" )
+ PORT_DIPSETTING( 0x04, "90 K" )
+ PORT_DIPSETTING( 0x00, "100 K" )
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6")
+ PORT_DIPSETTING( 0x30, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "Timer Speed" ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x00, "Fast" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( wndrplnt )
+INPUTS
+
+ PORT_START_TAG("DSW1") /* Dip switch bank 1 */
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) )
+
+ PORT_START_TAG("DSW2")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x01, "1" )
+ PORT_DIPSETTING( 0x03, "3" )
+ PORT_DIPSETTING( 0x02, "5" )
+ PORT_DIPSETTING( 0x00, "Infinite (Cheat)")
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( chelnov )
+ PORT_START_TAG("IN0") /* Player 1 controls */
+ 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_BUTTON3 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START_TAG("IN1") /* Player 2 controls */
+ 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_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START_TAG("IN2") /* start buttons */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
+
+ PORT_START_TAG("FAKE") /* Dummy input for i8751 */
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )
+
+ PORT_START_TAG("DSW1")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) )
+
+ PORT_START_TAG("DSW2")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x01, "1" )
+ PORT_DIPSETTING( 0x03, "3" )
+ PORT_DIPSETTING( 0x02, "5" )
+ PORT_DIPSETTING( 0x00, "Infinite (Cheat)")
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "Freeze" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+/******************************************************************************/
+
+static const gfx_layout chars =
+{
+ 8,8,
+ 1024,
+ 3,
+ { 0x6000*8,0x4000*8,0x2000*8 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8 /* every sprite takes 8 consecutive bytes */
+};
+
+static const gfx_layout sprites =
+{
+ 16,16,
+ 4096,
+ 4,
+ { 0x60000*8,0x00000*8,0x20000*8,0x40000*8 },
+ { 16*8, 1+(16*8), 2+(16*8), 3+(16*8), 4+(16*8), 5+(16*8), 6+(16*8), 7+(16*8),
+ 0,1,2,3,4,5,6,7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 ,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8},
+ 16*16
+};
+
+
+/* 16x16 tiles, 4 Planes, each plane is 0x10000 bytes */
+static const gfx_layout tiles =
+{
+ 16,16,
+ 2048,
+ 4,
+ { 0x30000*8,0x00000*8,0x10000*8,0x20000*8 },
+ { 16*8, 1+(16*8), 2+(16*8), 3+(16*8), 4+(16*8), 5+(16*8), 6+(16*8), 7+(16*8),
+ 0,1,2,3,4,5,6,7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 ,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8},
+ 16*16
+};
+
+static GFXDECODE_START( karnov )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, chars, 0, 4 ) /* colors 0-31 */
+ GFXDECODE_ENTRY( REGION_GFX2, 0, tiles, 512, 16 ) /* colors 512-767 */
+ GFXDECODE_ENTRY( REGION_GFX3, 0, sprites, 256, 16 ) /* colors 256-511 */
+GFXDECODE_END
+
+/******************************************************************************/
+
+static INTERRUPT_GEN( karnov_interrupt )
+{
+ static int latch;
+
+ /* Coin input to the i8751 generates an interrupt to the main cpu */
+ if (readinputport(3) == coin_mask) latch=1;
+ if (readinputport(3) != coin_mask && latch) {
+ if (i8751_needs_ack) {
+ /* i8751 is busy - queue the command */
+ i8751_coin_pending=readinputport(3) | 0x8000;
+ } else {
+ i8751_return=readinputport(3) | 0x8000;
+ cpunum_set_input_line(0,6,HOLD_LINE);
+ i8751_needs_ack=1;
+ }
+ latch=0;
+ }
+
+ cpunum_set_input_line(0,7,HOLD_LINE); /* VBL */
+}
+
+static void sound_irq(int linestate)
+{
+ cpunum_set_input_line(1,0,linestate); /* IRQ */
+}
+
+static struct YM3526interface ym3526_interface =
+{
+ sound_irq
+};
+
+/******************************************************************************/
+
+static MACHINE_RESET( karnov )
+{
+ memset(karnov_ram,0,0x4000/2); /* Chelnov likes ram clear on reset.. */
+}
+
+static MACHINE_DRIVER_START( karnov )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, 10000000) /* 10 MHz */
+ MDRV_CPU_PROGRAM_MAP(karnov_readmem,karnov_writemem)
+ MDRV_CPU_VBLANK_INT(karnov_interrupt,1)
+
+ MDRV_CPU_ADD(M6502, 1500000)
+ /* audio CPU */ /* Accurate */
+ MDRV_CPU_PROGRAM_MAP(karnov_s_readmem,karnov_s_writemem)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+ MDRV_MACHINE_RESET(karnov)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
+ MDRV_GFXDECODE(karnov)
+ MDRV_PALETTE_LENGTH(1024)
+
+ MDRV_PALETTE_INIT(karnov)
+ MDRV_VIDEO_START(karnov)
+ MDRV_VIDEO_UPDATE(karnov)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM2203, 1500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MDRV_SOUND_ADD(YM3526, 3000000)
+ MDRV_SOUND_CONFIG(ym3526_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_DRIVER_END
+
+
+static MACHINE_DRIVER_START( wndrplnt )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, 10000000) /* 10 MHz */
+ MDRV_CPU_PROGRAM_MAP(karnov_readmem,karnov_writemem)
+ MDRV_CPU_VBLANK_INT(karnov_interrupt,1)
+
+ MDRV_CPU_ADD(M6502, 1500000)
+ /* audio CPU */ /* Accurate */
+ MDRV_CPU_PROGRAM_MAP(karnov_s_readmem,karnov_s_writemem)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+ MDRV_MACHINE_RESET(karnov)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
+ MDRV_GFXDECODE(karnov)
+ MDRV_PALETTE_LENGTH(1024)
+
+ MDRV_PALETTE_INIT(karnov)
+ MDRV_VIDEO_START(wndrplnt)
+ MDRV_VIDEO_UPDATE(karnov)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM2203, 1500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MDRV_SOUND_ADD(YM3526, 3000000)
+ MDRV_SOUND_CONFIG(ym3526_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_DRIVER_END
+
+/******************************************************************************/
+
+ROM_START( karnov )
+ ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
+ ROM_LOAD16_BYTE( "dn08-5", 0x00000, 0x10000, CRC(db92c264) SHA1(bd4bcd984a3455eedd2b78dc2090c9d625025671) )
+ ROM_LOAD16_BYTE( "dn11-5", 0x00001, 0x10000, CRC(05669b4b) SHA1(c78d0da5afc66750dd9841a7d4f8f244d878c081) )
+ ROM_LOAD16_BYTE( "dn07-", 0x20000, 0x10000, CRC(fc14291b) SHA1(c92207cf70d4c887cd0f53208e8090c7f614c1d3) )
+ ROM_LOAD16_BYTE( "dn10-", 0x20001, 0x10000, CRC(a4a34e37) SHA1(f40b680cc7312c844f81d01997f9a47c48d36e88) )
+ ROM_LOAD16_BYTE( "dn06-5", 0x40000, 0x10000, CRC(29d64e42) SHA1(c07ff5f29b7ccd5fc97b5086bcae57ab6eb29330) )
+ ROM_LOAD16_BYTE( "dn09-5", 0x40001, 0x10000, CRC(072d7c49) SHA1(92195b89274d066a9c1f87dd810683ea66edaff4) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 6502 Sound CPU */
+ ROM_LOAD( "dn05-5", 0x8000, 0x8000, CRC(fa1a31a8) SHA1(5007a625be03c546d2a78444d72c28761b10cdb0) )
+
+ ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "dn00-", 0x00000, 0x08000, CRC(0ed77c6d) SHA1(4ec86ac56c01c158a580dc13dea3e5cbdf90d0e9) ) /* Characters */
+
+ ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "dn04-", 0x00000, 0x10000, CRC(a9121653) SHA1(04a67ba6fcf551719734ba2b86ee49c37ee1b842) ) /* Backgrounds */
+ ROM_LOAD( "dn01-", 0x10000, 0x10000, CRC(18697c9e) SHA1(b454af7922c4b1a651d303a3d8d89e5cc102f9ca) )
+ ROM_LOAD( "dn03-", 0x20000, 0x10000, CRC(90d9dd9c) SHA1(00a3bed276927f099d57e90f28fd77bd41a3c360) )
+ ROM_LOAD( "dn02-", 0x30000, 0x10000, CRC(1e04d7b9) SHA1(a2c6fde42569a52cc6d9a86715dea4a8bea80092) )
+
+ ROM_REGION( 0x80000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "dn12-", 0x00000, 0x10000, CRC(9806772c) SHA1(01f17fa033262a3e64e0675cc4e20b3c3f4b254d) ) /* Sprites - 2 sets of 4, interleaved here */
+ ROM_LOAD( "dn14-5", 0x10000, 0x08000, CRC(ac9e6732) SHA1(6f61344eb8a13349471145dee252a01aadb8cdf0) )
+ ROM_LOAD( "dn13-", 0x20000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) )
+ ROM_LOAD( "dn15-5", 0x30000, 0x08000, CRC(8933fcb8) SHA1(0dbda4b032ed3776d7633264f39e6f00ace7a238) )
+ ROM_LOAD( "dn16-", 0x40000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) )
+ ROM_LOAD( "dn17-5", 0x50000, 0x08000, CRC(b70ae950) SHA1(1ec833bdad12710ea846ef48dddbe2e1ae6b8ce1) )
+ ROM_LOAD( "dn18-", 0x60000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) )
+ ROM_LOAD( "dn19-5", 0x70000, 0x08000, CRC(8fd4fa40) SHA1(1870fb0c5c64fbc53a10115f0f3c7624cf2465db) )
+
+ ROM_REGION( 0x0800, REGION_PROMS, 0 )
+ ROM_LOAD( "karnprom.21", 0x0000, 0x0400, CRC(aab0bb93) SHA1(545707fbb1007fca1fe297c5fce61e485e7084fc) )
+ ROM_LOAD( "karnprom.20", 0x0400, 0x0400, CRC(02f78ffb) SHA1(cb4dd8b0ce3c404195321b17e10f51352f506958) )
+ROM_END
+
+ROM_START( karnovj )
+ ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
+ ROM_LOAD16_BYTE( "kar8", 0x00000, 0x10000, CRC(3e17e268) SHA1(3a63928bb0148175519540f9d891b03590094dfb) )
+ ROM_LOAD16_BYTE( "kar11", 0x00001, 0x10000, CRC(417c936d) SHA1(d31f9291f18c3d5e3c4430768396e1ac10fd9ea3) )
+ ROM_LOAD16_BYTE( "dn07-", 0x20000, 0x10000, CRC(fc14291b) SHA1(c92207cf70d4c887cd0f53208e8090c7f614c1d3) )
+ ROM_LOAD16_BYTE( "dn10-", 0x20001, 0x10000, CRC(a4a34e37) SHA1(f40b680cc7312c844f81d01997f9a47c48d36e88) )
+ ROM_LOAD16_BYTE( "kar6", 0x40000, 0x10000, CRC(c641e195) SHA1(fa7a2eba70e730f72a8d868160af9c41f9b2e5b0) )
+ ROM_LOAD16_BYTE( "kar9", 0x40001, 0x10000, CRC(d420658d) SHA1(4c7e67a80e419b8b94eb015f7f0af0a01f00c28e) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 6502 Sound CPU */
+ ROM_LOAD( "kar5", 0x8000, 0x8000, CRC(7c9158f1) SHA1(dfba7b3abd6b8d6991f0207cd252ee652a6050c2) )
+
+ ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "dn00-", 0x00000, 0x08000, CRC(0ed77c6d) SHA1(4ec86ac56c01c158a580dc13dea3e5cbdf90d0e9) ) /* Characters */
+
+ ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "dn04-", 0x00000, 0x10000, CRC(a9121653) SHA1(04a67ba6fcf551719734ba2b86ee49c37ee1b842) ) /* Backgrounds */
+ ROM_LOAD( "dn01-", 0x10000, 0x10000, CRC(18697c9e) SHA1(b454af7922c4b1a651d303a3d8d89e5cc102f9ca) )
+ ROM_LOAD( "dn03-", 0x20000, 0x10000, CRC(90d9dd9c) SHA1(00a3bed276927f099d57e90f28fd77bd41a3c360) )
+ ROM_LOAD( "dn02-", 0x30000, 0x10000, CRC(1e04d7b9) SHA1(a2c6fde42569a52cc6d9a86715dea4a8bea80092) )
+
+ ROM_REGION( 0x80000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "dn12-", 0x00000, 0x10000, CRC(9806772c) SHA1(01f17fa033262a3e64e0675cc4e20b3c3f4b254d) ) /* Sprites - 2 sets of 4, interleaved here */
+ ROM_LOAD( "kar14", 0x10000, 0x08000, CRC(c6b39595) SHA1(3bc2d0a613cc1b5d255cccc3b26e21ea1c23e75b) )
+ ROM_LOAD( "dn13-", 0x20000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) )
+ ROM_LOAD( "kar15", 0x30000, 0x08000, CRC(2f72cac0) SHA1(a71e61eea77ecd3240c5217ae84e7aa3ef21288a) )
+ ROM_LOAD( "dn16-", 0x40000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) )
+ ROM_LOAD( "kar17", 0x50000, 0x08000, CRC(7851c70f) SHA1(47b7a64dd8230e95cd7ae7f661c7586c7598c356) )
+ ROM_LOAD( "dn18-", 0x60000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) )
+ ROM_LOAD( "kar19", 0x70000, 0x08000, CRC(7bc174bb) SHA1(d8bc320169fc3a9cdd3f271ea523fb0486abae2c) )
+
+ ROM_REGION( 0x0800, REGION_PROMS, 0 )
+ ROM_LOAD( "karnprom.21", 0x0000, 0x0400, CRC(aab0bb93) SHA1(545707fbb1007fca1fe297c5fce61e485e7084fc) )
+ ROM_LOAD( "karnprom.20", 0x0400, 0x0400, CRC(02f78ffb) SHA1(cb4dd8b0ce3c404195321b17e10f51352f506958) )
+ROM_END
+
+ROM_START( wndrplnt )
+ ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
+ ROM_LOAD16_BYTE( "ea08.bin", 0x00000, 0x10000, CRC(b0578a14) SHA1(a420d1e8f80405161c86a123610ddf17c7ff07ff) )
+ ROM_LOAD16_BYTE( "ea11.bin", 0x00001, 0x10000, CRC(271edc6c) SHA1(6aa411fa4a3613018e7d971c5675f54d5765904d) )
+ ROM_LOAD16_BYTE( "ea07.bin", 0x20000, 0x10000, CRC(7095a7d5) SHA1(a7ee88cad03690a72a52b8ea2310416aa53febdd) )
+ ROM_LOAD16_BYTE( "ea10.bin", 0x20001, 0x10000, CRC(81a96475) SHA1(2d2e647ed7867b1a7f0dc24544e241e4b1c9fa92) )
+ ROM_LOAD16_BYTE( "ea06.bin", 0x40000, 0x10000, CRC(5951add3) SHA1(394552c29a6266becbdb36c3bd65fc1f56701d11) )
+ ROM_LOAD16_BYTE( "ea09.bin", 0x40001, 0x10000, CRC(c4b3cb1e) SHA1(006becbcdbbb3e666382e59e8fa5a5ebe06e5724) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 6502 Sound CPU */
+ ROM_LOAD( "ea05.bin", 0x8000, 0x8000, CRC(8dbb6231) SHA1(342faa020448ce916e820b3df18d44191983f7a6) )
+
+ ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "ea00.bin", 0x00000, 0x08000, CRC(9f3cac4c) SHA1(af8a275ff531029dbada3c820c9f660fef383100) ) /* Characters */
+
+ ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "ea04.bin", 0x00000, 0x10000, CRC(7d701344) SHA1(4efaa73a4b2534078ee25111a2f5143c7c7e846f) ) /* Backgrounds */
+ ROM_LOAD( "ea01.bin", 0x10000, 0x10000, CRC(18df55fb) SHA1(406ea47365ff8372bb2588c97c438ea02aa17538) )
+ ROM_LOAD( "ea03.bin", 0x20000, 0x10000, CRC(922ef050) SHA1(e33aea6df2e1a14bd371ed0a2b172f58edcc0e8e) )
+ ROM_LOAD( "ea02.bin", 0x30000, 0x10000, CRC(700fde70) SHA1(9b5b59aaffac091622329dc6ebedb24806b69964) )
+
+ ROM_REGION( 0x80000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "ea12.bin", 0x00000, 0x10000, CRC(a6d4e99d) SHA1(a85dbb23d05d1e386d8a66f505fa9dfcc554327b) ) /* Sprites - 2 sets of 4, interleaved here */
+ ROM_LOAD( "ea14.bin", 0x10000, 0x10000, CRC(915ffdc9) SHA1(b65cdc8ee953494f2b69e06cd6c97ee142d83c3e) )
+ ROM_LOAD( "ea13.bin", 0x20000, 0x10000, CRC(cd839f3a) SHA1(7eae3a1e080b7db22968d556e80b620cb07976b0) )
+ ROM_LOAD( "ea15.bin", 0x30000, 0x10000, CRC(a1f14f16) SHA1(5beb2b8967aa34271f734865704c6bab07d76a8c) )
+ ROM_LOAD( "ea16.bin", 0x40000, 0x10000, CRC(7a1d8a9c) SHA1(2b924a7e5a2490a7144b981155f2503d3737875d) )
+ ROM_LOAD( "ea17.bin", 0x50000, 0x10000, CRC(21a3223d) SHA1(7754ed9cbe4eed94b49130af6108e919be18e5b3) )
+ ROM_LOAD( "ea18.bin", 0x60000, 0x10000, CRC(3fb2cec7) SHA1(7231bb728f1009186d41e177402e84b63f25a44f) )
+ ROM_LOAD( "ea19.bin", 0x70000, 0x10000, CRC(87cf03b5) SHA1(29bc25642be1dd7e25f13e96dae90572f7a09d21) )
+
+ ROM_REGION( 0x0800, REGION_PROMS, 0 )
+ ROM_LOAD( "ea21.prm", 0x0000, 0x0400, CRC(c8beab49) SHA1(970c2bad3cbf2d7fc313997ae0fe11dd04383b40) )
+ ROM_LOAD( "ea20.prm", 0x0400, 0x0400, CRC(619f9d1e) SHA1(17fe49b6c9ce17be4a03e3400229e3ef4998a46f) )
+ROM_END
+
+ROM_START( chelnovu )
+ ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
+ ROM_LOAD16_BYTE( "ee08-a.j15", 0x00000, 0x10000, CRC(2f2fb37b) SHA1(f89b424099097a95cf184d20a15b876c5b639552) )
+ ROM_LOAD16_BYTE( "ee11-a.j20", 0x00001, 0x10000, CRC(f306d05f) SHA1(e523ffd17fb0104fe28eac288b6ebf7fc0ea2908) )
+ ROM_LOAD16_BYTE( "ee07-a.j14", 0x20000, 0x10000, CRC(9c69ed56) SHA1(23606d2fc7c550eaddf0fd4b0da1a4e2c9263e14) )
+ ROM_LOAD16_BYTE( "ee10-a.j18", 0x20001, 0x10000, CRC(d5c5fe4b) SHA1(183b2f5dfa4e0a9067674a29abab2744a887fd19) )
+ ROM_LOAD16_BYTE( "ee06-e.j13", 0x40000, 0x10000, CRC(55acafdb) SHA1(9dc0528c888dd73617f8cab76690b9296715680a) )
+ ROM_LOAD16_BYTE( "ee09-e.j17", 0x40001, 0x10000, CRC(303e252c) SHA1(d5d2570e42aa1e1b3600d14cc694677248e12750) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 6502 Sound CPU */
+ ROM_LOAD( "ee05-.f3", 0x8000, 0x8000, CRC(6a8936b4) SHA1(2b72cb749e6bddb67c2bd3d27b3a92511f9ef016) )
+
+ ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee00-e.c5", 0x00000, 0x08000, CRC(e06e5c6b) SHA1(70166257da5be428cb8404d8e1063c59c7722365) ) /* Characters */
+
+ ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee04-.d18", 0x00000, 0x10000, CRC(96884f95) SHA1(9d88d203028288cb26e111880d090bf40ef9385b) ) /* Backgrounds */
+ ROM_LOAD( "ee01-.c15", 0x10000, 0x10000, CRC(f4b54057) SHA1(72cd0b098a465232c2148fe6b4224c42dd42e6bc) )
+ ROM_LOAD( "ee03-.d15", 0x20000, 0x10000, CRC(7178e182) SHA1(e8f03bda417e8f2f0508df40057d39ce6ee74f16) )
+ ROM_LOAD( "ee02-.c18", 0x30000, 0x10000, CRC(9d7c45ae) SHA1(014dfafa6898e5fd0d124391e698b4f76d38fa94) )
+
+ ROM_REGION( 0x80000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee12-.f8", 0x00000, 0x10000, CRC(9b1c53a5) SHA1(b0fdc89dc7fd0931fa4bca3bbc20fc88f637ec74) ) /* Sprites */
+ ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) )
+ ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) )
+ ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) )
+
+ ROM_REGION( 0x0800, REGION_PROMS, 0 )
+ ROM_LOAD( "ee21.k8", 0x0000, 0x0400, CRC(b1db6586) SHA1(a7ecfcb4cf0f7450900820b3dfad8813efedfbea) ) /* different from the other set; */
+ /* might be bad */
+ ROM_LOAD( "ee20.l6", 0x0400, 0x0400, CRC(41816132) SHA1(89a1194bd8bf39f13419df685e489440bdb05676) )
+ROM_END
+
+ROM_START( chelnov )
+ ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
+ ROM_LOAD16_BYTE( "ee08-e.j16", 0x00000, 0x10000, CRC(8275cc3a) SHA1(961166226b68744eef15fed6a306010757b83556) )
+ ROM_LOAD16_BYTE( "ee11-e.j19", 0x00001, 0x10000, CRC(889e40a0) SHA1(e927f32d9bc448a331fb7b3478b2d07154f5013b) )
+ ROM_LOAD16_BYTE( "a-j14.bin", 0x20000, 0x10000, CRC(51465486) SHA1(e165e754eb756db3abc1f8477171ab817d03a890) )
+ ROM_LOAD16_BYTE( "a-j18.bin", 0x20001, 0x10000, CRC(d09dda33) SHA1(1764215606eec61e4fe30c0fc82ea2faf17821dc) )
+ ROM_LOAD16_BYTE( "ee06-e.j13", 0x40000, 0x10000, CRC(55acafdb) SHA1(9dc0528c888dd73617f8cab76690b9296715680a) )
+ ROM_LOAD16_BYTE( "ee09-e.j17", 0x40001, 0x10000, CRC(303e252c) SHA1(d5d2570e42aa1e1b3600d14cc694677248e12750) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 6502 Sound CPU */
+ ROM_LOAD( "ee05-.f3", 0x8000, 0x8000, CRC(6a8936b4) SHA1(2b72cb749e6bddb67c2bd3d27b3a92511f9ef016) )
+
+ ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee00-e.c5", 0x00000, 0x08000, CRC(e06e5c6b) SHA1(70166257da5be428cb8404d8e1063c59c7722365) ) /* Characters */
+
+ ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee04-.d18", 0x00000, 0x10000, CRC(96884f95) SHA1(9d88d203028288cb26e111880d090bf40ef9385b) ) /* Backgrounds */
+ ROM_LOAD( "ee01-.c15", 0x10000, 0x10000, CRC(f4b54057) SHA1(72cd0b098a465232c2148fe6b4224c42dd42e6bc) )
+ ROM_LOAD( "ee03-.d15", 0x20000, 0x10000, CRC(7178e182) SHA1(e8f03bda417e8f2f0508df40057d39ce6ee74f16) )
+ ROM_LOAD( "ee02-.c18", 0x30000, 0x10000, CRC(9d7c45ae) SHA1(014dfafa6898e5fd0d124391e698b4f76d38fa94) )
+
+ ROM_REGION( 0x80000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee12-.f8", 0x00000, 0x10000, CRC(9b1c53a5) SHA1(b0fdc89dc7fd0931fa4bca3bbc20fc88f637ec74) ) /* Sprites */
+ ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) )
+ ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) )
+ ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) )
+
+ ROM_REGION( 0x0800, REGION_PROMS, 0 )
+ ROM_LOAD( "ee21.k8", 0x0000, 0x0400, CRC(b1db6586) SHA1(a7ecfcb4cf0f7450900820b3dfad8813efedfbea) ) /* different from the other set; */
+ /* might be bad */
+ ROM_LOAD( "ee20.l6", 0x0400, 0x0400, CRC(41816132) SHA1(89a1194bd8bf39f13419df685e489440bdb05676) )
+ROM_END
+
+ROM_START( chelnovj )
+ ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
+ ROM_LOAD16_BYTE( "a-j15.bin", 0x00000, 0x10000, CRC(1978cb52) SHA1(833b8e80445ec2384e0479afb7430b32d6a14441) )
+ ROM_LOAD16_BYTE( "a-j20.bin", 0x00001, 0x10000, CRC(e0ed3d99) SHA1(f47aaec5c72ecc308c32cdcf117ef4965ac5ea61) )
+ ROM_LOAD16_BYTE( "a-j14.bin", 0x20000, 0x10000, CRC(51465486) SHA1(e165e754eb756db3abc1f8477171ab817d03a890) )
+ ROM_LOAD16_BYTE( "a-j18.bin", 0x20001, 0x10000, CRC(d09dda33) SHA1(1764215606eec61e4fe30c0fc82ea2faf17821dc) )
+ ROM_LOAD16_BYTE( "a-j13.bin", 0x40000, 0x10000, CRC(cd991507) SHA1(9da858ea41bfbce78496c086e3b462ea9f3722e8) )
+ ROM_LOAD16_BYTE( "a-j17.bin", 0x40001, 0x10000, CRC(977f601c) SHA1(b40a37160b493dcb614922c2a9b4b5f140b62aca) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 6502 Sound CPU */
+ ROM_LOAD( "ee05-.f3", 0x8000, 0x8000, CRC(6a8936b4) SHA1(2b72cb749e6bddb67c2bd3d27b3a92511f9ef016) )
+
+ ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "a-c5.bin", 0x00000, 0x08000, CRC(1abf2c6d) SHA1(86d625ae94cd9ea69e4e613895410640efb175b3) ) /* Characters */
+
+ ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee04-.d18", 0x00000, 0x10000, CRC(96884f95) SHA1(9d88d203028288cb26e111880d090bf40ef9385b) ) /* Backgrounds */
+ ROM_LOAD( "ee01-.c15", 0x10000, 0x10000, CRC(f4b54057) SHA1(72cd0b098a465232c2148fe6b4224c42dd42e6bc) )
+ ROM_LOAD( "ee03-.d15", 0x20000, 0x10000, CRC(7178e182) SHA1(e8f03bda417e8f2f0508df40057d39ce6ee74f16) )
+ ROM_LOAD( "ee02-.c18", 0x30000, 0x10000, CRC(9d7c45ae) SHA1(014dfafa6898e5fd0d124391e698b4f76d38fa94) )
+
+ ROM_REGION( 0x80000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "ee12-.f8", 0x00000, 0x10000, CRC(9b1c53a5) SHA1(b0fdc89dc7fd0931fa4bca3bbc20fc88f637ec74) ) /* Sprites */
+ ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) )
+ ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) )
+ ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) )
+
+ ROM_REGION( 0x0800, REGION_PROMS, 0 )
+ ROM_LOAD( "a-k7.bin", 0x0000, 0x0400, CRC(309c49d8) SHA1(7220002f6ef97514b4e6f61706fc16061120dafa) ) /* different from the other set; */
+ /* might be bad */
+ ROM_LOAD( "ee20.l6", 0x0400, 0x0400, CRC(41816132) SHA1(89a1194bd8bf39f13419df685e489440bdb05676) )
+ROM_END
+
+/******************************************************************************/
+
+static DRIVER_INIT( karnov )
+{
+ microcontroller_id=KARNOV;
+ coin_mask=0;
+}
+
+static DRIVER_INIT( karnovj )
+{
+ microcontroller_id=KARNOVJ;
+ coin_mask=0;
+}
+
+static DRIVER_INIT( wndrplnt )
+{
+ microcontroller_id=WNDRPLNT;
+ coin_mask=0;
+}
+
+static DRIVER_INIT( chelnov )
+{
+ UINT16 *RAM = (UINT16 *)memory_region(REGION_CPU1);
+
+ microcontroller_id=CHELNOV;
+ coin_mask=0xe0;
+ RAM[0x0A26/2]=0x4E71; /* removes a protection lookup table */
+ RAM[0x062a/2]=0x4E71; /* hangs waiting on i8751 int */
+}
+
+static DRIVER_INIT( chelnovw )
+{
+ UINT16 *RAM = (UINT16 *)memory_region(REGION_CPU1);
+
+ microcontroller_id=CHELNOVW;
+ coin_mask=0xe0;
+ RAM[0x0A26/2]=0x4E71; /* removes a protection lookup table */
+ RAM[0x062a/2]=0x4E71; /* hangs waiting on i8751 int */
+}
+
+static DRIVER_INIT( chelnovj )
+{
+ UINT16 *RAM = (UINT16 *)memory_region(REGION_CPU1);
+
+ microcontroller_id=CHELNOVJ;
+ coin_mask=0xe0;
+ RAM[0x0a2e/2]=0x4E71; /* removes a protection lookup table */
+ RAM[0x062a/2]=0x4E71; /* hangs waiting on i8751 int */
+}
+
+/******************************************************************************/
+
+GAME( 1987, karnov, 0, karnov, karnov, karnov, ROT0, "Data East USA", "Karnov (US)", 0 )
+GAME( 1987, karnovj, karnov, karnov, karnov, karnovj, ROT0, "Data East Corporation", "Karnov (Japan)", 0 )
+GAME( 1987, wndrplnt, 0, wndrplnt, wndrplnt,wndrplnt, ROT270, "Data East Corporation", "Wonder Planet (Japan)", 0 )
+GAME( 1988, chelnov, 0, karnov, chelnov, chelnovw, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (World)", 0 )
+GAME( 1988, chelnovu, chelnov, karnov, chelnov, chelnov, ROT0, "Data East USA", "Chelnov - Atomic Runner (US)", 0 )
+GAME( 1988, chelnovj, chelnov, karnov, chelnov, chelnovj, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (Japan)", 0 )