/*************************************************************************** Lethal Enforcers (c) 1992 Konami Driver by R. Belmont and Nicola Salmoria. This hardware is exceptionally weird - they have a bunch of chips intended for use with a 68000 hooked up to an 8-bit CPU. So everything is bankswitched like crazy. LETHAL ENFORCERS KONAMI 1993 84256 053245A 191A03.A4 6116 191A04.A8 191A05.A10 054539 053244A 053244A Z80B 191A02.F4 6116 191A06.C9 7C185 7C185 007644 5116 054000 4464 4464 4464 191E01.U4 5116 054157 054157 63C09EP 054156 24MHZ 191A07.V8 191A08.V10 191A09.V9 191A10.V10 --- Lethal Enforcers (c) Konami 1992 GX191 PWB353060A Dump of USA program ROMs only. Label CRC32 Location Code Chip Type 1 [72b843cc] F4 Z80 TMS 27C512 (64k) 6 [1b6b8f16] U4 6309 ST 27C4001 (512k) At offset 0x3FD03 in 6_usa.u4 is "08/17/92 21:38" Run down of PCB: Main CPU: HD63C09EP OSC 24.00000MHz near 6309 Sound CPU: Z80 (Zilog Z0840006PSC) OSC 18.43200MHz near Z80, 054968A & 054539 Konami Custom chips: 054986A (sound latch + Z80 memory mapper/banker + output DAC) 054539 (sound) 054000 (collision/protection) 053244A (x2) (sprites) 053245A (sprites) 054156 (tilemaps) 054157 (x2) (tilemaps) 007324 (???) All other ROMs surface mounted (not included): Label Printed* Position 191 A03 Mask16M-8bit - Near 054986A & 054539 - Sound - Also labeled as 056046 191A04 Mask8M-16bit \ Near 053244A (x2) & 05245A - Sprites 191A05 Mask8M-16bit / 191 A06 Mask8M-16bit - Also labeled as 056049 191A07 Mask8M-16bitx4 \ 191A08 Mask8M-16bitx4 | Near 054157 (x2) & 054156 - Tiles 191A09 Mask8M-16bitx4 | 191A10 Mask8M-16bitx4 / * This info is printed/silk-screened on to the PCB for assembly information? 4 way Dip Switch --------------------------------------------------- DipSwitch Title | Function | 1 | 2 | 3 | 4 | --------------------------------------------------- Sound Output | Stereo |off| | | Monaural |on | | --------------------------------------------------- Coin Mechanism | Common | |off| | | Independent | |on | | --------------------------------------------------- Game Type | Street | |off| | | Arcade | |on | | --------------------------------------------------- Language* | English | |off| | Spanish | |on | --------------------------------------------------- Default Settings |off|off|on |off| --------------------------------------------------- NOTE: Listed as "NOT USED" in UK / World Manual | --------------------------------------------------- Push Button Test Switch Memory map (from the schematics) Address Dir Data Name Description ---------------- --- -------- --------- ----------------------- 000xxxxxxxxxxxxx R xxxxxxxx PROM program ROM (banked) 001xxxxxxxxxxxxx R/W xxxxxxxx WRAM work RAM 010000--00xxxxxx W xxxxxxxx VREG 056832 control 010000--01--xxxx W xxxxxxxx VSCG 056832 control 010000--1000---- R/W -------- AFR watchdog reset 010000--1001---- W SDON sound enable? 010000--1010 CCLR ? 010000--1011---- n.c. 010000--11-000-- W ------xx COIN1/2 coin counters 010000--11-000-- W ----xx-- CKO1/2 coin enables? 010000--11-000-- W ---x---- VRD \ related to reading graphics ROMs? 010000--11-000-- W --x----- CRDB / 010000--11-001-- W -----xxx EEP EEPROM DI, CS, CLK 010000--11-001-- W ----x--- MUT sound mute? 010000--11-001-- W ---x---- CBNK bank switch 4800-7FFF region between palette and 053245/056832 010000--11-001-- W --x----- n.c. 010000--11-001-- W xx------ SHD0/1 shadow control 010000--11-010-- W -----xxx PCU1/XBA palette bank (tilemap A) 010000--11-010-- W -xxx---- PCU1/XBB palette bank (tilemap B) 010000--11-011-- W -----xxx PCU2/XBC palette bank (tilemap C) 010000--11-011-- W -xxx---- PCU2/XBD palette bank (tilemap D) 010000--11-100-- W -----xxx PCU3/XBO palette bank (sprites) 010000--11-100-- W -xxx---- PCU3/XBK palette bank (background?) 010000--11-101xx R xxxxxxxx POG gun inputs 010000--11-11000 R xxxxxxxx SW dip switches, EEPROM DO, R/B 010000--11-11001 R xxxxxxxx SW inputs 010000--11-11010 R xxxxxxxx SW unused inputs (crossed out in schematics) 010000--11-11011 R xx------ HHI1/2 gun input ready? 010000--11-11011 R -------x NCPU ? 010000--11-111-- W --xxxxxx BREG ROM bank select 010010--00------ n.c. 010010--01---xxx R/W xxxxxxxx OREG 053244 010010--10-xxxxx R/W xxxxxxxx HIP 054000 010010--11 R/W xxxxxxxx PAR sound communication 010100xxxxxxxxxx R/W xxxxxxxx OBJ 053245 011xxxxxxxxxxxxx R/W xxxxxxxx VRAM 056832 1xxxxxxxxxxxxxxx R xxxxxxxx PROM program ROM note: lethal enforcers has 2 sprite rendering chips working in parallel mixing data together to give 6bpp.. we cheat by using a custom function in konamiic.c and a fixed 6bpp decode. japanese version scroll / mirror / guns not set up correctly guns might be slightly off center 'external' rowscroll not hooked up correctly (1st attract level, highscores) can't find the flip bits used for the tiles.. (p2 start screen, reload indicator) maybe some priority issues / sprite placement issues.. ***************************************************************************/ #include "driver.h" #include "video/konamiic.h" #include "cpu/m6809/m6809.h" #include "cpu/hd6309/hd6309.h" #include "cpu/z80/z80.h" #include "machine/eeprom.h" #include "sound/k054539.h" #define GUNX( a ) (( ( readinputport( a ) * 287 ) / 0xff ) + 16) #define GUNY( a ) (( ( readinputport( a ) * 223 ) / 0xff ) + 10) VIDEO_START(lethalen); VIDEO_UPDATE(lethalen); WRITE8_HANDLER(le_palette_control); static int init_eeprom_count; static UINT8 cur_control2; /* Default Eeprom for the parent.. otherwise it will always complain first boot */ /* its easy to init but this saves me a bit of time.. */ static UINT8 lethalen_default_eeprom[48] = { 0x02, 0x1E, 0x00, 0x00, 0x39, 0x31, 0x39, 0x31, 0x55, 0x45, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x03, 0x05, 0x01, 0x01, 0x02, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; static struct EEPROM_interface eeprom_interface = { 7, /* address bits */ 8, /* data bits */ "011000", /* read command */ "011100", /* write command */ "0100100000000", /* erase command */ "0100000000000", /* lock command */ "0100110000000" /* unlock command */ }; static NVRAM_HANDLER( lethalen ) { if (read_or_write) EEPROM_save(file); else { EEPROM_init(&eeprom_interface); if (file) { init_eeprom_count = 0; EEPROM_load(file); } else { init_eeprom_count = 10; EEPROM_set_data(lethalen_default_eeprom,48); } } } static READ8_HANDLER( control2_r ) { return 0x02 | EEPROM_read_bit() | (input_port_1_r(0) & 0xf0); } static WRITE8_HANDLER( control2_w ) { /* bit 0 is data */ /* bit 1 is cs (active low) */ /* bit 2 is clock (active high) */ /* bit 3 is "MUT" on the schematics (audio mute?) */ /* bit 4 bankswitches the 4800-4fff region: 0 = registers, 1 = RAM ("CBNK" on schematics) */ /* bit 6 is "SHD0" (some kind of shadow control) */ /* bit 7 is "SHD1" (ditto) */ cur_control2 = data; EEPROM_write_bit(cur_control2 & 0x01); EEPROM_set_cs_line((cur_control2 & 0x02) ? CLEAR_LINE : ASSERT_LINE); EEPROM_set_clock_line((cur_control2 & 0x04) ? ASSERT_LINE : CLEAR_LINE); } static INTERRUPT_GEN(lethalen_interrupt) { if (K056832_is_IRQ_enabled(0)) cpunum_set_input_line(0, HD6309_IRQ_LINE, HOLD_LINE); } static WRITE8_HANDLER( sound_cmd_w ) { soundlatch_w(0, data); } static WRITE8_HANDLER( sound_irq_w ) { cpunum_set_input_line(1, 0, HOLD_LINE); } static READ8_HANDLER( sound_status_r ) { return 0xf; } static void sound_nmi(void) { cpunum_set_input_line(1, INPUT_LINE_NMI, PULSE_LINE); } static WRITE8_HANDLER( le_bankswitch_w ) { UINT8 *prgrom = (UINT8 *)memory_region(REGION_CPU1)+0x10000; memory_set_bankptr(1, &prgrom[data * 0x2000]); } static READ8_HANDLER( le_4800_r ) { if (cur_control2 & 0x10) // RAM enable { return paletteram_r(offset); } else { if (offset < 0x0800) { switch (offset) { case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: return K053244_r(offset-0x40); break; case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: return K054000_r(offset-0x80); break; case 0xca: return sound_status_r(0); break; } } else if (offset < 0x1800) return K053245_r((offset - 0x0800) & 0x07ff); else if (offset < 0x2000) return K056832_ram_code_lo_r(offset - 0x1800); else if (offset < 0x2800) return K056832_ram_code_hi_r(offset - 0x2000); else if (offset < 0x3000) return K056832_ram_attr_lo_r(offset - 0x2800); else // (offset < 0x3800) return K056832_ram_attr_hi_r(offset - 0x3000); } return 0; } static WRITE8_HANDLER( le_4800_w ) { if (cur_control2 & 0x10) // RAM enable { paletteram_xBBBBBGGGGGRRRRR_be_w(offset,data); } else { if (offset < 0x0800) { switch (offset) { case 0xc6: sound_cmd_w(0, data); break; case 0xc7: sound_irq_w(0, data); break; case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: K053244_w(offset-0x40, data); break; case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: K054000_w(offset-0x80, data); break; default: logerror("Unknown LE 48xx register write: %x to %x (PC=%x)\n", data, offset, activecpu_get_pc()); break; } } else if (offset < 0x1800) { K053245_w((offset - 0x0800) & 0x07ff, data); } else if (offset < 0x2000) K056832_ram_code_lo_w(offset - 0x1800, data); else if (offset < 0x2800) K056832_ram_code_hi_w(offset - 0x2000, data); else if (offset < 0x3000) K056832_ram_attr_lo_w(offset - 0x2800, data); else // (offset < 0x3800) K056832_ram_attr_hi_w(offset - 0x3000, data); } } // use one more palette entry for the BG color static WRITE8_HANDLER(le_bgcolor_w) { paletteram_xBBBBBGGGGGRRRRR_be_w(0x3800+offset, data); } static READ8_HANDLER(guns_r) { switch (offset) { case 0: return GUNX(2)>>1; break; case 1: if ((240-GUNY(3)) == 7) return 0; else return (240-GUNY(3)); break; case 2: return GUNX(4)>>1; break; case 3: if ((240-GUNY(5)) == 7) return 0; else return (240-GUNY(5)); break; } return 0; } static READ8_HANDLER(gunsaux_r) { int res = 0; if (GUNX(2) & 1) res |= 0x80; if (GUNX(4) & 1) res |= 0x40; return res; } static ADDRESS_MAP_START( le_main, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_READ(MRA8_BANK1) AM_WRITE(MWA8_ROM) AM_RANGE(0x2000, 0x3fff) AM_RAM // work RAM AM_RANGE(0x4000, 0x403f) AM_WRITE(K056832_w) AM_RANGE(0x4040, 0x404f) AM_WRITE(K056832_b_w) AM_RANGE(0x4080, 0x4080) AM_READ(MRA8_NOP) // watchdog AM_RANGE(0x4090, 0x4090) AM_READNOP AM_RANGE(0x40a0, 0x40a0) AM_READNOP AM_RANGE(0x40c4, 0x40c4) AM_WRITE(control2_w) AM_RANGE(0x40c8, 0x40d0) AM_WRITE(le_palette_control) // PCU1-PCU3 on the schematics AM_RANGE(0x40d4, 0x40d7) AM_READ(guns_r) AM_RANGE(0x40d8, 0x40d8) AM_READ(control2_r) AM_RANGE(0x40d9, 0x40d9) AM_READ(input_port_0_r) AM_RANGE(0x40db, 0x40db) AM_READ(gunsaux_r) // top X bit of guns AM_RANGE(0x40dc, 0x40dc) AM_WRITE(le_bankswitch_w) AM_RANGE(0x47fe, 0x47ff) AM_WRITE(le_bgcolor_w) // BG color AM_RANGE(0x4800, 0x7fff) AM_READWRITE(le_4800_r, le_4800_w) AM_BASE(&paletteram) // bankswitched: RAM and registers AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_BANK2) AM_WRITE(MWA8_ROM) ADDRESS_MAP_END static ADDRESS_MAP_START( le_sound, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0xefff) AM_ROM AM_RANGE(0xf000, 0xf7ff) AM_RAM AM_RANGE(0xf800, 0xfa2f) AM_READWRITE(K054539_0_r, K054539_0_w) AM_RANGE(0xfc00, 0xfc00) AM_WRITE(soundlatch2_w) AM_RANGE(0xfc02, 0xfc02) AM_READ(soundlatch_r) AM_RANGE(0xfc03, 0xfc03) AM_READNOP ADDRESS_MAP_END /* sound */ static INPUT_PORTS_START( lethalen ) /* IN 0 */ PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_SERVICE_NO_TOGGLE(0x08, IP_ACTIVE_LOW ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) /* IN 1 */ PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_DIPNAME( 0x10, 0x10, DEF_STR(Language) ) PORT_DIPSETTING( 0x10, DEF_STR(English) ) PORT_DIPSETTING( 0x00, DEF_STR(Spanish) ) PORT_DIPNAME( 0x20, 0x00, "Game Type" ) PORT_DIPSETTING( 0x20, "Street" ) PORT_DIPSETTING( 0x00, "Arcade" ) PORT_DIPNAME( 0x40, 0x40, "Coin Mechanism" ) PORT_DIPSETTING( 0x40, "Common" ) PORT_DIPSETTING( 0x00, "Independent" ) PORT_DIPNAME( 0x0080, 0x0080, "Sound Output" ) PORT_DIPSETTING( 0x0000, DEF_STR( Mono ) ) PORT_DIPSETTING( 0x0080, DEF_STR( Stereo ) ) /* IN 2 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) /* IN 3 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) /* IN 4 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) /* IN 5 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) INPUT_PORTS_END static INPUT_PORTS_START( lethalej ) /* IN 0 */ PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_SERVICE_NO_TOGGLE(0x08, IP_ACTIVE_LOW ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) /* IN 1 */ PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_DIPNAME( 0x10, 0x10, DEF_STR(Language) ) PORT_DIPSETTING( 0x10, DEF_STR(English) ) PORT_DIPSETTING( 0x00, DEF_STR(Spanish) ) PORT_DIPNAME( 0x20, 0x00, "Game Type" ) PORT_DIPSETTING( 0x20, "Street" ) PORT_DIPSETTING( 0x00, "Arcade" ) PORT_DIPNAME( 0x40, 0x40, "Coin Mechanism" ) PORT_DIPSETTING( 0x40, "Common" ) PORT_DIPSETTING( 0x00, "Independent" ) PORT_DIPNAME( 0x0080, 0x0080, "Sound Output" ) PORT_DIPSETTING( 0x0000, DEF_STR( Mono ) ) PORT_DIPSETTING( 0x0080, DEF_STR( Stereo ) ) /* IN 2 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) PORT_REVERSE /* IN 3 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) PORT_REVERSE /* IN 4 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) PORT_REVERSE /* IN 5 */ PORT_START PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) PORT_REVERSE INPUT_PORTS_END static struct K054539interface k054539_interface = { REGION_SOUND1, NULL, sound_nmi }; static MACHINE_START( lethalen ) { state_save_register_global(cur_control2); } static MACHINE_RESET( lethalen ) { UINT8 *prgrom = (UINT8 *)memory_region(REGION_CPU1); memory_set_bankptr(1, &prgrom[0x10000]); memory_set_bankptr(2, &prgrom[0x48000]); } static const gfx_layout lethal_6bpp = { 16,16, RGN_FRAC(1,2), 6, { RGN_FRAC(1,2)+8,RGN_FRAC(1,2)+0, 8, 0, 24, 16 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8*32+0, 8*32+1, 8*32+2, 8*32+3, 8*32+4, 8*32+5, 8*32+6, 8*32+7 }, { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 16*32, 17*32, 18*32, 19*32, 20*32, 21*32, 22*32, 23*32 }, 128*8 }; /* we use this decode instead of the one done by the sprite video start due to it being 6bpp */ static GFXDECODE_START( lethal ) GFXDECODE_ENTRY( REGION_GFX2, 0, lethal_6bpp, 0x000/*0x400*/, 256 ) /* sprites tiles */ GFXDECODE_END static MACHINE_DRIVER_START( lethalen ) /* basic machine hardware */ MDRV_CPU_ADD_TAG("main", HD6309, 8000000) // ??? MDRV_CPU_PROGRAM_MAP(le_main, 0) MDRV_CPU_VBLANK_INT(lethalen_interrupt, 1) MDRV_CPU_ADD_TAG("sound", Z80, 8000000) /* audio CPU */ MDRV_CPU_PROGRAM_MAP(le_sound, 0) MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) MDRV_MACHINE_START(lethalen) MDRV_MACHINE_RESET(lethalen) MDRV_NVRAM_HANDLER(lethalen) MDRV_GFXDECODE(lethal) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_SIZE(64*8, 32*8) MDRV_SCREEN_VISIBLE_AREA(216, 504-1, 16, 240-1) MDRV_PALETTE_LENGTH(7168+1) MDRV_VIDEO_START(lethalen) MDRV_VIDEO_UPDATE(lethalen) /* sound hardware */ MDRV_SPEAKER_STANDARD_STEREO("left", "right") MDRV_SOUND_ADD(K054539, 48000) MDRV_SOUND_CONFIG(k054539_interface) MDRV_SOUND_ROUTE(0, "left", 1.0) MDRV_SOUND_ROUTE(1, "right", 1.0) MACHINE_DRIVER_END static MACHINE_DRIVER_START( lethalej ) MDRV_IMPORT_FROM(lethalen) MDRV_SCREEN_VISIBLE_AREA(224, 512-1, 16, 240-1) MACHINE_DRIVER_END ROM_START( lethalen ) // US version UAE ROM_REGION( 0x50000, REGION_CPU1, 0 ) /* main program */ ROM_LOAD( "191uae01.u4", 0x10000, 0x40000, CRC(dca340e3) SHA1(8efbba0e3a459bcfe23c75c584bf3a4ce25148bb) ) ROM_REGION( 0x020000, REGION_CPU2, 0 ) /* Z80 sound program */ ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) ROM_RELOAD( 0x010000, 0x010000 ) ROM_REGION( 0x400000, REGION_GFX1, 0 ) /* tilemaps */ ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) /* sprites - fake 6bpp decode is done from here */ ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0,0, 0x200000) ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* K054539 samples */ ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) ROM_END ROM_START( lethalej ) // Japan version JAD ROM_REGION( 0x50000, REGION_CPU1, 0 ) /* main program */ ROM_LOAD( "191jad01.u4", 0x10000, 0x40000, CRC(160a25c0) SHA1(1d3ed5a158e461a73c079fe24a8e9d5e2a87e126) ) ROM_REGION( 0x020000, REGION_CPU2, 0 ) /* Z80 sound program */ ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) ROM_RELOAD( 0x010000, 0x010000 ) ROM_REGION( 0x400000, REGION_GFX1, 0 ) /* tilemaps */ ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) /* sprites - fake 6bpp decode is done from here */ ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0,0, 0x200000) ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* K054539 samples */ ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) ROM_END ROM_START( lethalux ) // US version ?, proto / hack?, very different to other sets ROM_REGION( 0x50000, REGION_CPU1, 0 ) /* main program */ ROM_LOAD( "191xxx01.u4", 0x10000, 0x40000, CRC(a3b9e790) SHA1(868b422850be129952c8b11c3c4aa730d8ea1544) ) // hacked? fails rom test ROM_REGION( 0x020000, REGION_CPU2, 0 ) /* Z80 sound program */ ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) ROM_RELOAD( 0x010000, 0x010000 ) ROM_REGION( 0x400000, REGION_GFX1, 0 ) /* tilemaps */ ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) /* sprites - fake 6bpp decode is done from here */ ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0,0, 0x200000) ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* K054539 samples */ ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) ROM_END ROM_START( letheab ) // Euro ver. EAB ROM_REGION( 0x50000, REGION_CPU1, 0 ) /* main program */ ROM_LOAD( "191eab01.u4", 0x10000, 0x40000, CRC(d7ce111e) SHA1(e56137a0ba7664f09b5d05bb39ec6eb4d1e412c7) ) ROM_REGION( 0x020000, REGION_CPU2, 0 ) /* Z80 sound program */ ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) ROM_RELOAD( 0x010000, 0x010000 ) ROM_REGION( 0x400000, REGION_GFX1, 0 ) /* tilemaps */ ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) /* sprites - fake 6bpp decode is done from here */ ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0,0, 0x200000) ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* K054539 samples */ ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) ROM_END ROM_START( letheae ) // Euro ver. EAE ROM_REGION( 0x50000, REGION_CPU1, 0 ) /* main program */ ROM_LOAD( "191eae01.u4", 0x10000, 0x40000, CRC(c6a3c6ac) SHA1(96a209a3a5b4af40af36bd7090c59a74f8c8df59) ) ROM_REGION( 0x020000, REGION_CPU2, 0 ) /* Z80 sound program */ ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) ROM_RELOAD( 0x010000, 0x010000 ) ROM_REGION( 0x400000, REGION_GFX1, 0 ) /* tilemaps */ ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) /* sprites - fake 6bpp decode is done from here */ ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0,0, 0x200000) ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* K054539 samples */ ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) ROM_END ROM_START( lethalua ) // *might* be UAA (writes UA to Eeprom) ROM_REGION( 0x50000, REGION_CPU1, 0 ) /* main program */ ROM_LOAD( "6_usa.u4", 0x10000, 0x40000, CRC(ab6b8f16) SHA1(8de6c429a6e71144270e79d18ad47b5aad13fe04) ) ROM_REGION( 0x020000, REGION_CPU2, 0 ) /* Z80 sound program */ ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) ROM_RELOAD( 0x010000, 0x010000 ) ROM_REGION( 0x400000, REGION_GFX1, 0 ) /* tilemaps */ ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) /* sprites - fake 6bpp decode is done from here */ ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0,0, 0x200000) ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* K054539 samples */ ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) ROM_END static DRIVER_INIT( lethalen ) { konami_rom_deinterleave_2_half(REGION_GFX2); konami_rom_deinterleave_2(REGION_GFX3); konami_rom_deinterleave_2(REGION_GFX4); } GAME( 1992, lethalen, 0, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver UAE, 11/19/92 15:04)", GAME_IMPERFECT_GRAPHICS) // writes UE to eeprom GAME( 1992, lethalua, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver unknown, US, 08/17/92 21:38)", GAME_IMPERFECT_GRAPHICS) // UAA? (writes UA to eeprom) GAME( 1992, lethalux, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver unknown, US, 08/06/92 15:11, hacked/proto?)", GAME_IMPERFECT_GRAPHICS) // writes UA to eeprom but earlier than suspected UAA set, might be a proto, might be hacked, fails rom test GAME( 1992, letheab, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAB, 10/14/92 19:53)", GAME_IMPERFECT_GRAPHICS) // writes EC to eeprom?! GAME( 1992, letheae, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAE, 11/19/92 16:24)", GAME_IMPERFECT_GRAPHICS) // writes EE to eeprom // different mirror / display setup, shoot off the top of the screen to reload.. GAME( 1992, lethalej, lethalen, lethalej, lethalej, lethalen, ORIENTATION_FLIP_X, "Konami", "Lethal Enforcers (ver JAD, 12/04/92 17:16)", GAME_IMPERFECT_GRAPHICS) // writes JC to eeprom?!