1
/***************************************************************************
3
Konami GQ System - Arcade PSX Hardware
4
======================================
5
Driver by R. Belmont & smf
14
|----------------------------------------------------------|
15
|CN14 420A01.2G 420A02.3M CN6 CN7 CN8 |
17
|LA4705 6264 058141 424800 |
19
| 18.432MHz PAL 056800 424800 |
20
| 32MHz 48MHz PAL 424800 |
26
|M 53.693175MHz (000619A) |
28
|A KM4216V256 CXD8538Q PAL (000613) |
29
| KM4216V256 PAL (000612) |
30
| TEST_SW KM4216V256 PAL (000618) |
31
| CXD2923AR 67.7376MHz |
32
| DIPSW(8) 93C46 NCR 53CF96-2 |
33
| KM48V514 KM48V514 420B03.27P HD_LED |
35
| CN3 CXD8530BQ TOSHIBA MK1924FBV |
36
| KM48V514 KM48V514 (U420UAA04) |
38
|----------------------------------------------------------|
41
CN6, CN7, CN8: For connection of guns.
42
CN3 : For connection of extra controls/buttons.
43
CN14: For connection of additional speaker for stereo output.
49
#include "cpu/m68000/m68000.h"
50
#include "cpu/psx/psx.h"
51
#include "video/psx.h"
52
#include "includes/psx.h"
53
#include "includes/konamigx.h"
54
#include "machine/eeprom.h"
55
#include "machine/am53cf96.h"
57
#include "sound/k054539.h"
59
class konamigq_state : public psx_state
62
konamigq_state(const machine_config &mconfig, device_type type, const char *tag)
63
: psx_state(mconfig, type, tag) { }
65
UINT8 m_sndto000[ 16 ];
66
UINT8 m_sndtor3k[ 16 ];
68
UINT8 m_sector_buffer[ 512 ];
73
static WRITE32_HANDLER( soundr3k_w )
75
konamigq_state *state = space->machine().driver_data<konamigq_state>();
77
if( ACCESSING_BITS_16_31 )
79
state->m_sndto000[ ( offset << 1 ) + 1 ] = data >> 16;
82
cputag_set_input_line(space->machine(), "soundcpu", 1, HOLD_LINE );
85
if( ACCESSING_BITS_0_15 )
87
state->m_sndto000[ offset << 1 ] = data;
91
static READ32_HANDLER( soundr3k_r )
93
konamigq_state *state = space->machine().driver_data<konamigq_state>();
96
data = ( state->m_sndtor3k[ ( offset << 1 ) + 1 ] << 16 ) | state->m_sndtor3k[ offset << 1 ];
98
/* hack to help the main program start up */
109
static WRITE32_HANDLER( mb89371_w )
113
static READ32_HANDLER( mb89371_r )
120
static const UINT16 konamigq_def_eeprom[64] =
122
0x292b, 0x5256, 0x2094, 0x4155, 0x0041, 0x1414, 0x0003, 0x0101,
123
0x0103, 0x0000, 0x0707, 0x0001, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa,
124
0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
125
0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
126
0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
127
0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
128
0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
129
0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
132
static WRITE32_HANDLER( eeprom_w )
134
input_port_write(space->machine(), "EEPROMOUT", data & 0x07, 0xff);
135
cputag_set_input_line(space->machine(), "soundcpu", INPUT_LINE_RESET, ( data & 0x40 ) ? CLEAR_LINE : ASSERT_LINE );
141
static WRITE32_HANDLER( pcmram_w )
143
konamigq_state *state = space->machine().driver_data<konamigq_state>();
145
if( ACCESSING_BITS_0_7 )
147
state->m_p_n_pcmram[ offset << 1 ] = data;
149
if( ACCESSING_BITS_16_23 )
151
state->m_p_n_pcmram[ ( offset << 1 ) + 1 ] = data >> 16;
155
static READ32_HANDLER( pcmram_r )
157
konamigq_state *state = space->machine().driver_data<konamigq_state>();
159
return ( state->m_p_n_pcmram[ ( offset << 1 ) + 1 ] << 16 ) | state->m_p_n_pcmram[ offset << 1 ];
164
static ADDRESS_MAP_START( konamigq_map, AS_PROGRAM, 32 )
165
AM_RANGE(0x00000000, 0x003fffff) AM_RAM AM_SHARE("share1") /* ram */
166
AM_RANGE(0x1f000000, 0x1f00001f) AM_READWRITE(am53cf96_r, am53cf96_w)
167
AM_RANGE(0x1f100000, 0x1f10000f) AM_WRITE(soundr3k_w)
168
AM_RANGE(0x1f100010, 0x1f10001f) AM_READ(soundr3k_r)
169
AM_RANGE(0x1f180000, 0x1f180003) AM_WRITE(eeprom_w)
170
AM_RANGE(0x1f198000, 0x1f198003) AM_WRITENOP /* cabinet lamps? */
171
AM_RANGE(0x1f1a0000, 0x1f1a0003) AM_WRITENOP /* indicates gun trigger */
172
AM_RANGE(0x1f200000, 0x1f200003) AM_READ_PORT("GUNX1")
173
AM_RANGE(0x1f208000, 0x1f208003) AM_READ_PORT("GUNY1")
174
AM_RANGE(0x1f210000, 0x1f210003) AM_READ_PORT("GUNX2")
175
AM_RANGE(0x1f218000, 0x1f218003) AM_READ_PORT("GUNY2")
176
AM_RANGE(0x1f220000, 0x1f220003) AM_READ_PORT("GUNX3")
177
AM_RANGE(0x1f228000, 0x1f228003) AM_READ_PORT("GUNY3")
178
AM_RANGE(0x1f230000, 0x1f230003) AM_READ_PORT("P1_P2")
179
AM_RANGE(0x1f230004, 0x1f230007) AM_READ_PORT("P3_SERVICE")
180
AM_RANGE(0x1f238000, 0x1f238003) AM_READ_PORT("DSW")
181
AM_RANGE(0x1f300000, 0x1f5fffff) AM_READWRITE(pcmram_r, pcmram_w)
182
AM_RANGE(0x1f680000, 0x1f68001f) AM_READWRITE(mb89371_r, mb89371_w)
183
AM_RANGE(0x1f780000, 0x1f780003) AM_WRITENOP /* watchdog? */
184
AM_RANGE(0x1fc00000, 0x1fc7ffff) AM_ROM AM_SHARE("share2") AM_REGION("user1", 0) /* bios */
185
AM_RANGE(0x80000000, 0x803fffff) AM_RAM AM_SHARE("share1") /* ram mirror */
186
AM_RANGE(0x9fc00000, 0x9fc7ffff) AM_ROM AM_SHARE("share2") /* bios mirror */
187
AM_RANGE(0xa0000000, 0xa03fffff) AM_RAM AM_SHARE("share1") /* ram mirror */
188
AM_RANGE(0xbfc00000, 0xbfc7ffff) AM_ROM AM_SHARE("share2") /* bios mirror */
189
AM_RANGE(0xfffe0130, 0xfffe0133) AM_WRITENOP
194
static READ16_HANDLER( dual539_r )
199
if( ACCESSING_BITS_0_7 )
201
data |= k054539_r( space->machine().device("konami2"), offset );
203
if( ACCESSING_BITS_8_15 )
205
data |= k054539_r( space->machine().device("konami1"), offset ) << 8;
210
static WRITE16_HANDLER( dual539_w )
212
if( ACCESSING_BITS_0_7 )
214
k054539_w( space->machine().device("konami2"), offset, data );
216
if( ACCESSING_BITS_8_15 )
218
k054539_w( space->machine().device("konami1"), offset, data >> 8 );
222
static READ16_HANDLER( sndcomm68k_r )
224
konamigq_state *state = space->machine().driver_data<konamigq_state>();
226
return state->m_sndto000[ offset ];
229
static WRITE16_HANDLER( sndcomm68k_w )
231
konamigq_state *state = space->machine().driver_data<konamigq_state>();
233
state->m_sndtor3k[ offset ] = data;
236
static READ16_HANDLER(tms57002_data_word_r)
241
static WRITE16_HANDLER(tms57002_data_word_w)
245
static READ16_HANDLER(tms57002_status_word_r)
250
static WRITE16_HANDLER(tms57002_control_word_w)
254
/* 68000 memory handling */
255
static ADDRESS_MAP_START( konamigq_sound_map, AS_PROGRAM, 16 )
256
AM_RANGE(0x000000, 0x07ffff) AM_ROM
257
AM_RANGE(0x100000, 0x10ffff) AM_RAM
258
AM_RANGE(0x200000, 0x2004ff) AM_READWRITE(dual539_r,dual539_w)
259
AM_RANGE(0x300000, 0x300001) AM_READWRITE(tms57002_data_word_r,tms57002_data_word_w)
260
AM_RANGE(0x400000, 0x40000f) AM_WRITE(sndcomm68k_w)
261
AM_RANGE(0x400010, 0x40001f) AM_READ(sndcomm68k_r)
262
AM_RANGE(0x500000, 0x500001) AM_READWRITE(tms57002_status_word_r,tms57002_control_word_w)
263
AM_RANGE(0x580000, 0x580001) AM_WRITENOP /* ?? */
267
static const k054539_interface k054539_config =
274
static void scsi_dma_read( konamigq_state *state, UINT32 n_address, INT32 n_size )
276
UINT32 *p_n_psxram = state->m_p_n_psxram;
277
UINT8 *sector_buffer = state->m_sector_buffer;
283
if( n_size > sizeof( state->m_sector_buffer ) / 4 )
285
n_this = sizeof( state->m_sector_buffer ) / 4;
291
am53cf96_read_data( n_this * 4, sector_buffer );
297
p_n_psxram[ n_address / 4 ] =
298
( sector_buffer[ i + 0 ] << 0 ) |
299
( sector_buffer[ i + 1 ] << 8 ) |
300
( sector_buffer[ i + 2 ] << 16 ) |
301
( sector_buffer[ i + 3 ] << 24 );
309
static void scsi_dma_write( konamigq_state *state, UINT32 n_address, INT32 n_size )
313
static void scsi_irq(running_machine &machine)
315
psx_irq_set(machine, 0x400);
318
static const SCSIConfigTable dev_table =
320
1, /* 1 SCSI device */
322
{ SCSI_ID_0, "disk", SCSI_DEVICE_HARDDISK } /* SCSI ID 0, using CHD 0, and it's a HDD */
326
static const struct AM53CF96interface scsi_intf =
328
&dev_table, /* SCSI device table */
329
&scsi_irq, /* command completion IRQ */
332
static DRIVER_INIT( konamigq )
334
konamigq_state *state = machine.driver_data<konamigq_state>();
336
psx_driver_init(machine);
338
state->m_p_n_pcmram = machine.region( "shared" )->base() + 0x80000;
341
static void konamigq_exit(running_machine &machine)
343
am53cf96_exit(&scsi_intf);
346
static MACHINE_START( konamigq )
348
konamigq_state *state = machine.driver_data<konamigq_state>();
350
/* init the scsi controller and hook up it's DMA */
351
am53cf96_init(machine, &scsi_intf);
352
machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(konamigq_exit), &machine));
354
state->save_pointer(NAME(state->m_p_n_pcmram), 0x380000);
355
state->save_item(NAME(state->m_sndto000));
356
state->save_item(NAME(state->m_sndtor3k));
357
state->save_item(NAME(state->m_sector_buffer));
360
static MACHINE_RESET( konamigq )
364
static MACHINE_CONFIG_START( konamigq, konamigq_state )
365
/* basic machine hardware */
366
MCFG_CPU_ADD( "maincpu", CXD8530BQ, XTAL_67_7376MHz )
367
MCFG_CPU_PROGRAM_MAP( konamigq_map )
368
MCFG_CPU_VBLANK_INT("screen", psx_vblank)
370
MCFG_PSX_DMA_CHANNEL_READ( "maincpu", 5, psx_dma_read_delegate( FUNC( scsi_dma_read ), (konamigq_state *) owner ) )
371
MCFG_PSX_DMA_CHANNEL_WRITE( "maincpu", 5, psx_dma_write_delegate( FUNC( scsi_dma_write ), (konamigq_state *) owner ) )
373
MCFG_CPU_ADD( "soundcpu", M68000, 8000000 )
374
MCFG_CPU_PROGRAM_MAP( konamigq_sound_map)
375
MCFG_CPU_PERIODIC_INT( irq2_line_hold, 480 )
377
MCFG_MACHINE_START( konamigq )
378
MCFG_MACHINE_RESET( konamigq )
379
MCFG_EEPROM_93C46_ADD("eeprom")
380
MCFG_EEPROM_DATA(konamigq_def_eeprom, 128)
383
MCFG_SCREEN_ADD("screen", RASTER)
384
MCFG_SCREEN_REFRESH_RATE( 60 )
385
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC( 0 ))
386
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
387
MCFG_SCREEN_SIZE( 1024, 1024 )
388
MCFG_SCREEN_VISIBLE_AREA( 0, 639, 0, 479 )
389
MCFG_SCREEN_UPDATE( psx )
391
MCFG_PALETTE_LENGTH( 65536 )
393
MCFG_PALETTE_INIT( psx )
394
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8538Q, 0 )
397
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
399
MCFG_SOUND_ADD("konami1", K054539, 48000)
400
MCFG_SOUND_CONFIG(k054539_config)
401
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
402
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
404
MCFG_SOUND_ADD("konami2", K054539, 48000)
405
MCFG_SOUND_CONFIG(k054539_config)
406
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
407
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
410
static INPUT_PORTS_START( konamigq )
412
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)
415
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)
418
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)
421
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)
424
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)
427
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)
430
PORT_BIT( 0x000001, IP_ACTIVE_LOW, IPT_COIN1 )
431
PORT_BIT( 0x000002, IP_ACTIVE_LOW, IPT_START1 )
432
PORT_BIT( 0x000004, IP_ACTIVE_LOW, IPT_UNKNOWN )
433
PORT_BIT( 0x000008, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* trigger */
434
PORT_BIT( 0x000010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) /* reload */
435
PORT_BIT( 0x000020, IP_ACTIVE_LOW, IPT_SERVICE1 )
436
PORT_BIT( 0x000040, IP_ACTIVE_LOW, IPT_UNKNOWN )
437
PORT_BIT( 0x000080, IP_ACTIVE_LOW, IPT_UNKNOWN )
438
PORT_BIT( 0x010000, IP_ACTIVE_LOW, IPT_COIN2 )
439
PORT_BIT( 0x020000, IP_ACTIVE_LOW, IPT_START2 )
440
PORT_BIT( 0x040000, IP_ACTIVE_LOW, IPT_UNKNOWN )
441
PORT_BIT( 0x080000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) /* trigger */
442
PORT_BIT( 0x100000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) /* reload */
443
PORT_BIT( 0x200000, IP_ACTIVE_LOW, IPT_SERVICE2 )
444
PORT_BIT( 0x400000, IP_ACTIVE_LOW, IPT_UNKNOWN )
445
PORT_BIT( 0x800000, IP_ACTIVE_LOW, IPT_UNKNOWN )
447
PORT_START("P3_SERVICE")
448
PORT_BIT( 0x000001, IP_ACTIVE_LOW, IPT_COIN3 )
449
PORT_BIT( 0x000002, IP_ACTIVE_LOW, IPT_START3 )
450
PORT_BIT( 0x000004, IP_ACTIVE_LOW, IPT_UNKNOWN )
451
PORT_BIT( 0x000008, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) /* trigger */
452
PORT_BIT( 0x000010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) /* reload */
453
PORT_BIT( 0x000020, IP_ACTIVE_LOW, IPT_SERVICE3 )
454
PORT_BIT( 0x000040, IP_ACTIVE_LOW, IPT_UNKNOWN )
455
PORT_BIT( 0x000080, IP_ACTIVE_LOW, IPT_UNKNOWN )
456
PORT_BIT( 0x010000, IP_ACTIVE_LOW, IPT_UNKNOWN )
457
PORT_BIT( 0x020000, IP_ACTIVE_LOW, IPT_UNKNOWN )
458
PORT_BIT( 0x040000, IP_ACTIVE_LOW, IPT_UNKNOWN )
459
PORT_BIT( 0x080000, IP_ACTIVE_LOW, IPT_UNKNOWN )
460
PORT_BIT( 0x100000, IP_ACTIVE_LOW, IPT_UNKNOWN )
461
PORT_SERVICE_NO_TOGGLE( 0x200000, IP_ACTIVE_LOW )
462
PORT_BIT( 0x400000, IP_ACTIVE_LOW, IPT_UNKNOWN )
463
PORT_BIT( 0x800000, IP_ACTIVE_LOW, IPT_UNKNOWN )
466
PORT_DIPNAME( 0x00000001, 0x01, DEF_STR( Stereo ) )
467
PORT_DIPSETTING( 0x01, DEF_STR( Stereo ) )
468
PORT_DIPSETTING( 0x00, DEF_STR( Mono ) )
469
PORT_DIPNAME( 0x00000002, 0x00, "Stage Set" )
470
PORT_DIPSETTING( 0x02, "Endless" )
471
PORT_DIPSETTING( 0x00, "6st End" )
472
PORT_DIPNAME( 0x00000004, 0x04, "Mirror" )
473
PORT_DIPSETTING( 0x04, DEF_STR( No ) )
474
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
475
PORT_DIPNAME( 0x00000008, 0x08, "Woofer" )
476
PORT_DIPSETTING( 0x08, DEF_STR( No ) )
477
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
478
PORT_DIPNAME( 0x00000010, 0x10, "Number of Players" )
479
PORT_DIPSETTING( 0x00, "2" )
480
PORT_DIPSETTING( 0x10, "3" )
481
PORT_DIPNAME( 0x00000020, 0x20, "Coin Mechanism (2p only)" )
482
PORT_DIPSETTING( 0x20, "Common" )
483
PORT_DIPSETTING( 0x00, "Independent" )
484
PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNKNOWN )
485
PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNKNOWN )
486
PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit)
488
PORT_START( "EEPROMOUT" )
489
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, write_bit)
490
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_cs_line)
491
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_clock_line)
494
ROM_START( cryptklr )
495
ROM_REGION( 0x80000, "soundcpu", 0 ) /* 68000 sound program */
496
ROM_LOAD16_WORD_SWAP( "420a01.2g", 0x000000, 0x080000, CRC(84fc2613) SHA1(e06f4284614d33c76529eb43b168d095200a9eac) )
498
ROM_REGION( 0x400000, "shared", 0 )
499
ROM_LOAD( "420a02.3m", 0x000000, 0x080000, CRC(2169c3c4) SHA1(6d525f10385791e19eb1897d18f0bab319640162) )
501
ROM_REGION32_LE( 0x080000, "user1", 0 ) /* bios */
502
ROM_LOAD( "420b03.27p", 0x0000000, 0x080000, CRC(aab391b1) SHA1(bf9dc7c0c8168c22a4be266fe6a66d3738df916b) )
504
DISK_REGION( "disk" )
505
DISK_IMAGE( "420uaa04", 0, SHA1(67cb1418fc0de2a89fc61847dc9efb9f1bebb347) )
508
GAME( 1995, cryptklr, 0, konamigq, konamigq, konamigq, ROT0, "Konami", "Crypt Killer (GQ420 UAA)", GAME_IMPERFECT_GRAPHICS )