diff options
Diffstat (limited to 'src/mame/drivers/policetr.c')
-rw-r--r-- | src/mame/drivers/policetr.c | 746 |
1 files changed, 746 insertions, 0 deletions
diff --git a/src/mame/drivers/policetr.c b/src/mame/drivers/policetr.c new file mode 100644 index 00000000000..573ab04590c --- /dev/null +++ b/src/mame/drivers/policetr.c @@ -0,0 +1,746 @@ +/*************************************************************************** + + 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. However, each checksum listed matches the checksum + printed on the ROM label. This has been verified on an original PCB. +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 "driver.h" +#include "cpu/mips/r3000.h" +#include "machine/eeprom.h" +#include "policetr.h" +#include "sound/bsmt2000.h" + + +/* constants */ +#define MASTER_CLOCK 48000000 + + +/* global variables */ +UINT32 * policetr_rambase; + + +/* local variables */ +static UINT32 control_data; + +static UINT32 bsmt_reg; +static UINT32 bsmt_data_bank; +static UINT32 bsmt_data_offset; + +static UINT32 *speedup_data; +static UINT32 last_cycles; +static UINT32 loop_count; + +static offs_t speedup_pc; + + + +/************************************* + * + * Interrupt handling + * + *************************************/ + +static TIMER_CALLBACK( irq5_gen ) +{ + cpunum_set_input_line(0, R3000_IRQ5, ASSERT_LINE); +} + + +static INTERRUPT_GEN( irq4_gen ) +{ + cpunum_set_input_line(0, R3000_IRQ4, ASSERT_LINE); + timer_set(video_screen_get_time_until_pos(0, 0, 0), 0, irq5_gen); +} + + + +/************************************* + * + * Input ports + * + *************************************/ + +static READ32_HANDLER( port0_r ) +{ + return readinputport(0) << 16; +} + + +static READ32_HANDLER( port1_r ) +{ + return (readinputport(1) << 16) | (EEPROM_read_bit() << 29); +} + + +static READ32_HANDLER( port2_r ) +{ + return readinputport(2) << 16; +} + + + +/************************************* + * + * Output ports + * + *************************************/ + +static WRITE32_HANDLER( control_w ) +{ + UINT32 old = 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(&control_data); + + /* handle EEPROM I/O */ + if (!(mem_mask & 0x00ff0000)) + { + 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) && (control_data & 0x80000000)) + { + BSMT2000_data_0_w(bsmt_data_bank, 0, 0); + sndti_reset(SOUND_BSMT2000, 0); + } + + /* log any unknown bits */ + if (data & 0x4f1fffff) + logerror("%08X: control_w = %08X & %08X\n", activecpu_get_previouspc(), data, ~mem_mask); +} + + + +/************************************* + * + * BSMT2000 I/O + * + *************************************/ + +static WRITE32_HANDLER( bsmt2000_reg_w ) +{ + if (control_data & 0x80000000) + BSMT2000_data_0_w(bsmt_reg, data & 0xffff, mem_mask | 0xffff0000); + else + COMBINE_DATA(&bsmt_data_offset); +} + + +static WRITE32_HANDLER( bsmt2000_data_w ) +{ + if (control_data & 0x80000000) + COMBINE_DATA(&bsmt_reg); + else + COMBINE_DATA(&bsmt_data_bank); +} + + +static READ32_HANDLER( bsmt2000_data_r ) +{ + return memory_region(REGION_SOUND1)[bsmt_data_bank * 0x10000 + bsmt_data_offset] << 8; +} + + + +/************************************* + * + * Busy loop optimization + * + *************************************/ + +static WRITE32_HANDLER( speedup_w ) +{ + COMBINE_DATA(speedup_data); + + /* see if the PC matches */ + if ((activecpu_get_previouspc() & 0x1fffffff) == speedup_pc) + { + UINT32 curr_cycles = activecpu_gettotalcycles(); + + /* if less than 50 cycles from the last time, count it */ + if (curr_cycles - last_cycles < 50) + { + loop_count++; + + /* more than 2 in a row and we spin */ + if (loop_count > 2) + cpu_spinuntil_int(); + } + else + loop_count = 0; + + last_cycles = curr_cycles; + } +} + + + +/************************************* + * + * EEPROM interface/saving + * + *************************************/ + +struct 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 +}; + + +static NVRAM_HANDLER( policetr ) +{ + if (read_or_write) + EEPROM_save(file); + else + { + EEPROM_init(&eeprom_interface_policetr); + if (file) EEPROM_load(file); + } +} + + + +/************************************* + * + * Main CPU memory handlers + * + *************************************/ + +static ADDRESS_MAP_START( policetr_map, ADDRESS_SPACE_PROGRAM, 32 ) + AM_RANGE(0x00000000, 0x0001ffff) AM_RAM AM_BASE(&policetr_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(bsmt2000_reg_w) + AM_RANGE(0x00800000, 0x00800003) AM_WRITE(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(port0_r) + AM_RANGE(0x00a20000, 0x00a20003) AM_READ(port1_r) + AM_RANGE(0x00a40000, 0x00a40003) AM_READ(port2_r) + AM_RANGE(0x00e00000, 0x00e00003) AM_WRITENOP // watchdog??? + AM_RANGE(0x1fc00000, 0x1fc7ffff) AM_ROM AM_REGION(REGION_USER1, 0) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( sshooter_map, ADDRESS_SPACE_PROGRAM, 32 ) + AM_RANGE(0x00000000, 0x0001ffff) AM_RAM AM_BASE(&policetr_rambase) + AM_RANGE(0x00200000, 0x00200003) AM_WRITE(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(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(port0_r) + AM_RANGE(0x00a20000, 0x00a20003) AM_READ(port1_r) + AM_RANGE(0x00a40000, 0x00a40003) AM_READ(port2_r) + AM_RANGE(0x00e00000, 0x00e00003) AM_WRITENOP // watchdog??? + AM_RANGE(0x1fc00000, 0x1fcfffff) AM_ROM AM_REGION(REGION_USER1, 0) +ADDRESS_MAP_END + + + +/************************************* + * + * Port definitions + * + *************************************/ + +static INPUT_PORTS_START( policetr ) + PORT_START + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_SERVICE( 0x0020, IP_ACTIVE_LOW ) /* Not actually a dipswitch */ + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* EEPROM read */ + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown )) + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x01, DEF_STR( On )) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown )) + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x02, DEF_STR( On )) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown )) + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x04, DEF_STR( On )) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown )) + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x08, DEF_STR( On )) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown )) + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x10, DEF_STR( On )) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown )) /* Manuals show dips 1 through 6 as unused */ + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x20, DEF_STR( On )) + PORT_DIPNAME( 0x40, 0x40, "Monitor Sync") + PORT_DIPSETTING( 0x00, "+") + PORT_DIPSETTING( 0x40, "-") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen )) /* For use with mirrored CRTs - Not supported */ + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x80, DEF_STR( On )) /* Will invert the Y axis of guns */ + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("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_TAG("GUNY1") /* fake analog Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.002, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) + + PORT_START_TAG("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_TAG("GUNY2") /* fake analog Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 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 struct r3000_config config = +{ + 0, /* 1 if we have an FPU, 0 otherwise */ + 4096, /* code cache size */ + 4096 /* data cache size */ +}; + + +static MACHINE_DRIVER_START( policetr ) + + /* basic machine hardware */ + MDRV_CPU_ADD_TAG("main", R3000BE, MASTER_CLOCK/2) + MDRV_CPU_CONFIG(config) + MDRV_CPU_PROGRAM_MAP(policetr_map,0) + MDRV_CPU_VBLANK_INT(irq4_gen,1) + + MDRV_SCREEN_REFRESH_RATE(60) + + MDRV_NVRAM_HANDLER(policetr) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_UPDATE_BEFORE_VBLANK) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(400, 262) /* needs to be verified */ + MDRV_SCREEN_VISIBLE_AREA(0, 393, 0, 239) + MDRV_PALETTE_LENGTH(256) + + MDRV_VIDEO_START(policetr) + MDRV_VIDEO_UPDATE(policetr) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(BSMT2000, MASTER_CLOCK/2) + MDRV_SOUND_CONFIG(bsmt2000_interface_region_1) + MDRV_SOUND_ROUTE(0, "left", 1.0) + MDRV_SOUND_ROUTE(1, "right", 1.0) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( sshooter ) + MDRV_IMPORT_FROM(policetr) + + /* basic machine hardware */ + MDRV_CPU_MODIFY("main") + MDRV_CPU_PROGRAM_MAP(sshooter_map,0) +MACHINE_DRIVER_END + + + +/************************************* + * + * ROM definition(s) + * + *************************************/ + +ROM_START( policetr ) /* Rev 0.3 PCB , with all chips dated 04/01/97 */ + ROM_REGION( 0x400000, REGION_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, REGION_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( 0x600000, REGION_SOUND1, 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( polict11 ) /* Rev 0.3 PCB with all chips dated 01/06/97 */ + ROM_REGION( 0x400000, REGION_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, REGION_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( 0x600000, REGION_SOUND1, 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( polict10 ) /* Rev 0.2 PCB with all chips dated 10/07/96 */ + ROM_REGION( 0x400000, REGION_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, REGION_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( 0x600000, REGION_SOUND1, 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( plctr13b ) /* Rev 0.5B PCB , unknown program rom date */ + ROM_REGION( 0x400000, REGION_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, REGION_USER1, 0 ) +/* +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... this seems wierd to me. + However, this has been verified to happen on a real PCB +*/ + ROM_LOAD32_BYTE( "ptb-u113.v13", 0x00000, 0x20000, CRC(d636c00d) SHA1(ef989eb85b51a64ca640297c1286514c8d7f8f76) ) + ROM_LOAD32_BYTE( "ptb-u112.v13", 0x00001, 0x20000, CRC(86f0497e) SHA1(d177023f7cb2e01de60ef072212836dc94759c1a) ) + ROM_LOAD32_BYTE( "ptb-u111.v13", 0x00002, 0x20000, CRC(39e96d6a) SHA1(efe6ffe70432b94c98f3d7247408a6d2f6f9e33d) ) + ROM_LOAD32_BYTE( "ptb-u110.v13", 0x00003, 0x20000, CRC(d7e6f4cb) SHA1(9dffe4937bc5cf47d870f06ae0dced362cd2dd66) ) + + ROM_REGION( 0x600000, REGION_SOUND1, 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, REGION_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, REGION_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( 0x600000, REGION_SOUND1, 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( sshoot12 ) /* Rev 0.5B PCB , program roms dated 04/17/98 */ + ROM_REGION( 0x800000, REGION_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, REGION_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( 0x600000, REGION_SOUND1, 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( sshoot11 ) /* Rev 0.5B PCB , program roms dated 04/03/98 */ + ROM_REGION( 0x800000, REGION_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, REGION_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( 0x600000, REGION_SOUND1, 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 ) +{ + speedup_data = memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x00000fc8, 0x00000fcb, 0, 0, speedup_w); + speedup_pc = 0x1fc028ac; +} + +static DRIVER_INIT( plctr13b ) +{ + speedup_data = memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x00000fc8, 0x00000fcb, 0, 0, speedup_w); + speedup_pc = 0x1fc028bc; +} + + +static DRIVER_INIT( sshooter ) +{ + speedup_data = memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x00018fd8, 0x00018fdb, 0, 0, speedup_w); + speedup_pc = 0x1fc03470; +} + +static DRIVER_INIT( sshoot12 ) +{ + speedup_data = memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x00018fd8, 0x00018fdb, 0, 0, speedup_w); + 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, polict11, policetr, policetr, polict10, policetr, ROT0, "P & P Marketing", "Police Trainer (Rev 1.1)", 0 ) +GAME( 1996, polict10, policetr, policetr, polict10, policetr, ROT0, "P & P Marketing", "Police Trainer (Rev 1.0)", 0 ) + +GAME( 1996, plctr13b, 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, sshoot12, sshooter, sshooter, sshoot11, sshoot12, ROT0, "P & P Marketing", "Sharpshooter (Rev 1.2)", 0 ) +GAME( 1998, sshoot11, sshooter, sshooter, sshoot11, sshoot12, ROT0, "P & P Marketing", "Sharpshooter (Rev 1.1)", 0 ) |