summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/rallyx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/rallyx.c')
-rw-r--r--src/mame/drivers/rallyx.c1235
1 files changed, 1235 insertions, 0 deletions
diff --git a/src/mame/drivers/rallyx.c b/src/mame/drivers/rallyx.c
new file mode 100644
index 00000000000..91c1e980413
--- /dev/null
+++ b/src/mame/drivers/rallyx.c
@@ -0,0 +1,1235 @@
+/***************************************************************************
+
+Rally X (c) 1980 Namco
+New Rally X (c) 1981 Namco
+
+and also
+
+Jungler (c) 1981 Konami
+Tactician (c) 1981 Konami
+Loco-Motion (c) 1982 Konami
+Commando (c) 1983 Sega
+
+driver by Nicola Salmoria
+
+There doesn't seem to be much doubt that Konami copied the video hardware of
+Rally X.
+The boards are surely very different; Rally X has video and sound split on the
+two boards, while the Konami version has all video in one board and all sound
+in the other.
+Rally X uses a single Z80 and Namco sound hardware, while the others use the
+standard Konami sound hardware of that era (slave Z80 + 2xAY-3-8910).
+Also, the Konami design includes an optional starfield generator, only used
+by Tactician.
+
+
+Rally X Memory map:
+------------------
+Note: the memory map for the RAM 6x chips derived from the schematics doesn't
+seem to be entirely correct. Here it's modified to match program behaviour.
+The names might be assigned incorrectly.
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+0-000xxxxxxxxxxx R xxxxxxxx ROM 1B program ROM \[1]
+0-001xxxxxxxxxxx R xxxxxxxx ROM 1C program ROM /
+0-010xxxxxxxxxxx R xxxxxxxx ROM 1D program ROM \[1]
+0-011xxxxxxxxxxx R xxxxxxxx ROM 1E program ROM /
+0-100xxxxxxxxxxx R xxxxxxxx ROM 1H program ROM \[1]
+0-101xxxxxxxxxxx R xxxxxxxx ROM 1J program ROM /
+0-110xxxxxxxxxxx R xxxxxxxx ROM 1K program ROM \[1]
+0-111xxxxxxxxxxx R xxxxxxxx ROM 1L program ROM /
+1-0000xxxxxxxxxx R/W xxxxxxxx RAM 6A/6C radar tilemap RAM + sprites
+1-0001xxxxxxxxxx R/W xxxxxxxx RAM 6B/6D playfield tilemap RAM
+1-0010xxxxxxxxxx R/W xxxxxxxx RAM 6J/6K radar tilemap RAM + sprites
+1-0011xxxxxxxxxx R/W xxxxxxxx RAM 6H/6L playfield tilemap RAM
+1-0110xxxxxxxxxx R/W xxxxxxxx RAM 6F/6M work RAM
+1-0111xxxxxxxxxx R/W xxxxxxxx RAM 6E/6N work RAM
+1-1----00---xxxx W ----xxxx SODWR bullets shape and X pos msb [2]
+1-1----01------- W -------- watchdog reset
+1-1----10000xxxx W ----xxxx RAM 2N \ sound control registers
+1-1----10001xxxx W ----xxxx RAM 2P /
+1-1----10010---- W n.c.
+1-1----10011---- W xxxxxxxx POSIX playfield X scroll
+1-1----10100---- W xxxxxxxx POSIY playfield Y scroll
+1-1----10101---- W n.c.
+1-1----10110 W WR2 ?
+1-1----10111 W WR3 ? this is written to A LOT of times every frame
+1-1----11----000 W -------x BANG explosion sound trigger
+1-1----11----001 W -------x INT ON interrupt enable
+1-1----11----010 W -------x SOUND ON sound enable [3]
+1-1----11----011 W -------x FLIP flip screen
+1-1----11----100 W -------x 1 player start lamp
+1-1----11----101 W -------x 2 players start lamp
+1-1----11----110 W -------x coin lockout
+1-1----11----111 W -------x coin counter
+1-1----00------- R xxxxxxxx switch inputs
+1-1----01------- R xxxxxxxx switch inputs
+1-1----10------- R xxxxxxxx dip switches
+1-1----11 R RDSTB ?
+
+[1] either 2x2716 or 1x2732
+[2] SO = Small Objects? Only locations 4-F are used.
+[3] doesn't seem to work in New Rally X.
+
+I/O ports:
+OUT on port $0 sets the interrupt vector/instruction (the game uses both
+IM 2 and IM 0)
+
+
+Loco-Motion Memory map:
+----------------------
+Main CPU:
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+0000xxxxxxxxxxxx R xxxxxxxx ROM 3D program ROM
+0001xxxxxxxxxxxx R xxxxxxxx ROM 3E program ROM
+0010xxxxxxxxxxxx R xxxxxxxx ROM 3F program ROM
+0011xxxxxxxxxxxx R xxxxxxxx ROM 3G program ROM
+0100xxxxxxxxxxxx R xxxxxxxx ROM 3J program ROM
+0101xxxxxxxxxxxx R xxxxxxxx ROM 3K program ROM
+0110xxxxxxxxxxxx R xxxxxxxx ROM 3L program ROM
+0111xxxxxxxxxxxx R xxxxxxxx ROM 3M program ROM
+1-000xxxxxxxxxxx R/W xxxxxxxx RAM 3C tilemap RAM (tile code) [1]
+1-001xxxxxxxxxxx R/W xxxxxxxx RAM 3B tilemap RAM (tile attr) [1]
+1-011xxxxxxxxxxx R/W xxxxxxxx RAM 3A work RAM
+1-1----00------- R xxxxxxxx IN1 switch inputs
+1-1----01------- R xxxxxxxx IN2 switch inputs
+1-1----10------- R xxxxxxxx IN3 switch inputs / dip switches
+1-1----11------- R xxxxxxxx IN4 dip switches
+1-1----00---xxxx W ----xxxx SCARW bullets shape and X pos msb
+1-1----01------- W -------- watchdog reset
+1-1----10------- W xxxxxxxx SOUNDDATA command for sound CPU
+1-1----11----000 W -------x SOUNDON trigger irq on sound CPU
+1-1----11----001 W -------x INTST irq enable/acknowledge
+1-1----11----010 W -------x MUT sound disable
+1-1----11----011 W -------x FLIP flip screen
+1-1----11----100 W -------x OUT1 coin counter #1
+1-1----11----101 W -------x OUT2 ?
+1-1----11----110 W -------x OUT3 coin counter #2
+1-1----11----111 W -------x STARSON stars enable (optional)
+
+[1] 1st half is "radar" + sprite registers, 2nd half is scrolling playfield
+
+
+Sound CPU (standard Konami sound board):
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+0000xxxxxxxxxxxx R xxxxxxxx ROM 1B program ROM
+0001xxxxxxxxxxxx R xxxxxxxx ROM 1C program ROM
+0010--xxxxxxxxxx R/W xxxxxxxx RAM 2B/2C work RAM
+0011xxxxxx------ W -------- CKB RC filters enable for 8910 #1 (data is in A6-A11)
+0011------xxxxxx W -------- CKB RC filters enable for 8910 #2 (data is in A0-A5)
+0100------------ R/W xxxxxxxx SEN1 AY-3-8910 #1 r/w [1]
+0101------------ W xxxxxxxx SEN2 AY-3-8910 #1 ctrl
+0110------------ R/W xxxxxxxx SEN3 AY-3-8910 #2 r/w
+0111------------ W xxxxxxxx SEN4 AY-3-8910 #2 ctrl
+
+[1] port A: command from main CPU; port B: timer
+
+
+Notes:
+- Easter egg (both Rally X and New Rally X):
+ - enter service mode
+ - keep B1 pressed and enter the following sequence:
+ 2xU 7xD 1xR 6xL
+ (c) NAMCO LTD. 1980 will be added at the bottom of the screen.
+
+- The Test Mode "dip switch" actually comes from the edge connector, but is mapped
+ in memory in place of dip switch #8. Dip switch #8 is supposed to freeze the
+ game and is entirely handled by hardware.
+
+- PROM 7a controls the video shape. This is used to hide the rightmost 4 char
+ columns in Locomotion and Commando, while showing them in Jungler and
+ Tactician.
+
+- The playfield scroll registers used in Rally X are present, but not useful
+ (always 0) in Jungler and Tactician. They were removed in Locomotn and Commando.
+
+- commsega has more sprites and more "bullets" than the other games.
+
+- it seems that Jungler doesn't support high priority tiles. Maybe they
+ disabled that feature because they needed more color combinations.
+
+- there are also 1-pixel sprite and bullet placement differences from game to game.
+
+- cottong is a bootleg of a very different version of locomotn, possibly a
+ prototype.
+
+- commsega:
+ Due to a bug at 0x1259, bit 3 of DSW1 also affects the "Bonus Life" value:
+ - when bit 3 is OFF, you get an extra life at 30000 points
+ - when bit 3 is ON , you get an extra life at 50000 points
+ At 0x0050 there is code to give infinite lives for player 1 when bit 3 of DSW0
+ is ON. I can't tell however when it is supposed to be called.
+
+TODO:
+- commsega: the first time you kill a soldier, the music stops. When you die,
+ the music restarts and won't stop a second time.
+
+- rallyx: Three things in the schematics that I haven't been able to trace:
+ WR2, WR3 and RDSTB. Only WR3 is actually used by the game.
+
+- rallyx: emulate the explosion with discrete sound components. The schematics
+ are available so it should be possible eventually.
+
+- tactician: the bouncing bomb seems to show incorrect graphics when it's hit.
+
+***************************************************************************/
+
+#include "driver.h"
+#include "audio/timeplt.h"
+#include "sound/namco.h"
+#include "sound/samples.h"
+
+
+extern UINT8 *rallyx_videoram,*rallyx_radarattr;
+WRITE8_HANDLER( rallyx_videoram_w );
+WRITE8_HANDLER( rallyx_scrollx_w );
+WRITE8_HANDLER( rallyx_scrolly_w );
+WRITE8_HANDLER( tactcian_starson_w );
+PALETTE_INIT( rallyx );
+VIDEO_START( rallyx );
+VIDEO_UPDATE( rallyx );
+DRIVER_INIT( rallyx );
+DRIVER_INIT( jungler );
+DRIVER_INIT( tactcian );
+DRIVER_INIT( locomotn );
+DRIVER_INIT( commsega );
+
+
+static WRITE8_HANDLER( rallyx_interrupt_vector_w )
+{
+ cpunum_set_input_line_vector(0, 0, data);
+ cpunum_set_input_line(0, 0, CLEAR_LINE);
+}
+
+
+
+static WRITE8_HANDLER( rallyx_bang_w )
+{
+ static int last;
+
+ if (data == 0 && last != 0)
+ sample_start(0,0,0);
+
+ last = data;
+}
+
+
+static WRITE8_HANDLER( rallyx_latch_w )
+{
+ int bit = data & 1;
+
+ switch (offset)
+ {
+ case 0x00: /* BANG */
+ rallyx_bang_w(0,bit);
+ break;
+
+ case 0x01: /* INT ON */
+ cpu_interrupt_enable(0,bit);
+ if (!bit)
+ cpunum_set_input_line(0, 0, CLEAR_LINE);
+ break;
+
+ case 0x02: /* SOUND ON */
+ /* this doesn't work in New Rally X so I'm not supporting it */
+// pacman_sound_enable_w(0,bit);
+ break;
+
+ case 0x03: /* FLIP */
+ flip_screen_set(bit);
+ break;
+
+ case 0x04:
+ set_led_status(0,bit);
+ break;
+
+ case 0x05:
+ set_led_status(1,bit);
+ break;
+
+ case 0x06:
+ coin_lockout_w(0,!bit);
+ break;
+
+ case 0x07:
+ coin_counter_w(0,bit);
+ break;
+ }
+}
+
+
+static WRITE8_HANDLER( locomotn_latch_w )
+{
+ int bit = data & 1;
+
+ switch (offset)
+ {
+ case 0x00: /* SOUNDON */
+ timeplt_sh_irqtrigger_w(0,bit);
+ break;
+
+ case 0x01: /* INTST */
+ cpu_interrupt_enable(0,bit);
+ break;
+
+ case 0x02: /* MUT */
+// sound disable
+ break;
+
+ case 0x03: /* FLIP */
+ flip_screen_set(bit);
+ break;
+
+ case 0x04: /* OUT1 */
+ coin_counter_w(0,bit);
+ break;
+
+ case 0x05: /* OUT2 */
+ break;
+
+ case 0x06: /* OUT3 */
+ coin_counter_w(1,bit);
+ break;
+
+ case 0x07: /* STARSON */
+ tactcian_starson_w(offset,bit);
+ break;
+ }
+}
+
+
+
+static ADDRESS_MAP_START( rallyx_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x3fff) AM_ROM
+ AM_RANGE(0x8000, 0x8fff) AM_READWRITE(MRA8_RAM, rallyx_videoram_w) AM_BASE(&rallyx_videoram)
+ AM_RANGE(0x9800, 0x9fff) AM_RAM
+ AM_RANGE(0xa000, 0xa000) AM_READ(input_port_0_r)
+ AM_RANGE(0xa080, 0xa080) AM_READ(input_port_1_r)
+ AM_RANGE(0xa100, 0xa100) AM_READ(input_port_2_r)
+ AM_RANGE(0xa000, 0xa00f) AM_WRITE(MWA8_RAM) AM_BASE(&rallyx_radarattr)
+ AM_RANGE(0xa080, 0xa080) AM_WRITE(watchdog_reset_w)
+ AM_RANGE(0xa100, 0xa11f) AM_WRITE(pacman_sound_w) AM_BASE(&namco_soundregs)
+ AM_RANGE(0xa130, 0xa130) AM_WRITE(rallyx_scrollx_w)
+ AM_RANGE(0xa140, 0xa140) AM_WRITE(rallyx_scrolly_w)
+ AM_RANGE(0xa170, 0xa170) AM_WRITE(MWA8_NOP) /* ? */
+ AM_RANGE(0xa180, 0xa187) AM_WRITE(rallyx_latch_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0, 0) AM_WRITE(rallyx_interrupt_vector_w)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( locomotn_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0x8fff) AM_READWRITE(MRA8_RAM, rallyx_videoram_w) AM_BASE(&rallyx_videoram)
+ AM_RANGE(0x9800, 0x9fff) AM_RAM
+ AM_RANGE(0xa000, 0xa000) AM_READ(input_port_0_r)
+ AM_RANGE(0xa080, 0xa080) AM_READ(input_port_1_r)
+ AM_RANGE(0xa100, 0xa100) AM_READ(input_port_2_r)
+ AM_RANGE(0xa180, 0xa180) AM_READ(input_port_3_r)
+ AM_RANGE(0xa000, 0xa00f) AM_MIRROR(0x00f0) AM_WRITE(MWA8_RAM) AM_BASE(&rallyx_radarattr) // jungler writes to a03x
+ AM_RANGE(0xa080, 0xa080) AM_WRITE(watchdog_reset_w)
+ AM_RANGE(0xa100, 0xa100) AM_WRITE(soundlatch_w)
+ AM_RANGE(0xa130, 0xa130) AM_WRITE(rallyx_scrollx_w) /* only jungler and tactcian */
+ AM_RANGE(0xa140, 0xa140) AM_WRITE(rallyx_scrolly_w) /* only jungler and tactcian */
+ AM_RANGE(0xa180, 0xa187) AM_WRITE(locomotn_latch_w)
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( rallyx )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START_TAG("IN1")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
+
+ PORT_START_TAG("DSW0")
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x38, 0x08, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x10, "1 Car, Medium" )
+ PORT_DIPSETTING( 0x28, "1 Car, Hard" )
+ PORT_DIPSETTING( 0x00, "2 Cars, Easy" )
+ PORT_DIPSETTING( 0x18, "2 Cars, Medium" )
+ PORT_DIPSETTING( 0x30, "2 Cars, Hard" )
+ PORT_DIPSETTING( 0x08, "3 Cars, Easy" )
+ PORT_DIPSETTING( 0x20, "3 Cars, Medium" )
+ PORT_DIPSETTING( 0x38, "3 Cars, Hard" )
+ PORT_DIPNAME( 0x06, 0x02, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x02, "10000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x10)
+ PORT_DIPSETTING( 0x02, "10000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x28)
+ PORT_DIPSETTING( 0x02, "15000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x02, "15000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x18)
+ PORT_DIPSETTING( 0x02, "15000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x30)
+ PORT_DIPSETTING( 0x02, "20000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x08)
+ PORT_DIPSETTING( 0x02, "20000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x20)
+ PORT_DIPSETTING( 0x02, "20000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x38)
+ PORT_DIPSETTING( 0x04, "20000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x10)
+ PORT_DIPSETTING( 0x04, "20000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x28)
+ PORT_DIPSETTING( 0x04, "30000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x04, "30000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x18)
+ PORT_DIPSETTING( 0x04, "30000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x30)
+ PORT_DIPSETTING( 0x04, "40000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x08)
+ PORT_DIPSETTING( 0x04, "40000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x20)
+ PORT_DIPSETTING( 0x04, "40000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x38)
+ PORT_DIPSETTING( 0x06, "30000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x10)
+ PORT_DIPSETTING( 0x06, "30000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x28)
+ PORT_DIPSETTING( 0x06, "40000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x06, "40000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x18)
+ PORT_DIPSETTING( 0x06, "40000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x30)
+ PORT_DIPSETTING( 0x06, "60000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x08)
+ PORT_DIPSETTING( 0x06, "60000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x20)
+ PORT_DIPSETTING( 0x06, "60000" ) PORT_CONDITION("DSW0",0x38,PORTCOND_EQUALS,0x38)
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+ PORT_SERVICE( 0x01, IP_ACTIVE_LOW )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( nrallyx )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START_TAG("IN1")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
+
+ PORT_START_TAG("DSW")
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x38, 0x00, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x10, "1 Car, Medium" )
+ PORT_DIPSETTING( 0x28, "1 Car, Hard" )
+ PORT_DIPSETTING( 0x18, "2 Cars, Medium" )
+ PORT_DIPSETTING( 0x30, "2 Cars, Hard" )
+ PORT_DIPSETTING( 0x00, "3 Cars, Easy" )
+ PORT_DIPSETTING( 0x20, "3 Cars, Medium" )
+ PORT_DIPSETTING( 0x38, "3 Cars, Hard" )
+ PORT_DIPSETTING( 0x08, "4 Cars, Easy" )
+ /* TODO: the bonus score depends on the number of lives */
+ PORT_DIPNAME( 0x06, 0x02, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x02, "A" )
+ PORT_DIPSETTING( 0x04, "B" )
+ PORT_DIPSETTING( 0x06, "C" )
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+ PORT_SERVICE( 0x01, IP_ACTIVE_LOW )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( jungler )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START_TAG("DSW0") /* Sound board */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START_TAG("DSW1") /* CPU board */
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) )
+ PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x28, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x80, 0x80, "Test (255 lives)" )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( locomotn )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START_TAG("DSW0") /* Sound board */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x30, "3" )
+ PORT_DIPSETTING( 0x20, "4" )
+ PORT_DIPSETTING( 0x10, "5" )
+ PORT_DIPSETTING( 0x00, "255" )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "Intermissions" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START_TAG("DSW1") /* CPU board */
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x0a, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 3C_4C ) )
+ PORT_DIPSETTING( 0x0e, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) )
+ PORT_DIPSETTING( 0x0b, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0d, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0xa0, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 3C_4C ) )
+ PORT_DIPSETTING( 0xe0, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x70, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ) )
+ PORT_DIPSETTING( 0xb0, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0xd0, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) )
+ PORT_DIPSETTING( 0x00, "Disabled" )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( tactcian )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY 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_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START_TAG("DSW0") /* Sound board */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x10, "4" )
+ PORT_DIPSETTING( 0x20, "5" )
+ PORT_DIPSETTING( 0x30, "255" )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x06, 0x00, DEF_STR( Coinage ) ) // Mode 1
+ PORT_DIPSETTING( 0x06, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) )
+ /*
+ PORT_DIPNAME( 0x06, 0x00, DEF_STR( Coinage ) ) // Mode 2
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x04, "A 2C/1C B 1C/3C" )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x06, "A 1C/1C B 1C/6C" )
+ */
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x00, "10k, 80k then every 100k" )
+ PORT_DIPSETTING( 0x01, "20k, 80k then every 100k" )
+
+ PORT_START_TAG("DSW1") /* CPU board */
+ PORT_DIPNAME( 0x01, 0x00, "Coin Mode" )
+ PORT_DIPSETTING( 0x00, "Mode 1" )
+ PORT_DIPSETTING( 0x01, "Mode 2" )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( commsega )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START_TAG("DSW0") /* (sound board) */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // "Infinite Lives" - See notes
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
+
+ PORT_START_TAG("DSW1") /* (CPU board) */
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x03, "3" )
+ PORT_DIPSETTING( 0x02, "4" )
+ PORT_DIPSETTING( 0x01, "5" )
+ PORT_DIPSETTING( 0x00, "6" )
+ PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 4C_1C ) ) // Bonus Life : 50000 points
+ PORT_DIPSETTING( 0x14, DEF_STR( 3C_1C ) ) // Bonus Life : 50000 points
+ PORT_DIPSETTING( 0x18, DEF_STR( 2C_1C ) ) // Bonus Life : 30000 points
+ PORT_DIPSETTING( 0x1c, DEF_STR( 1C_1C ) ) // Bonus Life : 30000 points
+ PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) ) // Bonus Life : 50000 points
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_2C ) ) // Bonus Life : 30000 points
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_3C ) ) // Bonus Life : 30000 points
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) // Bonus Life : 50000 points
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Difficulty ) ) // Check code at 0x1fc5
+ PORT_DIPSETTING( 0x40, DEF_STR( Easy ) ) // 16 flying enemies to kill
+ PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) // 24 flying enemies to kill
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) )
+INPUT_PORTS_END
+
+
+
+static const gfx_layout rallyx_charlayout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 2,
+ { 0, 4 },
+ { 8*8+0, 8*8+1, 8*8+2, 8*8+3, 0, 1, 2, 3 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 16*8
+};
+
+static const gfx_layout jungler_charlayout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 2,
+ { 4, 0 },
+ { 8*8+0, 8*8+1, 8*8+2, 8*8+3, 0, 1, 2, 3 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 16*8
+};
+
+static const gfx_layout rallyx_spritelayout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 2,
+ { 0, 4 },
+ { 8*8+0, 8*8+1, 8*8+2, 8*8+3, 16*8+0, 16*8+1, 16*8+2, 16*8+3,
+ 24*8+0, 24*8+1, 24*8+2, 24*8+3, 0, 1, 2, 3 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
+ 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 },
+ 64*8
+};
+
+static const gfx_layout jungler_spritelayout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 2,
+ { 4, 0 },
+ { 8*8, 8*8+1, 8*8+2, 8*8+3, 0, 1, 2, 3,
+ 24*8+0, 24*8+1, 24*8+2, 24*8+3, 16*8+0, 16*8+1, 16*8+2, 16*8+3 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
+ 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 },
+ 64*8
+};
+
+static const gfx_layout dotlayout =
+{
+ 4,4,
+ 8,
+ 2,
+ { 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8 },
+ { 0*32, 1*32, 2*32, 3*32 },
+ 16*8
+};
+
+static GFXDECODE_START( rallyx )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, rallyx_charlayout, 0, 64 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, rallyx_spritelayout, 0, 64 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, dotlayout, 64*4, 1 )
+GFXDECODE_END
+
+static GFXDECODE_START( jungler )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, jungler_charlayout, 0, 64 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, jungler_spritelayout, 0, 64 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, dotlayout, 64*4, 1 )
+GFXDECODE_END
+
+
+static struct namco_interface namco_interface =
+{
+ 3, /* number of voices */
+ REGION_SOUND1 /* memory region */
+};
+
+static const char *rallyx_sample_names[] =
+{
+ "*rallyx",
+ "bang.wav",
+ 0 /* end of array */
+};
+
+static struct Samplesinterface samples_interface =
+{
+ 1, /* 1 channel */
+ rallyx_sample_names
+};
+
+
+
+static MACHINE_DRIVER_START( rallyx )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 18432000/6) /* 3.072 MHz */
+ MDRV_CPU_PROGRAM_MAP(rallyx_map,0)
+ MDRV_CPU_IO_MAP(0,writeport)
+ MDRV_CPU_VBLANK_INT(irq0_line_assert,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60.606060)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(36*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1)
+ MDRV_GFXDECODE(rallyx)
+ MDRV_PALETTE_LENGTH(32)
+ MDRV_COLORTABLE_LENGTH(64*4+4)
+
+ MDRV_PALETTE_INIT(rallyx)
+ MDRV_VIDEO_START(rallyx)
+ MDRV_VIDEO_UPDATE(rallyx)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(NAMCO, 18432000/6/32)
+ MDRV_SOUND_CONFIG(namco_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+ MDRV_SOUND_ADD(SAMPLES, 0)
+ MDRV_SOUND_CONFIG(samples_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+MACHINE_DRIVER_END
+
+
+static MACHINE_DRIVER_START( tactcian )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 18432000/6) /* 3.072 MHz */
+ MDRV_CPU_PROGRAM_MAP(locomotn_map,0)
+ MDRV_CPU_VBLANK_INT(nmi_line_pulse,1)
+
+ MDRV_CPU_ADD(Z80, 14318180/8) /* 1.789772727 MHz */
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(locomotn_sound_readmem,locomotn_sound_writemem)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION /* frames per second, vblank duration */)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(36*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1)
+ MDRV_GFXDECODE(jungler)
+ MDRV_PALETTE_LENGTH(32+64)
+ MDRV_COLORTABLE_LENGTH(64*4+4)
+
+ MDRV_PALETTE_INIT(rallyx)
+ MDRV_VIDEO_START(rallyx)
+ MDRV_VIDEO_UPDATE(rallyx)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(AY8910, 14318180/8)
+ MDRV_SOUND_CONFIG(timeplt_ay8910_interface)
+ MDRV_SOUND_ROUTE(0, "filter.0.0", 0.60)
+ MDRV_SOUND_ROUTE(1, "filter.0.1", 0.60)
+ MDRV_SOUND_ROUTE(2, "filter.0.2", 0.60)
+
+ MDRV_SOUND_ADD(AY8910, 14318180/8)
+ MDRV_SOUND_ROUTE(0, "filter.1.0", 0.60)
+ MDRV_SOUND_ROUTE(1, "filter.1.1", 0.60)
+ MDRV_SOUND_ROUTE(2, "filter.1.2", 0.60)
+
+ MDRV_SOUND_ADD_TAG("filter.0.0", FILTER_RC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MDRV_SOUND_ADD_TAG("filter.0.1", FILTER_RC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MDRV_SOUND_ADD_TAG("filter.0.2", FILTER_RC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+ MDRV_SOUND_ADD_TAG("filter.1.0", FILTER_RC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MDRV_SOUND_ADD_TAG("filter.1.1", FILTER_RC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MDRV_SOUND_ADD_TAG("filter.1.2", FILTER_RC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_DRIVER_END
+
+
+static MACHINE_DRIVER_START( locomotn )
+
+ /* basic machine hardware */
+ MDRV_IMPORT_FROM(tactcian)
+
+ /* video hardware */
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+MACHINE_DRIVER_END
+
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( rallyx )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "1b", 0x0000, 0x1000, CRC(5882700d) SHA1(b6029e9730f1694894fe8b729ac0ba8d6712dea9) )
+ ROM_LOAD( "rallyxn.1e", 0x1000, 0x1000, CRC(ed1eba2b) SHA1(82d3a4b34b0ff5cfdb8ca7c18ad5c63d943b8484) )
+ ROM_LOAD( "rallyxn.1h", 0x2000, 0x1000, CRC(4f98dd1c) SHA1(8a20fadcea76802d1c412ba62086abb846ad54a8) )
+ ROM_LOAD( "rallyxn.1k", 0x3000, 0x1000, CRC(9aacccf0) SHA1(9b22079972c0f9970d62d62751db4783a87796d5) )
+
+ ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "8e", 0x0000, 0x1000, CRC(277c1de5) SHA1(30bc57263e8dad870c501c76bce6f42d69ab9e00) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "im5623.8m", 0x0000, 0x0100, CRC(3c16f62c) SHA1(7a3800be410e306cf85753b9953ffc5575afbcd6) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "m3-7603.11n", 0x0000, 0x0020, CRC(c7865434) SHA1(70c1c9610ba6f1ead77f347e7132958958bccb31) ) /* palette */
+ ROM_LOAD( "im5623.8p", 0x0020, 0x0100, CRC(834d4fda) SHA1(617864d3df0917a513e8255ad8d96ae7a04da5a1) ) /* lookup table */
+ ROM_LOAD( "r-2.4n", 0x0120, 0x0020, CRC(8f574815) SHA1(4f84162db9d58b64742c67dc689eb665b9862fb3) ) /* video layout (not used) */
+ ROM_LOAD( "r-3.7k", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+
+ ROM_REGION( 0x0200, REGION_SOUND1, 0 ) /* sound proms */
+ ROM_LOAD( "im5623.3p", 0x0000, 0x0100, CRC(4bad7017) SHA1(3e6da9d798f5e07fa18d6ce7d0b148be98c766d5) )
+ ROM_LOAD( "im5623.2m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */
+ROM_END
+
+ROM_START( rallyxm )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "1b", 0x0000, 0x1000, CRC(5882700d) SHA1(b6029e9730f1694894fe8b729ac0ba8d6712dea9) )
+ ROM_LOAD( "1e", 0x1000, 0x1000, CRC(786585ec) SHA1(8aa75f10d695f4b3483c4bf7030b733318fd3bf3) )
+ ROM_LOAD( "1h", 0x2000, 0x1000, CRC(110d7dcd) SHA1(23e0855c2c9300f2068711d160fcdfaedd07832f) )
+ ROM_LOAD( "1k", 0x3000, 0x1000, CRC(473ab447) SHA1(f0a37ccc48c97c53672f754ca2ac37dc0dc91a9f) )
+
+ ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "8e", 0x0000, 0x1000, CRC(277c1de5) SHA1(30bc57263e8dad870c501c76bce6f42d69ab9e00) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "im5623.8m", 0x0000, 0x0100, CRC(3c16f62c) SHA1(7a3800be410e306cf85753b9953ffc5575afbcd6) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "m3-7603.11n", 0x0000, 0x0020, CRC(c7865434) SHA1(70c1c9610ba6f1ead77f347e7132958958bccb31) ) /* palette */
+ ROM_LOAD( "im5623.8p", 0x0020, 0x0100, CRC(834d4fda) SHA1(617864d3df0917a513e8255ad8d96ae7a04da5a1) ) /* lookup table */
+ ROM_LOAD( "r-2.4n", 0x0120, 0x0020, CRC(8f574815) SHA1(4f84162db9d58b64742c67dc689eb665b9862fb3) ) /* video layout (not used) */
+ ROM_LOAD( "r-3.7k", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+
+ ROM_REGION( 0x0200, REGION_SOUND1, 0 ) /* sound proms */
+ ROM_LOAD( "im5623.3p", 0x0000, 0x0100, CRC(4bad7017) SHA1(3e6da9d798f5e07fa18d6ce7d0b148be98c766d5) )
+ ROM_LOAD( "im5623.2m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */
+ROM_END
+
+ROM_START( nrallyx )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "nrallyx.1b", 0x0000, 0x1000, CRC(9404c8d6) SHA1(ee7e45c22a2fbf72d3ac5ac26ab1111a22623fc5) )
+ ROM_LOAD( "nrallyx.1e", 0x1000, 0x1000, CRC(ac01bf3f) SHA1(8e1a7cce92ef709d18727db6ee7f89936f4b8df8) )
+ ROM_LOAD( "nrallyx.1h", 0x2000, 0x1000, CRC(aeba29b5) SHA1(2a6e4568729b83c430bf70e43c4146ad6a556b1b) )
+ ROM_LOAD( "nrallyx.1k", 0x3000, 0x1000, CRC(78f17da7) SHA1(1e035746a10f91e898166a58093d45bdb158ae47) )
+
+ ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "nrallyx.8e", 0x0000, 0x1000, CRC(ca7a174a) SHA1(dc553df18c45ba399661122be75b71d6cb54d6a2) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "im5623.8m", 0x0000, 0x0100, CRC(3c16f62c) SHA1(7a3800be410e306cf85753b9953ffc5575afbcd6) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "nrallyx.pr1", 0x0000, 0x0020, CRC(a0a49017) SHA1(494c920a157e9f876d533c1b0146275a366c4989) ) /* palette */
+ ROM_LOAD( "nrallyx.pr2", 0x0020, 0x0100, CRC(b2b7ca15) SHA1(e604d58f2f20ebf042f28b01e74eddeacf5baba9) ) /* lookup table */
+ ROM_LOAD( "r-2.4n", 0x0120, 0x0020, CRC(8f574815) SHA1(4f84162db9d58b64742c67dc689eb665b9862fb3) ) /* video layout (not used) */
+ ROM_LOAD( "r-3.7k", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+
+ ROM_REGION( 0x0200, REGION_SOUND1, 0 ) /* sound proms */
+ ROM_LOAD( "nrallyx.spr", 0x0000, 0x0100, CRC(b75c4e87) SHA1(450f79a5ae09e34f7624d37769815baf93c0028e) )
+ ROM_LOAD( "im5623.2m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */
+ROM_END
+
+
+ROM_START( jungler )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "jungr1", 0x0000, 0x1000, CRC(5bd6ad15) SHA1(608de86e19c6726bb7d21e7dc0e936f00121a3f4) )
+ ROM_LOAD( "jungr2", 0x1000, 0x1000, CRC(dc99f1e3) SHA1(942405f6c7d816139e36289126fe883a6a9a0a08) )
+ ROM_LOAD( "jungr3", 0x2000, 0x1000, CRC(3dcc03da) SHA1(2c328a46511c4c9eec6515b9316a586de6503152) )
+ ROM_LOAD( "jungr4", 0x3000, 0x1000, CRC(f92e9940) SHA1(d72a4d0a0ab7c9a1dcbb7925eb8530052640a234) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "1b", 0x0000, 0x1000, CRC(f86999c3) SHA1(4660bd7826219b1bad7d9178918823196d4fd8d6) )
+
+ ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "5k", 0x0000, 0x0800, CRC(924262bf) SHA1(593f59630b3bd369aef0819992106b4e6e6a241f) )
+ ROM_LOAD( "5m", 0x0800, 0x0800, CRC(131a08ac) SHA1(167a0710a2a153f7f7c6839d2340e5aa725ef039) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "82s129.10g", 0x0000, 0x0100, CRC(c59c51b7) SHA1(e8ac60fed9ba16c61a4c3c09e27f8c3f4e254014) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "18s030.8b", 0x0000, 0x0020, CRC(55a7e6d1) SHA1(f9e4ff3b165235db2fd8dab94c43bc686c3ad29b) ) /* palette */
+ ROM_LOAD( "tbp24s10.9d", 0x0020, 0x0100, CRC(d223f7b8) SHA1(87b62f09d4eda09c16d99d1554017d18e52b5886) ) /* loookup table */
+ ROM_LOAD( "18s030.7a", 0x0120, 0x0020, CRC(8f574815) SHA1(4f84162db9d58b64742c67dc689eb665b9862fb3) ) /* video layout (not used) */
+ ROM_LOAD( "6331-1.10a", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+ROM_START( junglers )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "5c", 0x0000, 0x1000, CRC(edd71b28) SHA1(6bdd85bc1c24ca57573252fd636e05759164de8a) )
+ ROM_LOAD( "5a", 0x1000, 0x1000, CRC(61ea4d46) SHA1(575ffe9fc7d5777c8f2d2b449623c353f42a4249) )
+ ROM_LOAD( "4d", 0x2000, 0x1000, CRC(557c7925) SHA1(84d8eb2fdb7ee9098805be9f457a37f51e4bc3b8) )
+ ROM_LOAD( "4c", 0x3000, 0x1000, CRC(51aac9a5) SHA1(2c8a24b4ce8cec96c6e09332f3f63bd7d25ae4c6) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "1b", 0x0000, 0x1000, CRC(f86999c3) SHA1(4660bd7826219b1bad7d9178918823196d4fd8d6) )
+
+ ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "5k", 0x0000, 0x0800, CRC(924262bf) SHA1(593f59630b3bd369aef0819992106b4e6e6a241f) )
+ ROM_LOAD( "5m", 0x0800, 0x0800, CRC(131a08ac) SHA1(167a0710a2a153f7f7c6839d2340e5aa725ef039) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "82s129.10g", 0x0000, 0x0100, CRC(c59c51b7) SHA1(e8ac60fed9ba16c61a4c3c09e27f8c3f4e254014) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "18s030.8b", 0x0000, 0x0020, CRC(55a7e6d1) SHA1(f9e4ff3b165235db2fd8dab94c43bc686c3ad29b) ) /* palette */
+ ROM_LOAD( "tbp24s10.9d", 0x0020, 0x0100, CRC(d223f7b8) SHA1(87b62f09d4eda09c16d99d1554017d18e52b5886) ) /* loookup table */
+ ROM_LOAD( "18s030.7a", 0x0120, 0x0020, CRC(8f574815) SHA1(4f84162db9d58b64742c67dc689eb665b9862fb3) ) /* video layout (not used) */
+ ROM_LOAD( "6331-1.10a", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+ROM_START( tactcian )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "tacticia.001", 0x0000, 0x1000, CRC(99163e39) SHA1(0a863f358a0bb065a9e2c41fcf4c20d370001dfe) )
+ ROM_LOAD( "tacticia.002", 0x1000, 0x1000, CRC(6d3e8a69) SHA1(2b4b3f2b7401064540f59070ef6742d1f44ca839) )
+ ROM_LOAD( "tacticia.003", 0x2000, 0x1000, CRC(0f71d0fa) SHA1(cb55243853b8b33034af7a6438f9a7c85a774d71) )
+ ROM_LOAD( "tacticia.004", 0x3000, 0x1000, CRC(5e15f3b3) SHA1(01979f64b281a958f0a4effe2be21bf0e0a812bf) )
+ ROM_LOAD( "tacticia.005", 0x4000, 0x1000, CRC(76456106) SHA1(580428f3c8cf442ee5c0f56db973644229aa8093) )
+ ROM_LOAD( "tacticia.006", 0x5000, 0x1000, CRC(b33ca9ea) SHA1(0299c1cb9a3c6368bbbacb60c6f5c6854035a7bf) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "tacticia.s2", 0x0000, 0x1000, CRC(97d145a7) SHA1(7aee9004287590a25e153d45b95dfaac89fbe996) )
+ ROM_LOAD( "tacticia.s1", 0x1000, 0x1000, CRC(067f781b) SHA1(640bc7813c239e497644e53a080d81366fcd04df) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "tacticia.c1", 0x0000, 0x1000, CRC(5d3ee965) SHA1(654c033291f3d139fb94f7aacbc2d1917856deb6) )
+ ROM_LOAD( "tacticia.c2", 0x1000, 0x1000, CRC(e8c59c4f) SHA1(e4881f2e2e08bb8af37cc679c4e2367528ac4804) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "tact6301.004", 0x0000, 0x0100, CRC(88b0b511) SHA1(785eded1ba761cdb59db579eb8a786516ff58152) ) /* dots */ // tac.a7
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "tact6331.002", 0x0000, 0x0020, CRC(b7ef83b7) SHA1(5ffab25c2dc5be0856a43a93711d39c4aec6660b) ) /* palette */
+ ROM_LOAD( "tact6301.003", 0x0020, 0x0100, CRC(a92796f2) SHA1(0faab2dc0f868f4023a34ecfcf972d1c86a224a0) ) /* loookup table */ // tac.b4
+ ROM_LOAD( "tact6331.001", 0x0120, 0x0020, CRC(8f574815) SHA1(4f84162db9d58b64742c67dc689eb665b9862fb3) ) /* video layout (not used) */
+// ROM_LOAD( "10a.bpr", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+ROM_START( tactcan2 )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "tan1", 0x0000, 0x1000, CRC(ddf38b75) SHA1(bad66fd6ae0ab3b91989fca14a8696ed855dc852) )
+ ROM_LOAD( "tan2", 0x1000, 0x1000, CRC(f065ee2e) SHA1(f2362c471981af3348465f3c8a5ffb38058432a5) )
+ ROM_LOAD( "tan3", 0x2000, 0x1000, CRC(2dba64fe) SHA1(8d312a6db99d2248fef2bbc590ceba333b0fde8b) )
+ ROM_LOAD( "tan4", 0x3000, 0x1000, CRC(2ba07847) SHA1(3cd7cd0621ed930cb5955fc2ffe3239f6e176321) )
+ ROM_LOAD( "tan5", 0x4000, 0x1000, CRC(1dae4c61) SHA1(70283b8412b0725f1c2acc281625c582a4fae39d) )
+ ROM_LOAD( "tan6", 0x5000, 0x1000, CRC(2b36a18d) SHA1(bea8f36ec98975438ab267509bd9d1d1eb605945) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ /* sound ROMs were missing - using the ones from the other set */
+ ROM_LOAD( "tacticia.s2", 0x0000, 0x1000, CRC(97d145a7) SHA1(7aee9004287590a25e153d45b95dfaac89fbe996) )
+ ROM_LOAD( "tacticia.s1", 0x1000, 0x1000, CRC(067f781b) SHA1(640bc7813c239e497644e53a080d81366fcd04df) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "c1", 0x0000, 0x1000, CRC(5399471f) SHA1(66aea0df982ccbd6caaa24c258b2ba364bc1ecfd) )
+ ROM_LOAD( "c2", 0x1000, 0x1000, CRC(8e8861e8) SHA1(38728418b09df06356c1e45a26cf438b93517ce5) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "tact6301.004", 0x0000, 0x0100, CRC(88b0b511) SHA1(785eded1ba761cdb59db579eb8a786516ff58152) ) /* dots */ // tac.a7
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "tact6331.002", 0x0000, 0x0020, CRC(b7ef83b7) SHA1(5ffab25c2dc5be0856a43a93711d39c4aec6660b) ) /* palette */
+ ROM_LOAD( "tact6301.003", 0x0020, 0x0100, CRC(a92796f2) SHA1(0faab2dc0f868f4023a34ecfcf972d1c86a224a0) ) /* loookup table */ // tac.b4
+ ROM_LOAD( "tact6331.001", 0x0120, 0x0020, CRC(8f574815) SHA1(4f84162db9d58b64742c67dc689eb665b9862fb3) ) /* video layout (not used) */
+// ROM_LOAD( "10a.bpr", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+ROM_START( locomotn )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "1a.cpu", 0x0000, 0x1000, CRC(b43e689a) SHA1(7f1a0fa1ea9ff95a9d51b23ea00792ba22024282) )
+ ROM_LOAD( "2a.cpu", 0x1000, 0x1000, CRC(529c823d) SHA1(714ae0af254646eb6ebc5f47422246832e89ccfb) )
+ ROM_LOAD( "3.cpu", 0x2000, 0x1000, CRC(c9dbfbd1) SHA1(10ec7403053ef52d0ce4aa6eab3e82a3ea5e57ff) )
+ ROM_LOAD( "4.cpu", 0x3000, 0x1000, CRC(caf6431c) SHA1(f013d8846fad9f64367b69febeb7512029a639c0) )
+ ROM_LOAD( "5.cpu", 0x4000, 0x1000, CRC(64cf8dd6) SHA1(8fa1b5c4a7f136cb74833425a565fa558eeee083) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "1b_s1.bin", 0x0000, 0x1000, CRC(a1105714) SHA1(6e2e264748ab90bc5e8e8167f17ff91677ef6ae7) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "5l_c1.bin", 0x0000, 0x1000, CRC(5732eda9) SHA1(451de30946a9c8198c5ec83cc5c50e3ac2f9f56b) )
+ ROM_LOAD( "c2.cpu", 0x1000, 0x1000, CRC(c3035300) SHA1(ddb1d658a28b973b60e2ce72fd7662537e147860) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "10g.bpr", 0x0000, 0x0100, CRC(2ef89356) SHA1(5ed33386bab5d583358709c92f21ad9ad1a1bce9) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "8b.bpr", 0x0000, 0x0020, CRC(75b05da0) SHA1(aee98f5389e42332f30a6882ee22ff23f37e0573) ) /* palette */
+ ROM_LOAD( "9d.bpr", 0x0020, 0x0100, CRC(aa6cf063) SHA1(08c1c9ab03eb168954b0170d40e95eed81022acd) ) /* loookup table */
+ ROM_LOAD( "7a.bpr", 0x0120, 0x0020, CRC(48c8f094) SHA1(61592209720fddc8991751edf08b6950388af42e) ) /* video layout (not used) */
+ ROM_LOAD( "10a.bpr", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+ROM_START( gutangtn )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "3d_1.bin", 0x0000, 0x1000, CRC(e9757395) SHA1(78e2f8988ed39d2ecfe1f874be370f603d5eecc1) )
+ ROM_LOAD( "3e_2.bin", 0x1000, 0x1000, CRC(11d21d2e) SHA1(fd17dd481bb7bb39234fa7e9946b1cb4fa18109e) )
+ ROM_LOAD( "3f_3.bin", 0x2000, 0x1000, CRC(4d80f895) SHA1(7d83f4ee34226636012a84f46af01991a28b96f6) )
+ ROM_LOAD( "3h_4.bin", 0x3000, 0x1000, CRC(aa258ddf) SHA1(0f01ac0d72d8bb5a55c91a6fba3e55ed1c038b86) )
+ ROM_LOAD( "3j_5.bin", 0x4000, 0x1000, CRC(52aec87e) SHA1(6516724c4e570972f070f6dab5b066ea92f56be0) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "1b_s1.bin", 0x0000, 0x1000, CRC(a1105714) SHA1(6e2e264748ab90bc5e8e8167f17ff91677ef6ae7) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "5l_c1.bin", 0x0000, 0x1000, CRC(5732eda9) SHA1(451de30946a9c8198c5ec83cc5c50e3ac2f9f56b) )
+ ROM_LOAD( "5m_c2.bin", 0x1000, 0x1000, CRC(51c542fd) SHA1(1437f8cba15811361b2c5b46085587ea3598fc88) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "10g.bpr", 0x0000, 0x0100, CRC(2ef89356) SHA1(5ed33386bab5d583358709c92f21ad9ad1a1bce9) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "8b.bpr", 0x0000, 0x0020, CRC(75b05da0) SHA1(aee98f5389e42332f30a6882ee22ff23f37e0573) ) /* palette */
+ ROM_LOAD( "9d.bpr", 0x0020, 0x0100, CRC(aa6cf063) SHA1(08c1c9ab03eb168954b0170d40e95eed81022acd) ) /* loookup table */
+ ROM_LOAD( "7a.bpr", 0x0120, 0x0020, CRC(48c8f094) SHA1(61592209720fddc8991751edf08b6950388af42e) ) /* video layout (not used) */
+ ROM_LOAD( "10a.bpr", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+ROM_START( cottong )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "c1", 0x0000, 0x1000, CRC(2c256fe6) SHA1(115594c616497eec998e4e3255ec6ab6299346fa) )
+ ROM_LOAD( "c2", 0x1000, 0x1000, CRC(1de5e6a0) SHA1(8bb3408a510662ff3b9b7201d2d06fe70685bf7f) )
+ ROM_LOAD( "c3", 0x2000, 0x1000, CRC(01f909fe) SHA1(c80295e9f91ce25bfd28e72823b20ee6f6524a5c) )
+ ROM_LOAD( "c4", 0x3000, 0x1000, CRC(a89eb3e3) SHA1(058928ade909faba06f177750f914cf1dabaefc3) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "c7", 0x0000, 0x1000, CRC(3d83f6d3) SHA1(e10ed6b6ce7280697c1bc9dbe6c6e6018e1d8be4) )
+ ROM_LOAD( "c8", 0x1000, 0x1000, CRC(323e1937) SHA1(75499d6c8a9032fac090a13cd4f36bd350f52dab) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "c5", 0x0000, 0x1000, CRC(992d079c) SHA1(b5acd30f2e8700cc4cd852b190bd1f4163b137e8) )
+ ROM_LOAD( "c6", 0x1000, 0x1000, CRC(0149ef46) SHA1(58f684a9b7b9410236b3c54ea6c0fa9853a078c5) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "5.bpr", 0x0000, 0x0100, CRC(21fb583f) SHA1(b8c65fbdd5d8b70bf51341cd60fc2efeaab8bb82) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "2.bpr", 0x0000, 0x0020, CRC(26f42e6f) SHA1(f51578216a5d588c4d0143ce7a23d695a15a3914) ) /* palette */
+ ROM_LOAD( "3.bpr", 0x0020, 0x0100, CRC(4aecc0c8) SHA1(3c1086a598d84b4bcb277556b716fd18c76c4364) ) /* loookup table */
+ ROM_LOAD( "7a.bpr", 0x0120, 0x0020, CRC(48c8f094) SHA1(61592209720fddc8991751edf08b6950388af42e) ) /* video layout (not used) */
+ ROM_LOAD( "10a.bpr", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+ROM_START( commsega )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "csega1", 0x0000, 0x1000, CRC(92de3405) SHA1(81ef4274b13f92d6274a0a037d7dc77ba0f67a1b) )
+ ROM_LOAD( "csega2", 0x1000, 0x1000, CRC(f14e2f9a) SHA1(c1a7ec1c306e07bac0bbf19b60f756650f63ae29) )
+ ROM_LOAD( "csega3", 0x2000, 0x1000, CRC(941dbf48) SHA1(01d2d64fb662af423aa04507ba97997772130c54) )
+ ROM_LOAD( "csega4", 0x3000, 0x1000, CRC(e0ac69b4) SHA1(3a52b2a6204b7310cfe321c582352b437de16660) )
+ ROM_LOAD( "csega5", 0x4000, 0x1000, CRC(bc56ebd0) SHA1(a178cd5ba381b107e720e18f3549247477037998) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "csega8", 0x0000, 0x1000, CRC(588b4210) SHA1(43bac1bdac721567e4b5d56e9e4488165872bd6a) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "csega7", 0x0000, 0x1000, CRC(e8e374f9) SHA1(442cc6b7e7d5b9472a5c16d6f78db0c03e651e98) )
+ ROM_LOAD( "csega6", 0x1000, 0x1000, CRC(cf07fd5e) SHA1(4fe351c3d093f8f5fcf95e3e921a06e44d14d2a7) )
+
+ ROM_REGION( 0x0100, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "gg3.bpr", 0x0000, 0x0100, CRC(ae7fd962) SHA1(118359cffb2ad3fdf09456a484aa730cb1b85a5d) ) /* dots */
+
+ ROM_REGION( 0x0160, REGION_PROMS, 0 )
+ ROM_LOAD( "gg1.bpr", 0x0000, 0x0020, CRC(f69e585a) SHA1(248740b154732b6bc6f772d4bb19d654798c3739) ) /* palette */
+ ROM_LOAD( "gg2.bpr", 0x0020, 0x0100, CRC(0b756e30) SHA1(8890e305547df8df108af0f89074fb1c8bed8e6c) ) /* loookup table */
+ ROM_LOAD( "gg0.bpr", 0x0120, 0x0020, CRC(48c8f094) SHA1(61592209720fddc8991751edf08b6950388af42e) ) /* video layout (not used) */
+ ROM_LOAD( "tt3.bpr", 0x0140, 0x0020, CRC(b8861096) SHA1(26fad384ed7a1a1e0ba719b5578e2dbb09334a25) ) /* video timing (not used) */
+ROM_END
+
+
+
+GAME( 1980, rallyx, 0, rallyx, rallyx, rallyx, ROT0, "Namco", "Rally X", 0 )
+GAME( 1980, rallyxm, rallyx, rallyx, rallyx, rallyx, ROT0, "[Namco] (Midway license)", "Rally X (Midway)", 0 )
+GAME( 1981, nrallyx, 0, rallyx, nrallyx, rallyx, ROT0, "Namco", "New Rally X", 0 )
+
+GAME( 1981, jungler, 0, tactcian, jungler, jungler, ROT90, "Konami", "Jungler", 0 )
+GAME( 1981, junglers, jungler, tactcian, jungler, jungler, ROT90, "[Konami] (Stern license)", "Jungler (Stern)", 0 )
+GAME( 1982, tactcian, 0, tactcian, tactcian, tactcian, ROT90, "[Konami] (Sega license)", "Tactician (set 1)", 0 )
+GAME( 1981, tactcan2, tactcian, tactcian, tactcian, tactcian, ROT90, "[Konami] (Sega license)", "Tactician (set 2)", 0 )
+GAME( 1982, locomotn, 0, locomotn, locomotn, locomotn, ROT90, "Konami (Centuri license)", "Loco-Motion", 0 )
+GAME( 1982, gutangtn, locomotn, locomotn, locomotn, locomotn, ROT90, "Konami (Sega license)", "Guttang Gottong", 0 )
+GAME( 1982, cottong, locomotn, locomotn, locomotn, locomotn, ROT90, "bootleg", "Cotocoto Cottong", 0 )
+GAME( 1983, commsega, 0, locomotn, commsega, commsega, ROT90, "Sega", "Commando (Sega)", GAME_IMPERFECT_SOUND )