summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/policetr.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/policetr.c')
-rw-r--r--trunk/src/mame/drivers/policetr.c725
1 files changed, 725 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/policetr.c b/trunk/src/mame/drivers/policetr.c
new file mode 100644
index 00000000000..26b27d619fc
--- /dev/null
+++ b/trunk/src/mame/drivers/policetr.c
@@ -0,0 +1,725 @@
+/***************************************************************************
+
+ P&P Marketing Police Trainer hardware
+
+ driver by Aaron Giles
+
+ Games supported:
+ * Police Trainer
+ * Sharpshooter
+
+ Known bugs:
+ * Flip screen not supported
+
+Note: Police Trainer v1.3B runs on the same revision PCB as Sharpshooter - Rev 0.5B
+ If you hold the test button down and boot the game, all program roms
+ fail the checksum. This has been verified on an original PCB.
+ See below for specific information on each set.
+Note: Police Trainer v1.0 (Rev 0.2 PCB), the checksum results in MAME have been
+ verified to be the same as an original PCB.
+
+To ID the version of your SharpShooter, check the 2nd printed line on each type of ROM.
+
+Program Roms: C121012 - Code version 1.2, Graphics v1.0 & Sound v1.2
+Graphic Roms: G10 - Graphics rom v1.0 (in diagnostics mode it's called "Art")
+ Sound Roms: S12 - Sound rom v1.2
+
+Noted differences in versions of SharpShooter:
+ Initial High Score names are changed between v1.1 and v1.2
+ Circus of Mystery:
+ The ballon challenge has been rewritten for v1.7
+ Jugglers throw balls painted with targets for v1.1 & v1.2 Version 1.7 uses regular targets
+ Alien Encounter:
+ First saucer challenge has been modified for v1.7
+
+The ATTILA Video System PCB (by EXIT Entertainment):
+
+Sharpshooter PCB is Rev 0.5B
+Police Trainer PCB is Rev 0.3 / Rev 0.2
+
+|------------JAMMA Connector------------|
+| CN7 |
+| GUN1 XILINX-1 93C66 |
+| GUN2 |
+| |
+| LED1 LED2 IDT71024 x 2 Bt481 |
+| AT001 |
+| DSW(8) |
+|U127 U113 U162|
+|U125 IDT71256 x 4 U112 |
+|U123 U111 U160|
+|U121 U110 |
+|U126 |
+|U124 OSC IDT79R3041 XILINX-2 |
+|U122 48.000MHz XILINX-3 |
+|U120 BSMT2000 |
+|---------------------------------------|
+
+Chips:
+ CPU: IDT 79R3041-25J (MIPS R3000 core)
+Sound: BSMT2000
+Other: Bt481AKPJ110 (44 Pin PQFP, Brooktree RAMDAC)
+ AT001 (160 Pin PQFP, P&P Marketing, custom programmed XILINX XC4310)
+ ATMEL 93C66 (EEPROM)
+ CN7 - 4 pin connector for stero speaker output
+PLDs:
+ XILINX-1 XC9536 Labeled as U175A (Rev 2/3: Not Used)
+ XILINX-2 XC9536 Labeled as U109A (Rev 2/3: Lattice ispLSI 2032-80LJ - U109.P)
+ XILINX-3 XC9536 Labeled as U151A (Rev 2/3: Lattice ispLSI 2032-80LJ - U151.P)
+
+Note #1: Bt481A 256-Word Color Palette 15, 16 & 24-bit Color Power-Down RAMDAC
+Note #2: For Rev 2 & 3 PCBs there is an optional daughter card to help with horizontal
+ light gun accuracy
+
+The main video chip is stamped:
+
+Rev 2 PCB Rev 3 PCB Rev 5B PCB
+------------------------------------------------------------
+XILINX P & P P & P
+XC4310 Marketing Marketing
+PQ160C 5380 AJ001 AT001
+PC5380-9651 5380-JY3306A 5380-N1045503A
+ PROTO AKI9749
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/mips/r3000.h"
+#include "machine/eeprom.h"
+#include "includes/policetr.h"
+#include "sound/bsmt2000.h"
+
+
+/* constants */
+#define MASTER_CLOCK 48000000
+
+
+/*************************************
+ *
+ * Interrupt handling
+ *
+ *************************************/
+
+static TIMER_CALLBACK( irq5_gen )
+{
+ cputag_set_input_line(machine, "maincpu", R3000_IRQ5, ASSERT_LINE);
+}
+
+
+static INTERRUPT_GEN( irq4_gen )
+{
+ device_set_input_line(device, R3000_IRQ4, ASSERT_LINE);
+ device->machine().scheduler().timer_set(device->machine().primary_screen->time_until_pos(0), FUNC(irq5_gen));
+}
+
+
+
+/*************************************
+ *
+ * Output ports
+ *
+ *************************************/
+
+static WRITE32_HANDLER( control_w )
+{
+ policetr_state *state = space->machine().driver_data<policetr_state>();
+ UINT32 old = state->m_control_data;
+
+ // bit $80000000 = BSMT access/ROM read
+ // bit $20000000 = toggled every 64 IRQ4's
+ // bit $10000000 = ????
+ // bit $00800000 = EEPROM data
+ // bit $00400000 = EEPROM clock
+ // bit $00200000 = EEPROM enable (on 1)
+
+ COMBINE_DATA(&state->m_control_data);
+
+ /* handle EEPROM I/O */
+ if (ACCESSING_BITS_16_23)
+ {
+ eeprom_device *eeprom = space->machine().device<eeprom_device>("eeprom");
+ eeprom->write_bit(data & 0x00800000);
+ eeprom->set_cs_line((data & 0x00200000) ? CLEAR_LINE : ASSERT_LINE);
+ eeprom->set_clock_line((data & 0x00400000) ? ASSERT_LINE : CLEAR_LINE);
+ }
+
+ /* toggling BSMT off then on causes a reset */
+ if (!(old & 0x80000000) && (state->m_control_data & 0x80000000))
+ {
+ bsmt2000_device *bsmt = space->machine().device<bsmt2000_device>("bsmt");
+ bsmt->reset();
+ }
+
+ /* log any unknown bits */
+ if (data & 0x4f1fffff)
+ logerror("%08X: control_w = %08X & %08X\n", cpu_get_previouspc(&space->device()), data, mem_mask);
+}
+
+
+
+/*************************************
+ *
+ * BSMT2000 I/O
+ *
+ *************************************/
+
+static WRITE32_HANDLER( policetr_bsmt2000_reg_w )
+{
+ policetr_state *state = space->machine().driver_data<policetr_state>();
+ if (state->m_control_data & 0x80000000)
+ space->machine().device<bsmt2000_device>("bsmt")->write_data(data);
+ else
+ COMBINE_DATA(&state->m_bsmt_data_offset);
+}
+
+
+static WRITE32_HANDLER( policetr_bsmt2000_data_w )
+{
+ policetr_state *state = space->machine().driver_data<policetr_state>();
+ space->machine().device<bsmt2000_device>("bsmt")->write_reg(data);
+ COMBINE_DATA(&state->m_bsmt_data_bank);
+}
+
+
+static CUSTOM_INPUT( bsmt_status_r )
+{
+ return field.machine().device<bsmt2000_device>("bsmt")->read_status();
+}
+
+
+static READ32_HANDLER( bsmt2000_data_r )
+{
+ policetr_state *state = space->machine().driver_data<policetr_state>();
+ return space->machine().region("bsmt")->base()[state->m_bsmt_data_bank * 0x10000 + state->m_bsmt_data_offset] << 8;
+}
+
+
+
+/*************************************
+ *
+ * Busy loop optimization
+ *
+ *************************************/
+
+static WRITE32_HANDLER( speedup_w )
+{
+ policetr_state *state = space->machine().driver_data<policetr_state>();
+ COMBINE_DATA(state->m_speedup_data);
+
+ /* see if the PC matches */
+ if ((cpu_get_previouspc(&space->device()) & 0x1fffffff) == state->m_speedup_pc)
+ {
+ UINT64 curr_cycles = space->machine().firstcpu->total_cycles();
+
+ /* if less than 50 cycles from the last time, count it */
+ if (curr_cycles - state->m_last_cycles < 50)
+ {
+ state->m_loop_count++;
+
+ /* more than 2 in a row and we spin */
+ if (state->m_loop_count > 2)
+ device_spin_until_interrupt(&space->device());
+ }
+ else
+ state->m_loop_count = 0;
+
+ state->m_last_cycles = curr_cycles;
+ }
+}
+
+
+
+/*************************************
+ *
+ * EEPROM interface/saving
+ *
+ *************************************/
+
+static const eeprom_interface eeprom_interface_policetr =
+{
+ 8, // address bits 8
+ 16, // data bits 16
+ "*110", // read 1 10 aaaaaa
+ "*101", // write 1 01 aaaaaa dddddddddddddddd
+ "*111", // erase 1 11 aaaaaa
+ "*10000xxxx", // lock 1 00 00xxxx
+ "*10011xxxx" // unlock 1 00 11xxxx
+};
+
+
+
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( policetr_map, AS_PROGRAM, 32 )
+ AM_RANGE(0x00000000, 0x0001ffff) AM_RAM AM_BASE_MEMBER(policetr_state, m_rambase)
+ AM_RANGE(0x00200000, 0x0020000f) AM_WRITE(policetr_video_w)
+ AM_RANGE(0x00400000, 0x00400003) AM_READ(policetr_video_r)
+ AM_RANGE(0x00500000, 0x00500003) AM_WRITENOP // copies ROM here at startup, plus checksum
+ AM_RANGE(0x00600000, 0x00600003) AM_READ(bsmt2000_data_r)
+ AM_RANGE(0x00700000, 0x00700003) AM_WRITE(policetr_bsmt2000_reg_w)
+ AM_RANGE(0x00800000, 0x00800003) AM_WRITE(policetr_bsmt2000_data_w)
+ AM_RANGE(0x00900000, 0x00900003) AM_WRITE(policetr_palette_offset_w)
+ AM_RANGE(0x00920000, 0x00920003) AM_WRITE(policetr_palette_data_w)
+ AM_RANGE(0x00a00000, 0x00a00003) AM_WRITE(control_w)
+ AM_RANGE(0x00a00000, 0x00a00003) AM_READ_PORT("IN0")
+ AM_RANGE(0x00a20000, 0x00a20003) AM_READ_PORT("IN1")
+ AM_RANGE(0x00a40000, 0x00a40003) AM_READ_PORT("DSW")
+ AM_RANGE(0x00e00000, 0x00e00003) AM_WRITENOP // watchdog???
+ AM_RANGE(0x1fc00000, 0x1fc7ffff) AM_ROM AM_REGION("user1", 0)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( sshooter_map, AS_PROGRAM, 32 )
+ AM_RANGE(0x00000000, 0x0001ffff) AM_RAM AM_BASE_MEMBER(policetr_state, m_rambase)
+ AM_RANGE(0x00200000, 0x00200003) AM_WRITE(policetr_bsmt2000_data_w)
+ AM_RANGE(0x00300000, 0x00300003) AM_WRITE(policetr_palette_offset_w)
+ AM_RANGE(0x00320000, 0x00320003) AM_WRITE(policetr_palette_data_w)
+ AM_RANGE(0x00400000, 0x00400003) AM_READ(policetr_video_r)
+ AM_RANGE(0x00500000, 0x00500003) AM_WRITENOP // copies ROM here at startup, plus checksum
+ AM_RANGE(0x00600000, 0x00600003) AM_READ(bsmt2000_data_r)
+ AM_RANGE(0x00700000, 0x00700003) AM_WRITE(policetr_bsmt2000_reg_w)
+ AM_RANGE(0x00800000, 0x0080000f) AM_WRITE(policetr_video_w)
+ AM_RANGE(0x00a00000, 0x00a00003) AM_WRITE(control_w)
+ AM_RANGE(0x00a00000, 0x00a00003) AM_READ_PORT("IN0")
+ AM_RANGE(0x00a20000, 0x00a20003) AM_READ_PORT("IN1")
+ AM_RANGE(0x00a40000, 0x00a40003) AM_READ_PORT("DSW")
+ AM_RANGE(0x00e00000, 0x00e00003) AM_WRITENOP // watchdog???
+ AM_RANGE(0x1fc00000, 0x1fcfffff) AM_ROM AM_REGION("user1", 0)
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Port definitions
+ *
+ *************************************/
+
+static INPUT_PORTS_START( policetr )
+ PORT_START("IN0")
+ PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_SERVICE( 0x00200000, IP_ACTIVE_LOW ) /* Not actually a dipswitch */
+ PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(bsmt_status_r, NULL)
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) /* EEPROM read */
+ PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("DSW")
+ PORT_DIPUNUSED_DIPLOC( 0x00010000, 0x00010000, "SW1:1" )
+ PORT_DIPUNUSED_DIPLOC( 0x00020000, 0x00020000, "SW1:2" )
+ PORT_DIPUNUSED_DIPLOC( 0x00040000, 0x00040000, "SW1:3" )
+ PORT_DIPUNUSED_DIPLOC( 0x00080000, 0x00080000, "SW1:4" )
+ PORT_DIPUNUSED_DIPLOC( 0x00100000, 0x00100000, "SW1:5" )
+ PORT_DIPUNUSED_DIPLOC( 0x00200000, 0x00200000, "SW1:6" )
+ PORT_DIPNAME( 0x00400000, 0x00400000, "Monitor Sync") PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x00000000, "+")
+ PORT_DIPSETTING( 0x00400000, "-")
+ PORT_DIPNAME( 0x00800000, 0x00800000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:8") /* For use with mirrored CRTs - Not supported */
+ PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00800000, DEF_STR( On ) ) /* Will invert the Y axis of guns */
+ PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("GUNX1") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.012, 0.008, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10)
+
+ PORT_START("GUNY1") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.05, 0.002, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10)
+
+ PORT_START("GUNX2") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.012, 0.008, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(2)
+
+ PORT_START("GUNY2") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.05, 0.002, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) PORT_PLAYER(2)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( polict10 )
+ PORT_INCLUDE( policetr )
+
+ PORT_MODIFY("GUNX1") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.018, -0.037, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10)
+
+ PORT_MODIFY("GUNY1") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, -0.033, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10)
+
+ PORT_MODIFY("GUNX2") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.018, -0.037, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(2)
+
+ PORT_MODIFY("GUNY2") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, -0.033, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) PORT_PLAYER(2)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( sshoot11 )
+ PORT_INCLUDE( policetr )
+
+ PORT_MODIFY("GUNX1") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.012, 0.208, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10)
+
+ PORT_MODIFY("GUNY1") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.093, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10)
+
+ PORT_MODIFY("GUNX2") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.012, 0.208, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(2)
+
+ PORT_MODIFY("GUNY2") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.093, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) PORT_PLAYER(2)
+INPUT_PORTS_END
+
+
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static const r3000_cpu_core r3000_config =
+{
+ 0, /* 1 if we have an FPU, 0 otherwise */
+ 4096, /* code cache size */
+ 4096 /* data cache size */
+};
+
+
+static MACHINE_CONFIG_START( policetr, policetr_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", R3000BE, MASTER_CLOCK/2)
+ MCFG_CPU_CONFIG(r3000_config)
+ MCFG_CPU_PROGRAM_MAP(policetr_map)
+ MCFG_CPU_VBLANK_INT("screen", irq4_gen)
+
+ MCFG_EEPROM_ADD("eeprom", eeprom_interface_policetr)
+
+ /* video hardware */
+ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MCFG_SCREEN_SIZE(400, 262) /* needs to be verified */
+ MCFG_SCREEN_VISIBLE_AREA(0, 393, 0, 239)
+ MCFG_SCREEN_UPDATE(policetr)
+
+ MCFG_PALETTE_LENGTH(256)
+
+ MCFG_VIDEO_START(policetr)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+
+ MCFG_BSMT2000_ADD("bsmt", MASTER_CLOCK/2)
+ MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( sshooter, policetr )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(sshooter_map)
+MACHINE_CONFIG_END
+
+
+
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ *************************************/
+
+ROM_START( policetr ) /* Rev 0.3 PCB , with all chips dated 04/01/97 */
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) )
+ ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) )
+ ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) )
+ ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) )
+
+ ROM_REGION32_BE( 0x80000, "user1", 0 )
+ ROM_LOAD32_BYTE( "pt-u113.bin", 0x00000, 0x20000, CRC(7b34d366) SHA1(b86cfe155e0685992aebbcc7db705fdbadc42bf9) )
+ ROM_LOAD32_BYTE( "pt-u112.bin", 0x00001, 0x20000, CRC(57d059c8) SHA1(ed0c624fc0afbeb6616bba8a67ce5b18d7c119fc) )
+ ROM_LOAD32_BYTE( "pt-u111.bin", 0x00002, 0x20000, CRC(fb5ce933) SHA1(4a07ac3e2d86262061092f112cab89f8660dce3d) )
+ ROM_LOAD32_BYTE( "pt-u110.bin", 0x00003, 0x20000, CRC(40bd6f60) SHA1(156000d3c439eab45962f0a2681bd806a17f47ee) )
+
+ ROM_REGION( 0x1000000, "bsmt", 0 )
+ ROM_LOAD( "pt-u160.bin", 0x000000, 0x100000, CRC(f267f813) SHA1(ae58507947fe2e9701b5df46565fd9908e2f9d77) )
+ ROM_RELOAD( 0x3f8000, 0x100000 )
+ ROM_LOAD( "pt-u162.bin", 0x100000, 0x100000, CRC(75fe850e) SHA1(ab8cf24ae6e5cf80f6a9a34e46f2b1596879643b) )
+ ROM_RELOAD( 0x4f8000, 0x100000 )
+ROM_END
+
+
+ROM_START( policetr11 ) /* Rev 0.3 PCB with all chips dated 01/06/97 */
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) )
+ ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) )
+ ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) )
+ ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) )
+
+ ROM_REGION32_BE( 0x80000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "pt-u113.v11", 0x00000, 0x20000, CRC(3d62f6d6) SHA1(342ffa38a6972bbb03c89b4dd603c2cc60609d3d) )
+ ROM_LOAD32_BYTE( "pt-u112.v11", 0x00001, 0x20000, CRC(942b280b) SHA1(c342ba3255203ce28ff59479da00f26f0bd026e0) )
+ ROM_LOAD32_BYTE( "pt-u111.v11", 0x00002, 0x20000, CRC(da6c45a7) SHA1(471bd372d2ad5bcb29af19dae09f3cfab4b010fd) )
+ ROM_LOAD32_BYTE( "pt-u110.v11", 0x00003, 0x20000, CRC(f1c8a8c0) SHA1(8a2d1ada002be6f2a3c2d21d193e7cde6531545a) )
+
+ ROM_REGION( 0x1000000, "bsmt", 0 )
+ ROM_LOAD( "pt-u160.bin", 0x000000, 0x100000, CRC(f267f813) SHA1(ae58507947fe2e9701b5df46565fd9908e2f9d77) )
+ ROM_RELOAD( 0x3f8000, 0x100000 )
+ ROM_LOAD( "pt-u162.bin", 0x100000, 0x100000, CRC(75fe850e) SHA1(ab8cf24ae6e5cf80f6a9a34e46f2b1596879643b) )
+ ROM_RELOAD( 0x4f8000, 0x100000 )
+ROM_END
+
+
+ROM_START( policetr10 ) /* Rev 0.2 PCB with all chips dated 10/07/96 */
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ /* Same data as the other sets, but split in 4 meg roms */
+ ROM_LOAD16_BYTE( "pt-u121.v10", 0x000000, 0x080000, CRC(9d31e805) SHA1(482f38e07ddb758e1fb444af7b56a0ef6ea945c8) )
+ ROM_LOAD16_BYTE( "pt-u120.v10", 0x000001, 0x080000, CRC(b03b9d46) SHA1(2bb8fcb1df09aa762b98adf2e1edd186203746c0) )
+ ROM_LOAD16_BYTE( "pt-u123.v10", 0x100000, 0x080000, CRC(80557cf1) SHA1(ba96fd5b6673b382013e1810a36edb827caaff4b) )
+ ROM_LOAD16_BYTE( "pt-u122.v10", 0x100001, 0x080000, CRC(eca09f41) SHA1(bbb1466d39c09598899a3f50b3bb8f9d58b274ec) )
+ ROM_LOAD16_BYTE( "pt-u125.v10", 0x200000, 0x080000, CRC(24bddc51) SHA1(6d7c85dba47c675c65e1cb751d581af0d2c678ad) )
+ ROM_LOAD16_BYTE( "pt-u124.v10", 0x200001, 0x080000, CRC(f1a43dee) SHA1(2c0aa894e148315168239c7df391ef1f2b4d32a1) )
+ ROM_LOAD16_BYTE( "pt-u127.v10", 0x300000, 0x080000, CRC(5031ea1e) SHA1(c1f9272f9874150d510f22c44c186fad0ed3a7e4) )
+ ROM_LOAD16_BYTE( "pt-u126.v10", 0x300001, 0x080000, CRC(33bf2653) SHA1(357da2da7df417109adbf600f3455c224f6c076f) )
+
+ ROM_REGION32_BE( 0x80000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "pt-u113.v10", 0x00000, 0x20000, CRC(3e27a0ce) SHA1(0d010da68f950a10a74eddc57941e4c0e2144071) )
+ ROM_LOAD32_BYTE( "pt-u112.v10", 0x00001, 0x20000, CRC(fcbcf4ca) SHA1(374291600043cfbbd87260b12961ac6d68caeda0) )
+ ROM_LOAD32_BYTE( "pt-u111.v10", 0x00002, 0x20000, CRC(61f79667) SHA1(25298cd8706b5c59f7c9e0f8d44db0df73c23403) )
+ ROM_LOAD32_BYTE( "pt-u110.v10", 0x00003, 0x20000, CRC(5c3c1548) SHA1(aab977274ecff7cb5fd540a3d0da7940e9707906) )
+
+ ROM_REGION( 0x1000000, "bsmt", 0 )
+ /* Same data as the other sets, but split in 4 meg roms */
+ ROM_LOAD( "pt-u160.v10", 0x000000, 0x080000, CRC(cd374405) SHA1(e53689d4344c78c3faac22747ada28bc3add8c56) )
+ ROM_RELOAD( 0x3f8000, 0x080000 )
+ ROM_LOAD( "pt-u161.v10", 0x080000, 0x080000, CRC(c33e3497) SHA1(a7d488f04bba3f1b884b0df210c3793f41967d73) )
+ ROM_RELOAD( 0x478000, 0x080000 )
+ ROM_LOAD( "pt-u162.v10", 0x100000, 0x080000, CRC(e7e02312) SHA1(ac92b8615b18528820a40dad025173e9f24072bf) )
+ ROM_RELOAD( 0x4f8000, 0x080000 )
+ ROM_LOAD( "pt-u163.v10", 0x180000, 0x080000, CRC(a45b3f85) SHA1(21965dcf89e04d5ee21e27eefd6baa34d6d4479a) )
+ ROM_RELOAD( 0x578000, 0x080000 )
+ROM_END
+
+
+ROM_START( policetr13a ) /* Rev 0.5B PCB , unknown program rom date. Actual version is V1.3B */
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) )
+ ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) )
+ ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) )
+ ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) )
+
+ ROM_REGION32_BE( 0x100000, "user1", 0 ) /* Program roms are type 27C020 */
+/*
+Note: With this version, the program roms are twice the size of those found on all other Police Trainer sets. Like the set listed below,
+ if you set the dipswitch to service mode and reset the game within Mame. All 4 program ROMs fail the checksum code and the listed
+ checksums on the screen match the set below. IE: U110=556D, U111=E5F1, U112=974C & U113=CB73
+
+ However, if you check the Diagnostics screen, the program rom checksum is 6819480C which is different then the set below. So it
+ looks like it's checking the extra code. The roms do not contain identical halves, so it's unknown what the "new" data is or does.
+
+ This set has also been found using mask roms for the program roms which would indicate it was the final version.
+*/
+ ROM_LOAD32_BYTE( "pt-av13.u113", 0x00000, 0x40000, CRC(909c052d) SHA1(23bd4849261ee5cc2414a4043ee929ccf1bd6806) ) /* Checksum printed on label FB46 */
+ ROM_LOAD32_BYTE( "pt-av13.u112", 0x00001, 0x40000, CRC(f9dc9ca8) SHA1(52de7bc8c9aa7834d953b9f9e2a65e06f8042f0a) ) /* Checksum printed on label 201D */
+ ROM_LOAD32_BYTE( "pt-av13.u111", 0x00002, 0x40000, CRC(8c4f3a64) SHA1(4953e6fc26bae7d6e7c7230f4ca76e3f5032af14) ) /* Checksum printed on label F343 */
+ ROM_LOAD32_BYTE( "pt-av13.u110", 0x00003, 0x40000, CRC(738a8277) SHA1(423a9bcecb82959f38ae79a0728d72eb13ed93b3) ) /* Checksum printed on label 050C */
+
+ ROM_REGION( 0x1000000, "bsmt", 0 )
+ ROM_LOAD( "pt-u160.bin", 0x000000, 0x100000, CRC(f267f813) SHA1(ae58507947fe2e9701b5df46565fd9908e2f9d77) )
+ ROM_RELOAD( 0x3f8000, 0x100000 )
+ ROM_LOAD( "pt-u162.bin", 0x100000, 0x100000, CRC(75fe850e) SHA1(ab8cf24ae6e5cf80f6a9a34e46f2b1596879643b) )
+ ROM_RELOAD( 0x4f8000, 0x100000 )
+ROM_END
+
+
+ROM_START( policetr13b ) /* Rev 0.5B PCB , unknown program rom date Actual version is V1.3B */
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) )
+ ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) )
+ ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) )
+ ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) )
+
+ ROM_REGION32_BE( 0x100000, "user1", 0 ) /* Program roms are type 27C010 */
+/*
+Note: If you set the dipswitch to service mode and reset the game within Mame. All 4 program ROMs fail the checksum code, IE: they
+ show in red instead of green. But, the listed checksums on the screen match the checksums printed on the ROM labels. However,
+ this has been verified to happen on a real PCB
+
+ The program rom checksum in the diagnostic screen is 17551773
+*/
+ ROM_LOAD32_BYTE( "ptb-u113.v13", 0x00000, 0x20000, CRC(d636c00d) SHA1(ef989eb85b51a64ca640297c1286514c8d7f8f76) ) /* Checksum printed on label CB73 */
+ ROM_LOAD32_BYTE( "ptb-u112.v13", 0x00001, 0x20000, CRC(86f0497e) SHA1(d177023f7cb2e01de60ef072212836dc94759c1a) ) /* Checksum printed on label 974C */
+ ROM_LOAD32_BYTE( "ptb-u111.v13", 0x00002, 0x20000, CRC(39e96d6a) SHA1(efe6ffe70432b94c98f3d7247408a6d2f6f9e33d) ) /* Checksum printed on label E5F1 */
+ ROM_LOAD32_BYTE( "ptb-u110.v13", 0x00003, 0x20000, CRC(d7e6f4cb) SHA1(9dffe4937bc5cf47d870f06ae0dced362cd2dd66) ) /* Checksum printed on label 556D */
+
+ ROM_REGION( 0x1000000, "bsmt", 0 )
+ ROM_LOAD( "pt-u160.bin", 0x000000, 0x100000, CRC(f267f813) SHA1(ae58507947fe2e9701b5df46565fd9908e2f9d77) )
+ ROM_RELOAD( 0x3f8000, 0x100000 )
+ ROM_LOAD( "pt-u162.bin", 0x100000, 0x100000, CRC(75fe850e) SHA1(ab8cf24ae6e5cf80f6a9a34e46f2b1596879643b) )
+ ROM_RELOAD( 0x4f8000, 0x100000 )
+ROM_END
+
+
+ROM_START( sshooter ) /* Rev 0.5B PCB , unknown program rom date */
+ ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 ) /* Graphics v1.0 */
+ ROM_LOAD16_BYTE( "ss-u121.bin", 0x000000, 0x100000, CRC(22e27dd6) SHA1(cb9e8c450352bb116a9c0407cc8ce6d8ae9d9881) ) // 1:1
+ ROM_LOAD16_BYTE( "ss-u120.bin", 0x000001, 0x100000, CRC(30173b1b) SHA1(366464444ce208391ca350f1639403f0c2217330) ) // 1:2
+ ROM_LOAD16_BYTE( "ss-u125.bin", 0x200000, 0x100000, CRC(79e8520a) SHA1(682e5c7954f96db65a137f05cde67c310b85b526) ) // 2:1
+ ROM_LOAD16_BYTE( "ss-u124.bin", 0x200001, 0x100000, CRC(8e805970) SHA1(bfc9940ed6425f136d768170275279c590da7003) ) // 2:2
+ ROM_LOAD16_BYTE( "ss-u123.bin", 0x400000, 0x100000, CRC(d045bb62) SHA1(839209ff6a8e5db63a51a3494a6c973e0068a3c6) ) // 3:1
+ ROM_LOAD16_BYTE( "ss-u122.bin", 0x400001, 0x100000, CRC(163cc133) SHA1(a5e84b5060fd32362aa097d0194ce72e8a90357c) ) // 3:2
+ ROM_LOAD16_BYTE( "ss-u127.bin", 0x600000, 0x100000, CRC(76a7a591) SHA1(9fd7cce21b01f388966a3e8388ba95820ac10bfd) ) // 4:1
+ ROM_LOAD16_BYTE( "ss-u126.bin", 0x600001, 0x100000, CRC(ab1b9d60) SHA1(ff51a71443f7774d3abf96c2eb8ef6a54d73dd8e) ) // 4:2
+
+ ROM_REGION32_BE( 0x100000, "user1", 0 )
+ ROM_LOAD32_BYTE( "ss-u113.v17", 0x00000, 0x40000, CRC(a8c96af5) SHA1(a62458156603b74e0d84ce6928f7bb868bf5a219) ) // 1:1
+ ROM_LOAD32_BYTE( "ss-u112.v17", 0x00001, 0x40000, CRC(c732d5fa) SHA1(2bcc26c8bbf55394173ca65b4b0df01bc6b719bb) ) // 1:2
+ ROM_LOAD32_BYTE( "ss-u111.v17", 0x00002, 0x40000, CRC(4240fa2f) SHA1(54223207c1e228d6b836918601c0f65c2692e5bc) ) // 1:3
+ ROM_LOAD32_BYTE( "ss-u110.v17", 0x00003, 0x40000, CRC(8ae744ce) SHA1(659cd27865cf5507aae6b064c5bc24b927cf5f5a) ) // 1:4
+
+ ROM_REGION( 0x1000000, "bsmt", 0 ) /* Sound v1.2 */
+ ROM_LOAD( "ss-u160.bin", 0x000000, 0x100000, CRC(1c603d42) SHA1(880992871be52129684052d542946de0cc32ba9a) ) // 1:1
+ ROM_RELOAD( 0x3f8000, 0x100000 )
+ ROM_LOAD( "ss-u162.bin", 0x100000, 0x100000, CRC(40ef448a) SHA1(c96f7b169be2576e9f3783af84c07259efefb812) ) // 2:1
+ ROM_RELOAD( 0x4f8000, 0x100000 )
+ROM_END
+
+
+ROM_START( sshooter12 ) /* Rev 0.5B PCB , program roms dated 04/17/98 */
+ ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 ) /* Graphics v1.0 */
+ ROM_LOAD16_BYTE( "ss-u121.bin", 0x000000, 0x100000, CRC(22e27dd6) SHA1(cb9e8c450352bb116a9c0407cc8ce6d8ae9d9881) ) // 1:1
+ ROM_LOAD16_BYTE( "ss-u120.bin", 0x000001, 0x100000, CRC(30173b1b) SHA1(366464444ce208391ca350f1639403f0c2217330) ) // 1:2
+ ROM_LOAD16_BYTE( "ss-u125.bin", 0x200000, 0x100000, CRC(79e8520a) SHA1(682e5c7954f96db65a137f05cde67c310b85b526) ) // 2:1
+ ROM_LOAD16_BYTE( "ss-u124.bin", 0x200001, 0x100000, CRC(8e805970) SHA1(bfc9940ed6425f136d768170275279c590da7003) ) // 2:2
+ ROM_LOAD16_BYTE( "ss-u123.bin", 0x400000, 0x100000, CRC(d045bb62) SHA1(839209ff6a8e5db63a51a3494a6c973e0068a3c6) ) // 3:1
+ ROM_LOAD16_BYTE( "ss-u122.bin", 0x400001, 0x100000, CRC(163cc133) SHA1(a5e84b5060fd32362aa097d0194ce72e8a90357c) ) // 3:2
+ ROM_LOAD16_BYTE( "ss-u127.bin", 0x600000, 0x100000, CRC(76a7a591) SHA1(9fd7cce21b01f388966a3e8388ba95820ac10bfd) ) // 4:1
+ ROM_LOAD16_BYTE( "ss-u126.bin", 0x600001, 0x100000, CRC(ab1b9d60) SHA1(ff51a71443f7774d3abf96c2eb8ef6a54d73dd8e) ) // 4:2
+
+ ROM_REGION32_BE( 0x100000, "user1", 0 )
+ ROM_LOAD32_BYTE( "ss-u113.v12", 0x00000, 0x40000, CRC(73dbaf4b) SHA1(a85fad95d63333f4fe5647f31258b3a22c5c2c0d) ) // 1:1
+ ROM_LOAD32_BYTE( "ss-u112.v12", 0x00001, 0x40000, CRC(06fbc2de) SHA1(8bdfcbc33b5fc010464dcd7691f9ecd6ba2168ba) ) // 1:2
+ ROM_LOAD32_BYTE( "ss-u111.v12", 0x00002, 0x40000, CRC(0b291731) SHA1(bd04f0b1b52198344df625fcddfc6c6ccb0bd923) ) // 1:3
+ ROM_LOAD32_BYTE( "ss-u110.v12", 0x00003, 0x40000, CRC(76841008) SHA1(ccbb88c8d63bf929814144a9d8757c9c7048fdef) ) // 1:4
+
+ ROM_REGION( 0x1000000, "bsmt", 0 ) /* Sound v1.2 */
+ ROM_LOAD( "ss-u160.bin", 0x000000, 0x100000, CRC(1c603d42) SHA1(880992871be52129684052d542946de0cc32ba9a) ) // 1:1
+ ROM_RELOAD( 0x3f8000, 0x100000 )
+ ROM_LOAD( "ss-u162.bin", 0x100000, 0x100000, CRC(40ef448a) SHA1(c96f7b169be2576e9f3783af84c07259efefb812) ) // 2:1
+ ROM_RELOAD( 0x4f8000, 0x100000 )
+ROM_END
+
+
+ROM_START( sshooter11 ) /* Rev 0.5B PCB , program roms dated 04/03/98 */
+ ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 ) /* Graphics v1.0 */
+ ROM_LOAD16_BYTE( "ss-u121.bin", 0x000000, 0x100000, CRC(22e27dd6) SHA1(cb9e8c450352bb116a9c0407cc8ce6d8ae9d9881) ) // 1:1
+ ROM_LOAD16_BYTE( "ss-u120.bin", 0x000001, 0x100000, CRC(30173b1b) SHA1(366464444ce208391ca350f1639403f0c2217330) ) // 1:2
+ ROM_LOAD16_BYTE( "ss-u125.bin", 0x200000, 0x100000, CRC(79e8520a) SHA1(682e5c7954f96db65a137f05cde67c310b85b526) ) // 2:1
+ ROM_LOAD16_BYTE( "ss-u124.bin", 0x200001, 0x100000, CRC(8e805970) SHA1(bfc9940ed6425f136d768170275279c590da7003) ) // 2:2
+ ROM_LOAD16_BYTE( "ss-u123.bin", 0x400000, 0x100000, CRC(d045bb62) SHA1(839209ff6a8e5db63a51a3494a6c973e0068a3c6) ) // 3:1
+ ROM_LOAD16_BYTE( "ss-u122.bin", 0x400001, 0x100000, CRC(163cc133) SHA1(a5e84b5060fd32362aa097d0194ce72e8a90357c) ) // 3:2
+ ROM_LOAD16_BYTE( "ss-u127.bin", 0x600000, 0x100000, CRC(76a7a591) SHA1(9fd7cce21b01f388966a3e8388ba95820ac10bfd) ) // 4:1
+ ROM_LOAD16_BYTE( "ss-u126.bin", 0x600001, 0x100000, CRC(ab1b9d60) SHA1(ff51a71443f7774d3abf96c2eb8ef6a54d73dd8e) ) // 4:2
+
+ ROM_REGION32_BE( 0x100000, "user1", 0 )
+ ROM_LOAD32_BYTE( "ss-u113.v11", 0x00000, 0x40000, CRC(c19693f3) SHA1(2f1576261f741d5e69d30f645aea0ed359b8dc03) ) // 1:1
+ ROM_LOAD32_BYTE( "ss-u112.v11", 0x00001, 0x40000, CRC(a5ab6d82) SHA1(b2cc3fd875f0c6702cee973b77fd608f4cfe0555) ) // 1:2
+ ROM_LOAD32_BYTE( "ss-u111.v11", 0x00002, 0x40000, CRC(ec209b5f) SHA1(1408b509853b325e865d0b23d237bca321e73f60) ) // 1:3
+ ROM_LOAD32_BYTE( "ss-u110.v11", 0x00003, 0x40000, CRC(0f1de201) SHA1(5001de3349357545a6a45102340caf0008b50d7b) ) // 1:4
+
+ ROM_REGION( 0x1000000, "bsmt", 0 ) /* Sound v1.2 */
+ ROM_LOAD( "ss-u160.bin", 0x000000, 0x100000, CRC(1c603d42) SHA1(880992871be52129684052d542946de0cc32ba9a) ) // 1:1
+ ROM_RELOAD( 0x3f8000, 0x100000 )
+ ROM_LOAD( "ss-u162.bin", 0x100000, 0x100000, CRC(40ef448a) SHA1(c96f7b169be2576e9f3783af84c07259efefb812) ) // 2:1
+ ROM_RELOAD( 0x4f8000, 0x100000 )
+ROM_END
+
+
+
+/*************************************
+ *
+ * Driver initialization
+ *
+ *************************************/
+
+static DRIVER_INIT( policetr )
+{
+ policetr_state *state = machine.driver_data<policetr_state>();
+ state->m_speedup_data = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x00000fc8, 0x00000fcb, FUNC(speedup_w));
+ state->m_speedup_pc = 0x1fc028ac;
+}
+
+static DRIVER_INIT( plctr13b )
+{
+ policetr_state *state = machine.driver_data<policetr_state>();
+ state->m_speedup_data = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x00000fc8, 0x00000fcb, FUNC(speedup_w));
+ state->m_speedup_pc = 0x1fc028bc;
+}
+
+
+static DRIVER_INIT( sshooter )
+{
+ policetr_state *state = machine.driver_data<policetr_state>();
+ state->m_speedup_data = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x00018fd8, 0x00018fdb, FUNC(speedup_w));
+ state->m_speedup_pc = 0x1fc03470;
+}
+
+static DRIVER_INIT( sshoot12 )
+{
+ policetr_state *state = machine.driver_data<policetr_state>();
+ state->m_speedup_data = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x00018fd8, 0x00018fdb, FUNC(speedup_w));
+ state->m_speedup_pc = 0x1fc033e0;
+}
+
+
+
+/*************************************
+ *
+ * Game driver(s)
+ *
+ *************************************/
+
+GAME( 1996, policetr, 0, policetr, policetr, policetr, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3)", 0 )
+GAME( 1996, policetr11, policetr, policetr, polict10, policetr, ROT0, "P&P Marketing", "Police Trainer (Rev 1.1)", 0 )
+GAME( 1996, policetr10, policetr, policetr, polict10, policetr, ROT0, "P&P Marketing", "Police Trainer (Rev 1.0)", 0 )
+
+GAME( 1996, policetr13a, policetr, sshooter, policetr, plctr13b, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3B Newer)", 0 )
+GAME( 1996, policetr13b, policetr, sshooter, policetr, plctr13b, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3B)", 0 )
+
+GAME( 1998, sshooter, 0, sshooter, policetr, sshooter, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.7)", 0 )
+GAME( 1998, sshooter12, sshooter, sshooter, sshoot11, sshoot12, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.2)", 0 )
+GAME( 1998, sshooter11, sshooter, sshooter, sshoot11, sshoot12, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.1)", 0 )