summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/namcos86.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/namcos86.c')
-rw-r--r--trunk/src/mame/drivers/namcos86.c1537
1 files changed, 1537 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/namcos86.c b/trunk/src/mame/drivers/namcos86.c
new file mode 100644
index 00000000000..df6ea13fde2
--- /dev/null
+++ b/trunk/src/mame/drivers/namcos86.c
@@ -0,0 +1,1537 @@
+/*******************************************************************
+
+Namco System 86
+
+Sky Kid Deluxe (c) 1986 Namco
+Hopping Mappy (c) 1986 Namco
+The Return of Ishtar (c) 1986 Namco
+Genpei ToumaDen (c) 1986 Namco
+Rolling Thunder (c) 1986 Namco
+Wonder Momo (c) 1987 Namco
+
+
+Rolling Thunder
+Custom ICs:
+----------
+98XX lamp/coin output
+99XX sound volume
+CUS27 clock divider
+CUS30 sound control
+CUS35/CUS48 sprite address generator [1]
+CUS39 sprite generator
+CUS41 address decoder [2] [3]
+CUS42(x2) dual scrolling tilemap address generator
+CUS43(x2) dual tilemap generator
+CUS47 address decoder
+CUS60 MCU (63701) [2]
+CUS115 expansion board ROM banking [4]
+
+[1] Schematics show CUS35, parts list shows CUS48
+[2] Shown in schematics but not in the parts list
+[3] Changes from game to game
+[4] The expansion board is used only by some games
+
+
+Rolling Thunder Memory map
+--------------------------
+Most of the decoding is done by custom chips (CUS47 and CUS41), so the memory
+map is inferred by program behaviour. The customs also handle internally irq
+and watchdog.
+The main CPU memory map is the same in all games because CUS47 is used by all
+games. The sub CPU and sound CPU, on the other hand, change because CUS41 is
+replaced by other chips.
+All RAM is shared between main and sub CPU, except for sound RAM which is shared
+between main and sound CPU; the portion of object RAM that is overlapped by sound
+RAM is used exclusively by the sub CPU.
+
+MAIN CPU:
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+000xxxxxxxxxxxxx R/W xxxxxxxx SCROLL0 tilemap 0/1 RAM (shared with sub CPU)
+001xxxxxxxxxxxxx R/W xxxxxxxx SCROLL1 tilemap 2/3 RAM (shared with sub CPU)
+010000xxxxxxxxxx R/W xxxxxxxx SOUND sound RAM (through CUS30, shared with MCU)
+01000000xxxxxxxx R/W xxxxxxxx portion holding the sound wave data
+0100000100xxxxxx R/W xxxxxxxx portion holding the sound registers
+010xxxxxxxxxxxxx R/W xxxxxxxx OBJECT work RAM (shared with sub CPU) [1]
+01011xxxxxxxxxxx R/W xxxxxxxx portion holding sprite registers
+011xxxxxxxxxxxxx R xxxxxxxx ROM 9D program ROM (banked) [2]
+1xxxxxxxxxxxxxxx R xxxxxxxx ROM 9C program ROM
+100000---------- W -------- watchdog reset (RES generated by CUS47)
+100001---------- W -------- main CPU irq acknowledge (IRQ generated by CUS47)
+10001x---------- W -------- BANK tile gfx bank select (data is in A10) (latch in CUS47)
+100100-------x0x W xxxxxxxx LATCH0 tilemap 0/1 X scroll + priority
+100100-------x10 W xxxxxxxx LATCH0 tilemap 0/1 Y scroll
+100100--------11 W ------xx BAMNKM ROM 9D bank select
+100101-------x0x W xxxxxxxx LATCH1 tilemap 2/3 X scroll + priority
+100101-------x10 W xxxxxxxx LATCH1 tilemap 2/3 Y scroll
+100101--------11 W ------xx BAMNKS ROM 12D bank select
+110000---------- W xxxxxxxx BACKCOLOR background color
+
+[1] Note that this is partially overlapped by sound RAM
+[2] In Rolling Thunder and others, replaced by the ROM/voice expansion board
+
+
+SUB CPU:
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+000xxxxxxxxxxxxx R/W xxxxxxxx SUBOBJ work RAM (shared with main CPU)
+00011xxxxxxxxxxx R/W xxxxxxxx portion holding sprite registers
+001xxxxxxxxxxxxx R/W xxxxxxxx SUBSCR0 tilemap 0/1 RAM (shared with main CPU)
+010xxxxxxxxxxxxx R/W xxxxxxxx SUBSCR1 tilemap 2/3 RAM (shared with main CPU)
+011xxxxxxxxxxxxx R xxxxxxxx ROM 12D program ROM (banked) [1]
+1xxxxxxxxxxxxxxx R xxxxxxxx ROM 12C program ROM
+10000----------- W -------- watchdog reset (MRESET generated by CUS41)
+10001----------- W -------- main CPU irq acknowledge (generated by CUS41)
+11010--------x0x W xxxxxxxx LATCH0 tilemap 0/1 X scroll + priority
+11010--------x10 W xxxxxxxx LATCH0 tilemap 0/1 Y scroll
+11010---------11 W ------xx BAMNKM ROM 9D bank select
+11011--------x0x W xxxxxxxx LATCH1 tilemap 2/3 X scroll + priority
+11011--------x10 W xxxxxxxx LATCH1 tilemap 2/3 Y scroll
+11011---------11 W ------xx BAMNKS ROM 12D bank select
+
+[1] Only used by Rolling Thunder
+
+
+MCU:
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+00000000xxxxxxxx MCU internal registers, timers, ports and RAM
+0001xxxxxxxxxxxx R/W xxxxxxxx RAM 3F sound RAM (through CUS30, partially shared with main CPU)
+00010000xxxxxxxx R/W xxxxxxxx portion holding the sound wave data
+0001000100xxxxxx R/W xxxxxxxx portion holding the sound registers
+00100-----00---x R/W xxxxxxxx YMCS YM2151
+00100-----01---- n.c.
+00100-----10---- R xxxxxxxx PORTA switch inputs
+00100-----11---- R xxxxxxxx PORTB dip switches
+01xxxxxxxxxxxxxx R xxxxxxxx ROM 6B program ROM (lower half)
+10xxxxxxxxxxxxxx R xxxxxxxx ROM 6B program ROM (upper half)
+10110----------- W unknown (CUS41)
+10111----------- W unknown (CUS41)
+1111xxxxxxxxxxxx R xxxxxxxx MCU internal ROM
+
+
+Notes:
+-----
+- we are using an unusually high CPU interleave factor (800) to avoid hangs
+ in rthunder. The two 6809 in this game synchronize using a semaphore at
+ 5606/5607 (CPU1) 1606/1607 (CPU2). CPU1 clears 5606, does some quick things,
+ and then increments 5606. While it does its quick things (which require
+ about 40 clock cycles) it expects CPU2 to clear 5607.
+ Raising the interleave factor to 1000 makes wndrmomo crash during attract
+ mode. I haven't investigated on the cause.
+
+- There are two watchdogs, one per CPU (or maybe three). Handling them
+ separately is necessary to allow entering service mode without manually
+ resetting in rthunder and genpeitd: only one of the CPUs stops writing to
+ the watchdog.
+
+- The sprite hardware buffers spriteram: the program writes the sprite list to
+ offsets 4-9 of every 16-byte block, then at the end writes to offset 0x1ff2 of
+ sprite RAM to signal the chip that the list is complete. The chip will copy
+ the list from 4-9 to 10-15 and use it from there. This has not been verified
+ on the real hardware, but it is the most logical way of doing it.
+ Emulating this behaviour and not using an external buffer is important in
+ rthunder: when you insert a coin, the whole sprite RAM is cleared, but 0x1ff2
+ is not written to. If we buffered spriteram to an external buffer, this would
+ cause dangling sprites because the buffer would not be updated.
+
+- spriteram buffering fixes sprite lag, but causes a glitch in rthunder when
+ entering a door. The *closed* door is made of tiles, but the *moving* door is
+ made of sprites. Since sprites are delayed by 1 frame, when you enter a door
+ there is one frame where neither the tile-based closed door nor the
+ sprite-based moving door is shown, so it flickers. This behavior has been
+ confirmed on a real PCB.
+
+TODO:
+----
+- In wndrmomo, enemies coming out from the ground cut "holes" from the crowd in
+ the foreground. This is because the crowd sprites have higher priority, but
+ come earlier in the sprite list, so now that sprite/tilemap orthogonality is
+ implemented, crowd is obscured by sprites following it, which are obscured
+ by the tilemap. Reverting to the previous behaviour, removing orthogonality,
+ would of course fix the problem, but I'm quite sure it wouldn't be correct.
+
+- The two unknown writes for the MCU are probably watchdog reset and irq acknowledge,
+ but they don't seem to work as expected. During the first few frames they are
+ written out of order and hooking them up in the usual way causes the MCU to
+ stop receiving interrupts.
+
+- rthundro crashes often after you die; I've seen this happen only in area 5, though.
+
+- In wndrmomo, nothing happens when setting the service mode dip switch while
+ the game is running. This is unusual for Namco.
+ Also, in rthunder it works during attract mode but not while playing. If you
+ set the service switch while playing, it just hangs.
+
+- in hopmappy, when you enter service mode the screen is flipped. Toggling the
+ flip screen dip switch corrects the problem. It appears that some RAM is
+ cleared after the routine that sets the screen orientation is called, while
+ it should be cleared before. I'm not sure if this is a bug in the original,
+ it could be a timing issue in the driver.
+
+*******************************************************************/
+
+#include "emu.h"
+#include "cpu/m6809/m6809.h"
+#include "cpu/m6800/m6800.h"
+#include "sound/2151intf.h"
+#include "sound/namco.h"
+#include "sound/n63701x.h"
+#include "includes/namcos86.h"
+
+static WRITE8_HANDLER( bankswitch1_w )
+{
+ UINT8 *base = space->machine().region("cpu1")->base() + 0x10000;
+
+ /* if the ROM expansion module is available, don't do anything. This avoids conflict */
+ /* with bankswitch1_ext_w() in wndrmomo */
+ if (space->machine().region("user1")->base()) return;
+
+ memory_set_bankptr(space->machine(), "bank1",base + ((data & 0x03) * 0x2000));
+}
+
+static WRITE8_HANDLER( bankswitch1_ext_w )
+{
+ UINT8 *base = space->machine().region("user1")->base();
+
+ if (base == 0) return;
+
+ memory_set_bankptr(space->machine(), "bank1",base + ((data & 0x1f) * 0x2000));
+}
+
+static WRITE8_HANDLER( bankswitch2_w )
+{
+ UINT8 *base = space->machine().region("cpu2")->base() + 0x10000;
+
+ memory_set_bankptr(space->machine(), "bank2",base + ((data & 0x03) * 0x2000));
+}
+
+/* Stubs to pass the correct Dip Switch setup to the MCU */
+static READ8_HANDLER( dsw0_r )
+{
+ int rhi, rlo;
+
+ rhi = ( input_port_read(space->machine(), "DSWA") & 0x01 ) << 4;
+ rhi |= ( input_port_read(space->machine(), "DSWA") & 0x04 ) << 3;
+ rhi |= ( input_port_read(space->machine(), "DSWA") & 0x10 ) << 2;
+ rhi |= ( input_port_read(space->machine(), "DSWA") & 0x40 ) << 1;
+
+ rlo = ( input_port_read(space->machine(), "DSWB") & 0x01 );
+ rlo |= ( input_port_read(space->machine(), "DSWB") & 0x04 ) >> 1;
+ rlo |= ( input_port_read(space->machine(), "DSWB") & 0x10 ) >> 2;
+ rlo |= ( input_port_read(space->machine(), "DSWB") & 0x40 ) >> 3;
+
+ return rhi | rlo;
+}
+
+static READ8_HANDLER( dsw1_r )
+{
+ int rhi, rlo;
+
+ rhi = ( input_port_read(space->machine(), "DSWA") & 0x02 ) << 3;
+ rhi |= ( input_port_read(space->machine(), "DSWA") & 0x08 ) << 2;
+ rhi |= ( input_port_read(space->machine(), "DSWA") & 0x20 ) << 1;
+ rhi |= ( input_port_read(space->machine(), "DSWA") & 0x80 );
+
+ rlo = ( input_port_read(space->machine(), "DSWB") & 0x02 ) >> 1;
+ rlo |= ( input_port_read(space->machine(), "DSWB") & 0x08 ) >> 2;
+ rlo |= ( input_port_read(space->machine(), "DSWB") & 0x20 ) >> 3;
+ rlo |= ( input_port_read(space->machine(), "DSWB") & 0x80 ) >> 4;
+
+ return rhi | rlo;
+}
+
+
+static WRITE8_HANDLER( int_ack1_w )
+{
+ cputag_set_input_line(space->machine(), "cpu1", 0, CLEAR_LINE);
+}
+
+static WRITE8_HANDLER( int_ack2_w )
+{
+ cputag_set_input_line(space->machine(), "cpu2", 0, CLEAR_LINE);
+}
+
+
+static WRITE8_HANDLER( watchdog1_w )
+{
+ namcos86_state *state = space->machine().driver_data<namcos86_state>();
+ state->m_wdog |= 1;
+ if (state->m_wdog == 3)
+ {
+ state->m_wdog = 0;
+ watchdog_reset_w(space,0,0);
+ }
+}
+
+static WRITE8_HANDLER( watchdog2_w )
+{
+ namcos86_state *state = space->machine().driver_data<namcos86_state>();
+ state->m_wdog |= 2;
+ if (state->m_wdog == 3)
+ {
+ state->m_wdog = 0;
+ watchdog_reset_w(space,0,0);
+ }
+}
+
+
+static WRITE8_HANDLER( namcos86_coin_w )
+{
+ coin_lockout_global_w(space->machine(), data & 1);
+ coin_counter_w(space->machine(), 0,~data & 2);
+ coin_counter_w(space->machine(), 1,~data & 4);
+}
+
+static WRITE8_HANDLER( namcos86_led_w )
+{
+ set_led_status(space->machine(), 0,data & 0x08);
+ set_led_status(space->machine(), 1,data & 0x10);
+}
+
+
+static WRITE8_HANDLER( cus115_w )
+{
+ /* make sure the expansion board is present */
+ if (!space->machine().region("user1")->base())
+ {
+ popmessage("expansion board not present");
+ return;
+ }
+
+ switch ((offset & 0x1e00) >> 9)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ namco_63701x_w(space->machine().device("namco2"), (offset & 0x1e00) >> 9,data);
+ break;
+
+ case 4:
+ bankswitch1_ext_w(space,0,data);
+ break;
+
+ case 5: // not used?
+ case 6: // ? cleared on startup
+ case 7: // ? cleared on startup
+ default: // 8-15 not used?
+ break;
+ }
+}
+
+
+static MACHINE_RESET( namco86 )
+{
+ UINT8 *base = machine.region("cpu1")->base() + 0x10000;
+
+ memory_set_bankptr(machine, "bank1",base);
+}
+
+
+
+static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x1fff) AM_READWRITE(rthunder_videoram1_r,rthunder_videoram1_w) AM_BASE_MEMBER(namcos86_state, m_rthunder_videoram1)
+ AM_RANGE(0x2000, 0x3fff) AM_READWRITE(rthunder_videoram2_r,rthunder_videoram2_w) AM_BASE_MEMBER(namcos86_state, m_rthunder_videoram2)
+
+ AM_RANGE(0x4000, 0x43ff) AM_DEVREADWRITE("namco", namcos1_cus30_r, namcos1_cus30_w) /* PSG device, shared RAM */
+
+ AM_RANGE(0x4000, 0x5fff) AM_READWRITE(rthunder_spriteram_r,rthunder_spriteram_w)
+
+ AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1")
+ AM_RANGE(0x8000, 0xffff) AM_ROM
+
+ /* ROM & Voice expansion board - only some games have it */
+ AM_RANGE(0x6000, 0x7fff) AM_WRITE(cus115_w) /* ROM bank select and 63701X sample player control */
+
+ AM_RANGE(0x8000, 0x8000) AM_WRITE(watchdog1_w)
+ AM_RANGE(0x8400, 0x8400) AM_WRITE(int_ack1_w) /* IRQ acknowledge */
+ AM_RANGE(0x8800, 0x8fff) AM_WRITE(rthunder_tilebank_select_w)
+
+ AM_RANGE(0x9000, 0x9002) AM_WRITE(rthunder_scroll0_w) /* scroll + priority */
+ AM_RANGE(0x9003, 0x9003) AM_WRITE(bankswitch1_w)
+ AM_RANGE(0x9004, 0x9006) AM_WRITE(rthunder_scroll1_w) /* scroll + priority */
+
+ AM_RANGE(0x9400, 0x9402) AM_WRITE(rthunder_scroll2_w) /* scroll + priority */
+// { 0x9403, 0x9403 } sub CPU rom bank select would be here
+ AM_RANGE(0x9404, 0x9406) AM_WRITE(rthunder_scroll3_w) /* scroll + priority */
+
+ AM_RANGE(0xa000, 0xa000) AM_WRITE(rthunder_backcolor_w)
+ADDRESS_MAP_END
+
+
+#define CPU2_MEMORY(NAME,ADDR_SPRITE,ADDR_VIDEO1,ADDR_VIDEO2,ADDR_ROM,ADDR_BANK,ADDR_WDOG,ADDR_INT) \
+static ADDRESS_MAP_START( NAME##_cpu2_map, AS_PROGRAM, 8 ) \
+ AM_RANGE(ADDR_SPRITE+0x0000, ADDR_SPRITE+0x1fff) AM_READWRITE(rthunder_spriteram_r,rthunder_spriteram_w) AM_BASE_MEMBER(namcos86_state, m_rthunder_spriteram) \
+ AM_RANGE(ADDR_VIDEO1+0x0000, ADDR_VIDEO1+0x1fff) AM_READWRITE(rthunder_videoram1_r,rthunder_videoram1_w) \
+ AM_RANGE(ADDR_VIDEO2+0x0000, ADDR_VIDEO2+0x1fff) AM_READWRITE(rthunder_videoram2_r,rthunder_videoram2_w) \
+ AM_RANGE(ADDR_ROM+0x0000, ADDR_ROM+0x1fff) AM_ROMBANK("bank2") \
+ AM_RANGE(0x8000, 0xffff) AM_ROM \
+/* { ADDR_BANK+0x00, ADDR_BANK+0x02 } layer 2 scroll registers would be here */ \
+ AM_RANGE(ADDR_BANK+0x03, ADDR_BANK+0x03) AM_WRITE(bankswitch2_w) \
+/* { ADDR_BANK+0x04, ADDR_BANK+0x06 } layer 3 scroll registers would be here */ \
+ AM_RANGE(ADDR_WDOG, ADDR_WDOG) AM_WRITE(watchdog2_w) \
+ AM_RANGE(ADDR_INT, ADDR_INT) AM_WRITE(int_ack2_w) /* IRQ acknowledge */ \
+ADDRESS_MAP_END
+
+#define UNUSED 0x4000
+/* SPRITE VIDEO1 VIDEO2 ROM BANK WDOG IRQACK */
+CPU2_MEMORY( hopmappy, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, 0x9000, UNUSED )
+CPU2_MEMORY( skykiddx, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, 0x9000, 0x9400 )
+CPU2_MEMORY( roishtar, 0x0000, 0x6000, 0x4000, UNUSED, UNUSED, 0xa000, 0xb000 )
+CPU2_MEMORY( genpeitd, 0x4000, 0x0000, 0x2000, UNUSED, UNUSED, 0xb000, 0x8800 )
+CPU2_MEMORY( rthunder, 0x0000, 0x2000, 0x4000, 0x6000, 0xd800, 0x8000, 0x8800 )
+CPU2_MEMORY( wndrmomo, 0x2000, 0x4000, 0x6000, UNUSED, UNUSED, 0xc000, 0xc800 )
+#undef UNUSED
+
+
+#define MCU_MEMORY(NAME,ADDR_LOWROM,ADDR_INPUT,ADDR_UNK1,ADDR_UNK2) \
+static ADDRESS_MAP_START( NAME##_mcu_map, AS_PROGRAM, 8 ) \
+ AM_RANGE(0x0000, 0x001f) AM_READWRITE(m6801_io_r,m6801_io_w) \
+ AM_RANGE(0x0080, 0x00ff) AM_RAM \
+ AM_RANGE(0x1000, 0x13ff) AM_DEVREADWRITE("namco", namcos1_cus30_r, namcos1_cus30_w) /* PSG device, shared RAM */ \
+ AM_RANGE(0x1400, 0x1fff) AM_RAM \
+ AM_RANGE(ADDR_INPUT+0x00, ADDR_INPUT+0x01) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) \
+ AM_RANGE(ADDR_INPUT+0x20, ADDR_INPUT+0x20) AM_READ_PORT("IN0") \
+ AM_RANGE(ADDR_INPUT+0x21, ADDR_INPUT+0x21) AM_READ_PORT("IN1") \
+ AM_RANGE(ADDR_INPUT+0x30, ADDR_INPUT+0x30) AM_READ(dsw0_r) \
+ AM_RANGE(ADDR_INPUT+0x31, ADDR_INPUT+0x31) AM_READ(dsw1_r) \
+ AM_RANGE(ADDR_LOWROM, ADDR_LOWROM+0x3fff) AM_ROM \
+ AM_RANGE(0x8000, 0xbfff) AM_ROM \
+ AM_RANGE(0xf000, 0xffff) AM_ROM \
+ AM_RANGE(ADDR_UNK1, ADDR_UNK1) AM_WRITENOP /* ??? written (not always) at end of interrupt */ \
+ AM_RANGE(ADDR_UNK2, ADDR_UNK2) AM_WRITENOP /* ??? written (not always) at end of interrupt */ \
+ADDRESS_MAP_END
+
+#define UNUSED 0x4000
+/* LOWROM INPUT UNK1 UNK2 */
+MCU_MEMORY( hopmappy, UNUSED, 0x2000, 0x8000, 0x8800 )
+MCU_MEMORY( skykiddx, UNUSED, 0x2000, 0x8000, 0x8800 )
+MCU_MEMORY( roishtar, 0x0000, 0x6000, 0x8000, 0x9800 )
+MCU_MEMORY( genpeitd, 0x4000, 0x2800, 0xa000, 0xa800 )
+MCU_MEMORY( rthunder, 0x4000, 0x2000, 0xb000, 0xb800 )
+MCU_MEMORY( wndrmomo, 0x4000, 0x3800, 0xc000, 0xc800 )
+#undef UNUSED
+
+
+static READ8_HANDLER( readFF )
+{
+ return 0xff;
+}
+
+static ADDRESS_MAP_START( mcu_port_map, AS_IO, 8 )
+ AM_RANGE(M6801_PORT1, M6801_PORT1) AM_READ_PORT("IN2")
+ AM_RANGE(M6801_PORT2, M6801_PORT2) AM_READ(readFF) /* leds won't work otherwise */
+ AM_RANGE(M6801_PORT1, M6801_PORT1) AM_WRITE(namcos86_coin_w)
+ AM_RANGE(M6801_PORT2, M6801_PORT2) AM_WRITE(namcos86_led_w)
+ADDRESS_MAP_END
+
+
+/*******************************************************************/
+
+static INPUT_PORTS_START( hopmappy )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 2 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 2 player 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service switch from the edge connector */
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 1 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 2 player 2 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 2 */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
+
+ PORT_START("DSWA")
+ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:5,4")
+ PORT_DIPSETTING( 0x10, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x18, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+
+ PORT_START("DSWB")
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:1")
+ PORT_DIPSETTING( 0x80, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hard ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWB:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:3")
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "Level Select (Cheat)") PORT_DIPLOCATION("SWB:4")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SWB:5" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SWB:6" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SWB:7" )
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWB:8")
+ PORT_DIPSETTING( 0x01, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( skykiddx )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 2 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service switch from the edge connector */
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 1 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 2 */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
+
+ PORT_START("DSWA")
+ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "Level Select (Cheat)" ) PORT_DIPLOCATION("SWA:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+
+ PORT_START("DSWB")
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:2,1")
+ PORT_DIPSETTING( 0x80, "1" )
+ PORT_DIPSETTING( 0x40, "2" )
+ PORT_DIPSETTING( 0xc0, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SWB:4,3")
+ PORT_DIPSETTING( 0x00, "20000 Every 80000" )
+ PORT_DIPSETTING( 0x10, "20000 80000" )
+ PORT_DIPSETTING( 0x20, "30000 Every 90000" )
+ PORT_DIPSETTING( 0x30, "30000 90000" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SWB:5" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SWB:6" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SWB:7" )
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:8")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( roishtar )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 2 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service switch from the edge connector */
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 1 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 2 */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY
+
+ PORT_START("DSWA")
+ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SWA:3" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SWA:4" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SWA:5" )
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:8,7,6")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_6C ) )
+
+ PORT_START("DSWB")
+ PORT_DIPNAME( 0x80, 0x80, "Freeze" ) PORT_DIPLOCATION("SWB:1")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SWB:3" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SWB:4" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SWB:5" )
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWB:8,7,6")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_6C ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( genpeitd )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 2 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service switch from the edge connector */
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 1 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 2 */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+
+ PORT_START("DSWA")
+ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SWA:5")
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+
+ PORT_START("DSWB")
+ PORT_DIPNAME( 0xc0, 0xc0, "Candle" ) PORT_DIPLOCATION("SWB:2,1")
+ PORT_DIPSETTING( 0x80, "40" )
+ PORT_DIPSETTING( 0xc0, "50" )
+ PORT_DIPSETTING( 0x40, "60" )
+ PORT_DIPSETTING( 0x00, "70" )
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:4,3")
+ PORT_DIPSETTING( 0x20, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SWB:5" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SWB:6" )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWB:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rthunder )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 2 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service switch from the edge connector */
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 1 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 2 */
+ 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_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2)
+
+ PORT_START("DSWA")
+ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "Invulnerability" ) PORT_DIPLOCATION("SWA:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+
+ PORT_START("DSWB")
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:1")
+ PORT_DIPSETTING( 0x80, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SWB:2")
+ PORT_DIPSETTING( 0x40, "70k, 200k" )
+ PORT_DIPSETTING( 0x00, "100k, 300k" )
+ PORT_DIPNAME( 0x20, 0x00, "Timer value" ) PORT_DIPLOCATION("SWB:3")
+ PORT_DIPSETTING( 0x20, "120 secs" )
+ PORT_DIPSETTING( 0x00, "150 secs" )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:4")
+ PORT_DIPSETTING( 0x10, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
+ PORT_DIPNAME( 0x08, 0x00, "Level Select (Cheat)" ) PORT_DIPLOCATION("SWB:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x06, 0x06, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWB:7,6")
+ PORT_DIPSETTING( 0x06, "Upright 1 Player" )
+ PORT_DIPSETTING( 0x02, "Upright 1 Player" ) // duplicated setting
+ PORT_DIPSETTING( 0x04, "Upright 2 Players" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Continues ) ) PORT_DIPLOCATION("SWB:8")
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x01, "6" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rthundro )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 2 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service switch from the edge connector */
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 1 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 2 */
+ 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_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2)
+
+ PORT_START("DSWA")
+ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "Invulnerability" ) PORT_DIPLOCATION("SWA:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+
+ PORT_START("DSWB")
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:2,1")
+ PORT_DIPSETTING( 0x80, "1" )
+ PORT_DIPSETTING( 0x40, "2" )
+ PORT_DIPSETTING( 0xc0, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SWB:3" ) // bonus life score?
+ PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SWB:4" ) // "
+ PORT_DIPNAME( 0x08, 0x08, "Level Select (Cheat)" ) PORT_DIPLOCATION("SWB:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x06, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWB:7,6")
+ PORT_DIPSETTING( 0x00, "Upright 1 Player" )
+ PORT_DIPSETTING( 0x04, "Upright 2 Players" )
+ PORT_DIPSETTING( 0x06, DEF_STR( Cocktail ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) ) // duplicated setting
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( wndrmomo )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 2 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service switch from the edge connector */
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* button 3 player 1 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 1 */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin counter 2 */
+ 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_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2)
+
+ PORT_START("DSWA")
+ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Level_Select ) ) PORT_DIPLOCATION("SWA:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7")
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+
+ PORT_START("DSWB")
+ PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x80, "SWB:1" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x40, 0x40, "SWB:2" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SWB:3" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SWB:4" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SWB:5" )
+ PORT_DIPNAME( 0x06, 0x02, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWB:7,6")
+ PORT_DIPSETTING( 0x02, "Upright 1 Player" )
+ PORT_DIPSETTING( 0x04, "Upright 2 Players" )
+ PORT_DIPSETTING( 0x06, DEF_STR( Cocktail ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) // duplicated setting
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:8")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+/*******************************************************************/
+
+static const gfx_layout tilelayout =
+{
+ 8,8,
+ RGN_FRAC(1,3),
+ 3,
+ { RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) },
+ { 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
+};
+
+static const gfx_layout spritelayout =
+{
+ 32,32,
+ RGN_FRAC(1,1),
+ 4,
+ { 0, 1, 2, 3 },
+ { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
+ 8*4, 9*4, 10*4, 11*4, 12*4, 13*4, 14*4, 15*4,
+ 16*64+0*4, 16*64+1*4, 16*64+2*4, 16*64+3*4, 16*64+4*4, 16*64+5*4, 16*64+6*4, 16*64+7*4,
+ 16*64+8*4, 16*64+9*4, 16*64+10*4, 16*64+11*4, 16*64+12*4, 16*64+13*4, 16*64+14*4, 16*64+15*4 },
+ { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
+ 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64,
+ 32*64, 33*64, 34*64, 35*64, 36*64, 37*64, 38*64, 39*64,
+ 40*64, 41*64, 42*64, 43*64, 44*64, 45*64, 46*64, 47*64 },
+ 64*64
+};
+
+static GFXDECODE_START( namcos86 )
+ GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 2048*0, 256 )
+ GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 2048*0, 256 )
+ GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 2048*1, 128 )
+GFXDECODE_END
+
+/*******************************************************************/
+
+static const namco_interface namco_config =
+{
+ 8, /* number of voices */
+ 0 /* stereo */
+};
+
+
+static MACHINE_CONFIG_START( hopmappy, namcos86_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("cpu1", M6809, 49152000/32)
+ MCFG_CPU_PROGRAM_MAP(cpu1_map)
+ MCFG_CPU_VBLANK_INT("screen", irq0_line_assert)
+
+ MCFG_CPU_ADD("cpu2", M6809, 49152000/32)
+ MCFG_CPU_PROGRAM_MAP(hopmappy_cpu2_map)
+ MCFG_CPU_VBLANK_INT("screen", irq0_line_assert)
+
+ MCFG_CPU_ADD("mcu", HD63701, 49152000/8) /* or compatible 6808 with extra instructions */
+ MCFG_CPU_PROGRAM_MAP(hopmappy_mcu_map)
+ MCFG_CPU_IO_MAP(mcu_port_map)
+ MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) /* ??? */
+
+ MCFG_QUANTUM_TIME(attotime::from_hz(48000)) /* heavy interleaving needed to avoid hangs in rthunder */
+
+ MCFG_MACHINE_RESET(namco86)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60.606060)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MCFG_SCREEN_SIZE(64*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(3 + 8*8, 3 + 44*8-1, 2*8, 30*8-1)
+ MCFG_SCREEN_UPDATE(namcos86)
+ MCFG_SCREEN_EOF(namcos86)
+
+ MCFG_GFXDECODE(namcos86)
+ MCFG_PALETTE_LENGTH(4096)
+
+ MCFG_PALETTE_INIT(namcos86)
+ MCFG_VIDEO_START(namcos86)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("ymsnd", YM2151, 3579580)
+ MCFG_SOUND_ROUTE(0, "mono", 0.0)
+ MCFG_SOUND_ROUTE(1, "mono", 0.60) /* only right channel is connected */
+
+ MCFG_SOUND_ADD("namco", NAMCO_CUS30, 49152000/2048)
+ MCFG_SOUND_CONFIG(namco_config)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( skykiddx, hopmappy )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("cpu2")
+ MCFG_CPU_PROGRAM_MAP(skykiddx_cpu2_map)
+
+ MCFG_CPU_MODIFY("mcu")
+ MCFG_CPU_PROGRAM_MAP(skykiddx_mcu_map)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( roishtar, hopmappy )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("cpu2")
+ MCFG_CPU_PROGRAM_MAP(roishtar_cpu2_map)
+
+ MCFG_CPU_MODIFY("mcu")
+ MCFG_CPU_PROGRAM_MAP(roishtar_mcu_map)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( genpeitd, hopmappy )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("cpu2")
+ MCFG_CPU_PROGRAM_MAP(genpeitd_cpu2_map)
+
+ MCFG_CPU_MODIFY("mcu")
+ MCFG_CPU_PROGRAM_MAP(genpeitd_mcu_map)
+
+ /* sound hardware */
+ MCFG_SOUND_ADD("namco2", NAMCO_63701X, 6000000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( rthunder, hopmappy )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("cpu2")
+ MCFG_CPU_PROGRAM_MAP(rthunder_cpu2_map)
+
+ MCFG_CPU_MODIFY("mcu")
+ MCFG_CPU_PROGRAM_MAP(rthunder_mcu_map)
+
+ /* sound hardware */
+ MCFG_SOUND_ADD("namco2", NAMCO_63701X, 6000000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( wndrmomo, hopmappy )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("cpu2")
+ MCFG_CPU_PROGRAM_MAP(wndrmomo_cpu2_map)
+
+ MCFG_CPU_MODIFY("mcu")
+ MCFG_CPU_PROGRAM_MAP(wndrmomo_mcu_map)
+
+ /* sound hardware */
+ MCFG_SOUND_ADD("namco2", NAMCO_63701X, 6000000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
+
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( skykiddx )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "sk3_1b.9c", 0x08000, 0x8000, CRC(767b3514) SHA1(7b85e520e56924235d1f4987333f183c914fafc1) )
+ ROM_LOAD( "sk3_2.9d", 0x10000, 0x8000, CRC(74b8f8e2) SHA1(0c9f0a283c764d5db59abea17a7f3285718b4501) )
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "sk3_3.12c", 0x8000, 0x8000, CRC(6d1084c4) SHA1(0045e01cbeb750c50a561420f1577de8cd881894) )
+ /* 12d empty */
+
+ ROM_REGION( 0x0c000, "gfx1", 0 )
+ ROM_LOAD( "sk3_9.7r", 0x00000, 0x08000, CRC(48675b17) SHA1(434babcf5454364a17e529daae16e6f623ca75dd) ) /* plane 1,2 */
+ ROM_LOAD( "sk3_10.7s", 0x08000, 0x04000, CRC(7418465a) SHA1(e8236c3d077af147a7d5f8f9cd519d030c073aaf) ) /* plane 3 */
+
+ ROM_REGION( 0x0c000, "gfx2", 0 )
+ ROM_LOAD( "sk3_7.4r", 0x00000, 0x08000, CRC(4036b735) SHA1(4177f3f37feb83fab63a1160a939c8d566bbe16c) ) /* plane 1,2 */
+ ROM_LOAD( "sk3_8.4s", 0x08000, 0x04000, CRC(044bfd21) SHA1(4fbb72fbf041cb256377952d860147376fc1d05b) ) /* plane 3 */
+
+ ROM_REGION( 0x40000, "gfx3", 0 )
+ ROM_LOAD( "sk3_5.12h", 0x00000, 0x8000, CRC(5c7d4399) SHA1(9c57e2510b1a01f618364ddaa9b9fa0ce9ae7340) )
+ ROM_LOAD( "sk3_6.12k", 0x08000, 0x8000, CRC(c908a3b2) SHA1(5fd5304c314443fb3351e7a2d50a72a0fede7e6d) )
+ /* 12l/m/p/r/t/u empty */
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "sk3-1.3r", 0x0000, 0x0200, CRC(9e81dedd) SHA1(9d2ddf51788d22ed65db9070684e586b2f64f99e) ) /* red & green components */
+ ROM_LOAD( "sk3-2.3s", 0x0200, 0x0200, CRC(cbfec4dd) SHA1(98adf5db270a853ab2a2e1cdd9edfd5657287a96) ) /* blue component */
+ ROM_LOAD( "sk3-3.4v", 0x0400, 0x0800, CRC(81714109) SHA1(577e513369a4368b7dd29dff80904eb0ac2004ff) ) /* tiles color table */
+ ROM_LOAD( "sk3-4.5v", 0x0c00, 0x0800, CRC(1bf25acc) SHA1(a8db254ba4cbb85efc232a5bf9b268534455ad4a) ) /* sprites color table */
+ ROM_LOAD( "sk3-5.6u", 0x1400, 0x0020, CRC(e4130804) SHA1(e1a3e1383186d036fba6dc8a8681f48f24f59281) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "sk3_4.6b", 0x8000, 0x4000, CRC(e6cae2d6) SHA1(b6598aaee0136b0980e13326cb2835aadadd9543) ) /* subprogram for the MCU */
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ /* the ROM/voice expansion board is not present in this game */
+ROM_END
+
+ROM_START( skykiddxo )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "sk3_1.9c", 0x08000, 0x8000, CRC(5722a291) SHA1(0b3ca2585bf5c18214c1337dce8f92027e9d78c2) )
+ ROM_LOAD( "sk3_2.9d", 0x10000, 0x8000, CRC(74b8f8e2) SHA1(0c9f0a283c764d5db59abea17a7f3285718b4501) )
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "sk3_3.12c", 0x8000, 0x8000, CRC(6d1084c4) SHA1(0045e01cbeb750c50a561420f1577de8cd881894) )
+ /* 12d empty */
+
+ ROM_REGION( 0x0c000, "gfx1", 0 )
+ ROM_LOAD( "sk3_9.7r", 0x00000, 0x08000, CRC(48675b17) SHA1(434babcf5454364a17e529daae16e6f623ca75dd) ) /* plane 1,2 */
+ ROM_LOAD( "sk3_10.7s", 0x08000, 0x04000, CRC(7418465a) SHA1(e8236c3d077af147a7d5f8f9cd519d030c073aaf) ) /* plane 3 */
+
+ ROM_REGION( 0x0c000, "gfx2", 0 )
+ ROM_LOAD( "sk3_7.4r", 0x00000, 0x08000, CRC(4036b735) SHA1(4177f3f37feb83fab63a1160a939c8d566bbe16c) ) /* plane 1,2 */
+ ROM_LOAD( "sk3_8.4s", 0x08000, 0x04000, CRC(044bfd21) SHA1(4fbb72fbf041cb256377952d860147376fc1d05b) ) /* plane 3 */
+
+ ROM_REGION( 0x40000, "gfx3", 0 )
+ ROM_LOAD( "sk3_5.12h", 0x00000, 0x8000, CRC(5c7d4399) SHA1(9c57e2510b1a01f618364ddaa9b9fa0ce9ae7340) )
+ ROM_LOAD( "sk3_6.12k", 0x08000, 0x8000, CRC(c908a3b2) SHA1(5fd5304c314443fb3351e7a2d50a72a0fede7e6d) )
+ /* 12l/m/p/r/t/u empty */
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "sk3-1.3r", 0x0000, 0x0200, CRC(9e81dedd) SHA1(9d2ddf51788d22ed65db9070684e586b2f64f99e) ) /* red & green components */
+ ROM_LOAD( "sk3-2.3s", 0x0200, 0x0200, CRC(cbfec4dd) SHA1(98adf5db270a853ab2a2e1cdd9edfd5657287a96) ) /* blue component */
+ ROM_LOAD( "sk3-3.4v", 0x0400, 0x0800, CRC(81714109) SHA1(577e513369a4368b7dd29dff80904eb0ac2004ff) ) /* tiles color table */
+ ROM_LOAD( "sk3-4.5v", 0x0c00, 0x0800, CRC(1bf25acc) SHA1(a8db254ba4cbb85efc232a5bf9b268534455ad4a) ) /* sprites color table */
+ ROM_LOAD( "sk3-5.6u", 0x1400, 0x0020, CRC(e4130804) SHA1(e1a3e1383186d036fba6dc8a8681f48f24f59281) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "sk3_4.6b", 0x8000, 0x4000, CRC(e6cae2d6) SHA1(b6598aaee0136b0980e13326cb2835aadadd9543) ) /* subprogram for the MCU */
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ /* the ROM/voice expansion board is not present in this game */
+ROM_END
+
+ROM_START( hopmappy )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "hm1_1.9c", 0x08000, 0x8000, CRC(1a83914e) SHA1(6cb96b2518f4b867e20bd5d31ac6913d09c95f06) )
+ /* 9d empty */
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "hm1_2.12c", 0xc000, 0x4000, CRC(c46cda65) SHA1(1131b4aa0a446569e1eb9f59964548058c7993e2) )
+ /* 12d empty */
+
+ ROM_REGION( 0x06000, "gfx1", 0 )
+ ROM_LOAD( "hm1_6.7r", 0x00000, 0x04000, CRC(fd0e8887) SHA1(b76737d22bb1c1ae4d700ea6796e8d91f6ffa275) ) /* plane 1,2 */
+ ROM_FILL( 0x04000, 0x02000, 0 ) /* no plane 3 */
+
+ ROM_REGION( 0x06000, "gfx2", 0 )
+ ROM_LOAD( "hm1_5.4r", 0x00000, 0x04000, CRC(9c4f31ae) SHA1(1c7072355d6f98b8e8554da19eab0512fdd9e2e1) ) /* plane 1,2 */
+ ROM_FILL( 0x04000, 0x02000, 0 ) /* no plane 3 */
+
+ ROM_REGION( 0x40000, "gfx3", 0 )
+ ROM_LOAD( "hm1_4.12h", 0x00000, 0x8000, CRC(78719c52) SHA1(06d7bb9f29ccdbf563b3bf13c0290510b26e186f) )
+ /* 12k/l/m/p/r/t/u empty */
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "hm1-1.3r", 0x0000, 0x0200, CRC(cc801088) SHA1(d2c39ac1694d9b8c426e253702ecd096e68c6db9) ) /* red & green components */
+ ROM_LOAD( "hm1-2.3s", 0x0200, 0x0200, CRC(a1cb71c5) SHA1(d8c33c2e52d64ebf4a07d8a26453e7b872cae413) ) /* blue component */
+ ROM_LOAD( "hm1-3.4v", 0x0400, 0x0800, CRC(e362d613) SHA1(16d87711c1ac4ac2b649a32a5627cbd62cc5031f) ) /* tiles color table */
+ ROM_LOAD( "hm1-4.5v", 0x0c00, 0x0800, CRC(678252b4) SHA1(9e2f7328532be3ac4b48bd5d52cd993108558452) ) /* sprites color table */
+ ROM_LOAD( "hm1-5.6u", 0x1400, 0x0020, CRC(475bf500) SHA1(7e6a91e57d3709a5c70786c8e3ed545ee6026d03) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "hm1_3.6b", 0x8000, 0x2000, CRC(6496e1db) SHA1(f990fb3b2f93295282e8dee4488a4c3fc5ef83d1) ) /* subprogram for the MCU */
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ /* the ROM/voice expansion board is not present in this game */
+ROM_END
+
+ROM_START( roishtar )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "ri1_1c.9c", 0x08000, 0x8000, CRC(14acbacb) SHA1(3c6130f9e5a4ba84be0cc3547c1086707ee3b8e9) )
+ ROM_LOAD( "ri1_2.9d", 0x14000, 0x2000, CRC(fcd58d91) SHA1(e7b6d7afd7cf6c374ee90d6499ea0f205e742b21) )
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "ri1_3.12c", 0x8000, 0x8000, CRC(a39829f7) SHA1(e08114d5154367a3cc36f1485253f18044a1888d) )
+ /* 12d empty */
+
+ ROM_REGION( 0x06000, "gfx1", 0 )
+ ROM_LOAD( "ri1_14.7r", 0x00000, 0x04000, CRC(de8154b4) SHA1(70a65e4656cf9fcf5c54e84c628ec95393e856fb) ) /* plane 1,2 */
+ ROM_LOAD( "ri1_15.7s", 0x04000, 0x02000, CRC(4298822b) SHA1(5aad41fd719c2f310ae485caaacda129c9f2ac94) ) /* plane 3 */
+
+ ROM_REGION( 0x06000, "gfx2", 0 )
+ ROM_LOAD( "ri1_12.4r", 0x00000, 0x04000, CRC(557e54d3) SHA1(d22969deefcb3c3443d08a215f1ec2e874650b19) ) /* plane 1,2 */
+ ROM_LOAD( "ri1_13.4s", 0x04000, 0x02000, CRC(9ebe8e32) SHA1(5990a86bfbf2669e512e8ca875c69b4c60c4d108) ) /* plane 3 */
+
+ ROM_REGION( 0x40000, "gfx3", 0 )
+ ROM_LOAD( "ri1_5.12h", 0x00000, 0x8000, CRC(46b59239) SHA1(bb08e57cd5864f41e27a07dcf449896570d2203d) )
+ ROM_LOAD( "ri1_6.12k", 0x08000, 0x8000, CRC(94d9ef48) SHA1(a13b345b8fe30dea8e85698782674859c385e79a) )
+ ROM_LOAD( "ri1_7.12l", 0x10000, 0x8000, CRC(da802b59) SHA1(b6551db5cd9c3d674cdf1dc59f581ee435a7eeb7) )
+ ROM_LOAD( "ri1_8.12m", 0x18000, 0x8000, CRC(16b88b74) SHA1(9ef3ebf686a539e911bb7a3a4c02d0e2dca616d0) )
+ ROM_LOAD( "ri1_9.12p", 0x20000, 0x8000, CRC(f3de3c2a) SHA1(02705bfd37f8996c5fc9c5bf2a99e859083a75e6) )
+ ROM_LOAD( "ri1_10.12r", 0x28000, 0x8000, CRC(6dacc70d) SHA1(c7db40a0e90c9717f8a2f1507daff997856a3b91) )
+ ROM_LOAD( "ri1_11.12t", 0x30000, 0x8000, CRC(fb6bc533) SHA1(a840af58d6db66518520bc7d88867a09a2e502c2) )
+ /* 12u empty */
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "ri1-1.3r", 0x0000, 0x0200, CRC(29cd0400) SHA1(a9b0d09492710e72e34155cd6a7b7c1a34c56b20) ) /* red & green components */
+ ROM_LOAD( "ri1-2.3s", 0x0200, 0x0200, CRC(02fd278d) SHA1(db104fc7acf2739def902180981eb7ba10ec3dda) ) /* blue component */
+ ROM_LOAD( "ri1-3.4v", 0x0400, 0x0800, CRC(cbd7e53f) SHA1(77ef70be4e8a21948d697649352a5e3527086cf2) ) /* tiles color table */
+ ROM_LOAD( "ri1-4.5v", 0x0c00, 0x0800, CRC(22921617) SHA1(7304cb5a86f524f912feb8b58801393cce5d3b09) ) /* sprites color table */
+ ROM_LOAD( "ri1-5.6u", 0x1400, 0x0020, CRC(e2188075) SHA1(be079ace2070433d4d90c757aef3e415b4e21455) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "ri1_4.6b", 0x0000, 0x4000, CRC(552172b8) SHA1(18b35cb116baba362831fc046241895198b07a53) ) /* subprogram for the MCU */
+ ROM_CONTINUE( 0x8000, 0x4000 )
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ /* the ROM/voice expansion board is not present in this game */
+ROM_END
+
+ROM_START( genpeitd )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "gt1_1b.9c", 0x08000, 0x8000, CRC(75396194) SHA1(2a526064fb91b2796c913f3050867352ac63e643) )
+ /* 9d empty */
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "gt1_2.12c", 0xc000, 0x4000, CRC(302f2cb6) SHA1(19c39afb7d49d80aeaaf67a837cd02bfd3d64fbd) )
+ /* 12d empty */
+
+ ROM_REGION( 0x18000, "gfx1", 0 )
+ ROM_LOAD( "gt1_7.7r", 0x00000, 0x10000, CRC(ea77a211) SHA1(32b8ae11723b6223b42225805acd0dcab65516a5) ) /* plane 1,2 */
+ ROM_LOAD( "gt1_6.7s", 0x10000, 0x08000, CRC(1b128a2e) SHA1(6d7b95326919420538b509a119c26e9109e5539e) ) /* plane 3 */
+
+ ROM_REGION( 0x0c000, "gfx2", 0 )
+ ROM_LOAD( "gt1_5.4r", 0x00000, 0x08000, CRC(44d58b06) SHA1(9663f026092484a4041e486bad23e8e58a4dbf95) ) /* plane 1,2 */
+ ROM_LOAD( "gt1_4.4s", 0x08000, 0x04000, CRC(db8d45b0) SHA1(fd4ebdf442e8b9ccc026079c29a975b1fa6e8dd6) ) /* plane 3 */
+
+ ROM_REGION( 0x100000, "gfx3", 0 )
+ ROM_LOAD( "gt1_11.12h", 0x00000, 0x20000, CRC(3181a5fe) SHA1(a98b8609afe3a41ed7b1432b3c2850e8de2c428b) )
+ ROM_LOAD( "gt1_12.12k", 0x20000, 0x20000, CRC(76b729ab) SHA1(d75aeca1ddbb690ff7442dee3b1d44331d220758) )
+ ROM_LOAD( "gt1_13.12l", 0x40000, 0x20000, CRC(e332a36e) SHA1(fa06da1e4f7ef3adf8e87d8d4d95aa7e0eb2d7b2) )
+ ROM_LOAD( "gt1_14.12m", 0x60000, 0x20000, CRC(e5ffaef5) SHA1(0db1fd0b7553f69a480fcf2d312c6a8cd99ed777) )
+ ROM_LOAD( "gt1_15.12p", 0x80000, 0x20000, CRC(198b6878) SHA1(3f42a80199192412171445dd4fe5c4a3a19a5672) )
+ ROM_LOAD( "gt1_16.12r", 0xa0000, 0x20000, CRC(801e29c7) SHA1(4f1dd17f04f56153cd090887e841e3baa1287755) )
+ ROM_LOAD( "gt1_8.12t", 0xc0000, 0x10000, CRC(ad7bc770) SHA1(babce324189b9380e1a71b63499362e276c99ea8) )
+ ROM_LOAD( "gt1_9.12u", 0xe0000, 0x10000, CRC(d95a5fd7) SHA1(819ac376ac0eb6ffa69153d579a9c11ae5feb6a4) )
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "gt1-1.3r", 0x0000, 0x0200, CRC(2f0ddddb) SHA1(27fa45c0baf9a48002db11be9b3c0472ecfd986c) ) /* red & green components */
+ ROM_LOAD( "gt1-2.3s", 0x0200, 0x0200, CRC(87d27025) SHA1(a50f969d48a99c6d29141458fb3e34b23cf5e67c) ) /* blue component */
+ ROM_LOAD( "gt1-3.4v", 0x0400, 0x0800, CRC(c178de99) SHA1(67289ef9e5068636023316560f9f1690a8384bfb) ) /* tiles color table */
+ ROM_LOAD( "gt1-4.5v", 0x0c00, 0x0800, CRC(9f48ef17) SHA1(78c813dd57326f3f5ab785005ef89ba96303adeb) ) /* sprites color table */
+ ROM_LOAD( "gt1-5.6u", 0x1400, 0x0020, CRC(e4130804) SHA1(e1a3e1383186d036fba6dc8a8681f48f24f59281) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "gt1_3.6b", 0x4000, 0x8000, CRC(315cd988) SHA1(87b1a90b2a53571f7d8f9a475125f3f31ed3cb5d) ) /* subprogram for the MCU */
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ ROM_REGION( 0x40000, "user1", 0 ) /* bank switched data for CPU1 */
+ ROM_LOAD( "gt1_10b.f1", 0x00000, 0x10000, CRC(5721ad0d) SHA1(f16afb3f468957a9de270366605592e14837b8c2) )
+ /* h1 empty */
+ /* k1 empty */
+ /* m1 empty */
+
+ ROM_REGION( 0x80000, "namco2", 0 ) /* PCM samples for Hitachi CPU */
+ ROM_LOAD( "gt1_17.f3", 0x00000, 0x20000, CRC(26181ff8) SHA1(c97a0e6282b2af88d960c71e3af5283608493d31) )
+ ROM_LOAD( "gt1_18.h3", 0x20000, 0x20000, CRC(7ef9e5ea) SHA1(0464d43b39903ce373d70854bbcd5da05896ecae) )
+ ROM_LOAD( "gt1_19.k3", 0x40000, 0x20000, CRC(38e11f6c) SHA1(52dea9d444d5a0421db4a8bf5c79a9d901b6f005) )
+ /* m3 empty */
+ROM_END
+
+ROM_START( rthunder )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "rt3_1b.9c", 0x8000, 0x8000, CRC(7d252a1b) SHA1(cb92709e94eb273b3ce44c55cd252170ad1017f4) )
+ /* 9d empty */
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "rt3_2b.12c", 0x08000, 0x8000, CRC(a7ea46ee) SHA1(52e8757aacb4e01f8432125729e2323c48ebc4f5) )
+ ROM_LOAD( "rt3_3.12d", 0x10000, 0x8000, CRC(a13f601c) SHA1(8987174e364d20eeab706c3e0d4e0d3c2b96723c) )
+
+ ROM_REGION( 0x18000, "gfx1", 0 )
+ ROM_LOAD( "rt1_7.7r", 0x00000, 0x10000, CRC(a85efa39) SHA1(1ed63b421a93960668cb4558c1ca1b3c86b1f6be) ) /* plane 1,2 */
+ ROM_LOAD( "rt1_8.7s", 0x10000, 0x08000, CRC(f7a95820) SHA1(82fe0adf6c5b3abef19031646e1eca1585dcc481) ) /* plane 3 */
+
+ ROM_REGION( 0x0c000, "gfx2", 0 )
+ ROM_LOAD( "rt1_5.4r", 0x00000, 0x08000, CRC(d0fc470b) SHA1(70f7f1e29527044eae405f58af08bad3097990bd) ) /* plane 1,2 */
+ ROM_LOAD( "rt1_6.4s", 0x08000, 0x04000, CRC(6b57edb2) SHA1(4a8f1e024e5be4d76f2c99d506ae7da86af3d1f5) ) /* plane 3 */
+
+ ROM_REGION( 0x80000, "gfx3", 0 )
+ ROM_LOAD( "rt1_9.12h", 0x00000, 0x10000, CRC(8e070561) SHA1(483b4de79f2429236f45c32ec56b97a9a90574a3) )
+ ROM_LOAD( "rt1_10.12k", 0x10000, 0x10000, CRC(cb8fb607) SHA1(ba9400fb19d29a285897cc3a2d4d739ce845f897) )
+ ROM_LOAD( "rt1_11.12l", 0x20000, 0x10000, CRC(2bdf5ed9) SHA1(a771e922ad868ca1e008d08a8ff5fdf28aa315fc) )
+ ROM_LOAD( "rt1_12.12m", 0x30000, 0x10000, CRC(e6c6c7dc) SHA1(ead143c2730a77911839a25734550188533c7b96) )
+ ROM_LOAD( "rt1_13.12p", 0x40000, 0x10000, CRC(489686d7) SHA1(a04b57424acbf2584f736b55740d613a1aae2b8b) )
+ ROM_LOAD( "rt1_14.12r", 0x50000, 0x10000, CRC(689e56a8) SHA1(b4d6de4eec47856a62f396f55d531fbf345cf12a) )
+ ROM_LOAD( "rt1_15.12t", 0x60000, 0x10000, CRC(1d8bf2ca) SHA1(949ae8b00b94bfa5bc2d07888aafbaaaea559b06) )
+ ROM_LOAD( "rt1_16.12u", 0x70000, 0x10000, CRC(1bbcf37b) SHA1(8d27c49b36d5e23dd446c150ada3853eec75e4c1) )
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "rt1-1.3r", 0x0000, 0x0200, CRC(8ef3bb9d) SHA1(4636d6b8ba7611b11d4863fab02475dc4a619eaf) ) /* red & green components */
+ ROM_LOAD( "rt1-2.3s", 0x0200, 0x0200, CRC(6510a8f2) SHA1(935f140bfa7e6f8cebafa7f1b0de99dd319273d4) ) /* blue component */
+ ROM_LOAD( "rt1-3.4v", 0x0400, 0x0800, CRC(95c7d944) SHA1(ca5fea028674882a61507ac7c89ada96f5b2674d) ) /* tiles color table */
+ ROM_LOAD( "rt1-4.5v", 0x0c00, 0x0800, CRC(1391fec9) SHA1(8ca94e22110b20d2ecdf03610bcc89ff4245920f) ) /* sprites color table */
+ ROM_LOAD( "rt1-5.6u", 0x1400, 0x0020, CRC(e4130804) SHA1(e1a3e1383186d036fba6dc8a8681f48f24f59281) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "rt3_4.6b", 0x4000, 0x8000, CRC(00cf293f) SHA1(bc441d21bb4c54a01d2393fbe99201714cd4439d) ) /* subprogram for the MCU */
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ ROM_REGION( 0x40000, "user1", 0 ) /* bank switched data for CPU1 */
+ ROM_LOAD( "rt1_17.f1", 0x00000, 0x10000, CRC(766af455) SHA1(8c71772795e783d6c4b88af9a311d55e363c298a) )
+ ROM_LOAD( "rt1_18.h1", 0x10000, 0x10000, CRC(3f9f2f5d) SHA1(541b8f80800cb55e4b81ac48771d00fe10c90743) )
+ ROM_LOAD( "rt3_19.k1", 0x20000, 0x10000, CRC(c16675e9) SHA1(e31c28cb95ffa85392c74e1d81bfa89acbaefeb9) )
+ ROM_LOAD( "rt3_20.m1", 0x30000, 0x10000, CRC(c470681b) SHA1(87f8d8509c3e8207f34c6001aaf4d0afdad82d0d) )
+
+ ROM_REGION( 0x80000, "namco2", 0 ) /* PCM samples for Hitachi CPU */
+ ROM_LOAD( "rt1_21.f3", 0x00000, 0x10000, CRC(454968f3) SHA1(e0a679353491190b6d4f0355324456a1bd7c8a7a) )
+ ROM_LOAD( "rt2_22.h3", 0x20000, 0x10000, CRC(fe963e72) SHA1(4c9ce4e4c8e756a743c541f670a6741b520125e3) )
+ /* k3 empty */
+ /* m3 empty */
+ROM_END
+
+ROM_START( rthundero )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "r1", 0x8000, 0x8000, CRC(6f8c1252) SHA1(586f2e33dd16f31131e4ae9423d639fdc6555c9c) )
+ /* 9d empty */
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "r2", 0x08000, 0x8000, CRC(f22a03d8) SHA1(5b81fc82813978d5cb69402be72b9ccc585fa1d0) )
+ ROM_LOAD( "r3", 0x10000, 0x8000, CRC(aaa82885) SHA1(fc2bec3cf7e2de5f90174a2ed3bacfa94b6819f4) )
+
+ ROM_REGION( 0x18000, "gfx1", 0 )
+ ROM_LOAD( "rt1_7.7r", 0x00000, 0x10000, CRC(a85efa39) SHA1(1ed63b421a93960668cb4558c1ca1b3c86b1f6be) ) /* plane 1,2 */
+ ROM_LOAD( "rt1_8.7s", 0x10000, 0x08000, CRC(f7a95820) SHA1(82fe0adf6c5b3abef19031646e1eca1585dcc481) ) /* plane 3 */
+
+ ROM_REGION( 0x0c000, "gfx2", 0 )
+ ROM_LOAD( "rt1_5.4r", 0x00000, 0x08000, CRC(d0fc470b) SHA1(70f7f1e29527044eae405f58af08bad3097990bd) ) /* plane 1,2 */
+ ROM_LOAD( "rt1_6.4s", 0x08000, 0x04000, CRC(6b57edb2) SHA1(4a8f1e024e5be4d76f2c99d506ae7da86af3d1f5) ) /* plane 3 */
+
+ ROM_REGION( 0x80000, "gfx3", 0 )
+ ROM_LOAD( "rt1_9.12h", 0x00000, 0x10000, CRC(8e070561) SHA1(483b4de79f2429236f45c32ec56b97a9a90574a3) )
+ ROM_LOAD( "rt1_10.12k", 0x10000, 0x10000, CRC(cb8fb607) SHA1(ba9400fb19d29a285897cc3a2d4d739ce845f897) )
+ ROM_LOAD( "rt1_11.12l", 0x20000, 0x10000, CRC(2bdf5ed9) SHA1(a771e922ad868ca1e008d08a8ff5fdf28aa315fc) )
+ ROM_LOAD( "rt1_12.12m", 0x30000, 0x10000, CRC(e6c6c7dc) SHA1(ead143c2730a77911839a25734550188533c7b96) )
+ ROM_LOAD( "rt1_13.12p", 0x40000, 0x10000, CRC(489686d7) SHA1(a04b57424acbf2584f736b55740d613a1aae2b8b) )
+ ROM_LOAD( "rt1_14.12r", 0x50000, 0x10000, CRC(689e56a8) SHA1(b4d6de4eec47856a62f396f55d531fbf345cf12a) )
+ ROM_LOAD( "rt1_15.12t", 0x60000, 0x10000, CRC(1d8bf2ca) SHA1(949ae8b00b94bfa5bc2d07888aafbaaaea559b06) )
+ ROM_LOAD( "rt1_16.12u", 0x70000, 0x10000, CRC(1bbcf37b) SHA1(8d27c49b36d5e23dd446c150ada3853eec75e4c1) )
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "rt1-1.3r", 0x0000, 0x0200, CRC(8ef3bb9d) SHA1(4636d6b8ba7611b11d4863fab02475dc4a619eaf) ) /* red & green components */
+ ROM_LOAD( "rt1-2.3s", 0x0200, 0x0200, CRC(6510a8f2) SHA1(935f140bfa7e6f8cebafa7f1b0de99dd319273d4) ) /* blue component */
+ ROM_LOAD( "rt1-3.4v", 0x0400, 0x0800, CRC(95c7d944) SHA1(ca5fea028674882a61507ac7c89ada96f5b2674d) ) /* tiles color table */
+ ROM_LOAD( "rt1-4.5v", 0x0c00, 0x0800, CRC(1391fec9) SHA1(8ca94e22110b20d2ecdf03610bcc89ff4245920f) ) /* sprites color table */
+ ROM_LOAD( "rt1-5.6u", 0x1400, 0x0020, CRC(e4130804) SHA1(e1a3e1383186d036fba6dc8a8681f48f24f59281) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "r4", 0x4000, 0x8000, CRC(0387464f) SHA1(ce7f521bc2ecc6525880da2551daf595a394a275) ) /* subprogram for the MCU */
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ ROM_REGION( 0x40000, "user1", 0 ) /* bank switched data for CPU1 */
+ ROM_LOAD( "rt1_17.f1", 0x00000, 0x10000, CRC(766af455) SHA1(8c71772795e783d6c4b88af9a311d55e363c298a) )
+ ROM_LOAD( "rt1_18.h1", 0x10000, 0x10000, CRC(3f9f2f5d) SHA1(541b8f80800cb55e4b81ac48771d00fe10c90743) )
+ ROM_LOAD( "r19", 0x20000, 0x10000, CRC(fe9343b0) SHA1(ae8e5ee11eaf7dc1e8f814b0a0beef97731f042b) )
+ ROM_LOAD( "r20", 0x30000, 0x10000, CRC(f8518d4f) SHA1(3a8551d46ffdf82844b2eb1b2c01cf2d8423a49e) )
+
+ ROM_REGION( 0x80000, "namco2", 0 ) /* PCM samples for Hitachi CPU */
+ ROM_LOAD( "rt1_21.f3", 0x00000, 0x10000, CRC(454968f3) SHA1(e0a679353491190b6d4f0355324456a1bd7c8a7a) )
+ ROM_LOAD( "rt2_22.h3", 0x20000, 0x10000, CRC(fe963e72) SHA1(4c9ce4e4c8e756a743c541f670a6741b520125e3) )
+ /* k3 empty */
+ /* m3 empty */
+ROM_END
+
+ROM_START( wndrmomo )
+ ROM_REGION( 0x18000, "cpu1", 0 )
+ ROM_LOAD( "wm1_1.9c", 0x8000, 0x8000, CRC(34b50bf0) SHA1(112c8c8a0a16382008cacd2e484f91fa9338d10a) )
+ /* 9d empty */
+
+ ROM_REGION( 0x18000, "cpu2", 0 )
+ ROM_LOAD( "wm1_2.12c", 0x8000, 0x8000, CRC(3181efd0) SHA1(01a2e0e4c8ced6f48b6e70393a3c4152b079e9b0) )
+ /* 12d empty */
+
+ ROM_REGION( 0x0c000, "gfx1", 0 )
+ ROM_LOAD( "wm1_6.7r", 0x00000, 0x08000, CRC(93955fbb) SHA1(cffd457886c40bf709b573237165ae8fa9784e32) ) /* plane 1,2 */
+ ROM_LOAD( "wm1_7.7s", 0x08000, 0x04000, CRC(7d662527) SHA1(09d1dc46a402c67dddcdd4cc90f32948c7a28795) ) /* plane 3 */
+
+ ROM_REGION( 0x0c000, "gfx2", 0 )
+ ROM_LOAD( "wm1_4.4r", 0x00000, 0x08000, CRC(bbe67836) SHA1(bc998c2ddc2664db614e7c487f77073a5be69e89) ) /* plane 1,2 */
+ ROM_LOAD( "wm1_5.4s", 0x08000, 0x04000, CRC(a81b481f) SHA1(b5a029e432b29e157505b975ea57cd4b5da361a7) ) /* plane 3 */
+
+ ROM_REGION( 0x80000, "gfx3", 0 )
+ ROM_LOAD( "wm1_8.12h", 0x00000, 0x10000, CRC(14f52e72) SHA1(0f8f58cd13e3393a113817593816f53a218f3ce4) )
+ ROM_LOAD( "wm1_9.12k", 0x10000, 0x10000, CRC(16f8cdae) SHA1(8281b4c66157580f34aec7c035d06f721f77b3d5) )
+ ROM_LOAD( "wm1_10.12l", 0x20000, 0x10000, CRC(bfbc1896) SHA1(0308cf907c77417ad3f84326b074567a00245998) )
+ ROM_LOAD( "wm1_11.12m", 0x30000, 0x10000, CRC(d775ddb2) SHA1(8f1a6efbdaeec9049624be56078e843b3094a277) )
+ ROM_LOAD( "wm1_12.12p", 0x40000, 0x10000, CRC(de64c12f) SHA1(c867e03d6b249ce0c9b3554797ccebaeb2778f73) )
+ ROM_LOAD( "wm1_13.12r", 0x50000, 0x10000, CRC(cfe589ad) SHA1(3289cd1571fefe5266ca1e8bd75069d386919ae5) )
+ ROM_LOAD( "wm1_14.12t", 0x60000, 0x10000, CRC(2ae21a53) SHA1(ef3e5e4fa8580f7891d9e1825d2eda4c387db732) )
+ ROM_LOAD( "wm1_15.12u", 0x70000, 0x10000, CRC(b5c98be0) SHA1(bdd6e0e02632866eea60a6bdeff3af8b6cd08d68) )
+
+ ROM_REGION( 0x1420, "proms", 0 )
+ ROM_LOAD( "wm1-1.3r", 0x0000, 0x0200, CRC(1af8ade8) SHA1(1aa0d314c34abc4154092d4b588214afb0b21e22) ) /* red & green components */
+ ROM_LOAD( "wm1-2.3s", 0x0200, 0x0200, CRC(8694e213) SHA1(f00d692e587c3706e71b6eeef21e1ea87c9dd921) ) /* blue component */
+ ROM_LOAD( "wm1-3.4v", 0x0400, 0x0800, CRC(2ffaf9a4) SHA1(2002df3cc38e05f3e127d05c244cb101d1f1d85f) ) /* tiles color table */
+ ROM_LOAD( "wm1-4.5v", 0x0c00, 0x0800, CRC(f4e83e0b) SHA1(b000d884c6e0373b0403bc9d63eb0452c1197491) ) /* sprites color table */
+ ROM_LOAD( "wm1-5.6u", 0x1400, 0x0020, CRC(e4130804) SHA1(e1a3e1383186d036fba6dc8a8681f48f24f59281) ) /* tile address decoder (used at runtime) */
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "wm1_3.6b", 0x4000, 0x8000, CRC(55f01df7) SHA1(c11574a8b51bf965790b97895452e9fa9ab6b752) ) /* subprogram for the MCU */
+ ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
+
+ ROM_REGION( 0x40000, "user1", 0 ) /* bank switched data for CPU1 */
+ ROM_LOAD( "wm1_16.f1", 0x00000, 0x10000, CRC(e565f8f3) SHA1(e1f417003ef9f700f9d5ed091484463c704c8b9f) )
+ /* h1 empty */
+ /* k1 empty */
+ /* m1 empty */
+
+ ROM_REGION( 0x80000, "namco2", 0 ) /* PCM samples for Hitachi CPU */
+ ROM_LOAD( "wm1_17.f3", 0x00000, 0x10000, CRC(bea3c318) SHA1(50b6e4c546ce056d68fbb2e52cb88397daa615aa) )
+ ROM_LOAD( "wm1_18.h3", 0x20000, 0x10000, CRC(6d73bcc5) SHA1(fccd83bb3a872b4cd8bd9f11f5cdf5926cb9b74e) )
+ ROM_LOAD( "wm1_19.k3", 0x40000, 0x10000, CRC(d288e912) SHA1(d0db58d7ed3d8cf895e031901f91f810f0e18709) )
+ ROM_LOAD( "wm1_20.m3", 0x60000, 0x10000, CRC(076a72cb) SHA1(0d0d74a6b11b07a2d768567e7bc06cf08bbcd68f) )
+ROM_END
+
+
+
+static DRIVER_INIT( namco86 )
+{
+ int size;
+ UINT8 *gfx;
+ UINT8 *buffer;
+
+ /* shuffle tile ROMs so regular gfx unpack routines can be used */
+ gfx = machine.region("gfx1")->base();
+ size = machine.region("gfx1")->bytes() * 2 / 3;
+ buffer = auto_alloc_array(machine, UINT8, size );
+
+ {
+ UINT8 *dest1 = gfx;
+ UINT8 *dest2 = gfx + ( size / 2 );
+ UINT8 *mono = gfx + size;
+ int i;
+
+ memcpy( buffer, gfx, size );
+
+ for ( i = 0; i < size; i += 2 )
+ {
+ UINT8 data1 = buffer[i];
+ UINT8 data2 = buffer[i+1];
+ *dest1++ = ( data1 << 4 ) | ( data2 & 0xf );
+ *dest2++ = ( data1 & 0xf0 ) | ( data2 >> 4 );
+
+ *mono ^= 0xff; mono++;
+ }
+
+ auto_free( machine, buffer );
+ }
+
+ gfx = machine.region("gfx2")->base();
+ size = machine.region("gfx2")->bytes() * 2 / 3;
+ buffer = auto_alloc_array(machine, UINT8, size );
+
+ {
+ UINT8 *dest1 = gfx;
+ UINT8 *dest2 = gfx + ( size / 2 );
+ UINT8 *mono = gfx + size;
+ int i;
+
+ memcpy( buffer, gfx, size );
+
+ for ( i = 0; i < size; i += 2 )
+ {
+ UINT8 data1 = buffer[i];
+ UINT8 data2 = buffer[i+1];
+ *dest1++ = ( data1 << 4 ) | ( data2 & 0xf );
+ *dest2++ = ( data1 & 0xf0 ) | ( data2 >> 4 );
+
+ *mono ^= 0xff; mono++;
+ }
+
+ auto_free( machine, buffer );
+ }
+}
+
+
+
+GAME( 1986, skykiddx, 0, skykiddx, skykiddx, namco86, ROT180, "Namco", "Sky Kid Deluxe (set 1)", 0 )
+GAME( 1986, skykiddxo,skykiddx, skykiddx, skykiddx, namco86, ROT180, "Namco", "Sky Kid Deluxe (set 2)", 0 )
+GAME( 1986, hopmappy, 0, hopmappy, hopmappy, namco86, ROT0, "Namco", "Hopping Mappy", 0 )
+GAME( 1986, roishtar, 0, roishtar, roishtar, namco86, ROT0, "Namco", "The Return of Ishtar", 0 )
+GAME( 1986, genpeitd, 0, genpeitd, genpeitd, namco86, ROT0, "Namco", "Genpei ToumaDen", 0 )
+GAME( 1986, rthunder, 0, rthunder, rthunder, namco86, ROT0, "Namco", "Rolling Thunder (new version)", 0 )
+GAME( 1986, rthundero,rthunder, rthunder, rthundro, namco86, ROT0, "Namco", "Rolling Thunder (old version)", 0 )
+GAME( 1987, wndrmomo, 0, wndrmomo, wndrmomo, namco86, ROT0, "Namco", "Wonder Momo", GAME_IMPERFECT_GRAPHICS )