summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/drivers/konamigq.cpp
blob: 879a152d852eb0e5cec09ca4f3507db82a15deb9 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                       
                                    












                                                                            
























                                                                    

        






                                                                                
 







                                                                                                       
 








                                                                                                  

  
                

                            
                              
                        
                                  
                             
                              
                            
                        
                          



                          
 
                                           

       
                                                                                        
                                                    
                                            

                                              
                                              

                                            

         
 


                                                
                                                    
                                                  
                                              
 



                                       
 
                                         

                                        



                                                        
                             

                                        

                                                   
 

                                                                                        
                                              



                                                    
  
 

            
                                               
 







                                                                       
  
 
                                        
 
                                                      
                                                                                                  

 
 

             
                                       
 
                                  

 
                                      
 
                                  



           



















                                                                                                                                  


               
                                              
 


                                                    

 
                                                   
 
                                        

 
                                                    
 

                                               

 
                                                     
 


                                             

 
                                                       
 










                                                                                                 

 
                                                         










                                                                                                                                      


                              



                                                        
 
 
                             




                                                           

 












                                                                            

          
                                                                                              
 
                                                 




                           
                                                            
                 
                                                               




                                        
                                                                       




                                   
                                                     










                                                                  
                                                                                               


 
                                    
 

 
                                             
 
                                         

                                       

 
                                             
 

 
                                              
                                    

                                                               
 


                                      

                                                                                                                         
 

                                                                                     
 


                                                                                    
 

                                                             

                                              

                                                         
 




                                                                                  
                                                                                   
 
                            
                                                                               

                            

                                                  
 
                                                     

                                                                   
                                                               
                                                        
                                                                                     

                                            
 
                                                               
                                                        

                                            
                  

                                    
                           

                                                                                                                                                                     
                           

                                                                                                                                                                     
                           

                                                                                                                                                                     
                           

                                                                                                                                                                     
                           

                                                                                                                                                                     
                           

                                                                                                                                                                     
                           
















                                                                                     
                                












                                                                                     
                                                         


                                                        
                         



















                                                                    
                                                                                                                                      

                                 


                                                                                                                                   


                     
                                                                      

                                                                                                                             
                                           

                                                                                                                    
                                                                

                                                                                                                     
                                                                  
                                                                                   

       
                                                                                                                                                    
// license:BSD-3-Clause
// copyright-holders:R. Belmont, smf
/***************************************************************************

  Konami GQ System - Arcade PSX Hardware
  ======================================
  Driver by R. Belmont & smf

  Crypt Killer
  Konami, 1995

  PCB Layout
  ----------

  GQ420  PWB354905B
  |----------------------------------------------------------------|
  |CN14          420A01.2G          420A02.3M         CN6 CN7 CN8  |
  |           056602  6264    |------| 424800                      |
  |           LA4705  6264    |058141|                             |
  |                   68000   |------| 424800                      |
  |     18.432MHz   PAL(000607)                                    |
  |     32MHz 48kHz PAL       |------| 424800                      |
  |                (000608)   |058800|                             |
  |    RESET_SW               |------| M514256                     |
  |                         |--------| M514256                     |
  |J                        |TMS57002|                             |
  |A                        |--------| MACH110                     |
  |M  000180          53.693175MHz    (000619A)                    |
  |M                        |--------|                             |
  |A  KM4216V256 KM4216V256 |CXD8538Q|           PAL (000613)      |
  |   KM4216V256 KM4216V256 |        |           PAL (000612)      |
  | TEST_SW                 |--------|           PAL (000618)      |
  |   CXD2923AR        67.7376MHz           93C46   NCR53CF96-2    |
  | DIPSW(8)           |---------|          420B03.27P    HDD_LED  |
  |  KM48V514 KM48V514 |CXD8530BQ|             |-----------------| |
  |  KM48V514 KM48V514 |         |             |543MB SCSI HDRIVE| |
  |CN3  UPA1556        |---------|             |TOSHIBA MK1924FBV| |
  |  KM48V514 KM48V514                         |(420UAA04)       | |
  |  KM48V514 KM48V514                         |-----------------| |
  |----------------------------------------------------------------|

  Notes:
        CN6/7/8 - 5-pin connector for guns. All 3 connectors are wired the same.
                  Pinout is...
                  1- gun opto
                  2- ground
                  3- trigger
                  4- +5v
                  5- reload (see below)

                  The Crypt Killer shotguns have 6 wires coming out of the gun.
                  The wire colors and connections are....
                  Black  - Ground; joined to CN6/7/8 pin 2
                  Red    - +5v; joined to CN6/7/8 pin 4
                  Yellow - Gun opto; joined to CN6/7/8 pin 1
                  White  - Trigger; joined to CN6/7/8 pin 3
                  Purple - Reload; joined to CN6/7/8 pin 5
                  Grey   - Reload ground; this wire must be joined to any ground for the reload to work

        CN3     - For connection of extra controls/buttons (e.g. player 3 start etc)
        CN14    - For connection of additional speaker for stereo output
        68000   - Clock input 8.000MHz [32/4]
        53CF96  - Clock input 16.000MHz [32/2]
        TMS57002- Clock input 24.000MHz [48/2]
        056602  - Konami custom ceramic module. Clock inputs 18.432MHz, 1.536MHz[18.432/12], 48kHz
        000180  - Konami custom ceramic module containing LM1203 and resistors/caps etc
        Vsync   - 59.825Hz
        HSync   - 15.613kHz
*/

#include "emu.h"
#include "bus/scsi/scsi.h"
#include "bus/scsi/scsihd.h"
#include "cpu/m68000/m68000.h"
#include "cpu/psx/psx.h"
#include "cpu/tms57002/tms57002.h"
#include "machine/am53cf96.h"
#include "machine/eepromser.h"
#include "machine/mb89371.h"
#include "machine/ram.h"
#include "sound/k054539.h"
#include "sound/k056800.h"
#include "video/psx.h"
#include "speaker.h"


class konamigq_state : public driver_device
{
public:
	konamigq_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag),
		m_maincpu(*this, "maincpu"),
		m_soundcpu(*this, "soundcpu"),
		m_dasp(*this, "dasp"),
		m_am53cf96(*this, "am53cf96"),
		m_k056800(*this, "k056800"),
		m_pcmram(*this, "pcmram")
	{
	}

	required_device<cpu_device> m_maincpu;
	required_device<cpu_device> m_soundcpu;
	required_device<tms57002_device> m_dasp;
	required_device<am53cf96_device> m_am53cf96;
	required_device<k056800_device> m_k056800;
	required_shared_ptr<uint8_t> m_pcmram;

	uint8_t *m_p_n_pcmram;
	uint8_t m_sector_buffer[ 512 ];
	uint8_t m_sound_ctrl;
	uint8_t m_sound_intck;

	DECLARE_WRITE16_MEMBER(eeprom_w);
	DECLARE_WRITE8_MEMBER(pcmram_w);
	DECLARE_READ8_MEMBER(pcmram_r);
	DECLARE_READ16_MEMBER(tms57002_data_word_r);
	DECLARE_WRITE16_MEMBER(tms57002_data_word_w);
	DECLARE_READ16_MEMBER(tms57002_status_word_r);
	DECLARE_WRITE16_MEMBER(tms57002_control_word_w);
	void init_konamigq();
	DECLARE_MACHINE_START(konamigq);
	DECLARE_MACHINE_RESET(konamigq);
	INTERRUPT_GEN_MEMBER(tms_sync);
	DECLARE_WRITE_LINE_MEMBER(k054539_irq_gen);

	void scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size );
	void scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size );
	void konamigq(machine_config &config);
	void konamigq_dasp_map(address_map &map);
	void konamigq_k054539_map(address_map &map);
	void konamigq_map(address_map &map);
	void konamigq_sound_map(address_map &map);
};

/* EEPROM */

static const uint16_t konamigq_def_eeprom[64] =
{
	0x292b, 0x5256, 0x2094, 0x4155, 0x0041, 0x1414, 0x0003, 0x0101,
	0x0103, 0x0000, 0x0707, 0x0001, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa,
	0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
	0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
	0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
	0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
	0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
	0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
};

WRITE16_MEMBER(konamigq_state::eeprom_w)
{
	ioport("EEPROMOUT")->write(data & 0x07, 0xff);
	m_soundcpu->set_input_line(INPUT_LINE_RESET, ( data & 0x40 ) ? CLEAR_LINE : ASSERT_LINE );
}


/* PCM RAM */

WRITE8_MEMBER(konamigq_state::pcmram_w)
{
	m_pcmram[ offset ] = data;
}

READ8_MEMBER(konamigq_state::pcmram_r)
{
	return m_pcmram[ offset ];
}

/* Video */

void konamigq_state::konamigq_map(address_map &map)
{
	map(0x1f000000, 0x1f00001f).rw(m_am53cf96, FUNC(am53cf96_device::read), FUNC(am53cf96_device::write)).umask32(0x00ff00ff);
	map(0x1f100000, 0x1f10001f).rw(m_k056800, FUNC(k056800_device::host_r), FUNC(k056800_device::host_w)).umask32(0x00ff00ff);
	map(0x1f180000, 0x1f180001).w(this, FUNC(konamigq_state::eeprom_w));
	map(0x1f198000, 0x1f198003).nopw();            /* cabinet lamps? */
	map(0x1f1a0000, 0x1f1a0003).nopw();            /* indicates gun trigger */
	map(0x1f200000, 0x1f200003).portr("GUNX1");
	map(0x1f208000, 0x1f208003).portr("GUNY1");
	map(0x1f210000, 0x1f210003).portr("GUNX2");
	map(0x1f218000, 0x1f218003).portr("GUNY2");
	map(0x1f220000, 0x1f220003).portr("GUNX3");
	map(0x1f228000, 0x1f228003).portr("GUNY3");
	map(0x1f230000, 0x1f230003).portr("P1_P2");
	map(0x1f230004, 0x1f230007).portr("P3_SERVICE");
	map(0x1f238000, 0x1f238003).portr("DSW");
	map(0x1f300000, 0x1f5fffff).rw(this, FUNC(konamigq_state::pcmram_r), FUNC(konamigq_state::pcmram_w)).umask32(0x00ff00ff);
	map(0x1f680000, 0x1f68001f).rw("mb89371", FUNC(mb89371_device::read), FUNC(mb89371_device::write)).umask32(0x00ff00ff);
	map(0x1f780000, 0x1f780003).nopw(); /* watchdog? */
}

/* SOUND CPU */

INTERRUPT_GEN_MEMBER(konamigq_state::tms_sync)
{
	// DASP is synced to the LRCLK of the 058141
	if (m_sound_ctrl & 0x20)
		m_dasp->sync_w(1);
}

READ16_MEMBER(konamigq_state::tms57002_data_word_r)
{
	return m_dasp->data_r(space, 0);
}

WRITE16_MEMBER(konamigq_state::tms57002_data_word_w)
{
	if (ACCESSING_BITS_0_7)
		m_dasp->data_w(space, 0, data);
}

READ16_MEMBER(konamigq_state::tms57002_status_word_r)
{
	return (m_dasp->dready_r() ? 4 : 0) |
		(m_dasp->pc0_r() ? 2 : 0) |
		(m_dasp->empty_r() ? 1 : 0);
}

WRITE16_MEMBER(konamigq_state::tms57002_control_word_w)
{
	if (ACCESSING_BITS_0_7)
	{
		if (!(data & 1))
			m_soundcpu->set_input_line(M68K_IRQ_2, CLEAR_LINE);

		m_dasp->pload_w(data & 4);
		m_dasp->cload_w(data & 8);
		m_dasp->set_input_line(INPUT_LINE_RESET, data & 0x10 ? CLEAR_LINE : ASSERT_LINE);

		m_sound_ctrl = data;
	}
}

/* 68000 memory handling - near identical to Konami GX */
void konamigq_state::konamigq_sound_map(address_map &map)
{
	map(0x000000, 0x07ffff).rom();
	map(0x100000, 0x10ffff).ram();
	map(0x200000, 0x2004ff).rw("k054539_1", FUNC(k054539_device::read), FUNC(k054539_device::write)).umask16(0xff00);
	map(0x200000, 0x2004ff).rw("k054539_2", FUNC(k054539_device::read), FUNC(k054539_device::write)).umask16(0x00ff);
	map(0x300000, 0x300001).rw(this, FUNC(konamigq_state::tms57002_data_word_r), FUNC(konamigq_state::tms57002_data_word_w));
	map(0x400000, 0x40001f).rw(m_k056800, FUNC(k056800_device::sound_r), FUNC(k056800_device::sound_w)).umask16(0x00ff);
	map(0x500000, 0x500001).rw(this, FUNC(konamigq_state::tms57002_status_word_r), FUNC(konamigq_state::tms57002_control_word_w));
	map(0x580000, 0x580001).nopw(); // 'NRES' - D2: K056602 /RESET
}


/* TMS57002 memory handling */
void konamigq_state::konamigq_dasp_map(address_map &map)
{
	map(0x00000, 0x3ffff).ram();
}


/* K058141 memory handling */
void konamigq_state::konamigq_k054539_map(address_map &map)
{
	map(0x000000, 0x07ffff).rom().region("k054539", 0);
	map(0x080000, 0x3fffff).ram().share("pcmram");
}


/* 058141 */
WRITE_LINE_MEMBER(konamigq_state::k054539_irq_gen)
{
	if (m_sound_ctrl & 1)
	{
		// Trigger an interrupt on the rising edge
		if (!m_sound_intck && state)
			m_soundcpu->set_input_line(M68K_IRQ_2, ASSERT_LINE);
	}

	m_sound_intck = state;
}

/* SCSI */

void konamigq_state::scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size )
{
	uint8_t *sector_buffer = m_sector_buffer;
	int i;
	int n_this;

	while( n_size > 0 )
	{
		if( n_size > sizeof( m_sector_buffer ) / 4 )
		{
			n_this = sizeof( m_sector_buffer ) / 4;
		}
		else
		{
			n_this = n_size;
		}
		m_am53cf96->dma_read_data( n_this * 4, sector_buffer );
		n_size -= n_this;

		i = 0;
		while( n_this > 0 )
		{
			p_n_psxram[ n_address / 4 ] =
				( sector_buffer[ i + 0 ] << 0 ) |
				( sector_buffer[ i + 1 ] << 8 ) |
				( sector_buffer[ i + 2 ] << 16 ) |
				( sector_buffer[ i + 3 ] << 24 );
			n_address += 4;
			i += 4;
			n_this--;
		}
	}
}

void konamigq_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size )
{
}

void konamigq_state::init_konamigq()
{
}

MACHINE_START_MEMBER(konamigq_state,konamigq)
{
	save_item(NAME(m_sector_buffer));
	save_item(NAME(m_sound_ctrl));
	save_item(NAME(m_sound_intck));
}

MACHINE_RESET_MEMBER(konamigq_state,konamigq)
{
}

MACHINE_CONFIG_START(konamigq_state::konamigq)
	/* basic machine hardware */
	MCFG_DEVICE_ADD("maincpu", CXD8530BQ, XTAL(67'737'600))
	MCFG_DEVICE_PROGRAM_MAP(konamigq_map)

	MCFG_RAM_MODIFY("maincpu:ram")
	MCFG_RAM_DEFAULT_SIZE("4M")

	MCFG_PSX_DMA_CHANNEL_READ( "maincpu", 5, psxdma_device::read_delegate(&konamigq_state::scsi_dma_read, this ) )
	MCFG_PSX_DMA_CHANNEL_WRITE( "maincpu", 5, psxdma_device::write_delegate(&konamigq_state::scsi_dma_write, this ) )

	MCFG_DEVICE_ADD("soundcpu", M68000, XTAL(32'000'000)/4) /* 8MHz - measured */
	MCFG_DEVICE_PROGRAM_MAP(konamigq_sound_map)

	MCFG_DEVICE_ADD("dasp", TMS57002, XTAL(48'000'000)/2) /* 24MHz - measured */
	MCFG_DEVICE_DATA_MAP(konamigq_dasp_map)
	MCFG_DEVICE_PERIODIC_INT_DRIVER(konamigq_state, tms_sync, 48000)

	MCFG_MACHINE_START_OVERRIDE(konamigq_state, konamigq)
	MCFG_MACHINE_RESET_OVERRIDE(konamigq_state, konamigq)

	MCFG_DEVICE_ADD("mb89371", MB89371, 0)
	MCFG_EEPROM_SERIAL_93C46_ADD("eeprom")
	MCFG_EEPROM_SERIAL_DATA(konamigq_def_eeprom, 128)

	MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0)
	MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0)

	MCFG_DEVICE_ADD("am53cf96", AM53CF96, 0)
	MCFG_LEGACY_SCSI_PORT("scsi")
	MCFG_AM53CF96_IRQ_HANDLER(WRITELINE("maincpu:irq", psxirq_device, intin10))

	/* video hardware */
	MCFG_PSXGPU_ADD("maincpu", "gpu", CXD8538Q, 0x200000, XTAL(53'693'175))

	/* sound hardware */
	SPEAKER(config, "lspeaker").front_left();
	SPEAKER(config, "rspeaker").front_right();

	MCFG_K056800_ADD("k056800", XTAL(18'432'000))
	MCFG_K056800_INT_HANDLER(INPUTLINE("soundcpu", M68K_IRQ_1))

	MCFG_DEVICE_ADD("k054539_1", K054539, XTAL(18'432'000))
	MCFG_DEVICE_ADDRESS_MAP(0, konamigq_k054539_map)
	MCFG_K054539_TIMER_HANDLER(WRITELINE(*this, konamigq_state, k054539_irq_gen))
	MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
	MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)

	MCFG_DEVICE_ADD("k054539_2", K054539, XTAL(18'432'000))
	MCFG_DEVICE_ADDRESS_MAP(0, konamigq_k054539_map)
	MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
	MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END

static INPUT_PORTS_START( konamigq )
	PORT_START("GUNX1")
	PORT_BIT( 0x01ff, 0x011d, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_MINMAX( 0x007d, 0x01bc ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)

	PORT_START("GUNY1")
	PORT_BIT( 0x00ff, 0x0078, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_MINMAX( 0x0000, 0x00ef ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)

	PORT_START("GUNX2")
	PORT_BIT( 0x01ff, 0x011d, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_MINMAX( 0x007d, 0x01bc ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2)

	PORT_START("GUNY2")
	PORT_BIT( 0x00ff, 0x0078, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_MINMAX( 0x0000, 0x00ef ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2)

	PORT_START("GUNX3")
	PORT_BIT( 0x01ff, 0x011d, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_MINMAX( 0x007d, 0x01bc ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(3)

	PORT_START("GUNY3")
	PORT_BIT( 0x00ff, 0x0078, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_MINMAX( 0x0000, 0x00ef ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(3)

	PORT_START("P1_P2")
	PORT_BIT( 0x000001, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x000002, IP_ACTIVE_LOW, IPT_START1 )
	PORT_BIT( 0x000004, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x000008, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* trigger */
	PORT_BIT( 0x000010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) /* reload */
	PORT_BIT( 0x000020, IP_ACTIVE_LOW, IPT_SERVICE1 )
	PORT_BIT( 0x000040, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x000080, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x010000, IP_ACTIVE_LOW, IPT_COIN2 )
	PORT_BIT( 0x020000, IP_ACTIVE_LOW, IPT_START2 )
	PORT_BIT( 0x040000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x080000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) /* trigger */
	PORT_BIT( 0x100000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) /* reload */
	PORT_BIT( 0x200000, IP_ACTIVE_LOW, IPT_SERVICE2 )
	PORT_BIT( 0x400000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x800000, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("P3_SERVICE")
	PORT_BIT( 0x000001, IP_ACTIVE_LOW, IPT_COIN3 )
	PORT_BIT( 0x000002, IP_ACTIVE_LOW, IPT_START3 )
	PORT_BIT( 0x000004, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x000008, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) /* trigger */
	PORT_BIT( 0x000010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) /* reload */
	PORT_BIT( 0x000020, IP_ACTIVE_LOW, IPT_SERVICE3 )
	PORT_BIT( 0x000040, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x000080, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x010000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x020000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x040000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x080000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x100000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_SERVICE_NO_TOGGLE( 0x200000, IP_ACTIVE_LOW )
	PORT_BIT( 0x400000, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x800000, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("DSW")
	PORT_DIPNAME( 0x00000001, 0x01, DEF_STR( Stereo ) )
	PORT_DIPSETTING(    0x01, DEF_STR( Stereo ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Mono ) )
	PORT_DIPNAME( 0x00000002, 0x00, "Stage Set" )
	PORT_DIPSETTING(    0x02, "Endless" )
	PORT_DIPSETTING(    0x00, "6st End" )
	PORT_DIPNAME( 0x00000004, 0x04, "Mirror" )
	PORT_DIPSETTING(    0x04, DEF_STR( No ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x00000008, 0x08, "Woofer" )
	PORT_DIPSETTING(    0x08, DEF_STR( No ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x00000010, 0x10, "Number of Players" )
	PORT_DIPSETTING(    0x00, "2" )
	PORT_DIPSETTING(    0x10, "3" )
	PORT_DIPNAME( 0x00000020, 0x20, "Coin Mechanism (2p only)" )
	PORT_DIPSETTING(    0x20, "Common" )
	PORT_DIPSETTING(    0x00, "Independent" )
	PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read)

	PORT_START( "EEPROMOUT" )
	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write)
	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write)
	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write)
INPUT_PORTS_END

ROM_START( cryptklr )
	ROM_REGION( 0x80000, "soundcpu", 0 ) /* 68000 sound program */
	ROM_LOAD16_WORD_SWAP( "420a01.2g", 0x000000, 0x080000, CRC(84fc2613) SHA1(e06f4284614d33c76529eb43b168d095200a9eac) )

	ROM_REGION( 0x80000, "k054539", 0 )
	ROM_LOAD( "420a02.3m",    0x000000, 0x080000, CRC(2169c3c4) SHA1(6d525f10385791e19eb1897d18f0bab319640162) )

	ROM_REGION32_LE( 0x080000, "maincpu:rom", 0 ) /* bios */
	ROM_LOAD( "420b03.27p",   0x0000000, 0x080000, CRC(aab391b1) SHA1(bf9dc7c0c8168c22a4be266fe6a66d3738df916b) )

	DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":harddisk:image" )
	DISK_IMAGE( "420uaa04", 0, SHA1(67cb1418fc0de2a89fc61847dc9efb9f1bebb347) )
ROM_END

GAME( 1995, cryptklr, 0, konamigq, konamigq, konamigq_state, init_konamigq, ROT0, "Konami", "Crypt Killer (GQ420 UAA)", MACHINE_IMPERFECT_GRAPHICS )