summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/twin16.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/twin16.c')
-rw-r--r--src/mame/drivers/twin16.c1534
1 files changed, 1534 insertions, 0 deletions
diff --git a/src/mame/drivers/twin16.c b/src/mame/drivers/twin16.c
new file mode 100644
index 00000000000..e8b13f4299f
--- /dev/null
+++ b/src/mame/drivers/twin16.c
@@ -0,0 +1,1534 @@
+/*
+Konami "Twin16"
+
+driver by Phil Stroffolino
+
+CPU : 68000(10M)x2 Z-80
+SOUND : YM2151 007232 uPD7759C
+OSC. : 3.579545MHz 18432.00KHz
+
+Main processors are a pair of 68000 CPUs
+Sounds are generated by a Z80, a Yamaha 2151 and 3012, a Konami custom IC and a UPD7759C
+
+ Dark Adventure / Devil World / Majuu no Ohkoku
+ Vulcan Venture / Gradius II
+ Cuebrick
+ MIA (Japan)
+ Final Round / Hard Puncher (Japan)
+
+Known Issues:
+ - some rogue sprites in Devil World
+ - sprite-background priority isn't correct (see intro screen of Devil World)
+
+68000 Memory Map for Konami Twin System
+
+ CPUA CPUB
+ 0x000000..0x03ffff ROM 0x000000..0x03ffff
+ 0x040000..0x043fff communication RAM 0x040000..0x043fff (shared)
+ 0x060000..0x063fff work RAM 0x060000..0x063fff
+ 0x080000..0x080fff palette
+ 0x080000..0x09ffff ROM (extra tile data)
+ 0x0a0000..0x0a0001 IRQ control 0x0a0000..0x0a0001
+ 0x0a0008..0x0a0009 sound command
+ 0x0a0010..0xa00011 watchdog
+ 0x0c0000..0x0c0001 screenflip
+ 0x0c0002..0x0c000f scroll registers
+
+ 0x100000..0x103fff FIXRAM (text layer)
+ 0x120000..0x123fff VIDRAM (tilemaps) 0x480000..0x483fff (shared)
+ 0x140000..0x143fff OBJRAM (sprites) 0x400000..0x403fff (shared)
+ ZIP RAM (tiles) 0x500000..0x53ffff
+ gfx ROM (banked) 0x600000..0x77ffff
+ sprite gfx RAM 0x780000..0x79ffff
+*/
+
+/*
+
+ Konami Twin16 Hardware
+
+ TODO:
+
+ - mia reset crash
+
+*/
+
+#include "driver.h"
+#include "cpu/m68000/m68000.h"
+#include "cpu/z80/z80.h"
+#include "sound/2151intf.h"
+#include "sound/k007232.h"
+#include "sound/upd7759.h"
+
+extern WRITE16_HANDLER( twin16_videoram2_w );
+extern WRITE16_HANDLER( twin16_paletteram_word_w );
+extern WRITE16_HANDLER( fround_gfx_bank_w );
+extern WRITE16_HANDLER( twin16_video_register_w );
+
+extern VIDEO_START( twin16 );
+extern VIDEO_START( fround );
+extern VIDEO_UPDATE( twin16 );
+extern VIDEO_EOF( twin16 );
+extern VIDEO_UPDATE( vulcan );
+
+extern void twin16_spriteram_process( void );
+
+UINT16 twin16_custom_video;
+UINT16 *twin16_gfx_rom;
+UINT16 *twin16_sprite_gfx_ram;
+UINT16 *twin16_tile_gfx_ram;
+UINT16 *twin16_videoram2; /* text layer */
+
+static UINT16 twin16_CPUA_register, twin16_CPUB_register;
+
+#define CPUA_IRQ_ENABLE (twin16_CPUA_register & 0x20)
+#define CPUB_IRQ_ENABLE (twin16_CPUB_register & 0x02)
+
+static UINT8 twin16_soundlatch;
+static UINT16 twin16_sound_command;
+
+static int cuebrick_nvram_bank;
+static UINT16 cuebrick_nvram[0x400*0x20]; // 32k paged in a 1k window
+
+
+int twin16_spriteram_process_enable( void )
+{
+ return (twin16_CPUA_register & 0x40) == 0;
+}
+
+enum
+{
+ CPU_SOUND,
+ CPU_B,
+ CPU_A
+};
+
+
+/******************************************************************************************/
+
+#define COMRAM_r MRA16_BANK1
+#define COMRAM_w MWA16_BANK1
+
+/* Read/Write Handlers */
+
+static READ16_HANDLER( videoram16_r )
+{
+ return videoram16[offset];
+}
+
+static WRITE16_HANDLER( videoram16_w )
+{
+ COMBINE_DATA(videoram16 + offset);
+}
+
+static READ16_HANDLER( extra_rom_r )
+{
+ return ((UINT16 *)memory_region(REGION_GFX3))[offset];
+}
+
+static READ16_HANDLER( twin16_gfx_rom1_r )
+{
+ return twin16_gfx_rom[offset];
+}
+
+static READ16_HANDLER( twin16_gfx_rom2_r )
+{
+ return twin16_gfx_rom[offset + 0x80000 + ((twin16_CPUB_register&0x04)?0x40000:0)];
+}
+
+static WRITE16_HANDLER( sound_command_w )
+{
+ COMBINE_DATA(&twin16_sound_command);
+ soundlatch_w( 0, twin16_sound_command&0xff );
+}
+
+static READ16_HANDLER( twin16_sprite_status_r )
+{
+ /*
+ return value indicates whether the spriteram16-processing circuitry
+ is busy.
+
+ for now, we'll just alternate the value every time it is read
+ */
+ static int k;
+ k = 1-k;
+ return k;
+}
+
+static WRITE16_HANDLER( twin16_CPUA_register_w )
+{
+ /*
+ 7 6 5 4 3 2 1 0
+ ? sprite protection disable
+ X IRQ5 enable (CPUA)
+ X 0->1 trigger IRQ6 on CPUB
+ X 0->1 trigger IRQ on sound CPU
+ x x x coin counters
+ */
+ UINT16 old = twin16_CPUA_register;
+ COMBINE_DATA(&twin16_CPUA_register);
+ if( twin16_CPUA_register!=old )
+ {
+ if( (old&0x08)==0 && (twin16_CPUA_register&0x08) )
+ {
+ cpunum_set_input_line_and_vector( CPU_SOUND, 0, HOLD_LINE, 0xff );
+ }
+
+ if( (old&0x40) && (twin16_CPUA_register&0x40)==0 )
+ {
+ twin16_spriteram_process();
+ }
+
+ if( (old&0x10)==0 && (twin16_CPUA_register&0x10) )
+ {
+ cpunum_set_input_line( CPU_B, MC68000_IRQ_6, HOLD_LINE );
+ }
+ coin_counter_w( 0, twin16_CPUA_register&0x01 );
+ coin_counter_w( 1, twin16_CPUA_register&0x02 );
+ coin_counter_w( 2, twin16_CPUA_register&0x04 );
+ }
+}
+
+static WRITE16_HANDLER( twin16_CPUB_register_w )
+{
+ /*
+ 7 6 5 4 3 2 1 0
+ X gfx bank select
+ X IRQ5 enable
+ X 0->1 trigger IRQ6 on CPUA
+ */
+ UINT16 old = twin16_CPUB_register;
+ COMBINE_DATA(&twin16_CPUB_register);
+ if( twin16_CPUB_register!=old )
+ {
+ if( (old&0x01)==0 && (twin16_CPUB_register&0x1) )
+ {
+ cpunum_set_input_line( CPU_A, MC68000_IRQ_6, HOLD_LINE );
+ }
+ }
+}
+
+static WRITE16_HANDLER( fround_CPU_register_w )
+{
+ UINT16 old = twin16_CPUA_register;
+ COMBINE_DATA(&twin16_CPUA_register);
+ if( twin16_CPUA_register!=old )
+ {
+ if( (old&0x08)==0 && (twin16_CPUA_register&0x08) )
+ cpunum_set_input_line_and_vector( CPU_SOUND, 0, HOLD_LINE, 0xff ); // trigger IRQ on sound CPU
+ }
+}
+
+static READ16_HANDLER( twin16_input_r )
+{
+ switch( offset )
+ {
+ case 0x00: return readinputport(0); // coin
+ case 0x01: return readinputport(1); // p1
+ case 0x02: return readinputport(2); // p2
+ case 0x03: return readinputport(3); // p3 (Dark Adventure)
+ case 0x08: return readinputport(5); // DSW1
+ case 0x09: return readinputport(4); // DSW2
+ case 0x0c: return readinputport(6); // DSW3
+ }
+ return 0;
+}
+
+static READ8_HANDLER( twin16_sres_r )
+{
+ return twin16_soundlatch;
+}
+
+static WRITE8_HANDLER( twin16_sres_w )
+{
+ /* bit 1 resets the UPD7795C sound chip */
+ upd7759_reset_w(0, data & 0x02);
+ twin16_soundlatch = data;
+}
+
+static READ16_HANDLER( cuebrick_nvram_r )
+{
+ return cuebrick_nvram[offset + (cuebrick_nvram_bank * 0x400 / 2)];
+}
+
+static WRITE16_HANDLER( cuebrick_nvram_w )
+{
+ COMBINE_DATA(&cuebrick_nvram[offset + (cuebrick_nvram_bank * 0x400 / 2)]);
+}
+
+static WRITE16_HANDLER( cuebrick_nvram_bank_w )
+{
+ cuebrick_nvram_bank = (data >> 8);
+}
+
+/* Memory Maps */
+
+static ADDRESS_MAP_START( readmem_sound, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x8000, 0x8fff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x9000, 0x9000) AM_READ(twin16_sres_r)
+ AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_r)
+ AM_RANGE(0xb000, 0xb00d) AM_READ(K007232_read_port_0_r)
+ AM_RANGE(0xc001, 0xc001) AM_READ(YM2151_status_port_0_r)
+ AM_RANGE(0xf000, 0xf000) AM_READ(upd7759_0_busy_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writemem_sound, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x8000, 0x8fff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x9000, 0x9000) AM_WRITE(twin16_sres_w)
+ AM_RANGE(0xb000, 0xb00d) AM_WRITE(K007232_write_port_0_w)
+ AM_RANGE(0xc000, 0xc000) AM_WRITE(YM2151_register_port_0_w)
+ AM_RANGE(0xc001, 0xc001) AM_WRITE(YM2151_data_port_0_w)
+ AM_RANGE(0xd000, 0xd000) AM_WRITE(upd7759_0_port_w)
+ AM_RANGE(0xe000, 0xe000) AM_WRITE(upd7759_0_start_w)
+ AM_RANGE(0xf000, 0xf000) AM_WRITE(MWA8_NOP) // ???
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x040000, 0x043fff) AM_READ(COMRAM_r)
+ AM_RANGE(0x044000, 0x04ffff) AM_READ(MRA16_RAM) // miaj
+ AM_RANGE(0x060000, 0x063fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x080000, 0x080fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x0a0000, 0x0a001b) AM_READ(twin16_input_r)
+ AM_RANGE(0x0b0000, 0x0b03ff) AM_READ(cuebrick_nvram_r)
+ AM_RANGE(0x0c000e, 0x0c000f) AM_READ(twin16_sprite_status_r)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x104000, 0x105fff) AM_READ(MRA16_RAM) // miaj
+ AM_RANGE(0x120000, 0x123fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x140000, 0x143fff) AM_READ(MRA16_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x040000, 0x043fff) AM_WRITE(COMRAM_w)
+ AM_RANGE(0x044000, 0x04ffff) AM_WRITE(MWA16_RAM) // miaj
+ AM_RANGE(0x060000, 0x063fff) AM_WRITE(MWA16_RAM)
+ AM_RANGE(0x080000, 0x080fff) AM_WRITE(twin16_paletteram_word_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x081000, 0x081fff) AM_WRITE(MWA16_NOP)
+ AM_RANGE(0x0a0000, 0x0a0001) AM_WRITE(twin16_CPUA_register_w)
+ AM_RANGE(0x0a0008, 0x0a0009) AM_WRITE(sound_command_w)
+ AM_RANGE(0x0a0010, 0x0a0011) AM_WRITE(watchdog_reset16_w)
+ AM_RANGE(0x0b0000, 0x0b03ff) AM_WRITE(cuebrick_nvram_w)
+ AM_RANGE(0x0b0400, 0x0b0401) AM_WRITE(cuebrick_nvram_bank_w)
+ AM_RANGE(0x0c0000, 0x0c000f) AM_WRITE(twin16_video_register_w)
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(twin16_videoram2_w) AM_BASE(&twin16_videoram2)
+ AM_RANGE(0x104000, 0x105fff) AM_WRITE(MWA16_RAM) // miaj
+ AM_RANGE(0x120000, 0x123fff) AM_WRITE(MWA16_RAM) AM_BASE(&videoram16)
+ AM_RANGE(0x140000, 0x143fff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( readmem_sub, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x040000, 0x043fff) AM_READ(COMRAM_r)
+ AM_RANGE(0x044000, 0x04ffff) AM_READ(MRA16_RAM) // miaj
+ AM_RANGE(0x060000, 0x063fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x080000, 0x09ffff) AM_READ(extra_rom_r)
+ AM_RANGE(0x400000, 0x403fff) AM_READ(spriteram16_r)
+ AM_RANGE(0x480000, 0x483fff) AM_READ(videoram16_r)
+ AM_RANGE(0x500000, 0x53ffff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x600000, 0x6fffff) AM_READ(twin16_gfx_rom1_r)
+ AM_RANGE(0x700000, 0x77ffff) AM_READ(twin16_gfx_rom2_r)
+ AM_RANGE(0x780000, 0x79ffff) AM_READ(MRA16_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writemem_sub, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x040000, 0x043fff) AM_WRITE(COMRAM_w)
+ AM_RANGE(0x044000, 0x04ffff) AM_WRITE(MWA16_RAM) // miaj
+ AM_RANGE(0x060000, 0x063fff) AM_WRITE(MWA16_RAM)
+ AM_RANGE(0x0a0000, 0x0a0001) AM_WRITE(twin16_CPUB_register_w)
+ AM_RANGE(0x400000, 0x403fff) AM_WRITE(spriteram16_w)
+ AM_RANGE(0x480000, 0x483fff) AM_WRITE(videoram16_w)
+ AM_RANGE(0x500000, 0x53ffff) AM_WRITE(MWA16_RAM) AM_BASE(&twin16_tile_gfx_ram)
+ AM_RANGE(0x780000, 0x79ffff) AM_WRITE(MWA16_RAM) AM_BASE(&twin16_sprite_gfx_ram)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( fround_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x040000, 0x043fff) AM_READ(COMRAM_r)
+ AM_RANGE(0x060000, 0x063fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x080000, 0x080fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x0a0000, 0x0a001b) AM_READ(twin16_input_r)
+ AM_RANGE(0x0c000e, 0x0c000f) AM_READ(twin16_sprite_status_r)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x120000, 0x123fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x140000, 0x143fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x500000, 0x6fffff) AM_READ(twin16_gfx_rom1_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( fround_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x040000, 0x043fff) AM_WRITE(COMRAM_w)
+ AM_RANGE(0x060000, 0x063fff) AM_WRITE(MWA16_RAM)
+ AM_RANGE(0x080000, 0x080fff) AM_WRITE(twin16_paletteram_word_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x0a0000, 0x0a0001) AM_WRITE(fround_CPU_register_w)
+ AM_RANGE(0x0a0008, 0x0a0009) AM_WRITE(sound_command_w)
+ AM_RANGE(0x0a0010, 0x0a0011) AM_WRITE(watchdog_reset16_w)
+ AM_RANGE(0x0c0000, 0x0c000f) AM_WRITE(twin16_video_register_w)
+ AM_RANGE(0x0e0000, 0x0e0001) AM_WRITE(fround_gfx_bank_w)
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(twin16_videoram2_w) AM_BASE(&twin16_videoram2)
+ AM_RANGE(0x120000, 0x123fff) AM_WRITE(MWA16_RAM) AM_BASE(&videoram16)
+ AM_RANGE(0x140000, 0x143fff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ADDRESS_MAP_END
+
+/* Input Ports */
+
+#define KONAMI_TWIN_COINAGE PORT_START \
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) \
+ PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) \
+ PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) \
+ PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) \
+ PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) ) \
+ PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) ) \
+ PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) \
+ PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) ) \
+ PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) ) \
+ PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) ) \
+ PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) ) \
+ PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) ) \
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) ) \
+ PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) ) \
+ PORT_DIPSETTING( 0x0a, 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( 0x20, DEF_STR( 4C_1C ) ) \
+ PORT_DIPSETTING( 0x50, DEF_STR( 3C_1C ) ) \
+ PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) \
+ PORT_DIPSETTING( 0x40, DEF_STR( 3C_2C ) ) \
+ PORT_DIPSETTING( 0x10, DEF_STR( 4C_3C ) ) \
+ PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) \
+ PORT_DIPSETTING( 0x30, DEF_STR( 3C_4C ) ) \
+ PORT_DIPSETTING( 0x70, DEF_STR( 2C_3C ) ) \
+ PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) ) \
+ PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ) ) \
+ PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) ) \
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) ) \
+ PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) \
+ PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) \
+ PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) \
+ PORT_DIPSETTING( 0x00, "Disabled" )
+
+static INPUT_PORTS_START( devilw )
+ PORT_START /* 0xa0001 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE4 ) // map, advance through tests
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0003 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // start/powerup
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // attack
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // jump
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0005 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0007 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ KONAMI_TWIN_COINAGE
+
+ PORT_START /* DSW2 */
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x03, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x01, "5" )
+ PORT_DIPSETTING( 0x00, "7" )
+ PORT_BIT( 0x1c, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, "Difficult" )
+ PORT_DIPSETTING( 0x00, "Very Difficult" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* DSW3 0xa0019 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( darkadv )
+ PORT_START /* 0xa0001 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE4 ) // map, advance through tests
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE2 )
+
+ PORT_START /* 0xa0003 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // start/jump
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // attack
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // dynamite
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE3 )
+
+ PORT_START /* 0xa0005 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0007 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* Coinage */
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) )
+ PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
+ PORT_DIPSETTING( 0x00, "Invalid" )
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START /* DSW2 */
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x03, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x01, "5" )
+ PORT_DIPSETTING( 0x00, "7" )
+ PORT_BIT( 0x1c, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, "Difficult" )
+ PORT_DIPSETTING( 0x00, "Very Difficult" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* DSW3 0xa0019 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( vulcan )
+ PORT_START /* 0xa0001 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) // advance through tests
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0003 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // powerup
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // shoot
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // missile
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0005 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0007 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ KONAMI_TWIN_COINAGE
+
+ PORT_START /* DSW2 */
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x03, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x01, "4" )
+ PORT_DIPSETTING( 0x00, "7" )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x18, "20K 70K" )
+ PORT_DIPSETTING( 0x10, "30K 80K" )
+ PORT_DIPSETTING( 0x08, "20K" )
+ PORT_DIPSETTING( 0x00, "70K" )
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, "Difficult" )
+ PORT_DIPSETTING( 0x00, "Very Difficult" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* DSW3 0xa0018 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, "Upright Controls" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Dual ) )
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( gradius2 ) // same as vulcan, different bonus
+ PORT_START /* 0xa0001 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) // advance through tests
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0003 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // powerup
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // shoot
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // missile
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0005 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0007 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ KONAMI_TWIN_COINAGE
+
+ PORT_START /* DSW2 */
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x03, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x01, "4" )
+ PORT_DIPSETTING( 0x00, "7" )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR (Bonus_Life ) )
+ PORT_DIPSETTING( 0x18, "20K 150K" )
+ PORT_DIPSETTING( 0x10, "30K 200K" )
+ PORT_DIPSETTING( 0x08, "20K" )
+ PORT_DIPSETTING( 0x00, "70K" )
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, "Difficult" )
+ PORT_DIPSETTING( 0x00, "Very Difficult" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* DSW3 0xa0018 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, "Upright Controls" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Dual ) )
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fround )
+ PORT_START /* 0xa0001 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) // advance through tests
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0003 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // face punch
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // body punch
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // defend
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0005 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START /* 0xa0007 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ KONAMI_TWIN_COINAGE
+
+ PORT_START /* DSW2 */
+ PORT_DIPNAME( 0x03, 0x02, "Energy" )
+ PORT_DIPSETTING( 0x03, "18" )
+ PORT_DIPSETTING( 0x02, "20" )
+ PORT_DIPSETTING( 0x01, "22" )
+ PORT_DIPSETTING( 0x00, "24" )
+ PORT_BIT( 0x1c, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, "Difficult" )
+ PORT_DIPSETTING( 0x00, "Very Difficult" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* DSW3 0xa0018 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( miaj )
+ PORT_START /* 0xa0001 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) // advance through tests
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0003 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // knife
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // weapon
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // choice
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0005 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0007 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ KONAMI_TWIN_COINAGE
+
+ PORT_START /* DSW2 */
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x03, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x01, "5" )
+ PORT_DIPSETTING( 0x00, "7" )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x18, "30K 80K" )
+ PORT_DIPSETTING( 0x10, "50K 100K" )
+ PORT_DIPSETTING( 0x08, "50K" )
+ PORT_DIPSETTING( 0x00, "100K" )
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, "Difficult" )
+ PORT_DIPSETTING( 0x00, "Very Difficult" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* DSW3 0xa0018 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "VRAM Character Check" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( cuebrick )
+ PORT_START /* 0xa0001 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) // advance through tests
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0003 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // move
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // warp
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // stop
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0005 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 0xa0007 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ KONAMI_TWIN_COINAGE
+
+ PORT_START /* DSW2 */
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x03, "1" )
+ PORT_DIPSETTING( 0x02, "2" )
+ PORT_DIPSETTING( 0x01, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x18, 0x18, "Machine Name" )
+ PORT_DIPSETTING( 0x18, DEF_STR( None ) )
+ PORT_DIPSETTING( 0x10, "Lewis" )
+ PORT_DIPSETTING( 0x08, "Johnson" )
+ PORT_DIPSETTING( 0x00, "George" )
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* DSW3 0xa0018 */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, "Upright Controls" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Dual ) )
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
+ PORT_DIPNAME( 0x08, 0x08, "Mode" )
+ PORT_DIPSETTING( 0x08, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+/* Graphics Layouts */
+
+static const gfx_layout alpha_layout =
+{
+ 8,8,
+ 0x200,
+ 4,
+ { 0,1,2,3 },
+ { 0*4,1*4,2*4,3*4,4*4,5*4,6*4,7*4 },
+ { 0*32,1*32,2*32,3*32,4*32,5*32,6*32,7*32 },
+ 8*32
+};
+
+/* Graphics Decode Info */
+
+static GFXDECODE_START( twin16 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0x00000, alpha_layout, 0, 16 )
+GFXDECODE_END
+
+/* Sound Interfaces */
+
+static void volume_callback(int v)
+{
+ K007232_set_volume(0,0,(v >> 4) * 0x11,0);
+ K007232_set_volume(0,1,0,(v & 0x0f) * 0x11);
+}
+
+static struct K007232_interface k007232_interface =
+{
+ REGION_SOUND1, /* memory regions */
+ volume_callback /* external port callback */
+};
+
+static struct upd7759_interface upd7759_interface =
+{
+ REGION_SOUND2 /* memory region */
+};
+
+/* Interrupt Generators */
+
+static INTERRUPT_GEN( CPUA_interrupt )
+{
+ if (CPUA_IRQ_ENABLE) cpunum_set_input_line(cpu_getactivecpu(), 5, HOLD_LINE);
+}
+
+static INTERRUPT_GEN( CPUB_interrupt )
+{
+ if (CPUB_IRQ_ENABLE) cpunum_set_input_line(cpu_getactivecpu(), 5, HOLD_LINE);
+}
+
+/* Machine Drivers */
+
+static MACHINE_DRIVER_START( twin16 )
+ // basic machine hardware
+ MDRV_CPU_ADD(Z80, 3579545)
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(readmem_sound,writemem_sound)
+
+ MDRV_CPU_ADD(M68000, 10000000)
+ MDRV_CPU_PROGRAM_MAP(readmem_sub,writemem_sub)
+ MDRV_CPU_VBLANK_INT(CPUB_interrupt,1)
+
+ MDRV_CPU_ADD(M68000, 10000000)
+ MDRV_CPU_PROGRAM_MAP(readmem,writemem)
+ MDRV_CPU_VBLANK_INT(CPUA_interrupt,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+ MDRV_INTERLEAVE(100)
+
+ // video hardware
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(40*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 30*8-1)
+ MDRV_GFXDECODE(twin16)
+ MDRV_PALETTE_LENGTH(0x400)
+
+ MDRV_VIDEO_START(twin16)
+ MDRV_VIDEO_UPDATE(twin16)
+ MDRV_VIDEO_EOF(twin16)
+
+ // sound hardware
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(YM2151, 7159160/2)
+ MDRV_SOUND_ROUTE(0, "left", 1.0)
+ MDRV_SOUND_ROUTE(1, "right", 1.0)
+
+ MDRV_SOUND_ADD(K007232, 3579545)
+ MDRV_SOUND_CONFIG(k007232_interface)
+ MDRV_SOUND_ROUTE(0, "left", 0.20)
+ MDRV_SOUND_ROUTE(0, "right", 0.20)
+ MDRV_SOUND_ROUTE(1, "left", 0.20)
+ MDRV_SOUND_ROUTE(1, "right", 0.20)
+
+ MDRV_SOUND_ADD(UPD7759, UPD7759_STANDARD_CLOCK)
+ MDRV_SOUND_CONFIG(upd7759_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.20)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.20)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( heavysync )
+ MDRV_IMPORT_FROM(twin16)
+ MDRV_INTERLEAVE(1000)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( fround )
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 3579545)
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(readmem_sound,writemem_sound)
+
+ MDRV_CPU_ADD(M68000, 10000000)
+ MDRV_CPU_PROGRAM_MAP(fround_readmem,fround_writemem)
+ MDRV_CPU_VBLANK_INT(CPUA_interrupt,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+ MDRV_INTERLEAVE(100)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(40*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 30*8-1)
+ MDRV_GFXDECODE(twin16)
+ MDRV_PALETTE_LENGTH(0x400)
+
+ MDRV_VIDEO_START(fround)
+ MDRV_VIDEO_UPDATE(twin16)
+ MDRV_VIDEO_EOF(twin16)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(YM2151, 7159160/2)
+ MDRV_SOUND_ROUTE(0, "left", 1.0)
+ MDRV_SOUND_ROUTE(1, "right", 1.0)
+
+ MDRV_SOUND_ADD(K007232, 3579545)
+ MDRV_SOUND_CONFIG(k007232_interface)
+ MDRV_SOUND_ROUTE(0, "left", 0.20)
+ MDRV_SOUND_ROUTE(0, "right", 0.20)
+ MDRV_SOUND_ROUTE(1, "left", 0.20)
+ MDRV_SOUND_ROUTE(1, "right", 0.20)
+
+ MDRV_SOUND_ADD(UPD7759, UPD7759_STANDARD_CLOCK)
+ MDRV_SOUND_CONFIG(upd7759_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.20)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.20)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( hpuncher )
+ MDRV_IMPORT_FROM(twin16)
+ MDRV_VIDEO_START(fround)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( mia )
+ MDRV_IMPORT_FROM(twin16)
+ MDRV_SCREEN_VISIBLE_AREA(1*8, 39*8-1, 2*8, 30*8-1)
+ MDRV_VIDEO_START(fround)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( vulcan )
+ MDRV_IMPORT_FROM(twin16)
+ MDRV_VIDEO_UPDATE(vulcan )
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( cuebrick )
+ MDRV_IMPORT_FROM(twin16)
+ MDRV_SCREEN_VISIBLE_AREA(1*8, 39*8-1, 2*8, 30*8-1)
+ MDRV_VIDEO_START(fround)
+ MDRV_NVRAM_HANDLER(generic_0fill)
+MACHINE_DRIVER_END
+
+/* ROMs */
+
+ROM_START( devilw )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "687_l03.10a", 0x00000, 0x8000, CRC(7201983c) SHA1(06d089406d2f702e8d51ffdfbf34e4727a28d506) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "687_q07.10n", 0x00000, 0x10000, CRC(53110c0b) SHA1(a473486f7c99ab758187376d5bd89581e0b7cbdf) )
+ ROM_LOAD16_BYTE( "687_q06.8n", 0x00001, 0x10000, CRC(9c53a0c5) SHA1(3b195a88af2b0198af47e4f7140087bf5a7feee6) )
+ ROM_LOAD16_BYTE( "687_q13.10s", 0x20000, 0x10000, CRC(36ae6014) SHA1(102d4c3215fb5f199ce6f93ce92725b5cce0b01d) )
+ ROM_LOAD16_BYTE( "687_q12.8s", 0x20001, 0x10000, CRC(6d012167) SHA1(d608e29e0b2e834c099386b6ebb667e4bfc40ce7) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "687_t05.6n", 0x00000, 0x10000, CRC(8ab7dc61) SHA1(de8e93f04f22fa07ea6c379eeae12f8fcb48f751) )
+ ROM_LOAD16_BYTE( "687_t04.4n", 0x00001, 0x10000, CRC(c69924da) SHA1(9b7220eac95fd92f32fec92b21f4f02f871c5d43) )
+ ROM_LOAD16_BYTE( "687_t09.6r", 0x20000, 0x10000, CRC(fae97de0) SHA1(25b085c9de0943a0112d76447ca0504ed57cad85) )
+ ROM_LOAD16_BYTE( "687_t08.4r", 0x20001, 0x10000, CRC(8c898d67) SHA1(0dd1a4467f97c993ea8d40398f46c3fc88c889bd) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "687_m14.d8", 0x00000, 0x4000, CRC(d7338557) SHA1(9b384baafabaab3888a0139674f0b530303684ca) ) // characters
+
+ ROM_REGION16_LE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD( "687i17.p16", 0x000000, 0x80000, CRC(66cb3923) SHA1(3c1fc1dff77201cf8d8c4594c965695066c1701c) )
+ ROM_LOAD16_WORD( "687i18.p18", 0x080000, 0x80000, CRC(a1c7d0db) SHA1(901bc6e1982b9a8c2150a802995256d0168cc605) )
+ ROM_LOAD16_WORD( "687i15.p13", 0x100000, 0x80000, CRC(eec8c5b2) SHA1(c400dd8c7bb85d233815572acd547acf626e4c73) )
+ ROM_LOAD16_WORD( "687i16.p15", 0x180000, 0x80000, CRC(746cf48b) SHA1(8f51df931b1de928f402f51bbaf02e37dfec1d6d) )
+
+ ROM_REGION16_BE( 0x20000, REGION_GFX3, 0 ) // tile data; mapped at 0x80000 on CPUB
+ ROM_LOAD16_BYTE( "687_l11.10r", 0x00000, 0x10000, CRC(399deee8) SHA1(dcc65e95f28ae4e9b671e70ce0bd5ba0fe178506) )
+ ROM_LOAD16_BYTE( "687_l10.8r", 0x00001, 0x10000, CRC(117c91ee) SHA1(dcf8efb25fc73cff916b66b7bcfd3c1fb2556a53) )
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "687_i01.5a", 0x00000, 0x20000, CRC(d4992dfb) SHA1(c65bef07b6adb9ab6328d679595450945dbf6a88) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "687_i02.7c", 0x00000, 0x20000, CRC(e5947501) SHA1(9ec7319bd97711981db60af6f477c2ba2ec7e6b8) )
+ROM_END
+
+ROM_START( majuu )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "687_l03.10a", 0x00000, 0x8000, CRC(7201983c) SHA1(06d089406d2f702e8d51ffdfbf34e4727a28d506) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "687_q07.10n", 0x00000, 0x10000, CRC(53110c0b) SHA1(a473486f7c99ab758187376d5bd89581e0b7cbdf) )
+ ROM_LOAD16_BYTE( "687_q06.8n", 0x00001, 0x10000, CRC(9c53a0c5) SHA1(3b195a88af2b0198af47e4f7140087bf5a7feee6) )
+ ROM_LOAD16_BYTE( "687_q13.10s", 0x20000, 0x10000, CRC(36ae6014) SHA1(102d4c3215fb5f199ce6f93ce92725b5cce0b01d) )
+ ROM_LOAD16_BYTE( "687_q12.8s", 0x20001, 0x10000, CRC(6d012167) SHA1(d608e29e0b2e834c099386b6ebb667e4bfc40ce7) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "687_s05.6n", 0x00000, 0x10000, CRC(bd99b434) SHA1(4dbcf3a57ff0b4c3a160e2a60c2ee3fd38f5a95d) )
+ ROM_LOAD16_BYTE( "687_s04.4n", 0x00001, 0x10000, CRC(3df732e2) SHA1(32e42edbc6f9dfba6ff881c72b8b014b6905e7f3) )
+ ROM_LOAD16_BYTE( "687_s09.6r", 0x20000, 0x10000, CRC(1f6efec3) SHA1(4177d300877e3ffcb481f534ef7b3e4bdc160be0) )
+ ROM_LOAD16_BYTE( "687_s08.4r", 0x20001, 0x10000, CRC(8a16c8c6) SHA1(df3af1c137632eab98b1eea538cc4ef5b134f44f) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "687_l14.d8", 0x00000, 0x4000, CRC(20ecccd6) SHA1(b8ac3186de5ea81ae1c64b9511b7a0718aabab48) ) // characters
+
+ ROM_REGION16_LE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD( "687i17.p16", 0x000000, 0x80000, CRC(66cb3923) SHA1(3c1fc1dff77201cf8d8c4594c965695066c1701c) )
+ ROM_LOAD16_WORD( "687i18.p18", 0x080000, 0x80000, CRC(a1c7d0db) SHA1(901bc6e1982b9a8c2150a802995256d0168cc605) )
+ ROM_LOAD16_WORD( "687i15.p13", 0x100000, 0x80000, CRC(eec8c5b2) SHA1(c400dd8c7bb85d233815572acd547acf626e4c73) )
+ ROM_LOAD16_WORD( "687i16.p15", 0x180000, 0x80000, CRC(746cf48b) SHA1(8f51df931b1de928f402f51bbaf02e37dfec1d6d) )
+
+ ROM_REGION16_BE( 0x20000, REGION_GFX3, 0 ) // tile data; mapped at 0x80000 on CPUB
+ ROM_LOAD16_BYTE( "687_l11.10r", 0x00000, 0x10000, CRC(399deee8) SHA1(dcc65e95f28ae4e9b671e70ce0bd5ba0fe178506) )
+ ROM_LOAD16_BYTE( "687_l10.8r", 0x00001, 0x10000, CRC(117c91ee) SHA1(dcf8efb25fc73cff916b66b7bcfd3c1fb2556a53) )
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "687_i01.5a", 0x00000, 0x20000, CRC(d4992dfb) SHA1(c65bef07b6adb9ab6328d679595450945dbf6a88) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "687_i02.7c", 0x00000, 0x20000, CRC(e5947501) SHA1(9ec7319bd97711981db60af6f477c2ba2ec7e6b8) )
+ROM_END
+
+ROM_START( darkadv )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "687_n03.10a", 0x00000, 0x8000, CRC(a24c682f) SHA1(cf053270d3f77448ff802db832598ae3cf7dae6c) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "687_n07.10n", 0x00000, 0x10000, CRC(6154322a) SHA1(e84c75b4d346ade2cfb5d56454282fafb04c2d77) )
+ ROM_LOAD16_BYTE( "687_n06.8n", 0x00001, 0x10000, CRC(37a72e8b) SHA1(574d655ba7cda2f8eb628155fb8662a4ee5f23e5) )
+ ROM_LOAD16_BYTE( "687_n13.10s", 0x20000, 0x10000, CRC(f1c252af) SHA1(dbe78352ae5b284870becc92139773f66c52ed7d) )
+ ROM_LOAD16_BYTE( "687_n12.8s", 0x20001, 0x10000, CRC(da221944) SHA1(c288ee583414a077f0d8b815b8e01b7f19a5fafe) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "687_n05.6n", 0x00000, 0x10000, CRC(a9195b0b) SHA1(a5b30c93dc962b5aef33bab7e257ed606f00c9f2) )
+ ROM_LOAD16_BYTE( "687_n04.4n", 0x00001, 0x10000, CRC(65b55105) SHA1(ef102eebf34cceebafb55b04003ab9173af43458) )
+ ROM_LOAD16_BYTE( "687_n09.6r", 0x20000, 0x10000, CRC(1c6b594c) SHA1(06e4eab7f544170ac40e8c77b9ebb236a6094367) )
+ ROM_LOAD16_BYTE( "687_n08.4r", 0x20001, 0x10000, CRC(a9603196) SHA1(a3ab00a446531d370809d8e405cabe2d74cb612b) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "687_n14.d8", 0x0000, 0x4000, CRC(c76ac6d2) SHA1(d8fec255f1f7177a3716a5894fb679cbe172b6ea) ) // characters
+
+ ROM_REGION16_LE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD( "687i17.p16", 0x000000, 0x80000, CRC(66cb3923) SHA1(3c1fc1dff77201cf8d8c4594c965695066c1701c) )
+ ROM_LOAD16_WORD( "687i18.p18", 0x080000, 0x80000, CRC(a1c7d0db) SHA1(901bc6e1982b9a8c2150a802995256d0168cc605) )
+ ROM_LOAD16_WORD( "687i15.p13", 0x100000, 0x80000, CRC(eec8c5b2) SHA1(c400dd8c7bb85d233815572acd547acf626e4c73) )
+ ROM_LOAD16_WORD( "687i16.p15", 0x180000, 0x80000, CRC(746cf48b) SHA1(8f51df931b1de928f402f51bbaf02e37dfec1d6d) )
+
+ ROM_REGION16_BE( 0x20000, REGION_GFX3, 0 ) // tile data; mapped at 0x80000 on CPUB
+ ROM_LOAD16_BYTE( "687_l11.10r", 0x00000, 0x10000, CRC(399deee8) SHA1(dcc65e95f28ae4e9b671e70ce0bd5ba0fe178506) )
+ ROM_LOAD16_BYTE( "687_l10.8r", 0x00001, 0x10000, CRC(117c91ee) SHA1(dcf8efb25fc73cff916b66b7bcfd3c1fb2556a53) )
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "687_i01.5a", 0x00000, 0x20000, CRC(d4992dfb) SHA1(c65bef07b6adb9ab6328d679595450945dbf6a88) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "687_i02.7c", 0x00000, 0x20000, CRC(e5947501) SHA1(9ec7319bd97711981db60af6f477c2ba2ec7e6b8) )
+ROM_END
+
+ROM_START( vulcan )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "785_g03.10a", 0x00000, 0x8000, CRC(67a3b50d) SHA1(3c83f3b0df73d9361ec3cda26a6c4c603a088419) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "785_p07.10n", 0x00000, 0x10000, CRC(686d549d) SHA1(9687be801c4fb963bf6b0199e2ae9f5051213f7a) )
+ ROM_LOAD16_BYTE( "785_p06.8n" , 0x00001, 0x10000, CRC(70c94bee) SHA1(951e00ca4d3a47a21b4db05bcdc8ead45b42c3f1) )
+ ROM_LOAD16_BYTE( "785_p13.10s", 0x20000, 0x10000, CRC(478fdb0a) SHA1(2e285ad6dcfc67f3e24d231e0e1be19036ce64d2) )
+ ROM_LOAD16_BYTE( "785_p12.8s", 0x20001, 0x10000, CRC(38ea402a) SHA1(90ff2bd71435988cde967704ce3b1401de206683) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "785_w05.6n", 0x00000, 0x10000, CRC(6e0e99cd) SHA1(f9f4ef617aee83397b0ac98a5cc92f60d3a3d5ed) )
+ ROM_LOAD16_BYTE( "785_w04.4n", 0x00001, 0x10000, CRC(23ec74ca) SHA1(901c7c798b113232f20e24f61940ed6ef5148599) )
+ ROM_LOAD16_BYTE( "785_w09.6r", 0x20000, 0x10000, CRC(377e4f28) SHA1(d3af2e52c38b5d618cac2e66df99ab7950638fbc) )
+ ROM_LOAD16_BYTE( "785_w08.4r", 0x20001, 0x10000, CRC(813d41ea) SHA1(58ba0e4b1afec3e5674286c44da14244591f1312) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "785_h14.d8", 0x0000, 0x4000, CRC(02f4b16f) SHA1(45addc99f520770f38c6aa69aef9af59cfc410b5) ) // characters
+
+ ROM_REGION16_BE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD( "785f17.p16", 0x000000, 0x80000, CRC(8fbec1a4) SHA1(71cbdb25470b5a2ca7e80c92f12fc47e28085793) )
+ ROM_LOAD16_WORD( "785f18.p18", 0x080000, 0x80000, CRC(50d61e38) SHA1(051d332d93d435d19571e22d69ffc5395dbb16a4) )
+ ROM_LOAD16_WORD( "785f15.p13", 0x100000, 0x80000, CRC(af96aef3) SHA1(a58e26a8b134ab6e7938cd4fa342c04c236efd99) )
+ ROM_LOAD16_WORD( "785f16.p15", 0x180000, 0x80000, CRC(b858df1f) SHA1(c434da7ba54d59643fe6ca30bceccf16413904c3) )
+
+ ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_ERASE00 ) // tile data; mapped at 0x80000 on CPUB
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "785_f01.5a", 0x00000, 0x20000, CRC(a0d8d69e) SHA1(2994e5740b7c099d55fb162a363a26ef1995c756) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "785_f02.7c", 0x00000, 0x20000, CRC(c39f5ca4) SHA1(92ebea11b7d3a72d0f58c456f16a6ff36d6b3062) )
+ROM_END
+
+ROM_START( gradius2 )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "785_g03.10a", 0x00000, 0x8000, CRC(67a3b50d) SHA1(3c83f3b0df73d9361ec3cda26a6c4c603a088419) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "785_p07.10n", 0x00000, 0x10000, CRC(686d549d) SHA1(9687be801c4fb963bf6b0199e2ae9f5051213f7a) )
+ ROM_LOAD16_BYTE( "785_p06.8n" , 0x00001, 0x10000, CRC(70c94bee) SHA1(951e00ca4d3a47a21b4db05bcdc8ead45b42c3f1) )
+ ROM_LOAD16_BYTE( "785_p13.10s", 0x20000, 0x10000, CRC(478fdb0a) SHA1(2e285ad6dcfc67f3e24d231e0e1be19036ce64d2) )
+ ROM_LOAD16_BYTE( "785_p12.8s", 0x20001, 0x10000, CRC(38ea402a) SHA1(90ff2bd71435988cde967704ce3b1401de206683) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "785_x05.6n", 0x00000, 0x10000, CRC(8a23a7b8) SHA1(9846272c011715b17f146d5265a09e790d6e37cd) )
+ ROM_LOAD16_BYTE( "785_x04.4n", 0x00001, 0x10000, CRC(88e466ce) SHA1(3a7d098b851bcf6dc8e7ff601d11563406c56666) )
+ ROM_LOAD16_BYTE( "785_x09.6r", 0x20000, 0x10000, CRC(3f3d7d7a) SHA1(8e3acf980179e749ec642b6ff211c4ba57c6c592) )
+ ROM_LOAD16_BYTE( "785_x08.4r", 0x20001, 0x10000, CRC(c39c8efd) SHA1(372dbb254525a7334fe79a42ba9851eafa856847) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "785_g14.d8", 0x0000, 0x4000, CRC(9dcdad9d) SHA1(22f457408b453a71b7e91974aee1b1e735ff887f) ) // characters
+
+ ROM_REGION16_BE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD( "785f17.p16", 0x000000, 0x80000, CRC(8fbec1a4) SHA1(71cbdb25470b5a2ca7e80c92f12fc47e28085793) )
+ ROM_LOAD16_WORD( "785f18.p18", 0x080000, 0x80000, CRC(50d61e38) SHA1(051d332d93d435d19571e22d69ffc5395dbb16a4) )
+ ROM_LOAD16_WORD( "785f15.p13", 0x100000, 0x80000, CRC(af96aef3) SHA1(a58e26a8b134ab6e7938cd4fa342c04c236efd99) )
+ ROM_LOAD16_WORD( "785f16.p15", 0x180000, 0x80000, CRC(b858df1f) SHA1(c434da7ba54d59643fe6ca30bceccf16413904c3) )
+
+ ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_ERASE00 ) // tile data; mapped at 0x80000 on CPUB
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "785_f01.5a", 0x00000, 0x20000, CRC(a0d8d69e) SHA1(2994e5740b7c099d55fb162a363a26ef1995c756) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "785_f02.7c", 0x00000, 0x20000, CRC(c39f5ca4) SHA1(92ebea11b7d3a72d0f58c456f16a6ff36d6b3062) )
+ROM_END
+
+ROM_START( grdius2a )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "785_g03.10a", 0x00000, 0x8000, CRC(67a3b50d) SHA1(3c83f3b0df73d9361ec3cda26a6c4c603a088419) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "785_p07.10n", 0x00000, 0x10000, CRC(686d549d) SHA1(9687be801c4fb963bf6b0199e2ae9f5051213f7a) )
+ ROM_LOAD16_BYTE( "785_p06.8n" , 0x00001, 0x10000, CRC(70c94bee) SHA1(951e00ca4d3a47a21b4db05bcdc8ead45b42c3f1) )
+ ROM_LOAD16_BYTE( "785_p13.10s", 0x20000, 0x10000, CRC(478fdb0a) SHA1(2e285ad6dcfc67f3e24d231e0e1be19036ce64d2) )
+ ROM_LOAD16_BYTE( "785_p12.8s", 0x20001, 0x10000, CRC(38ea402a) SHA1(90ff2bd71435988cde967704ce3b1401de206683) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "785_p05.6n", 0x00000, 0x10000, CRC(4db0e736) SHA1(45edf094da448d039af18a7b47a592a3de02f17b) )
+ ROM_LOAD16_BYTE( "785_p04.4n", 0x00001, 0x10000, CRC(765b99e6) SHA1(4acae0cf2bf23f8a1cf7b650b018d22a9ae947c9) )
+ ROM_LOAD16_BYTE( "785_t09.6r", 0x20000, 0x10000, CRC(4e3f4965) SHA1(130da6db0590779948a29fd5010f0e628e4f2ee6) )
+ ROM_LOAD16_BYTE( "785_j08.4r", 0x20001, 0x10000, CRC(2b1c9108) SHA1(3d367a1b60f95798b478dc4a84daa9b362271d4d) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "785_g14.d8", 0x0000, 0x4000, CRC(9dcdad9d) SHA1(22f457408b453a71b7e91974aee1b1e735ff887f) ) // characters
+
+ ROM_REGION16_BE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD( "785f17.p16", 0x000000, 0x80000, CRC(8fbec1a4) SHA1(71cbdb25470b5a2ca7e80c92f12fc47e28085793) )
+ ROM_LOAD16_WORD( "785f18.p18", 0x080000, 0x80000, CRC(50d61e38) SHA1(051d332d93d435d19571e22d69ffc5395dbb16a4) )
+ ROM_LOAD16_WORD( "785f15.p13", 0x100000, 0x80000, CRC(af96aef3) SHA1(a58e26a8b134ab6e7938cd4fa342c04c236efd99) )
+ ROM_LOAD16_WORD( "785f16.p15", 0x180000, 0x80000, CRC(b858df1f) SHA1(c434da7ba54d59643fe6ca30bceccf16413904c3) )
+
+ ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_ERASE00 ) // tile data; mapped at 0x80000 on CPUB
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "785_f01.5a", 0x00000, 0x20000, CRC(a0d8d69e) SHA1(2994e5740b7c099d55fb162a363a26ef1995c756) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "785_f02.7c", 0x00000, 0x20000, CRC(c39f5ca4) SHA1(92ebea11b7d3a72d0f58c456f16a6ff36d6b3062) )
+ROM_END
+
+ROM_START( grdius2b )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "785_g03.10a", 0x00000, 0x8000, CRC(67a3b50d) SHA1(3c83f3b0df73d9361ec3cda26a6c4c603a088419) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "785_p07.10n", 0x00000, 0x10000, CRC(686d549d) SHA1(9687be801c4fb963bf6b0199e2ae9f5051213f7a) )
+ ROM_LOAD16_BYTE( "785_p06.8n" , 0x00001, 0x10000, CRC(70c94bee) SHA1(951e00ca4d3a47a21b4db05bcdc8ead45b42c3f1) )
+ ROM_LOAD16_BYTE( "785_p13.10s", 0x20000, 0x10000, CRC(478fdb0a) SHA1(2e285ad6dcfc67f3e24d231e0e1be19036ce64d2) )
+ ROM_LOAD16_BYTE( "785_p12.8s", 0x20001, 0x10000, CRC(38ea402a) SHA1(90ff2bd71435988cde967704ce3b1401de206683) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "785_p05.6n", 0x00000, 0x10000, CRC(4db0e736) SHA1(45edf094da448d039af18a7b47a592a3de02f17b) )
+ ROM_LOAD16_BYTE( "785_p04.4n", 0x00001, 0x10000, CRC(765b99e6) SHA1(4acae0cf2bf23f8a1cf7b650b018d22a9ae947c9) )
+ ROM_LOAD16_BYTE( "785_j09.6r", 0x20000, 0x10000, CRC(6d96a7e3) SHA1(cc1362f5922cf1e348a58d54d03320f394a2aeab) )
+ ROM_LOAD16_BYTE( "785_j08.4r", 0x20001, 0x10000, CRC(2b1c9108) SHA1(3d367a1b60f95798b478dc4a84daa9b362271d4d) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "785_g14.d8", 0x0000, 0x4000, CRC(9dcdad9d) SHA1(22f457408b453a71b7e91974aee1b1e735ff887f) ) // characters
+
+ ROM_REGION16_BE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD( "785f17.p16", 0x000000, 0x80000, CRC(8fbec1a4) SHA1(71cbdb25470b5a2ca7e80c92f12fc47e28085793) )
+ ROM_LOAD16_WORD( "785f18.p18", 0x080000, 0x80000, CRC(50d61e38) SHA1(051d332d93d435d19571e22d69ffc5395dbb16a4) )
+ ROM_LOAD16_WORD( "785f15.p13", 0x100000, 0x80000, CRC(af96aef3) SHA1(a58e26a8b134ab6e7938cd4fa342c04c236efd99) )
+ ROM_LOAD16_WORD( "785f16.p15", 0x180000, 0x80000, CRC(b858df1f) SHA1(c434da7ba54d59643fe6ca30bceccf16413904c3) )
+
+ ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_ERASE00 ) // tile data; mapped at 0x80000 on CPUB
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "785_f01.5a", 0x00000, 0x20000, CRC(a0d8d69e) SHA1(2994e5740b7c099d55fb162a363a26ef1995c756) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "785_f02.7c", 0x00000, 0x20000, CRC(c39f5ca4) SHA1(92ebea11b7d3a72d0f58c456f16a6ff36d6b3062) )
+ROM_END
+
+ROM_START( fround )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "870_f03.10a", 0x00000, 0x8000, CRC(a645c727) SHA1(e173e79130f187d090766664f1c478d47062749c) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "870_m21.bin", 0x00000, 0x20000, CRC(436dbffb) SHA1(be8c8544f4d8ae86f216095753c6178a3cbf0e8d) )
+ ROM_LOAD16_BYTE( "870_m20.bin", 0x00001, 0x20000, CRC(b1c79d6a) SHA1(76e95e87eaa96ba694675fde7706540c584a36fb) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "870_f14.d8", 0x0000, 0x4000, CRC(c9b46615) SHA1(c0cddb1af47b8e0865055624cf4e89a111ac1b0f) ) // characters
+
+ ROM_REGION16_LE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD("870c18.p18", 0x000000, 0x80000, CRC(07927fe8) SHA1(0ab5e0e785347fbed5c4b930a32876d6ce2bef4a) )
+ ROM_LOAD16_WORD("870c17.p16", 0x080000, 0x80000, CRC(2bc99ff8) SHA1(9a06502317a71ca5662b79aedf47379b8e5434a9) )
+ ROM_LOAD16_WORD("870c16.p15", 0x100000, 0x80000, CRC(41df6a1b) SHA1(32e0fdeb53628d18adde851e4496dd01ac6ec68f) )
+ ROM_LOAD16_WORD("870c15.p13", 0x180000, 0x80000, CRC(8c9281df) SHA1(5e3d80be414db108d5363d0ea1b74021ba942c33) )
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "870_c01.5a", 0x00000, 0x20000, CRC(6af96546) SHA1(63b49b28c0f2ef8f52bc4c5955ad6a633dd553cf) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "870_c02.7c", 0x00000, 0x20000, CRC(54e12c6d) SHA1(8171441aeb1a1dc4d65fae59c7c217f992f70cbc) )
+ROM_END
+
+ROM_START( froundl )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "870_f03.10a", 0x00000, 0x8000, CRC(a645c727) SHA1(e173e79130f187d090766664f1c478d47062749c) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "870_l21.bin", 0x00000, 0x20000, CRC(e21a3a19) SHA1(5f5793c88093bc8632eab673f5e0d954ac9b9177) )
+ ROM_LOAD16_BYTE( "870_l20.bin", 0x00001, 0x20000, CRC(0ce9786f) SHA1(0fb0eef999ed09dd50eed403255887103fc35461) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "870_f14.d8", 0x0000, 0x4000, CRC(c9b46615) SHA1(c0cddb1af47b8e0865055624cf4e89a111ac1b0f) ) // characters
+
+ ROM_REGION16_LE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD("870c18.p18", 0x000000, 0x80000, CRC(07927fe8) SHA1(0ab5e0e785347fbed5c4b930a32876d6ce2bef4a) )
+ ROM_LOAD16_WORD("870c17.p16", 0x080000, 0x80000, CRC(2bc99ff8) SHA1(9a06502317a71ca5662b79aedf47379b8e5434a9) )
+ ROM_LOAD16_WORD("870c16.p15", 0x100000, 0x80000, CRC(41df6a1b) SHA1(32e0fdeb53628d18adde851e4496dd01ac6ec68f) )
+ ROM_LOAD16_WORD("870c15.p13", 0x180000, 0x80000, CRC(8c9281df) SHA1(5e3d80be414db108d5363d0ea1b74021ba942c33) )
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "870_c01.5a", 0x00000, 0x20000, CRC(6af96546) SHA1(63b49b28c0f2ef8f52bc4c5955ad6a633dd553cf) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "870_c02.7c", 0x00000, 0x20000, CRC(54e12c6d) SHA1(8171441aeb1a1dc4d65fae59c7c217f992f70cbc) )
+ROM_END
+
+ROM_START( hpuncher )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "870_g03.10a", 0x00000, 0x8000, CRC(db9c10c8) SHA1(b2ec4d6800a4ab00dfcc8d3cd4abf9b9d7c5544a) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "870_h07.10n", 0x00000, 0x10000, CRC(b4dda612) SHA1(e9612af11a151de1f0236629c84679f80936cae9) )
+ ROM_LOAD16_BYTE( "870_h06.8n", 0x00001, 0x10000, CRC(696ba702) SHA1(e35c9aeab4305d828a347eaddf4abc806a889fa3) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "870_h05.6n", 0x00000, 0x10000, CRC(2bcfeef3) SHA1(8843e795a310e1a79b7b65226d9526197c2144ef) )
+ ROM_LOAD16_BYTE( "870_h04.4n", 0x00001, 0x10000, CRC(b9f97fd3) SHA1(d15a659f753f9f475dfd4f7e96789bacc54cb1f9) )
+ ROM_LOAD16_BYTE( "870_h09.6r", 0x20000, 0x10000, CRC(96a4f8b1) SHA1(2709f5236235b1b69c3367054fb998c1beb35625) )
+ ROM_LOAD16_BYTE( "870_h08.4r", 0x20001, 0x10000, CRC(46d65156) SHA1(6dd9d97a8e3394db668da1fc6a46c166bca1f456) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "870_f14.d8", 0x0000, 0x4000, CRC(c9b46615) SHA1(c0cddb1af47b8e0865055624cf4e89a111ac1b0f) ) // characters
+
+ ROM_REGION16_LE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD("870c17.p16", 0x000000, 0x80000, CRC(2bc99ff8) SHA1(9a06502317a71ca5662b79aedf47379b8e5434a9) )
+ ROM_LOAD16_WORD("870c18.p18", 0x080000, 0x80000, CRC(07927fe8) SHA1(0ab5e0e785347fbed5c4b930a32876d6ce2bef4a) )
+ ROM_LOAD16_WORD("870c15.p13", 0x100000, 0x80000, CRC(8c9281df) SHA1(5e3d80be414db108d5363d0ea1b74021ba942c33) )
+ ROM_LOAD16_WORD("870c16.p15", 0x180000, 0x80000, CRC(41df6a1b) SHA1(32e0fdeb53628d18adde851e4496dd01ac6ec68f) )
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD( "870_c01.5a", 0x00000, 0x20000, CRC(6af96546) SHA1(63b49b28c0f2ef8f52bc4c5955ad6a633dd553cf) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, 0 ) // samples
+ ROM_LOAD( "870_c02.7c", 0x00000, 0x20000, CRC(54e12c6d) SHA1(8171441aeb1a1dc4d65fae59c7c217f992f70cbc) )
+ROM_END
+
+ROM_START( miaj )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "808_e03.10a", 0x00000, 0x8000, CRC(3d93a7cd) SHA1(dcdd327e78f32436b276d0666f62a5b733b296e8) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE("808_e07.10n", 0x00000, 0x10000, CRC(297bdcea) SHA1(41ed650cbc4f56777fa352812e9a560554459f90) )
+ ROM_LOAD16_BYTE("808_e06.8n", 0x00001, 0x10000, CRC(8f576b33) SHA1(cd8c9a45626c30571ca12d0241cccc092c0903a0) )
+ ROM_LOAD16_BYTE("808_e13.10s", 0x20000, 0x10000, CRC(1fa708f4) SHA1(9511a19f50fb61571c2986c72d1a85e87b8d0495) )
+ ROM_LOAD16_BYTE("808_e12.8s", 0x20001, 0x10000, CRC(d62f1fde) SHA1(1e55084f1294b6ac7c152fcd1800511fcab5d360) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE("808_r05.6n", 0x00000, 0x10000, CRC(91fd83f4) SHA1(12cba5828d1d752efe4fc1972bed0205ac277850) )
+ ROM_LOAD16_BYTE("808_r04.4n", 0x00001, 0x10000, CRC(f1c8c597) SHA1(4e8e87aedc9dac4ed05816989210de49f4dd60d2) )
+ ROM_LOAD16_BYTE("808_r09.6r", 0x20000, 0x10000, CRC(f74d4467) SHA1(2b2491ee7ece979f2ec849075b0c30b6c1ed6bae) )
+ ROM_LOAD16_BYTE("808_r08.4r", 0x20001, 0x10000, CRC(26f21704) SHA1(123cb2e4bcb25d82faa75e4505f9859c10bca754) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD("808_e14.d8", 0x0000, 0x4000, CRC(b9d36525) SHA1(53291c4911d7e1a5110539e4c57a11d0d530dc6f) ) // characters
+
+ ROM_REGION16_LE( 0x200000, REGION_GFX2, 0 ) // gfx data used at runtime
+ ROM_LOAD16_WORD("808d17.p16", 0x000000, 0x80000, CRC(d1299082) SHA1(c3c07b0517e7428ccd1cdf9e15aaf16d98e7c4cd) )
+ ROM_LOAD16_WORD("808d15.p13", 0x100000, 0x80000, CRC(2b22a6b6) SHA1(8e1af0627a4eac045128c4096e2cfb59c3d2f5ef) )
+
+ ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_ERASE00 ) // tile data; mapped at 0x80000 on CPUB
+
+ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) // samples
+ ROM_LOAD("808_d01.5a", 0x00000, 0x20000, CRC(fd4d37c0) SHA1(ef91c6e7bb57c27a9a51729fffd1bfe3e806fb61) )
+
+ ROM_REGION( 0x20000, REGION_SOUND2, ROMREGION_ERASE00 ) // samples
+ROM_END
+
+ROM_START( cuebrick )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) // Z80 code (sound CPU)
+ ROM_LOAD( "903_d03.10a", 0x00000, 0x8000, CRC(455e855a) SHA1(cfdd54a5071862653ee94c0455301f4a7245fbd8) )
+
+ ROM_REGION( 0x40000, REGION_CPU2, 0 ) // 68000 code (CPU B)
+ ROM_LOAD16_BYTE( "903_d07.10n", 0x00000, 0x10000, CRC(fc0edce7) SHA1(57e969a42c48a9464ec370d4605eaecb690d58ab) )
+ ROM_LOAD16_BYTE( "903_d06.8n", 0x00001, 0x10000, CRC(b2cef6fe) SHA1(27d1d15f3a408e6166745cb6a159704a8cbb4584) )
+ ROM_LOAD16_BYTE( "903_e13.10s", 0x20000, 0x10000, CRC(4fb5fb80) SHA1(3a59dae3846341289c31aa106684ebc45488ca45) )
+ ROM_LOAD16_BYTE( "903_e12.8s", 0x20001, 0x10000, CRC(883e3097) SHA1(fe0fa1a2881a67223d741c400bb8c1a0c67946c1) )
+
+ ROM_REGION( 0x40000, REGION_CPU3, 0 ) // 68000 code (CPU A)
+ ROM_LOAD16_BYTE( "903_e05.6n", 0x00000, 0x10000, CRC(8b556220) SHA1(dbe24133e74018c4fe9332519394cbb882c4ed5a) )
+ ROM_LOAD16_BYTE( "903_e04.4n", 0x00001, 0x10000, CRC(bf9c7927) SHA1(3a594b8846f7e6074ca54f8cd5fe2ba3b64ba740) )
+ ROM_LOAD16_BYTE( "903_e09.6r", 0x20000, 0x10000, CRC(2a77554d) SHA1(53eee99737333c8c4bbb9c757fd12488b6c4d3d8) )
+ ROM_LOAD16_BYTE( "903_e08.4r", 0x20001, 0x10000, CRC(c0a430c1) SHA1(bef737f12e9a79781a4cd795ffc108899757901d) )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "903_e14.d8", 0x0000, 0x4000, CRC(ddbebbd5) SHA1(df532f19a08cabb28d693e4cd445c47c9e35e5ff) ) // characters
+
+ ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_ERASE00 ) // gfx data used at runtime
+ // unpopulated
+
+ ROM_REGION16_BE( 0x20000, REGION_GFX3, 0 ) // tile data; mapped at 0x80000 on CPUB
+ ROM_LOAD16_BYTE( "903_e11.10r", 0x00000, 0x10000, CRC(5c41faf8) SHA1(f9eee6a7b92d3b3aa4320747da6390310522a2cf) )
+ ROM_LOAD16_BYTE( "903_e10.8r", 0x00001, 0x10000, CRC(417576d4) SHA1(e84762743e3a1117b6ef7ea0b304877e4a719f75) )
+
+ ROM_REGION( 0x20000, REGION_SOUND1, ROMREGION_ERASE00 ) // samples
+ // unpopulated
+
+ ROM_REGION( 0x20000, REGION_SOUND2, ROMREGION_ERASE00 ) // samples
+ // unpopulated
+ROM_END
+
+/* Driver Initialization */
+
+static void gfx_untangle( void )
+{
+ // sprite, tile data
+
+ int i;
+ UINT16 *temp = malloc_or_die(0x200000);
+
+ twin16_gfx_rom = (UINT16 *)memory_region(REGION_GFX2);
+ memcpy( temp, twin16_gfx_rom, 0x200000 );
+
+ for( i=0; i<0x080000; i++ )
+ {
+ twin16_gfx_rom[i*2+0] = temp[i+0x080000];
+ twin16_gfx_rom[i*2+1] = temp[i];
+ }
+ free( temp );
+}
+
+static DRIVER_INIT( twin16 )
+{
+ gfx_untangle();
+ twin16_custom_video = 0;
+}
+
+static DRIVER_INIT( fround )
+{
+ gfx_untangle();
+ twin16_custom_video = 1;
+}
+
+static DRIVER_INIT( hpuncher )
+{
+ gfx_untangle();
+ twin16_custom_video = 2;
+}
+
+static DRIVER_INIT( cuebrick )
+{
+ gfx_untangle();
+ twin16_custom_video = 2;
+
+ generic_nvram = (UINT8 *)cuebrick_nvram;
+ generic_nvram_size = 0x400*0x20;
+}
+
+/* Game Drivers */
+
+GAME( 1987, devilw, 0, heavysync, devilw, twin16, ROT0, "Konami", "Devil World", 0 )
+GAME( 1987, majuu, devilw, heavysync, devilw, twin16, ROT0, "Konami", "Majuu no Ohkoku", 0 )
+GAME( 1987, darkadv, devilw, heavysync, darkadv, twin16, ROT0, "Konami", "Dark Adventure", 0 )
+GAME( 1988, vulcan, 0, vulcan, vulcan, twin16, ROT0, "Konami", "Vulcan Venture", 0 )
+GAME( 1988, gradius2, vulcan, vulcan, gradius2, twin16, ROT0, "Konami", "Gradius II - GOFER no Yabou (Japan New Ver.)", 0 )
+GAME( 1988, grdius2a, vulcan, vulcan, vulcan, twin16, ROT0, "Konami", "Gradius II - GOFER no Yabou (Japan Old Ver.)", 0 )
+GAME( 1988, grdius2b, vulcan, vulcan, vulcan, twin16, ROT0, "Konami", "Gradius II - GOFER no Yabou (Japan Older Ver.)", 0 )
+
+GAME( 1988, fround, 0, fround, fround, fround, ROT0, "Konami", "The Final Round (version M)", 0 )
+GAME( 1988, froundl, fround, fround, fround, fround, ROT0, "Konami", "The Final Round (version L)", 0 )
+GAME( 1988, hpuncher, fround, hpuncher, fround, hpuncher, ROT0, "Konami", "Hard Puncher (Japan)", 0 )
+GAME( 1989, miaj, mia, mia, miaj, hpuncher, ROT0, "Konami", "M.I.A. - Missing in Action (Japan)", 0 )
+GAME( 1989, cuebrick, 0, cuebrick, cuebrick, cuebrick, ROT0, "Konami", "Cue Brick (Japan)", 0 )