/*
Konami "Twin16"

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:
	- battery-backed RAM isn't handled properly (CueBrick)
	- 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
*/

#include "driver.h"
#include "vidhrdw/generic.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"

extern void fround_gfx_bank_w( int offset, int data );
extern void twin16_video_register_w( int offset, int data );

extern int twin16_vh_start( void );
extern void twin16_vh_stop( void );
extern void twin16_vh_screenrefresh( struct osd_bitmap *bitmap, int fullrefresh );

extern void twin16_spriteram_process( void );

/******************************************************************************************/

UINT16 twin16_custom_vidhrdw;
UINT16 *twin16_gfx_rom;
unsigned char *twin16_sprite_gfx_ram;
unsigned char *twin16_tile_gfx_ram;
unsigned char *twin16_fixram; /* 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 unsigned char *battery_backed_ram;

#define CREDITS "Phil Stroffolino\nDave Spicer\nNao"


int twin16_spriteram_process_enable( void ){
	return (twin16_CPUA_register&0x40)==0;
}

enum {
	CPU_SOUND,
	CPU_B,
	CPU_A
};

enum {
	MEM_CPU_SOUND = 0,
	MEM_SOUND_SAMPLES1,
	MEM_SOUND_SAMPLES2,
	MEM_GFX_CHARS,
	MEM_GFX_SPRITES,
	MEM_CPU_A,
	MEM_CPU_B,
	MEM_GFX_EXTRA
};


/******************************************************************************************/

#define WORKRAM_CPUA_r				MRA_BANK1
#define WORKRAM_CPUA_w				MWA_BANK1

#define WORKRAM_CPUB_r				MRA_BANK2
#define WORKRAM_CPUB_w				MWA_BANK2

#define FIXRAM_r					MRA_BANK3
#define FIXRAM_w					MWA_BANK3, &twin16_fixram

#define COMRAM_r					MRA_BANK4
#define COMRAM_w					MWA_BANK4

#define twin16_sprite_gfx_ram_w		MWA_BANK5, &twin16_sprite_gfx_ram
#define twin16_sprite_gfx_ram_r		MRA_BANK5

#define twin16_tile_gfx_ram_w		MWA_BANK6, &twin16_tile_gfx_ram
#define twin16_tile_gfx_ram_r		MRA_BANK7

int VIDRAM_r( int offset ){ return READ_WORD(&videoram[offset]); }
void VIDRAM_w( int offset, int data ){ COMBINE_WORD_MEM(&videoram[offset],data); }

int OBJRAM_r( int offset ){ return READ_WORD(&spriteram[offset]); }
void OBJRAM_w( int offset, int data ){ COMBINE_WORD_MEM(&spriteram[offset],data); }


int battery_backed_ram_r( int offset ){
	return READ_WORD(&battery_backed_ram[offset]);
}

void battery_backed_ram_w( int offset, int data ){
	COMBINE_WORD_MEM(&battery_backed_ram[offset],data);
}

static int cuebrick_hiload(void){
	void *f = osd_fopen(Machine->gamedrv->name,0,OSD_FILETYPE_HIGHSCORE,0);
	if( f ){
		if( errorlog ) fprintf( errorlog, "loading bup_ram\n" );
		osd_fread(f,battery_backed_ram,0x4000);
		osd_fclose(f);
	}
	return 1;
}

static void cuebrick_hisave(void){
	void *f = osd_fopen(Machine->gamedrv->name,0,OSD_FILETYPE_HIGHSCORE,1);
	if( f ){
		if( errorlog ) fprintf( errorlog, "saving bup_ram\n" );
		osd_fwrite(f,battery_backed_ram,0x4000);
		osd_fclose(f);
	}
}

/******************************************************************************************/

static int extra_rom_r( int offset ){
	return ((UINT16 *)Machine->memory_region[MEM_GFX_EXTRA])[offset/2];
}

static int twin16_gfx_rom1_r( int offset ){
	return twin16_gfx_rom[offset/2];
}

static int twin16_gfx_rom2_r( int offset ){
	return twin16_gfx_rom[offset/2 + 0x80000 + ((twin16_CPUB_register&0x04)?0x40000:0)];
}

static void twin16_paletteram_w(int offset,int data){ // identical to tmnt_paletteram_w
	int oldword = READ_WORD(&paletteram[offset]);
	int newword = COMBINE_WORD(oldword,data);
	WRITE_WORD(&paletteram[offset],newword);

	offset /= 4;
	{
		int palette = ((READ_WORD(&paletteram[offset * 4]) & 0x00ff) << 8)
				+ (READ_WORD(&paletteram[offset * 4 + 2]) & 0x00ff);
		int r = palette & 31;
		int g = (palette >> 5) & 31;
		int b = (palette >> 10) & 31;

		r = (r << 3) + (r >> 2);
		g = (g << 3) + (g >> 2);
		b = (b << 3) + (b >> 2);

		palette_change_color (offset,r,g,b);
	}
}

static struct GfxLayout 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
};

static void gfx_untangle( void ){ /* sprite, tile data */
	int i;
	UINT16 *temp = (UINT16 *)malloc(0x200000);
	if( temp ){
		twin16_gfx_rom = (UINT16 *)Machine->memory_region[MEM_GFX_SPRITES];
		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 void twin16_decode( void ){
	gfx_untangle();
	twin16_custom_vidhrdw = 0;
}

static void fround_decode( void ){
	gfx_untangle();
	twin16_custom_vidhrdw = 1;
}

static struct GfxDecodeInfo gfxdecodeinfo[] = {
	{ MEM_GFX_CHARS, 0x00000, &alpha_layout, 0, 16 },
	{ -1 }
};

/******************************************************************************************/

static void sound_command_w( int offset, int data ){
	twin16_sound_command = COMBINE_WORD( twin16_sound_command, data );
	soundlatch_w( 0, twin16_sound_command&0xff );
}

static int CPUA_interrupt( void ){\
	return CPUA_IRQ_ENABLE?MC68000_IRQ_5:MC68000_INT_NONE;
}

static int CPUB_interrupt( void ){
	return CPUB_IRQ_ENABLE?MC68000_IRQ_5:MC68000_INT_NONE;
}

static int twin16_sprite_status_r( int offset ){
	/*
		return value indicates whether the spriteram-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 void twin16_CPUA_register_w( int offset, int data ){
	/*
		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	coin counters
	*/
	UINT16 old = twin16_CPUA_register;
	twin16_CPUA_register = COMBINE_WORD( old, data );
	if( twin16_CPUA_register!=old ){
		if( (old&0x08)==0 && (twin16_CPUA_register&0x08) ){
			cpu_cause_interrupt( CPU_SOUND, 0xff );
		}

		if( (old&0x40) && (twin16_CPUA_register&0x40)==0 ){
			twin16_spriteram_process();
		}

		if( (old&0x10)==0 && (twin16_CPUA_register&0x10) ){
			cpu_cause_interrupt( CPU_B, MC68000_IRQ_6 );
		}
		coin_counter_w( 0, twin16_CPUA_register&0x01 );
		coin_counter_w( 1, twin16_CPUA_register&0x02 );
	}
}

static void twin16_CPUB_register_w( int offset, int data ){
	/*
		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;
	twin16_CPUB_register = COMBINE_WORD( old, data );
	if( twin16_CPUB_register!=old ){
		if( (old&0x01)==0 && (twin16_CPUB_register&0x1) ){
			cpu_cause_interrupt( CPU_A, MC68000_IRQ_6 );
		}
	}
}

static void fround_CPU_register_w( int offset, int data ){
	UINT16 old = twin16_CPUA_register;
	twin16_CPUA_register = COMBINE_WORD( old, data );
	if( twin16_CPUA_register!=old ){
		if( (old&0x08)==0 && (twin16_CPUA_register&0x08) )
			cpu_cause_interrupt( CPU_SOUND, 0xff ); // trigger IRQ on sound CPU
	}
}

/******************************************************************************************/

static int twin16_input_r (int offset){
	switch( offset ){
		case 0x00: return readinputport(0); // coin
		case 0x02: return readinputport(1); // p1
		case 0x04: return readinputport(2); // p2
		case 0x06: return readinputport(3); // p3? (Devils World)
		case 0x10: return readinputport(5); // DSW1
		case 0x12: return readinputport(4); // DSW2
		case 0x18: return readinputport(6); // DSW3
	}
	return 0;
}

/******************************************************************************************/
/* sound system */

int twin16_sres_r(int offset){
	return twin16_soundlatch;
}

void twin16_sres_w(int offset,int data){
	/* bit 1 resets the UPD7795C sound chip */
	if ((data & 0x02) == 0){
		UPD7759_reset_w(0,(data & 0x02) >> 1);
	}
	twin16_soundlatch = data;
}

static struct YM2151interface ym2151_interface = {
	1,			/* 1 chip */
	7159160/2,	/* 3.58 MHZ ? */
	{ YM3012_VOL(80,MIXER_PAN_LEFT,80,MIXER_PAN_RIGHT) },
	{ 0 }
};

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 =
{
	1,		/* number of chips */
	{MEM_SOUND_SAMPLES1,MEM_SOUND_SAMPLES1}, /* memory regions */
	{ K007232_VOL(35,MIXER_PAN_CENTER,35,MIXER_PAN_CENTER) },	/* volume */
	{ volume_callback }	/* external port callback */
};

static struct UPD7759_interface upd7759_interface =
{
	1,		/* number of chips */
	UPD7759_STANDARD_CLOCK,
	{ 30 }, /* volume */
	{ MEM_SOUND_SAMPLES2 }, /* memory region */
	UPD7759_STANDALONE_MODE, /* chip mode */
	{0}
};

// Added by Takahiro Nogi. (1999/10/27)
static void UPD7759_start_wx(int offset, int data)
{
	UPD7759_start_w(offset, (!(data & 0x01)));
}

static struct MemoryReadAddress readmem_sound[] = {
	{ 0x0000, 0x7fff, MRA_ROM },
	{ 0x8000, 0x8fff, MRA_RAM },
	{ 0x9000, 0x9000, twin16_sres_r },
	{ 0xa000, 0xa000, soundlatch_r },
	{ 0xb000, 0xb00d, K007232_read_port_0_r },
	{ 0xc001, 0xc001, YM2151_status_port_0_r },
	{ 0xf000, 0xf000, UPD7759_busy_r },
	{ -1 }
};

static struct MemoryWriteAddress writemem_sound[] = {
	{ 0x0000, 0x7fff, MWA_ROM },
	{ 0x8000, 0x8fff, MWA_RAM },
	{ 0x9000, 0x9000, twin16_sres_w },
	{ 0xb000, 0xb00d, K007232_write_port_0_w  },
	{ 0xc000, 0xc000, YM2151_register_port_0_w },
	{ 0xc001, 0xc001, YM2151_data_port_0_w },
	{ 0xd000, 0xd000, UPD7759_message_w },
	{ 0xe000, 0xe000, UPD7759_start_wx },	// Changed by Takahiro Nogi. (1999/10/27)
	{ -1 }
};

/******************************************************************************************/

static struct MemoryReadAddress readmem[] = {
	{ 0x000000, 0x03ffff, MRA_ROM },
	{ 0x040000, 0x043fff, COMRAM_r },
	{ 0x060000, 0x063fff, WORKRAM_CPUA_r },
	{ 0x080000, 0x080fff, paletteram_word_r },
	{ 0x0a0000, 0x0a001b, twin16_input_r },
	{ 0x0b0000, 0x0b3fff, battery_backed_ram_r }, /* cuebrick only */
	{ 0x0c000e, 0x0c000f, twin16_sprite_status_r },
	{ 0x100000, 0x103fff, FIXRAM_r },
	{ 0x120000, 0x123fff, VIDRAM_r },
	{ 0x140000, 0x143fff, OBJRAM_r },
	{ -1 }
};

static struct MemoryWriteAddress writemem[] = {
	{ 0x000000, 0x03ffff, MWA_ROM },
	{ 0x040000, 0x043fff, COMRAM_w },
	{ 0x060000, 0x063fff, WORKRAM_CPUA_w },
	{ 0x080000, 0x080fff, twin16_paletteram_w, &paletteram },
	{ 0x081000, 0x081fff, MWA_NOP },
	{ 0x0a0000, 0x0a0001, twin16_CPUA_register_w },
	{ 0x0a0008, 0x0a0009, sound_command_w },
	{ 0x0a0010, 0x0a0011, MWA_NOP }, /* watchdog */
	{ 0x0b0000, 0x0b3fff, battery_backed_ram_w, &battery_backed_ram }, /* cuebrick only */
	{ 0x0c0000, 0x0c000f, twin16_video_register_w },
	{ 0x100000, 0x103fff, FIXRAM_w },
	{ 0x120000, 0x123fff, VIDRAM_w, &videoram },
	{ 0x140000, 0x143fff, OBJRAM_w, &spriteram },
	{ -1 }
};

static struct MemoryReadAddress readmem_sub[] = {
	{ 0x000000, 0x03ffff, MRA_ROM },
	{ 0x040000, 0x043fff, COMRAM_r },
	{ 0x060000, 0x063fff, WORKRAM_CPUB_r },
	{ 0x080000, 0x09ffff, extra_rom_r },
	{ 0x400000, 0x403fff, OBJRAM_r },
	{ 0x480000, 0x483fff, VIDRAM_r },
	{ 0x500000, 0x53ffff, twin16_tile_gfx_ram_r },
	{ 0x600000, 0x6fffff, twin16_gfx_rom1_r },
	{ 0x700000, 0x77ffff, twin16_gfx_rom2_r },
	{ 0x780000, 0x79ffff, twin16_sprite_gfx_ram_r },
	{ -1 }
};

static struct MemoryWriteAddress writemem_sub[] = {
	{ 0x000000, 0x03ffff, MWA_ROM },
	{ 0x040000, 0x043fff, COMRAM_w },
	{ 0x060000, 0x063fff, WORKRAM_CPUB_w },
	{ 0x0a0000, 0x0a0001, twin16_CPUB_register_w },
	{ 0x400000, 0x403fff, OBJRAM_w },
	{ 0x480000, 0x483fff, VIDRAM_w },
	{ 0x500000, 0x53ffff, twin16_tile_gfx_ram_w },
	{ 0x780000, 0x79ffff, twin16_sprite_gfx_ram_w },
	{ -1 }
};

/******************************************************************************************/

static struct MemoryReadAddress fround_readmem[] = {
	{ 0x000000, 0x03ffff, MRA_ROM },
	{ 0x040000, 0x043fff, COMRAM_r },
	{ 0x060000, 0x063fff, WORKRAM_CPUA_r },
	{ 0x080000, 0x080fff, paletteram_word_r },
	{ 0x0a0000, 0x0a001b, twin16_input_r },
	{ 0x0c000e, 0x0c000f, twin16_sprite_status_r },
	{ 0x100000, 0x103fff, FIXRAM_r },
	{ 0x120000, 0x123fff, VIDRAM_r },
	{ 0x140000, 0x143fff, OBJRAM_r },
	{ 0x500000, 0x6fffff, twin16_gfx_rom1_r },
	{ -1 }
};

static struct MemoryWriteAddress fround_writemem[] = {
	{ 0x000000, 0x03ffff, MWA_ROM },
	{ 0x040000, 0x043fff, COMRAM_w },
	{ 0x060000, 0x063fff, WORKRAM_CPUA_w },
	{ 0x080000, 0x080fff, twin16_paletteram_w, &paletteram },
	{ 0x0a0000, 0x0a0001, fround_CPU_register_w },
	{ 0x0a0008, 0x0a0009, sound_command_w },
	{ 0x0a0010, 0x0a0011, MWA_NOP }, /* watchdog */
	{ 0x0c0000, 0x0c000f, twin16_video_register_w },
	{ 0x0e0000, 0x0e0001, fround_gfx_bank_w },
	{ 0x100000, 0x103fff, FIXRAM_w },
	{ 0x120000, 0x123fff, VIDRAM_w, &videoram },
	{ 0x140000, 0x143fff, OBJRAM_w, &spriteram },
	{ -1 }
};

/******************************************************************************************/

static struct MachineDriver machine_driver =
{
	{
		{
			CPU_Z80 | CPU_AUDIO_CPU,
			3579545,
			MEM_CPU_SOUND,
			readmem_sound,writemem_sound,0,0,
			ignore_interrupt,1
		},

		{
			CPU_M68000,
			10000000,
			MEM_CPU_B,
			readmem_sub,writemem_sub,0,0,
			CPUB_interrupt,1
		},

		{
			CPU_M68000,
			10000000,
			MEM_CPU_A,
			readmem,writemem,0,0,
			CPUA_interrupt,1
		},
	},
	60, DEFAULT_REAL_60HZ_VBLANK_DURATION,
	100, /* CPU slices */
	0, /* init machine */

	/* video hardware */
	320, 256, { 0, 319, 0+16, 255-16 },
	gfxdecodeinfo,
	0x400,0x400,
	0,

	VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,
	0,
	twin16_vh_start,
	twin16_vh_stop,
	twin16_vh_screenrefresh,

	/* sound hardware */
	0,0,0,0,
	{
		{
			SOUND_YM2151,
			&ym2151_interface
		},
		{
			SOUND_K007232,
			&k007232_interface,
		},
		{
			SOUND_UPD7759,
			&upd7759_interface
		}
	}
};

static struct MachineDriver heavysync_machine_driver =
{
	{
		{
			CPU_Z80 | CPU_AUDIO_CPU,
			3579545,
			MEM_CPU_SOUND,
			readmem_sound,writemem_sound,0,0,
			ignore_interrupt,1
		},

		{
			CPU_M68000,
			10000000,
			MEM_CPU_B,
			readmem_sub,writemem_sub,0,0,
			CPUB_interrupt,1
		},

		{
			CPU_M68000,
			10000000,
			MEM_CPU_A,
			readmem,writemem,0,0,
			CPUA_interrupt,1
		},
	},
	60, DEFAULT_REAL_60HZ_VBLANK_DURATION,
	1000, /* CPU slices */
	0, /* init machine */

	/* video hardware */
	320, 256, { 0, 319, 0+16, 255-16 },
	gfxdecodeinfo,
	0x400,0x400,
	0,

	VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,// | VIDEO_SUPPORTS_16BIT,
	0,
	twin16_vh_start,
	twin16_vh_stop,
	twin16_vh_screenrefresh,

	/* sound hardware */
	0,0,0,0,
	{
		{
			SOUND_YM2151,
			&ym2151_interface
		},
		{
			SOUND_K007232,
			&k007232_interface,
		},
		{
			SOUND_UPD7759,
			&upd7759_interface
		}
	}
};

static struct MachineDriver fround_machine_driver =
{
	{
		{
			CPU_Z80 | CPU_AUDIO_CPU,
			3579545,
			MEM_CPU_SOUND,
			readmem_sound,writemem_sound,0,0,
			ignore_interrupt,1
		},
		{
			CPU_M68000,
			10000000,
			MEM_CPU_A,
			fround_readmem,fround_writemem,0,0,
			CPUA_interrupt,1
		},
	},
	60, DEFAULT_REAL_60HZ_VBLANK_DURATION,
	100, /* CPU slices */
	0, /* init machine */

	/* video hardware */
	320, 256, { 0, 319, 0+16, 255-16 },
	gfxdecodeinfo,
	0x400,0x400,
	0,

	VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,// | VIDEO_SUPPORTS_16BIT,
	0,
	twin16_vh_start,
	twin16_vh_stop,
	twin16_vh_screenrefresh,

	/* sound hardware */
	0,0,0,0,
	{
		{
			SOUND_YM2151,
			&ym2151_interface
		},
		{
			SOUND_K007232,
			&k007232_interface,
		},
		{
			SOUND_UPD7759,
			&upd7759_interface
		}
	}
};

/******************************************************************************************/

ROM_START( devilw )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "dw-m03.rom",	0x00000,  0x8000, 0x7201983c )
	ROM_REGION(0x20000) /* samples */
	ROM_LOAD( "dw-ic5a.rom",	0x00000, 0x20000, 0xd4992dfb )
	ROM_REGION(0x20000) /* samples */
	ROM_LOAD( "dw-ic7c.rom",	0x00000, 0x20000, 0xe5947501 )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "dw-m14.rom",	0x00000,  0x4000, 0xd7338557 ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE_SWAP(	"dw-10p.rom",	0x000000, 0x80000, 0x66cb3923 )
	ROM_LOAD_WIDE_SWAP(	"dw-10r.rom",	0x080000, 0x80000, 0xa1c7d0db )
	ROM_LOAD_WIDE_SWAP(	"dw-10l.rom",	0x100000, 0x80000, 0xeec8c5b2 )
	ROM_LOAD_WIDE_SWAP(	"dw-10m.rom",	0x180000, 0x80000, 0x746cf48b )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "dw-t05.rom",	0x00000, 0x10000, 0x8ab7dc61 )
	ROM_LOAD_ODD(  "dw-t04.rom",	0x00000, 0x10000, 0xc69924da )
	ROM_LOAD_EVEN( "dw-t09.rom",   0x20000, 0x10000, 0xfae97de0 )
	ROM_LOAD_ODD(  "dw-t08.rom",   0x20000, 0x10000, 0x8c898d67 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "dw-r07.rom",	0x00000, 0x10000, 0x53110c0b )
	ROM_LOAD_ODD(  "dw-r06.rom",	0x00000, 0x10000, 0x9c53a0c5 )
	ROM_LOAD_EVEN( "dw-r13.rom",	0x20000, 0x10000, 0x36ae6014 )
	ROM_LOAD_ODD(  "dw-r12.rom",	0x20000, 0x10000, 0x6d012167 )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
	ROM_LOAD_EVEN( "dw-m11.rom",	0x00000, 0x10000, 0x399deee8 )
	ROM_LOAD_ODD(  "dw-m10.rom",	0x00000, 0x10000, 0x117c91ee )
ROM_END

ROM_START( majuu )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "dw-m03.rom",	0x00000,  0x8000, 0x7201983c )
	ROM_REGION(0x20000) /* samples */
	ROM_LOAD( "dw-ic5a.rom",	0x00000, 0x20000, 0xd4992dfb )
	ROM_REGION(0x20000) /* samples */
	ROM_LOAD( "dw-ic7c.rom",	0x00000, 0x20000, 0xe5947501 )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "687-l14.d8",	0x00000,  0x4000, 0x20ecccd6 ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE_SWAP(	"dw-10p.rom",	0x000000, 0x80000, 0x66cb3923 )
	ROM_LOAD_WIDE_SWAP(	"dw-10r.rom",	0x080000, 0x80000, 0xa1c7d0db )
	ROM_LOAD_WIDE_SWAP(	"dw-10l.rom",	0x100000, 0x80000, 0xeec8c5b2 )
	ROM_LOAD_WIDE_SWAP(	"dw-10m.rom",	0x180000, 0x80000, 0x746cf48b )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "687-s05.6n",	0x00000, 0x10000, 0xbd99b434 )
	ROM_LOAD_ODD(  "687-s04.4n",	0x00000, 0x10000, 0x3df732e2 )
	ROM_LOAD_EVEN( "687-s09.6r",	0x20000, 0x10000, 0x1f6efec3 )
	ROM_LOAD_ODD(  "687-s08.4r",	0x20000, 0x10000, 0x8a16c8c6 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "dw-r07.rom",	0x00000, 0x10000, 0x53110c0b )
	ROM_LOAD_ODD(  "dw-r06.rom",	0x00000, 0x10000, 0x9c53a0c5 )
	ROM_LOAD_EVEN( "dw-r13.rom",	0x20000, 0x10000, 0x36ae6014 )
	ROM_LOAD_ODD(  "dw-r12.rom",	0x20000, 0x10000, 0x6d012167 )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
	ROM_LOAD_EVEN( "dw-m11.rom",	0x00000, 0x10000, 0x399deee8 )
	ROM_LOAD_ODD(  "dw-m10.rom",	0x00000, 0x10000, 0x117c91ee )
ROM_END

ROM_START( darkadv ) /* this set is incomplete */
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "n03.10a",	0x00000,  0x8000, 0xa24c682f )
	ROM_REGION(0x20000) /* samples */
	ROM_LOAD( "dw-ic5a.rom",	0x00000, 0x20000, 0 )
	ROM_REGION(0x20000) /* samples */
	ROM_LOAD( "dw-ic7c.rom",	0x00000, 0x20000, 0 )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "n14.3f",	0x0000,  0x4000, 0xc76ac6d2 ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE_SWAP(	"dw-10p.rom",	0x000000, 0x80000, 0x66cb3923 )
	ROM_LOAD_WIDE_SWAP(	"dw-10r.rom",	0x080000, 0x80000, 0xa1c7d0db )
	ROM_LOAD_WIDE_SWAP(	"dw-10l.rom",	0x100000, 0x80000, 0xeec8c5b2 )
	ROM_LOAD_WIDE_SWAP(	"dw-10m.rom",	0x180000, 0x80000, 0x746cf48b )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "n05.6n",	0x00000, 0x10000, 0xa9195b0b )
	ROM_LOAD_ODD(  "n04.4n",	0x00000, 0x10000, 0x65b55105 )
	ROM_LOAD_EVEN( "9.rom",		0x20000, 0x10000, 0 ) /* missing! */
	ROM_LOAD_ODD(  "n08.4r",	0x20000, 0x10000, 0xa9603196 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "n07.10n",	0x00000, 0x10000, 0x6154322a )
	ROM_LOAD_ODD(  "n06.8n",	0x00000, 0x10000, 0x37a72e8b )
	ROM_LOAD_EVEN( "n13.10s",	0x20000, 0x10000, 0xf1c252af )
	ROM_LOAD_ODD(  "n12.8s",	0x20000, 0x10000, 0xda221944 )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
	ROM_LOAD_EVEN( "dw-m11.rom",	0x00000, 0x10000, 0x399deee8 )
	ROM_LOAD_ODD(  "dw-m10.rom",	0x00000, 0x10000, 0x117c91ee ) /* tiles */
ROM_END

/******************************************************************************************/

ROM_START( cuebrick )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "903-d03.10a",	0x00000,  0x8000, 0x455e855a )

	ROM_REGION( 0x20000 ) /* unpopulated */
	ROM_REGION( 0x20000 ) /* unpopulated */

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "903-e14.d8",	0x0000, 0x4000, 0xddbebbd5 ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "903-e05.6n",	0x00000, 0x10000, 0x8b556220 )
	ROM_LOAD_ODD(  "903-e04.4n",	0x00000, 0x10000, 0xbf9c7927 )
	ROM_LOAD_EVEN( "903-e09.6r",	0x20000, 0x10000, 0x2a77554d )
	ROM_LOAD_ODD(  "903-e08.4r",	0x20000, 0x10000, 0xc0a430c1 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "903-d07.10n",	0x00000, 0x10000, 0xfc0edce7 )
	ROM_LOAD_ODD(  "903-d06.8n",	0x00000, 0x10000, 0xb2cef6fe )
	ROM_LOAD_EVEN( "903-e13.10s",	0x20000, 0x10000, 0x4fb5fb80 )
	ROM_LOAD_ODD(  "903-e12.8s",	0x20000, 0x10000, 0x883e3097 )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
	ROM_LOAD_EVEN( "903-e11.10r",	0x00000, 0x10000, 0x5c41faf8 )
	ROM_LOAD_ODD(  "903-e10.8r",	0x00000, 0x10000, 0x417576d4 )
ROM_END

ROM_START( vulcan )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "vulcan.g03",	0x00000,  0x8000, 0x67a3b50d )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f01",	0x00000, 0x20000, 0xa0d8d69e )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f02",	0x00000, 0x20000, 0xc39f5ca4 )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "vulcan.h14",	0x0000, 0x4000, 0x02f4b16f ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE( "vulcan.f17",	0x000000, 0x80000, 0x8fbec1a4 )
	ROM_LOAD_WIDE( "vulcan.f18",	0x080000, 0x80000, 0x50d61e38 )
	ROM_LOAD_WIDE( "vulcan.f15",	0x100000, 0x80000, 0xaf96aef3 )
	ROM_LOAD_WIDE( "vulcan.f16",	0x180000, 0x80000, 0xb858df1f )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "vulcan.w05", 0x00000, 0x10000, 0x6e0e99cd )
	ROM_LOAD_ODD(  "vulcan.w04", 0x00000, 0x10000, 0x23ec74ca )
	ROM_LOAD_EVEN( "vulcan.w09", 0x20000, 0x10000, 0x377e4f28 )
	ROM_LOAD_ODD(  "vulcan.w08", 0x20000, 0x10000, 0x813d41ea )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "vulcan.p07", 0x00000, 0x10000, 0x686d549d )
	ROM_LOAD_ODD(  "vulcan.p06", 0x00000, 0x10000, 0x70c94bee )
	ROM_LOAD_EVEN( "vulcan.p13", 0x20000, 0x10000, 0x478fdb0a )
	ROM_LOAD_ODD(  "vulcan.p12", 0x20000, 0x10000, 0x38ea402a )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
ROM_END

ROM_START( gradius2 )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "vulcan.g03",	0x00000,  0x8000, 0x67a3b50d )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f01",	0x00000, 0x20000, 0xa0d8d69e )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f02",	0x00000, 0x20000, 0xc39f5ca4 )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "gradius2.g14",	0x0000, 0x4000, 0x9dcdad9d ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE( "vulcan.f17",	0x000000, 0x80000, 0x8fbec1a4 )
	ROM_LOAD_WIDE( "vulcan.f18",	0x080000, 0x80000, 0x50d61e38 )
	ROM_LOAD_WIDE( "vulcan.f15",	0x100000, 0x80000, 0xaf96aef3 )
	ROM_LOAD_WIDE( "vulcan.f16",	0x180000, 0x80000, 0xb858df1f )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "785x05.bin", 0x00000, 0x10000, 0x8a23a7b8 )
	ROM_LOAD_ODD(  "785x04.bin", 0x00000, 0x10000, 0x88e466ce )
	ROM_LOAD_EVEN( "785x09.bin", 0x20000, 0x10000, 0x3f3d7d7a )
	ROM_LOAD_ODD(  "785x08.bin", 0x20000, 0x10000, 0xc39c8efd )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "vulcan.p07", 0x00000, 0x10000, 0x686d549d )
	ROM_LOAD_ODD(  "vulcan.p06", 0x00000, 0x10000, 0x70c94bee )
	ROM_LOAD_EVEN( "vulcan.p13", 0x20000, 0x10000, 0x478fdb0a )
	ROM_LOAD_ODD(  "vulcan.p12", 0x20000, 0x10000, 0x38ea402a )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
ROM_END

ROM_START( grdius2a )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "vulcan.g03",	0x00000,  0x8000, 0x67a3b50d )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f01",	0x00000, 0x20000, 0xa0d8d69e )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f02",	0x00000, 0x20000, 0xc39f5ca4 )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "gradius2.g14",	0x0000, 0x4000, 0x9dcdad9d ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE( "vulcan.f17",	0x000000, 0x80000, 0x8fbec1a4 )
	ROM_LOAD_WIDE( "vulcan.f18",	0x080000, 0x80000, 0x50d61e38 )
	ROM_LOAD_WIDE( "vulcan.f15",	0x100000, 0x80000, 0xaf96aef3 )
	ROM_LOAD_WIDE( "vulcan.f16",	0x180000, 0x80000, 0xb858df1f )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "gradius2.p05", 0x00000, 0x10000, 0x4db0e736 )
	ROM_LOAD_ODD(  "gradius2.p04", 0x00000, 0x10000, 0x765b99e6 )
	ROM_LOAD_EVEN( "785t09.bin",   0x20000, 0x10000, 0x4e3f4965 )
	ROM_LOAD_ODD(  "gradius2.j08", 0x20000, 0x10000, 0x2b1c9108 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "vulcan.p07", 0x00000, 0x10000, 0x686d549d )
	ROM_LOAD_ODD(  "vulcan.p06", 0x00000, 0x10000, 0x70c94bee )
	ROM_LOAD_EVEN( "vulcan.p13", 0x20000, 0x10000, 0x478fdb0a )
	ROM_LOAD_ODD(  "vulcan.p12", 0x20000, 0x10000, 0x38ea402a )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
ROM_END

ROM_START( grdius2b )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "vulcan.g03",	0x00000,  0x8000, 0x67a3b50d )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f01",	0x00000, 0x20000, 0xa0d8d69e )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "vulcan.f02",	0x00000, 0x20000, 0xc39f5ca4 )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "gradius2.g14",	0x0000, 0x4000, 0x9dcdad9d ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE( "vulcan.f17",	0x000000, 0x80000, 0x8fbec1a4 )
	ROM_LOAD_WIDE( "vulcan.f18",	0x080000, 0x80000, 0x50d61e38 )
	ROM_LOAD_WIDE( "vulcan.f15",	0x100000, 0x80000, 0xaf96aef3 )
	ROM_LOAD_WIDE( "vulcan.f16",	0x180000, 0x80000, 0xb858df1f )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "gradius2.p05", 0x00000, 0x10000, 0x4db0e736 )
	ROM_LOAD_ODD(  "gradius2.p04", 0x00000, 0x10000, 0x765b99e6 )
	ROM_LOAD_EVEN( "gradius2.j09", 0x20000, 0x10000, 0x6d96a7e3 )
	ROM_LOAD_ODD(  "gradius2.j08", 0x20000, 0x10000, 0x2b1c9108 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "vulcan.p07", 0x00000, 0x10000, 0x686d549d )
	ROM_LOAD_ODD(  "vulcan.p06", 0x00000, 0x10000, 0x70c94bee )
	ROM_LOAD_EVEN( "vulcan.p13", 0x20000, 0x10000, 0x478fdb0a )
	ROM_LOAD_ODD(  "vulcan.p12", 0x20000, 0x10000, 0x38ea402a )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
ROM_END

/******************************************************************************************/

ROM_START( hpuncher )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "870g03.10a",	0x00000,  0x8000, 0xdb9c10c8 )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "870c01.5a",	0x00000, 0x20000, 0x6af96546 )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "870c02.7c",	0x00000, 0x20000, 0x54e12c6d )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "870f14.d8",	0x0000, 0x4000, 0xc9b46615 ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE_SWAP(	"870c17.p16",	0x000000, 0x80000, 0x2bc99ff8 )
	ROM_LOAD_WIDE_SWAP(	"870c18.p18",	0x080000, 0x80000, 0x07927fe8 )
	ROM_LOAD_WIDE_SWAP(	"870c15.p13",	0x100000, 0x80000, 0x8c9281df )
	ROM_LOAD_WIDE_SWAP(	"870c16.p15",	0x180000, 0x80000, 0x41df6a1b )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "870h05.6n", 0x00000, 0x10000, 0x2bcfeef3 )
	ROM_LOAD_ODD(  "870h04.4n", 0x00000, 0x10000, 0xb9f97fd3 )
	ROM_LOAD_EVEN( "870h09.6r", 0x20000, 0x10000, 0x96a4f8b1 )
	ROM_LOAD_ODD(  "870h08.4r", 0x20000, 0x10000, 0x46d65156 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN( "870h07.10n",	0x00000, 0x10000, 0xb4dda612 )
	ROM_LOAD_ODD(  "870h06.8n",	0x00000, 0x10000, 0x696ba702 )
ROM_END

ROM_START( fround )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "frf03.bin",	0x00000,  0x8000, 0xa645c727 )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "870c01.5a",	0x00000, 0x20000, 0x6af96546 )
	ROM_REGION( 0x20000 )
	ROM_LOAD( "870c02.7c",	0x00000, 0x20000, 0x54e12c6d )

	ROM_REGION_DISPOSE( 0x4000 )
	ROM_LOAD( "870f14.d8",	0x0000, 0x4000, 0xc9b46615 ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE_SWAP(	"870c17.p16",	0x080000, 0x80000, 0x2bc99ff8 )
	ROM_LOAD_WIDE_SWAP(	"870c18.p18",	0x000000, 0x80000, 0x07927fe8 )
	ROM_LOAD_WIDE_SWAP(	"870c15.p13",	0x180000, 0x80000, 0x8c9281df )
	ROM_LOAD_WIDE_SWAP(	"870c16.p15",	0x100000, 0x80000, 0x41df6a1b )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN( "frl21.bin", 0x00000, 0x20000, 0xe21a3a19 )
	ROM_LOAD_ODD(  "frl20.bin", 0x00000, 0x20000, 0x0ce9786f )
ROM_END

/******************************************************************************************/

ROM_START( miaj )
	ROM_REGION( 0x10000 ) /* Z80 code (sound CPU) */
	ROM_LOAD( "808e03.f4",	0x00000,  0x8000, 0x3d93a7cd )
	ROM_REGION( 0x20000 ) /* samples */
	ROM_LOAD(	"808d01.d4",	0x00000, 0x20000, 0xfd4d37c0 )
	ROM_REGION( 0x20000 ) /* samples */

	ROM_REGION_DISPOSE( 0x4000 ) /* chars */
	ROM_LOAD(	"808e14.bin",	0x0000, 0x4000, 0xb9d36525 ) /* characters */

	ROM_REGION( 0x200000 ) /* gfx data */
	ROM_LOAD_WIDE_SWAP(	"808d17.j4",	0x000000, 0x80000, 0xd1299082 )
	ROM_LOAD_WIDE_SWAP(	"808d15.h4",	0x100000, 0x80000, 0x2b22a6b6 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU A) */
	ROM_LOAD_EVEN(	"808r05.bin", 0x00000, 0x10000, 0x91fd83f4 )
	ROM_LOAD_ODD(	"808r04.bin", 0x00000, 0x10000, 0xf1c8c597 )
	ROM_LOAD_EVEN(	"808r09.bin", 0x20000, 0x10000, 0xf74d4467 )
	ROM_LOAD_ODD(	"808r08.bin", 0x20000, 0x10000, 0x26f21704 )

	ROM_REGION( 0x40000 ) /* 68000 code (CPU B) */
	ROM_LOAD_EVEN(	"808e07.bin",	0x00000, 0x10000, 0x297bdcea )
	ROM_LOAD_ODD(	"808e06.bin",	0x00000, 0x10000, 0x8f576b33 )
	ROM_LOAD_EVEN(	"808e13.h28",	0x20000, 0x10000, 0x1fa708f4 )
	ROM_LOAD_ODD(	"808e12.f28",	0x20000, 0x10000, 0xd62f1fde )

	ROM_REGION( 0x20000 ) /* tile data; mapped at 0x80000 on CPUB */
ROM_END

/******************************************************************************************/

#define KONAMI_TWIN_COINAGE PORT_START \
	PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) \
	PORT_DIPSETTING(    0x00, "freeplay" ) \
	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(    0x06, DEF_STR( 2C_5C ) ) \
	PORT_DIPSETTING(    0x0e, DEF_STR( 1C_2C ) ) \
	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_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(    0x60, DEF_STR( 2C_5C ) ) \
	PORT_DIPSETTING(    0xe0, DEF_STR( 1C_2C ) ) \
	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 ) )

INPUT_PORTS_START( twin16 ) /* generic */
	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_UNKNOWN )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) /* advances through tests */
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0003 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0005 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0007 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER3 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER3 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER3 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	KONAMI_TWIN_COINAGE

	PORT_START	/* DSW2 */
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Cabinet ) )
	PORT_DIPSETTING(    0x04, DEF_STR( Upright ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	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, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
	PORT_DIPNAME( 0x08, 0x08, "Reserved" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END

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_UNKNOWN )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) /* advances through tests */
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0003 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0005 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0007 */
	PORT_BIT( 0xff, 0xff, IPT_UNUSED )

	KONAMI_TWIN_COINAGE

	PORT_START	/* DSW2 */
	PORT_DIPNAME( 0x03, 0x03, "Player's Basic Power" )
	PORT_DIPSETTING(    0x03, "18" )
	PORT_DIPSETTING(    0x02, "20" )
	PORT_DIPSETTING(    0x01, "22" )
	PORT_DIPSETTING(    0x00, "24" )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Cabinet ) )
	PORT_DIPSETTING(    0x04, DEF_STR( Upright ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) )
	PORT_DIPSETTING(    0x00, "Very Difficult" )
	PORT_DIPSETTING(    0x20, "Difficult" )
	PORT_DIPSETTING(    0x40, "Normal" )
	PORT_DIPSETTING(    0x60, "Easy" )
	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, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
	PORT_DIPNAME( 0x08, 0x08, "Reserved" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END

/* note, these input ports are tested for Vulcan Venture only! */
INPUT_PORTS_START( gradius2 )
	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_UNKNOWN )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) /* advances through tests */
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0003 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0005 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0007 */
	PORT_BIT( 0xff, 0xff, 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, "Bonus" )
	PORT_DIPSETTING(    0x08, "20K" )
	PORT_DIPSETTING(    0x18, "20K/70K" )
	PORT_DIPSETTING(    0x10, "30K/80K" )
	PORT_DIPSETTING(    0x00, "70K" )
	PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
	PORT_DIPSETTING(    0x60, "Easy" )
	PORT_DIPSETTING(    0x40, "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, "Controls" )
	PORT_DIPSETTING(    0x02, "Single" )
	PORT_DIPSETTING(    0x00, "Dual" )
	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
	PORT_DIPNAME( 0x08, 0x08, "Reserved" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END

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_UNKNOWN )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) /* "map" button (also advances through tests */
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON7 )

	PORT_START      /* 0xa0003 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) /* also used in-game */
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 )

	PORT_START      /* 0xa0005 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) /* also used in-game */
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )

	PORT_START      /* 0xa0007 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER3 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START3 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER3 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER3 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER3 )

	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_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_DIPNAME( 0x08, 0x08, "Special" )//#players?
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )

	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
	PORT_DIPSETTING(    0x60, "Easy" )
	PORT_DIPSETTING(    0x40, "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_DIPNAME( 0x02, 0x00, "Controls" )
	PORT_DIPSETTING(    0x02, "Single" )
	PORT_DIPSETTING(    0x00, "Dual" )
	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
	PORT_DIPNAME( 0x08, 0x08, "Reserved" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

//	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END

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_UNKNOWN )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) /* advances through tests */
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0003 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER1 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0005 */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 | IPF_8WAY )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START      /* 0xa0007 */
	PORT_BIT( 0xff, 0xff, IPT_UNUSED )

	KONAMI_TWIN_COINAGE

	PORT_START	/* DSW2 */
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
	PORT_DIPSETTING(    0x03, "2" )
	PORT_DIPSETTING(    0x02, "3" )
	PORT_DIPSETTING(    0x01, "5" )
	PORT_DIPSETTING(    0x00, "7" )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x18, 0x08, "Bonus" )
	PORT_DIPSETTING(    0x18, "30K 80K" )
	PORT_DIPSETTING(    0x08, "50K" )
	PORT_DIPSETTING(    0x10, "50K 100K" )
	PORT_DIPSETTING(    0x00, "100K" )
	PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) )
	PORT_DIPSETTING(    0x60, "Easy" )
	PORT_DIPSETTING(    0x40, "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, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
	PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) )
	PORT_DIPSETTING(    0x08, DEF_STR( Cocktail ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END

/******************************************************************************************/

struct GameDriver driver_devilw =  {
	__FILE__,
	0,
	"devilw",
	"Devil World",
	"1987",
	"Konami",
	CREDITS,
	0,
	&heavysync_machine_driver,
	0,
	rom_devilw,
	twin16_decode,
	0,
	0,
	0,

	input_ports_devilw,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_majuu =  {
	__FILE__,
	&driver_devilw,
	"majuu",
	"Majuu no Ohkoku",
	"1987",
	"Konami",
	CREDITS,
	0,
	&heavysync_machine_driver,
	0,
	rom_majuu,
	twin16_decode,
	0,
	0,
	0,

	input_ports_devilw,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_darkadv =  {
	__FILE__,
	&driver_devilw,
	"darkadv",
	"Dark Adventure",
	"1987",
	"Konami",
	CREDITS,
	0,
	&heavysync_machine_driver,
	0,
	rom_darkadv,
	twin16_decode,
	0,
	0,
	0,

	input_ports_devilw,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_vulcan =  {
	__FILE__,
	0,
	"vulcan",
	"Vulcan Venture",
	"1988",
	"Konami",
	CREDITS,
	0,
	&machine_driver,
	0,
	rom_vulcan,
	twin16_decode,
	0,
	0,
	0,

	input_ports_gradius2,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_gradius2 =  {
	__FILE__,
	&driver_vulcan,
	"gradius2",
	"Gradius II - Gofer no Yabou (Japan set 1)",
	"1988",
	"Konami",
	CREDITS,
	0,
	&machine_driver,
	0,
	rom_gradius2,
	twin16_decode,
	0,
	0,
	0,

	input_ports_gradius2,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_grdius2a =  {
	__FILE__,
	&driver_vulcan,
	"grdius2a",
	"Gradius II - Gofer no Yabou (Japan set 2)",
	"1988",
	"Konami",
	CREDITS,
	0,
	&machine_driver,
	0,
	rom_grdius2a,
	twin16_decode,
	0,
	0,
	0,

	input_ports_gradius2,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_grdius2b =  {
	__FILE__,
	&driver_vulcan,
	"grdius2b",
	"Gradius II - Gofer no Yabou (Japan set 3)",
	"1988",
	"Konami",
	CREDITS,
	0,
	&machine_driver,
	0,
	rom_grdius2b,
	twin16_decode,
	0,
	0,
	0,

	input_ports_gradius2,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_cuebrick =  {
	__FILE__,
	0,
	"cuebrick",
	"Cuebrick",
	"1989",
	"Konami",
	CREDITS,
	0,
	&machine_driver,
	0,
	rom_cuebrick,
	twin16_decode,
	0,
	0,
	0,

	input_ports_twin16,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	cuebrick_hiload,cuebrick_hisave
};

struct GameDriver driver_fround =  {
	__FILE__,
	0,
	"fround",
	"Final Round",
	"1988",
	"Konami",
	CREDITS,
	0,
	&fround_machine_driver,
	0,
	rom_fround,
	fround_decode, 0,
	0,
	0,

	input_ports_fround,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

struct GameDriver driver_hpuncher =  {
	__FILE__,
	&driver_fround,
	"hpuncher",
	"Hard Puncher (Japan)",
	"1988",
	"Konami",
	CREDITS,
	0,
	&machine_driver,
	0,
	rom_hpuncher,
	twin16_decode, 0,
	0,
	0,

	input_ports_fround,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};

extern struct GameDriver driver_mia;
struct GameDriver driver_miaj =  {
	__FILE__,
	&driver_mia,
	"miaj",
	"Missing in Action (Japan)",
	"1989",
	"Konami",
	CREDITS,
	0,
	&machine_driver,
	0,
	rom_miaj,
	twin16_decode, 0,
	0,
	0,

	input_ports_miaj,

	0, 0, 0, /* colors, palette, colortable */
	ORIENTATION_DEFAULT,
	0,0
};
