/*************************************************************************** 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 UINT64 last_cycles; static UINT32 loop_count; static offs_t speedup_pc; /************************************* * * Interrupt handling * *************************************/ static TIMER_CALLBACK( irq5_gen ) { cpunum_set_input_line(machine, 0, R3000_IRQ5, ASSERT_LINE); } static INTERRUPT_GEN( irq4_gen ) { cpunum_set_input_line(machine, 0, R3000_IRQ4, ASSERT_LINE); timer_set(video_screen_get_time_until_pos(machine->primary_screen, 0, 0), NULL, 0, irq5_gen); } /************************************* * * 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 (ACCESSING_BITS_16_23) { 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(machine, bsmt_data_bank, 0, 0xffff); 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(machine, bsmt_reg, data & 0xffff, mem_mask & 0xffff); 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(machine, "bsmt")[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) { UINT64 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 * *************************************/ 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 }; 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_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, 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_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_LOW, IPT_UNKNOWN ) 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_CUSTOM(eeprom_bit_r, NULL) /* 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 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("main", R3000BE, MASTER_CLOCK/2) MDRV_CPU_CONFIG(config) MDRV_CPU_PROGRAM_MAP(policetr_map,0) MDRV_CPU_VBLANK_INT("main", irq4_gen) MDRV_NVRAM_HANDLER(policetr) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MDRV_SCREEN_ADD("main", RASTER) MDRV_SCREEN_REFRESH_RATE(60) 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("bsmt", BSMT2000, MASTER_CLOCK/2) 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, "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( 0x600000, "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( polict11 ) /* 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( 0x600000, "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( polict10 ) /* 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( 0x600000, "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( plctr13b ) /* Rev 0.5B PCB , unknown program rom date */ 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 ) /* 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 There was a PCB on eBay that used mask roms for the program roms with the following checksum values printed on the labels U110 050C u111 F343 U112 201D U113 FB4x (x maybe 0, 6 or 8. The picture wasn't clear for this last number) These are different then the current set and might have the checksum test corrected. */ 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, "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( 0x600000, "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( sshoot12 ) /* 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( 0x600000, "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( sshoot11 ) /* 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( 0x600000, "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 ) { speedup_data = memory_install_write32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x00000fc8, 0x00000fcb, 0, 0, speedup_w); speedup_pc = 0x1fc028ac; } static DRIVER_INIT( plctr13b ) { speedup_data = memory_install_write32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x00000fc8, 0x00000fcb, 0, 0, speedup_w); speedup_pc = 0x1fc028bc; } static DRIVER_INIT( sshooter ) { speedup_data = memory_install_write32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x00018fd8, 0x00018fdb, 0, 0, speedup_w); speedup_pc = 0x1fc03470; } static DRIVER_INIT( sshoot12 ) { speedup_data = memory_install_write32_handler(machine, 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 )