summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/lethal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/lethal.c')
-rw-r--r--src/mame/drivers/lethal.c916
1 files changed, 916 insertions, 0 deletions
diff --git a/src/mame/drivers/lethal.c b/src/mame/drivers/lethal.c
new file mode 100644
index 00000000000..0ec68946938
--- /dev/null
+++ b/src/mame/drivers/lethal.c
@@ -0,0 +1,916 @@
+/***************************************************************************
+
+ 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?!