summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/gladiatr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/gladiatr.c')
-rw-r--r--src/mame/drivers/gladiatr.c1047
1 files changed, 1047 insertions, 0 deletions
diff --git a/src/mame/drivers/gladiatr.c b/src/mame/drivers/gladiatr.c
new file mode 100644
index 00000000000..a6d4729cf0c
--- /dev/null
+++ b/src/mame/drivers/gladiatr.c
@@ -0,0 +1,1047 @@
+/***************************************************************************
+
+Ping Pong King (c) Taito 1985
+Gladiator (c) Taito 1986
+
+Credits:
+- Victor Trucco: original emulation and MAME driver
+- Steve Ellenoff: YM2203 Sound, ADPCM Sound, dip switch fixes, high score save,
+ input port patches, panning fix, sprite banking,
+ Golden Castle Rom Set Support
+- Phil Stroffolino: palette, sprites, misc video driver fixes
+- Tatsuyuki Satoh: YM2203 sound improvements, NEC 8741 simulation,ADPCM with MC6809
+- Tomasz Slanina preliminary Ping POng King driver
+- Nicola Salmoria clean up
+
+special thanks to:
+- Camilty for precious hardware information and screenshots
+- Jason Richmond for hardware information and misc. notes
+- Joe Rounceville for schematics
+- and everyone else who'se offered support along the way!
+
+
+***************************************************************************
+
+PING PONG KING
+TAITO 1985
+M6100094A
+
+-------------
+P0-003
+
+
+X Q0_10 Q0_9 Q0_8 Q0_7 Q0_6 6116 Q0_5 Q0_4 Q0_3 Q1_2 Q1_1
+ Q1
+ Z80B
+ 8251
+ 2009 2009 2009
+ AQ-001
+ Q2
+ 2116
+ 2116
+ AQ-003
+-------------
+P1-004
+
+
+ QO_15 TMM2009 Q0_14 Q0_13 Q0_12 2128 2128
+
+
+ SW1
+ AQ-004
+
+ SW2 SW3
+ 6809 X Q0_19 Q0_18
+ Z80 Q0_17 Q0_16 2009 AQ-003 YM2203
+
+
+***************************************************************************
+
+Gladiator Memory Map
+--------------------
+
+Main CPU (Z80)
+--------------
+The address decoding is done by two PROMs, Q3 @ 2B and Q4 @ 5S.
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+00xxxxxxxxxxxxxx R xxxxxxxx ROM 1F program ROM
+010xxxxxxxxxxxxx R xxxxxxxx ROM 1D program ROM
+011xxxxxxxxxxxxx R xxxxxxxx ROM 1A program ROM (paged)
+10xxxxxxxxxxxxxx R xxxxxxxx ROM 1C program ROM (paged)
+110000xxxxxxxxxx R/W xxxxxxxx RAM 4S sprite RAM [1]
+110001xxxxxxxxxx R/W xxxxxxxx RAM 4U sprite RAM
+110010xxxxxxxxxx R/W xxxxxxxx RAM 4T sprite RAM
+110011000------- W xxxxxxxx VCSA2 fg relative scroll Y?
+110011001------- W ------xx fg tile bank select
+110011001------- W -----x-- bg scroll X msb
+110011001------- W ----x--- fg scroll X msb
+110011001------- W ---x---- bg tile bank select
+110011001------- W --x----- blank screen?
+11001101-------- W xxxxxxxx VCSA1 fg scroll X
+11001110-------- W xxxxxxxx fg+bg scroll Y?
+11001111-------- W xxxxxxxx VCSA3 bg scroll X
+11010xxxxxxxxxxx R/W xxxxxxxx CCS palette RAM
+11011xxxxxxxxxxx R/W xxxxxxxx VCS1 bg tilemap RAM
+11100xxxxxxxxxxx R/W xxxxxxxx VCS2 bg tilemap RAM
+11101xxxxxxxxxxx R/W xxxxxxxx VCS3 fg tilemap RAM
+11110xxxxxxxxxxx R/W xxxxxxxx RAM 1H work RAM (battery backed)
+11111----------- n.c.
+
+[1] only the first 256 bytes of each RAM actually contain sprite data (two buffers
+ of 128 bytes).
+
+I/O ports:
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+--------000--000 W -------x OBJACS ? select active sprite buffer
+--------000--001 W -------x OBJCGBK sprite bank select
+--------000--010 W -------x PR.BK ROM bank select
+--------000--011 W -------x NMIFG NMI enable/acknowledge (NMI not used by Gladiator)
+--------000--100 W -------x SRST reset sound CPU
+--------000--101 W -------x CBK0 unknown
+--------000--110 W -------x LOBJ unknown (related to sprites)
+--------000--111 W -------x REVERS flip screen
+--------001----- n.c.
+--------010----- n.c.
+--------011----- n.c.
+--------100----x R/W xxxxxxxx CIOMCS 8741 #0 (communication with 2nd Z80, DIPSW1)
+--------101----- R/W ARST watchdog reset
+--------110----x R/W xxxxxxxx SI/.CS 8251 (serial communication for debug purposes)
+--------111----- n.c.
+
+
+Sound CPU (Z80)
+---------------
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+00xxxxxxxxxxxxxx R xxxxxxxx ROM 6F program ROM
+01xxxxxxxxxxxxxx R xxxxxxxx ROM 6E program ROM
+10----xxxxxxxxxx R/W xxxxxxxx RAM 6D work RAM
+11-------------- n.c.
+
+I/O ports:
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+--------000----x R/W xxxxxxxx OPNCS YM2203 (portA: SSRST, unknown; portB: DIPSW3)
+--------001----x R/W xxxxxxxx CIOSCS 8741 #1 (communication with main Z80, DIPSW2)
+--------010----- R/W -------- INTCS irq enable/acknowledge
+--------011----x R/W xxxxxxxx AX1 8741 #2 (digital inputs, coins)
+--------100----x R/W xxxxxxxx AX2 8741 #3 (digital inputs)
+--------101--xxx W -------x FCS control filters in sound output section
+--------110----- n.c.
+--------111----- W xxxxxxxx ADCS command to 6809
+
+
+Third CPU (6809)
+----------------
+
+Address Dir Data Name Description
+---------------- --- -------- --------- -----------------------
+0000------------ n.c.
+0001------------ W ----xxxx MSM5205 data
+0001------------ W ---x---- MSM5205 clock
+0001------------ W --x----- MSM5205 reset
+0001------------ W -x------ ADBR ROM bank select
+0010------------ R xxxxxxxx command from Z80
+0011------------ n.c.
+01xxxxxxxxxxxxxx R xxxxxxxx ROM 5P program ROM (banked)
+10xxxxxxxxxxxxxx R xxxxxxxx ROM 5N program ROM (banked)
+11xxxxxxxxxxxxxx R xxxxxxxx ROM 5M program ROM (banked)
+
+
+***************************************************************************
+
+Notes:
+------
+- The fg tilemap is a 1bpp layer which selects the second palette bank when
+ active, so it could be used for some cool effects. Gladiator just sets the
+ whole palette to white so we can just treat it as a monochromatic layer.
+- tilemap Y scroll is not implemented because the game doesn't use it so I can't
+ verify it's right.
+
+TODO:
+-----
+- gladiatr_irq_patch_w, which triggers irq on the second CPU, is a kludge. It
+ shouldn't work that way, that address should actually reset the second CPU
+ (but the main CPU never asserts the line). The schematics are too fuzzy to
+ understand what should trigger irq on the second CPU. Just using a vblank
+ interrupt doesn't work, probably because the CPU expects interrupts to only
+ begin happening when the main CPU has finished the self test.
+- YM2203 mixing problems (loss of bass notes)
+- YM2203 some sound effects just don't sound correct
+- Audio Filter Switch not hooked up (might solve YM2203 mixing issue)
+- Ports 60,61,80,81 not fully understood yet...
+- The four 8741 ROMs are available but not used.
+
+
+***************************************************************************/
+
+#include "driver.h"
+#include "machine/tait8741.h"
+#include "cpu/z80/z80.h"
+#include "sound/2203intf.h"
+#include "sound/msm5205.h"
+
+
+/*Video functions*/
+extern UINT8 *gladiatr_videoram, *gladiatr_colorram,*gladiatr_textram;
+WRITE8_HANDLER( gladiatr_videoram_w );
+WRITE8_HANDLER( gladiatr_colorram_w );
+WRITE8_HANDLER( gladiatr_textram_w );
+WRITE8_HANDLER( gladiatr_paletteram_w );
+WRITE8_HANDLER( ppking_video_registers_w );
+WRITE8_HANDLER( gladiatr_video_registers_w );
+WRITE8_HANDLER( gladiatr_spritebuffer_w );
+WRITE8_HANDLER( gladiatr_spritebank_w );
+VIDEO_START( ppking );
+VIDEO_UPDATE( ppking );
+VIDEO_START( gladiatr );
+VIDEO_UPDATE( gladiatr );
+
+
+/*Rom bankswitching*/
+static WRITE8_HANDLER( gladiatr_bankswitch_w )
+{
+ UINT8 *rom = memory_region(REGION_CPU1) + 0x10000;
+
+ memory_set_bankptr(1, rom + 0x6000 * (data & 0x01));
+}
+
+
+static READ8_HANDLER( gladiator_dsw1_r )
+{
+ int orig = readinputportbytag("DSW1")^0xff;
+
+ return BITSWAP8(orig, 0,1,2,3,4,5,6,7);
+}
+
+static READ8_HANDLER( gladiator_dsw2_r )
+{
+ int orig = readinputportbytag("DSW2")^0xff;
+
+ return BITSWAP8(orig, 2,3,4,5,6,7,1,0);
+}
+
+static READ8_HANDLER( gladiator_controll_r )
+{
+ int coins = 0;
+
+ if( readinputportbytag("COINS") & 0xc0 ) coins = 0x80;
+ switch(offset)
+ {
+ case 0x01: /* start button , coins */
+ return readinputportbytag("IN0") | coins;
+ case 0x02: /* Player 1 Controller , coins */
+ return readinputportbytag("IN1") | coins;
+ case 0x04: /* Player 2 Controller , coins */
+ return readinputportbytag("IN2") | coins;
+ }
+ /* unknown */
+ return 0;
+}
+
+static READ8_HANDLER( gladiator_button3_r )
+{
+ switch(offset)
+ {
+ case 0x01: /* button 3 */
+ return readinputportbytag("IN3");
+ }
+ /* unknown */
+ return 0;
+}
+
+static struct TAITO8741interface gsword_8741interface=
+{
+ 4, /* 4 chips */
+ {TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT},/* program mode */
+ {1,0,0,0}, /* serial port connection */
+ {gladiator_dsw1_r,gladiator_dsw2_r,gladiator_button3_r,gladiator_controll_r} /* port handler */
+};
+
+static MACHINE_RESET( gladiator )
+{
+ TAITO8741_start(&gsword_8741interface);
+ /* 6809 bank memory set */
+ {
+ UINT8 *rom = memory_region(REGION_CPU3) + 0x10000;
+ memory_set_bankptr(2,rom);
+ }
+}
+
+/* YM2203 port A handler (input) */
+static READ8_HANDLER( gladiator_dsw3_r )
+{
+ return readinputportbytag("DSW3");
+}
+/* YM2203 port B handler (output) */
+static WRITE8_HANDLER( gladiator_int_control_w )
+{
+ /* bit 7 : SSRST = sound reset ? */
+ /* bit 6-1 : N.C. */
+ /* bit 0 : ?? */
+}
+/* YM2203 IRQ */
+static void gladiator_ym_irq(int irq)
+{
+ /* NMI IRQ is not used by gladiator sound program */
+ cpunum_set_input_line(1, INPUT_LINE_NMI, irq ? ASSERT_LINE : CLEAR_LINE);
+}
+
+/*Sound Functions*/
+static WRITE8_HANDLER( glad_adpcm_w )
+{
+ UINT8 *rom = memory_region(REGION_CPU3) + 0x10000;
+
+ /* bit6 = bank offset */
+ memory_set_bankptr(2,rom + ((data & 0x40) ? 0xc000 : 0));
+
+ MSM5205_data_w(0,data); /* bit0..3 */
+ MSM5205_reset_w(0,(data>>5)&1); /* bit 5 */
+ MSM5205_vclk_w (0,(data>>4)&1); /* bit4 */
+}
+
+static WRITE8_HANDLER( glad_cpu_sound_command_w )
+{
+ soundlatch_w(0,data);
+ cpunum_set_input_line(2, INPUT_LINE_NMI, ASSERT_LINE);
+}
+
+static READ8_HANDLER( glad_cpu_sound_command_r )
+{
+ cpunum_set_input_line(2, INPUT_LINE_NMI, CLEAR_LINE);
+ return soundlatch_r(0);
+}
+
+static WRITE8_HANDLER( gladiatr_flipscreen_w )
+{
+ flip_screen_set(data & 1);
+}
+
+
+#if 1
+/* !!!!! patch to IRQ timming for 2nd CPU !!!!! */
+static WRITE8_HANDLER( gladiatr_irq_patch_w )
+{
+ cpunum_set_input_line(1,0,HOLD_LINE);
+}
+#endif
+
+
+
+
+
+
+static int data1,data2,flag1=1,flag2=1;
+
+static WRITE8_HANDLER(qx0_w)
+{
+ if(!offset)
+ {
+ data2=data;
+ flag2=1;
+ }
+}
+
+static WRITE8_HANDLER(qx1_w)
+{
+ if(!offset)
+ {
+ data1=data;
+ flag1=1;
+ }
+}
+
+static WRITE8_HANDLER(qx2_w){ }
+
+static WRITE8_HANDLER(qx3_w){ }
+
+static READ8_HANDLER(qx2_r){ return mame_rand(Machine); }
+
+static READ8_HANDLER(qx3_r){ return mame_rand(Machine)&0xf; }
+
+static READ8_HANDLER(qx0_r)
+{
+ if(!offset)
+ return data1;
+ else
+ return flag2;
+}
+
+static READ8_HANDLER(qx1_r)
+{
+ if(!offset)
+ return data2;
+ else
+ return flag1;
+}
+
+static ADDRESS_MAP_START( ppking_cpu1_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0xbfff) AM_ROM
+ AM_RANGE(0xc000, 0xcbff) AM_RAM AM_BASE(&spriteram)
+ AM_RANGE(0xcc00, 0xcfff) AM_WRITE(ppking_video_registers_w)
+ AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(MRA8_RAM, gladiatr_paletteram_w) AM_BASE(&paletteram)
+ AM_RANGE(0xd800, 0xdfff) AM_READWRITE(MRA8_RAM, gladiatr_videoram_w) AM_BASE(&gladiatr_videoram)
+ AM_RANGE(0xe000, 0xe7ff) AM_READWRITE(MRA8_RAM, gladiatr_colorram_w) AM_BASE(&gladiatr_colorram)
+ AM_RANGE(0xe800, 0xefff) AM_READWRITE(MRA8_RAM, gladiatr_textram_w) AM_BASE(&gladiatr_textram)
+ AM_RANGE(0xf000, 0xf7ff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* battery backed RAM */
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( ppking_cpu3_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x2000, 0x2fff) AM_ROM
+ AM_RANGE(0xc000, 0xffff) AM_ROM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( ppking_cpu1_io, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x00) AM_WRITE(gladiatr_spritebuffer_w)
+ AM_RANGE(0x04, 0x04) AM_NOP // WRITE(ppking_irq_patch_w)
+ AM_RANGE(0x9e, 0x9f) AM_READ(qx0_r) AM_WRITE(qx0_w)
+ AM_RANGE(0xbf, 0xbf) AM_NOP
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( ppking_cpu2_io, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x00) AM_READ(YM2203_status_port_0_r) AM_WRITE(YM2203_control_port_0_w)
+ AM_RANGE(0x01, 0x01) AM_READ(YM2203_read_port_0_r) AM_WRITE(YM2203_write_port_0_w)
+ AM_RANGE(0x20, 0x21) AM_READ(qx1_r) AM_WRITE(qx1_w)
+ AM_RANGE(0x40, 0x40) AM_READ(MRA8_NOP)
+ AM_RANGE(0x60, 0x61) AM_READ(qx2_r) AM_WRITE(qx2_w)
+ AM_RANGE(0x80, 0x81) AM_READ(qx3_r) AM_WRITE(qx3_w)
+ADDRESS_MAP_END
+
+
+
+
+static ADDRESS_MAP_START( gladiatr_cpu1_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x5fff) AM_ROM
+ AM_RANGE(0x6000, 0xbfff) AM_ROMBANK(1)
+ AM_RANGE(0xc000, 0xcbff) AM_RAM AM_BASE(&spriteram)
+ AM_RANGE(0xcc00, 0xcfff) AM_WRITE(gladiatr_video_registers_w)
+ AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(MRA8_RAM, gladiatr_paletteram_w) AM_BASE(&paletteram)
+ AM_RANGE(0xd800, 0xdfff) AM_READWRITE(MRA8_RAM, gladiatr_videoram_w) AM_BASE(&gladiatr_videoram)
+ AM_RANGE(0xe000, 0xe7ff) AM_READWRITE(MRA8_RAM, gladiatr_colorram_w) AM_BASE(&gladiatr_colorram)
+ AM_RANGE(0xe800, 0xefff) AM_READWRITE(MRA8_RAM, gladiatr_textram_w) AM_BASE(&gladiatr_textram)
+ AM_RANGE(0xf000, 0xf7ff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* battery backed RAM */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( cpu2_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0x83ff) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( gladiatr_cpu3_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x1000, 0x1fff) AM_WRITE(glad_adpcm_w)
+ AM_RANGE(0x2000, 0x2fff) AM_READ(glad_cpu_sound_command_r)
+ AM_RANGE(0x4000, 0xffff) AM_ROMBANK(2)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( gladiatr_cpu1_io, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x00) AM_WRITE(gladiatr_spritebuffer_w)
+ AM_RANGE(0x01, 0x01) AM_WRITE(gladiatr_spritebank_w)
+ AM_RANGE(0x02, 0x02) AM_WRITE(gladiatr_bankswitch_w)
+ AM_RANGE(0x04, 0x04) AM_WRITE(gladiatr_irq_patch_w) /* !!! patch to 2nd CPU IRQ !!! */
+ AM_RANGE(0x07, 0x07) AM_WRITE(gladiatr_flipscreen_w)
+ AM_RANGE(0x9e, 0x9f) AM_READWRITE(TAITO8741_0_r, TAITO8741_0_w)
+ AM_RANGE(0xbf, 0xbf) AM_NOP // watchdog_reset_w doesn't work
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( gladiatr_cpu2_io, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x00) AM_READWRITE(YM2203_status_port_0_r, YM2203_control_port_0_w)
+ AM_RANGE(0x01, 0x01) AM_READWRITE(YM2203_read_port_0_r, YM2203_write_port_0_w)
+ AM_RANGE(0x20, 0x21) AM_READWRITE(TAITO8741_1_r, TAITO8741_1_w)
+ AM_RANGE(0x40, 0x40) AM_NOP // WRITE(sub_irq_ack_w)
+ AM_RANGE(0x60, 0x61) AM_READWRITE(TAITO8741_2_r, TAITO8741_2_w)
+ AM_RANGE(0x80, 0x81) AM_READWRITE(TAITO8741_3_r, TAITO8741_3_w)
+ AM_RANGE(0xa0, 0xa7) AM_NOP // filters on sound output
+ AM_RANGE(0xe0, 0xe0) AM_WRITE(glad_cpu_sound_command_w)
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( ppking )
+
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( gladiatr )
+ PORT_START_TAG("DSW1") /* (8741-0 parallel port)*/
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Medium ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x04, 0x04, "After 4 Stages" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Continues ) )
+ PORT_DIPSETTING( 0x04, "Ends" )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) /*NOTE: Actual manual has these settings reversed(typo?)! */
+ PORT_DIPSETTING( 0x08, "Only at 100000" )
+ PORT_DIPSETTING( 0x00, "Every 100000" )
+ PORT_DIPNAME( 0x30, 0x10, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x30, "1" )
+ PORT_DIPSETTING( 0x20, "2" )
+ PORT_DIPSETTING( 0x10, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START_TAG("DSW2") /* (8741-1 parallel port) - Dips 6 Unused */
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 2C_1C ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Free_Play ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START_TAG("DSW3") /* (YM2203 port B) - Dips 5,6,7 Unused */
+ PORT_DIPNAME( 0x01, 0x01, "Invulnerability (Cheat)")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "Memory Backup" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x00, "Clear" )
+ PORT_DIPNAME( 0x0c, 0x0c, "Starting Stage" )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
+
+ PORT_START_TAG("IN0") /*(8741-3 parallel port 1) */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* COINS */
+
+ PORT_START_TAG("COINS") /*(8741-3 parallel port bit7) */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1)
+
+ PORT_START_TAG("IN1") /* (8741-3 parallel port 2) */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* COINS */
+
+ PORT_START_TAG("IN2") /* (8741-3 parallel port 4) */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* COINS */
+
+ PORT_START_TAG("IN3") /* (8741-2 parallel port 1) */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+/*******************************************************************/
+
+static const gfx_layout charlayout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 1,
+ { 0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+static const gfx_layout tilelayout =
+{
+ 8,8,
+ RGN_FRAC(1,2),
+ 3,
+ { 4, RGN_FRAC(1,2), RGN_FRAC(1,2)+4 },
+ { 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 16*8
+};
+
+static const gfx_layout spritelayout =
+{
+ 16,16,
+ RGN_FRAC(1,2),
+ 3,
+ { 4, RGN_FRAC(1,2), RGN_FRAC(1,2)+4 },
+ { 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3,
+ 16*8+0, 16*8+1, 16*8+2, 16*8+3, 24*8+0, 24*8+1, 24*8+2, 24*8+3 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
+ 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 },
+ 64*8
+};
+
+static GFXDECODE_START( ppking )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 1 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, tilelayout, 0, 32 )
+ GFXDECODE_ENTRY( REGION_GFX3, 0, spritelayout, 0x100, 32 )
+GFXDECODE_END
+
+static GFXDECODE_START( gladiatr )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0x200, 1 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, tilelayout, 0x000, 32 )
+ GFXDECODE_ENTRY( REGION_GFX3, 0, spritelayout, 0x100, 32 )
+GFXDECODE_END
+
+
+
+static READ8_HANDLER(f1_r)
+{
+ return mame_rand(Machine);
+}
+
+static struct YM2203interface ppking_ym2203_interface =
+{
+ f1_r,
+ f1_r
+};
+
+static struct YM2203interface gladiatr_ym2203_interface =
+{
+ 0,
+ gladiator_dsw3_r, /* port B read */
+ gladiator_int_control_w, /* port A write */
+ 0,
+ gladiator_ym_irq /* NMI request for 2nd cpu */
+};
+
+static struct MSM5205interface msm5205_interface =
+{
+ 0, /* interrupt function */
+ MSM5205_SEX_4B /* vclk input mode */
+};
+
+
+
+static MACHINE_DRIVER_START( ppking )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 12000000/2) /* 6 MHz */
+ MDRV_CPU_PROGRAM_MAP(ppking_cpu1_map,0)
+ MDRV_CPU_IO_MAP(ppking_cpu1_io,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 12000000/4) /* 3 MHz */
+ MDRV_CPU_PROGRAM_MAP(cpu2_map,0)
+ MDRV_CPU_IO_MAP(ppking_cpu2_io,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_CPU_ADD(M6809, 12000000/16) /* 750 kHz */
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(ppking_cpu3_map,0)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+ MDRV_INTERLEAVE(100)
+
+ MDRV_NVRAM_HANDLER(generic_0fill)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ MDRV_GFXDECODE(ppking)
+ MDRV_PALETTE_LENGTH(1024)
+
+ MDRV_VIDEO_START(ppking)
+ MDRV_VIDEO_UPDATE(ppking)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM2203, 12000000/8)
+ MDRV_SOUND_CONFIG(ppking_ym2203_interface)
+ MDRV_SOUND_ROUTE(0, "mono", 0.60)
+ MDRV_SOUND_ROUTE(1, "mono", 0.60)
+ MDRV_SOUND_ROUTE(2, "mono", 0.60)
+ MDRV_SOUND_ROUTE(3, "mono", 0.50)
+
+ MDRV_SOUND_ADD(MSM5205, 12000000/32)
+ MDRV_SOUND_CONFIG(msm5205_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( gladiatr )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 12000000/2) /* 6 MHz */
+ MDRV_CPU_PROGRAM_MAP(gladiatr_cpu1_map,0)
+ MDRV_CPU_IO_MAP(gladiatr_cpu1_io,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 12000000/4) /* 3 MHz */
+ MDRV_CPU_PROGRAM_MAP(cpu2_map,0)
+ MDRV_CPU_IO_MAP(gladiatr_cpu2_io,0)
+
+ MDRV_CPU_ADD(M6809, 12000000/16) /* 750 kHz */
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(gladiatr_cpu3_map,0)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+ MDRV_INTERLEAVE(10)
+
+ MDRV_MACHINE_RESET(gladiator)
+ MDRV_NVRAM_HANDLER(generic_0fill)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ MDRV_GFXDECODE(gladiatr)
+ MDRV_PALETTE_LENGTH(1024)
+
+ MDRV_VIDEO_START(gladiatr)
+ MDRV_VIDEO_UPDATE(gladiatr)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM2203, 12000000/8)
+ MDRV_SOUND_CONFIG(gladiatr_ym2203_interface)
+ MDRV_SOUND_ROUTE(0, "mono", 0.60)
+ MDRV_SOUND_ROUTE(1, "mono", 0.60)
+ MDRV_SOUND_ROUTE(2, "mono", 0.60)
+ MDRV_SOUND_ROUTE(3, "mono", 0.50)
+
+ MDRV_SOUND_ADD(MSM5205, 12000000/32)
+ MDRV_SOUND_CONFIG(msm5205_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+MACHINE_DRIVER_END
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( ppking )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "q1_1.a1", 0x00000, 0x2000, CRC(b74b2718) SHA1(29833439211076873324ccfa5897eb1e6aa9d134) )
+ ROM_LOAD( "q1_2.b1", 0x02000, 0x2000, CRC(1b1e4cd4) SHA1(34c6cf5e0775c0c834dda34a3a2a4685465daa8e) )
+ ROM_LOAD( "q0_3.c1", 0x04000, 0x2000, CRC(6a7acf8e) SHA1(06d37e813605f507ea1c720764fc554e58defdf8) )
+ ROM_LOAD( "q0_4.d1", 0x06000, 0x2000, CRC(b83eb6d5) SHA1(f112d3c0d701977dcc5c312ad74d78b44882201b) )
+ ROM_LOAD( "q0_5.e1", 0x08000, 0x4000, CRC(4d2007e2) SHA1(973ef0e6ff6065b753402489a3d10a9b68164969) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "q0_17.6f", 0x0000, 0x2000, CRC(f7fe0d24) SHA1(6dcb23aa7fc08fc892a8b3843ccb982997c20571) )
+ ROM_LOAD( "q0_16.6e", 0x4000, 0x2000, CRC(b1e32588) SHA1(13c74479238a34a08e249f9120b42a52d80f8274) )
+
+ ROM_REGION( 0x10000, REGION_CPU3, 0 )
+ ROM_LOAD( "q0_19.5n", 0x0c000, 0x2000, CRC(4bcf896d) SHA1(f587a66fcc63e989742ce2d5f4cf2bb464987038) )
+ ROM_LOAD( "q0_18.5m", 0x0e000, 0x2000, CRC(89ba64f8) SHA1(fa01316ea744b4277ee64d5f14cb6d7e3a949f2b) )
+
+ ROM_REGION( 0x02000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "q0_15.1r", 0x00000, 0x2000, CRC(fbd33219) SHA1(78b9bb327ededaa818d26c41c5e8fd1c041ef142) )
+
+ ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "q0_12.1j", 0x00000, 0x2000, CRC(b1a44482) SHA1(84cc40976aa9b015a9f970a878bbde753651b3ba) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "q0_13.1k", 0x04000, 0x2000, CRC(468f35e6) SHA1(8e28481910663fe525cefd4ad406468b7736900e) ) /* planes 1,2 */
+ ROM_LOAD( "q0_14.1m", 0x06000, 0x2000, CRC(eed04a7f) SHA1(d139920889653c33ded38a85510789380dd0aa9e) ) /* planes 1,2 */
+
+ ROM_REGION( 0x10000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "q0_6.k1", 0x00000, 0x2000, CRC(bb3d666c) SHA1(a689c7a1e75b916d69f396db7c4688ac355c2aff) ) /* plane 3 */
+ ROM_LOAD( "q0_7.l1", 0x02000, 0x2000, CRC(16a2550e) SHA1(adb54b70a6db660b5f29ad66da02afd8e99884bb) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "q0_8.m1", 0x08000, 0x2000, CRC(41235b22) SHA1(4d9702efe0ea320dab7c0d889f4d03f196b32661) ) /* planes 1,2 */
+ ROM_LOAD( "q0_9.p1", 0x0a000, 0x2000, CRC(74cc94b2) SHA1(2cb981ecb2487dfa5c0974e036106fc06c2c1880) ) /* planes 1,2 */
+ ROM_LOAD( "q0_10.r1", 0x0c000, 0x2000, CRC(af438cc6) SHA1(cf79c8d3f2a0c489a756b341f8df747f6654764b) ) /* planes 1,2 */
+ /* empty! */
+
+ ROM_REGION( 0x040, REGION_PROMS, 0 )
+ ROM_LOAD( "q1", 0x0000, 0x0020, CRC(cca9ae7b) SHA1(e18416fbe2a5b09db749cc9a14fa89186ed8f4ba) )
+ ROM_LOAD( "q2", 0x0020, 0x0020, CRC(da952b5e) SHA1(0863ad8fdcf69435a7455cd345d3d0af0b0c0a0a) )
+ROM_END
+
+
+ROM_START( gladiatr )
+ ROM_REGION( 0x1c000, REGION_CPU1, 0 )
+ ROM_LOAD( "qb0-5", 0x00000, 0x4000, CRC(25b19efb) SHA1(c41344278f6c7f3d6527aced3e459ed1ba86dea5) )
+ ROM_LOAD( "qb0-4", 0x04000, 0x2000, CRC(347ec794) SHA1(51100f9fef2e96f00e94fce709eed6583b01a2eb) )
+ ROM_LOAD( "qb0-1", 0x10000, 0x2000, CRC(040c9839) SHA1(8c0d9a246847461a59eb5e6a53a94218e701d6c3) )
+ ROM_CONTINUE( 0x16000, 0x2000 )
+ ROM_LOAD( "qc0-3", 0x12000, 0x4000, CRC(8d182326) SHA1(f0af3757c2cf9e1e8035272567adee6efc733319) )
+ ROM_CONTINUE( 0x18000, 0x4000 )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Code for the 2nd CPU */
+ ROM_LOAD( "qb0-17", 0x0000, 0x4000, CRC(e78be010) SHA1(157231d858d13a006b57a4ab419368168e64edb7) )
+
+ ROM_REGION( 0x28000, REGION_CPU3, 0 ) /* 6809 Code & ADPCM data */
+ ROM_LOAD( "qb0-20", 0x10000, 0x4000, CRC(15916eda) SHA1(6558bd2ae6f14d630ae93e66ce7d09be33870cce) )
+ ROM_CONTINUE( 0x1c000, 0x4000 )
+ ROM_LOAD( "qb0-19", 0x14000, 0x4000, CRC(79caa7ed) SHA1(57adc8429ad016c4da41deda6b7b6fe36de5a225) )
+ ROM_CONTINUE( 0x20000, 0x4000 )
+ ROM_LOAD( "qb0-18", 0x18000, 0x4000, CRC(e9591260) SHA1(e427aa10c683fbeb98171f6d1820781d21075a24) )
+ ROM_CONTINUE( 0x24000, 0x4000 )
+
+ ROM_REGION( 0x02000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "qc0-15", 0x00000, 0x2000, CRC(a7efa340) SHA1(f87e061b8e4d8cd0834fab301779a8493549419b) ) /* (monochrome) */
+
+ ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE ) /* tiles */
+ ROM_LOAD( "qb0-12", 0x00000, 0x8000, CRC(0585d9ac) SHA1(e3cb07e9dc5ec2fcfa0c90294d32f0b751f67752) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "qb0-13", 0x10000, 0x8000, CRC(a6bb797b) SHA1(852e9993270e5557c1a0350007d0beaec5ca6286) ) /* planes 1,2 */
+ ROM_LOAD( "qb0-14", 0x18000, 0x8000, CRC(85b71211) SHA1(81545cd168da4a707e263fdf0ee9902e3a13ba93) ) /* planes 1,2 */
+
+ ROM_REGION( 0x30000, REGION_GFX3, ROMREGION_DISPOSE ) /* sprites */
+ ROM_LOAD( "qc1-6", 0x00000, 0x4000, CRC(651e6e44) SHA1(78ce576e6c29e43d590c42f0d4926cff82fd0268) ) /* plane 3 */
+ ROM_LOAD( "qc2-7", 0x04000, 0x8000, CRC(c992c4f7) SHA1(3263973474af07c8b93c4ec97924568848cb7201) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "qc0-8", 0x18000, 0x4000, CRC(1c7ffdad) SHA1(b224fd4cce078186f22e6393a38c7a2d84dc0066) ) /* planes 1,2 */
+ ROM_LOAD( "qc1-9", 0x1c000, 0x4000, CRC(01043e03) SHA1(6a6dddc0a036873135dceaa989e757bdd2455ae7) ) /* planes 1,2 */
+ ROM_LOAD( "qc1-10", 0x20000, 0x8000, CRC(364cdb58) SHA1(4d8548f9dfa9d105dd277c61cf3d56583a5ebbcb) ) /* planes 1,2 */
+ ROM_LOAD( "qc2-11", 0x28000, 0x8000, CRC(c9fecfff) SHA1(7c13ace4293fbfab7fe924b7b24c498d8cefc7ac) ) /* planes 1,2 */
+
+ ROM_REGION( 0x00040, REGION_PROMS, 0 ) /* unused */
+ ROM_LOAD( "q3.2b", 0x00000, 0x0020, CRC(6a7c3c60) SHA1(5125bfeb03752c8d76b140a4e74d5cac29dcdaa6) ) /* address decoding */
+ ROM_LOAD( "q4.5s", 0x00020, 0x0020, CRC(e325808e) SHA1(5fd92ad4eff24f6ccf2df19d268a6cafba72202e) )
+ROM_END
+
+ROM_START( ogonsiro )
+ ROM_REGION( 0x1c000, REGION_CPU1, 0 )
+ ROM_LOAD( "qb0-5", 0x00000, 0x4000, CRC(25b19efb) SHA1(c41344278f6c7f3d6527aced3e459ed1ba86dea5) )
+ ROM_LOAD( "qb0-4", 0x04000, 0x2000, CRC(347ec794) SHA1(51100f9fef2e96f00e94fce709eed6583b01a2eb) )
+ ROM_LOAD( "qb0-1", 0x10000, 0x2000, CRC(040c9839) SHA1(8c0d9a246847461a59eb5e6a53a94218e701d6c3) )
+ ROM_CONTINUE( 0x16000, 0x2000 )
+ ROM_LOAD( "qb0_3", 0x12000, 0x4000, CRC(d6a342e7) SHA1(96274ae3bda4679108a25fcc514b625552abda30) )
+ ROM_CONTINUE( 0x18000, 0x4000 )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Code for the 2nd CPU */
+ ROM_LOAD( "qb0-17", 0x0000, 0x4000, CRC(e78be010) SHA1(157231d858d13a006b57a4ab419368168e64edb7) )
+
+ ROM_REGION( 0x28000, REGION_CPU3, 0 ) /* 6809 Code & ADPCM data */
+ ROM_LOAD( "qb0-20", 0x10000, 0x4000, CRC(15916eda) SHA1(6558bd2ae6f14d630ae93e66ce7d09be33870cce) )
+ ROM_CONTINUE( 0x1c000, 0x4000 )
+ ROM_LOAD( "qb0-19", 0x14000, 0x4000, CRC(79caa7ed) SHA1(57adc8429ad016c4da41deda6b7b6fe36de5a225) )
+ ROM_CONTINUE( 0x20000, 0x4000 )
+ ROM_LOAD( "qb0-18", 0x18000, 0x4000, CRC(e9591260) SHA1(e427aa10c683fbeb98171f6d1820781d21075a24) )
+ ROM_CONTINUE( 0x24000, 0x4000 )
+
+ ROM_REGION( 0x02000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "qb0_15", 0x00000, 0x2000, CRC(5e1332b8) SHA1(fab6e2c7ea9bc94c1245bf759b4004a70c57d666) ) /* (monochrome) */
+
+ ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE ) /* tiles */
+ ROM_LOAD( "qb0-12", 0x00000, 0x8000, CRC(0585d9ac) SHA1(e3cb07e9dc5ec2fcfa0c90294d32f0b751f67752) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "qb0-13", 0x10000, 0x8000, CRC(a6bb797b) SHA1(852e9993270e5557c1a0350007d0beaec5ca6286) ) /* planes 1,2 */
+ ROM_LOAD( "qb0-14", 0x18000, 0x8000, CRC(85b71211) SHA1(81545cd168da4a707e263fdf0ee9902e3a13ba93) ) /* planes 1,2 */
+
+ ROM_REGION( 0x30000, REGION_GFX3, ROMREGION_DISPOSE ) /* sprites */
+ ROM_LOAD( "qb0_6", 0x00000, 0x4000, CRC(1a2bc769) SHA1(498861f4d0cffeaff90609c8000c921a114756b6) ) /* plane 3 */
+ ROM_LOAD( "qb0_7", 0x04000, 0x8000, CRC(4b677bd9) SHA1(3314ef58ff5307faf0ecd8f99950d43d571c91a6) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "qc0-8", 0x18000, 0x4000, CRC(1c7ffdad) SHA1(b224fd4cce078186f22e6393a38c7a2d84dc0066) ) /* planes 1,2 */
+ ROM_LOAD( "qb0_9", 0x1c000, 0x4000, CRC(38f5152d) SHA1(fbb7b13a625999807d180a3212e6e12870629438) ) /* planes 1,2 */
+ ROM_LOAD( "qb0_10", 0x20000, 0x8000, CRC(87ab6cc4) SHA1(50bc1108ff5609c0e7dad615e92e16eb72b7bc03) ) /* planes 1,2 */
+ ROM_LOAD( "qb0_11", 0x28000, 0x8000, CRC(25eaa4ff) SHA1(3547fc600a617ba7fe5240a7830edb90230b6c51) ) /* planes 1,2 */
+
+ ROM_REGION( 0x00040, REGION_PROMS, 0 ) /* unused */
+ ROM_LOAD( "q3.2b", 0x00000, 0x0020, CRC(6a7c3c60) SHA1(5125bfeb03752c8d76b140a4e74d5cac29dcdaa6) ) /* address decoding */
+ ROM_LOAD( "q4.5s", 0x00020, 0x0020, CRC(e325808e) SHA1(5fd92ad4eff24f6ccf2df19d268a6cafba72202e) )
+ROM_END
+
+ROM_START( greatgur )
+ ROM_REGION( 0x1c000, REGION_CPU1, 0 )
+ ROM_LOAD( "qb0-5", 0x00000, 0x4000, CRC(25b19efb) SHA1(c41344278f6c7f3d6527aced3e459ed1ba86dea5) )
+ ROM_LOAD( "qb0-4", 0x04000, 0x2000, CRC(347ec794) SHA1(51100f9fef2e96f00e94fce709eed6583b01a2eb) )
+ ROM_LOAD( "qb0-1", 0x10000, 0x2000, CRC(040c9839) SHA1(8c0d9a246847461a59eb5e6a53a94218e701d6c3) )
+ ROM_CONTINUE( 0x16000, 0x2000 )
+ ROM_LOAD( "qb0_3", 0x12000, 0x4000, CRC(d6a342e7) SHA1(96274ae3bda4679108a25fcc514b625552abda30) )
+ ROM_CONTINUE( 0x18000, 0x4000 )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Code for the 2nd CPU */
+ ROM_LOAD( "qb0-17", 0x0000, 0x4000, CRC(e78be010) SHA1(157231d858d13a006b57a4ab419368168e64edb7) )
+
+ ROM_REGION( 0x28000, REGION_CPU3, 0 ) /* 6809 Code & ADPCM data */
+ ROM_LOAD( "qb0-20", 0x10000, 0x4000, CRC(15916eda) SHA1(6558bd2ae6f14d630ae93e66ce7d09be33870cce) )
+ ROM_CONTINUE( 0x1c000, 0x4000 )
+ ROM_LOAD( "qb0-19", 0x14000, 0x4000, CRC(79caa7ed) SHA1(57adc8429ad016c4da41deda6b7b6fe36de5a225) )
+ ROM_CONTINUE( 0x20000, 0x4000 )
+ ROM_LOAD( "qb0-18", 0x18000, 0x4000, CRC(e9591260) SHA1(e427aa10c683fbeb98171f6d1820781d21075a24) )
+ ROM_CONTINUE( 0x24000, 0x4000 )
+
+ ROM_REGION( 0x02000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "qb0_15", 0x00000, 0x2000, CRC(5e1332b8) SHA1(fab6e2c7ea9bc94c1245bf759b4004a70c57d666) ) /* (monochrome) */
+
+ ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE ) /* tiles */
+ ROM_LOAD( "qb0-12", 0x00000, 0x8000, CRC(0585d9ac) SHA1(e3cb07e9dc5ec2fcfa0c90294d32f0b751f67752) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "qb0-13", 0x10000, 0x8000, CRC(a6bb797b) SHA1(852e9993270e5557c1a0350007d0beaec5ca6286) ) /* planes 1,2 */
+ ROM_LOAD( "qb0-14", 0x18000, 0x8000, CRC(85b71211) SHA1(81545cd168da4a707e263fdf0ee9902e3a13ba93) ) /* planes 1,2 */
+
+ ROM_REGION( 0x30000, REGION_GFX3, ROMREGION_DISPOSE ) /* sprites */
+ ROM_LOAD( "qc0-06.bin", 0x00000, 0x4000, CRC(96b20201) SHA1(212270d3ba72974f22e96744c752860cc5ffba5b) ) /* plane 3 */
+ ROM_LOAD( "qc0-07.bin", 0x04000, 0x8000, CRC(9e89fa8f) SHA1(b133ae2ac62f43a7a51fa0d1a023a4f95fef2996) ) /* plane 3 */
+ /* space to unpack plane 3 */
+ ROM_LOAD( "qc0-8", 0x18000, 0x4000, CRC(1c7ffdad) SHA1(b224fd4cce078186f22e6393a38c7a2d84dc0066) ) /* planes 1,2 */
+ ROM_LOAD( "qc0-09.bin", 0x1c000, 0x4000, CRC(204cd385) SHA1(e7a8720feeac8ced581d72190345daed5750379f) ) /* planes 1,2 */
+ ROM_LOAD( "qc1-10", 0x20000, 0x8000, CRC(364cdb58) SHA1(4d8548f9dfa9d105dd277c61cf3d56583a5ebbcb) ) /* planes 1,2 */
+ ROM_LOAD( "qc1-11.bin", 0x28000, 0x8000, CRC(b2aabbf5) SHA1(9eb4d80f38a30f6e45231a9bfd1aff7a124c6ee9) ) /* planes 1,2 */
+
+ ROM_REGION( 0x00040, REGION_PROMS, 0 ) /* unused */
+ ROM_LOAD( "q3.2b", 0x00000, 0x0020, CRC(6a7c3c60) SHA1(5125bfeb03752c8d76b140a4e74d5cac29dcdaa6) ) /* address decoding */
+ ROM_LOAD( "q4.5s", 0x00020, 0x0020, CRC(e325808e) SHA1(5fd92ad4eff24f6ccf2df19d268a6cafba72202e) )
+
+ ROM_REGION( 0x0400, REGION_USER1, 0 ) /* ROMs for the four 8741 (not emulated yet) */
+ ROM_LOAD( "gladcctl.1", 0x00000, 0x0400, CRC(b30d225f) SHA1(f383286530975c440589c276aa8c46fdfe5292b6) )
+ ROM_LOAD( "gladccpu.2", 0x00000, 0x0400, CRC(1d02cd5f) SHA1(f7242039788c66a1d91b01852d7d447330b847c4) )
+ ROM_LOAD( "gladucpu.17", 0x00000, 0x0400, CRC(3c5ca4c6) SHA1(0d8c2e1c2142ada11e30cfb9a48663386fee9cb8) )
+ ROM_LOAD( "gladcsnd.18", 0x00000, 0x0400, CRC(3c5ca4c6) SHA1(0d8c2e1c2142ada11e30cfb9a48663386fee9cb8) )
+ROM_END
+
+
+static void swap_block(UINT8 *src1,UINT8 *src2,int len)
+{
+ int i,t;
+
+ for (i = 0;i < len;i++)
+ {
+ t = src1[i];
+ src1[i] = src2[i];
+ src2[i] = t;
+ }
+}
+
+static DRIVER_INIT( gladiatr )
+{
+ UINT8 *rom;
+ int i,j;
+
+ rom = memory_region(REGION_GFX2);
+ // unpack 3bpp graphics
+ for (j = 3; j >= 0; j--)
+ {
+ for (i = 0; i < 0x2000; i++)
+ {
+ rom[i+(2*j+1)*0x2000] = rom[i+j*0x2000] >> 4;
+ rom[i+2*j*0x2000] = rom[i+j*0x2000];
+ }
+ }
+ // sort data
+ swap_block(rom + 0x14000, rom + 0x18000, 0x4000);
+
+
+ rom = memory_region(REGION_GFX3);
+ // unpack 3bpp graphics
+ for (j = 5; j >= 0; j--)
+ {
+ for (i = 0; i < 0x2000; i++)
+ {
+ rom[i+(2*j+1)*0x2000] = rom[i+j*0x2000] >> 4;
+ rom[i+2*j*0x2000] = rom[i+j*0x2000];
+ }
+ }
+ // sort data
+ swap_block(rom + 0x1a000, rom + 0x1c000, 0x2000);
+ swap_block(rom + 0x22000, rom + 0x28000, 0x2000);
+ swap_block(rom + 0x26000, rom + 0x2c000, 0x2000);
+ swap_block(rom + 0x24000, rom + 0x28000, 0x4000);
+}
+
+
+static READ8_HANDLER(f6a3_r)
+{
+ if(activecpu_get_previouspc()==0x8e)
+ generic_nvram[0x6a3]=1;
+
+ return generic_nvram[0x6a3];
+}
+
+static DRIVER_INIT(ppking)
+{
+ UINT8 *rom;
+ int i,j;
+
+ rom = memory_region(REGION_GFX2);
+ // unpack 3bpp graphics
+ for (i = 0; i < 0x2000; i++)
+ {
+ rom[i+0x2000] = rom[i] >> 4;
+ }
+
+ rom = memory_region(REGION_GFX3);
+ // unpack 3bpp graphics
+ for (j = 1; j >= 0; j--)
+ {
+ for (i = 0; i < 0x2000; i++)
+ {
+ rom[i+(2*j+1)*0x2000] = rom[i+j*0x2000] >> 4;
+ rom[i+2*j*0x2000] = rom[i+j*0x2000];
+ }
+ }
+
+ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xf6a3,0xf6a3,0,0, f6a3_r );
+}
+
+
+
+GAME( 1985, ppking, 0, ppking, ppking, ppking, ROT90, "Taito America Corporation", "Ping-Pong King", GAME_NOT_WORKING)
+GAME( 1986, gladiatr, 0, gladiatr, gladiatr, gladiatr, ROT0, "Taito America Corporation", "Gladiator (US)", 0 )
+GAME( 1986, ogonsiro, gladiatr, gladiatr, gladiatr, gladiatr, ROT0, "Taito Corporation", "Ohgon no Siro (Japan)", 0 )
+GAME( 1986, greatgur, gladiatr, gladiatr, gladiatr, gladiatr, ROT0, "Taito Corporation", "Great Gurianos (Japan?)", 0 )