/***************************************************************************
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)
maybe some priority issues / sprite placement issues..
***************************************************************************/
#include "emu.h"
#include "video/konicdev.h"
#include "cpu/m6809/m6809.h"
#include "cpu/hd6309/hd6309.h"
#include "cpu/z80/z80.h"
#include "machine/eeprom.h"
#include "sound/k054539.h"
#include "includes/lethal.h"
#define MAIN_CLOCK XTAL_24MHz
#define SOUND_CLOCK XTAL_18_432MHz
static const char *const gunnames[] = { "LIGHT0_X", "LIGHT0_Y", "LIGHT1_X", "LIGHT1_Y" };
/* a = 1, 2 = player # */
#define GUNX( a ) (( ( input_port_read(space->machine(), gunnames[2 * (a - 1)]) * 287 ) / 0xff ) + 16)
#define GUNY( a ) (( ( input_port_read(space->machine(), gunnames[2 * (a - 1) + 1]) * 223 ) / 0xff ) + 10)
/* 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 const 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 const eeprom_interface eeprom_intf =
{
7, /* address bits */
8, /* data bits */
"011000", /* read command */
"011100", /* write command */
"0100100000000", /* erase command */
"0100000000000", /* lock command */
"0100110000000" /* unlock command */
};
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) */
lethal_state *state = space->machine().driver_data<lethal_state>();
state->m_cur_control2 = data;
input_port_write(space->machine(), "EEPROMOUT", state->m_cur_control2, 0xff);
}
static INTERRUPT_GEN(lethalen_interrupt)
{
lethal_state *state = device->machine().driver_data<lethal_state>();
if (k056832_is_irq_enabled(state->m_k056832, 0))
device_set_input_line(device, HD6309_IRQ_LINE, HOLD_LINE);
}
static WRITE8_HANDLER( sound_cmd_w )
{
soundlatch_w(space, 0, data);
}
static WRITE8_HANDLER( sound_irq_w )
{
lethal_state *state = space->machine().driver_data<lethal_state>();
device_set_input_line(state->m_audiocpu, 0, HOLD_LINE);
}
static READ8_HANDLER( sound_status_r )
{
return 0xf;
}
static void sound_nmi( device_t *device )
{
lethal_state *state = device->machine().driver_data<lethal_state>();
device_set_input_line(state->m_audiocpu, INPUT_LINE_NMI, PULSE_LINE);
}
static WRITE8_HANDLER( le_bankswitch_w )
{
memory_set_bank(space->machine(), "bank1", data);
}
static READ8_HANDLER( le_4800_r )
{
lethal_state *state = space->machine().driver_data<lethal_state>();
if (state->m_cur_control2 & 0x10) // RAM enable
{
return space->machine().generic.paletteram.u8[offset];
}
else
{
if (offset < 0x0800)
{
switch (offset)
{
case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
case 0x46:
case 0x47:
case 0x48:
case 0x49:
case 0x4a:
case 0x4b:
case 0x4c:
case 0x4d:
case 0x4e:
case 0x4f:
return k053244_r(state->m_k053244, offset - 0x40);
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(state->m_k054000, offset - 0x80);
case 0xca:
return sound_status_r(space, 0);
}
}
else if (offset < 0x1800)
return k053245_r(state->m_k053244, (offset - 0x0800) & 0x07ff);
else if (offset < 0x2000)
return k056832_ram_code_lo_r(state->m_k056832, offset - 0x1800);
else if (offset < 0x2800)
return k056832_ram_code_hi_r(state->m_k056832, offset - 0x2000);
else if (offset < 0x3000)
return k056832_ram_attr_lo_r(state->m_k056832, offset - 0x2800);
else // (offset < 0x3800)
return k056832_ram_attr_hi_r(state->m_k056832, offset - 0x3000);
}
return 0;
}
static WRITE8_HANDLER( le_4800_w )
{
lethal_state *state = space->machine().driver_data<lethal_state>();
if (state->m_cur_control2 & 0x10) // RAM enable
{
paletteram_xBBBBBGGGGGRRRRR_be_w(space, offset, data);
}
else
{
if (offset < 0x0800)
{
switch (offset)
{
case 0xc6:
sound_cmd_w(space, 0, data);
break;
case 0xc7:
sound_irq_w(space, 0, data);
break;
case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
case 0x46:
case 0x47:
case 0x48:
case 0x49:
case 0x4a:
case 0x4b:
case 0x4c:
case 0x4d:
case 0x4e:
case 0x4f:
k053244_w(state->m_k053244, 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(state->m_k054000, offset - 0x80, data);
break;
default:
logerror("Unknown LE 48xx register write: %x to %x (PC=%x)\n", data, offset, cpu_get_pc(&space->device()));
break;
}
}
else if (offset < 0x1800)
k053245_w(state->m_k053244, (offset - 0x0800) & 0x07ff, data);
else if (offset < 0x2000)
k056832_ram_code_lo_w(state->m_k056832, offset - 0x1800, data);
else if (offset < 0x2800)
k056832_ram_code_hi_w(state->m_k056832, offset - 0x2000, data);
else if (offset < 0x3000)
k056832_ram_attr_lo_w(state->m_k056832, offset - 0x2800, data);
else // (offset < 0x3800)
k056832_ram_attr_hi_w(state->m_k056832, offset - 0x3000, data);
}
}
// use one more palette entry for the BG color
static WRITE8_HANDLER( le_bgcolor_w )
{
paletteram_xBBBBBGGGGGRRRRR_be_w(space, 0x3800 + offset, data);
}
static READ8_HANDLER( guns_r )
{
switch (offset)
{
case 0:
return GUNX(1) >> 1;
case 1:
if ((240 - GUNY(1)) == 7)
return 0;
else
return (240 - GUNY(1));
break;
case 2:
return GUNX(2) >> 1;
case 3:
if ((240 - GUNY(2)) == 7)
return 0;
else
return (240 - GUNY(2));
break;
}
return 0;
}
static READ8_HANDLER( gunsaux_r )
{
int res = 0;
if (GUNX(1) & 1) res |= 0x80;
if (GUNX(2) & 1) res |= 0x40;
return res;
}
static ADDRESS_MAP_START( le_main, AS_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_ROMBANK("bank1")
AM_RANGE(0x2000, 0x3fff) AM_RAM // work RAM
AM_RANGE(0x4000, 0x403f) AM_DEVWRITE("k056832", k056832_w)
AM_RANGE(0x4040, 0x404f) AM_DEVWRITE("k056832", k056832_b_w)
AM_RANGE(0x4080, 0x4080) AM_READNOP // 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(lethalen_palette_control) // PCU1-PCU3 on the schematics
AM_RANGE(0x40d4, 0x40d7) AM_READ(guns_r)
AM_RANGE(0x40d8, 0x40d8) AM_READ_PORT("DSW")
AM_RANGE(0x40d9, 0x40d9) AM_READ_PORT("INPUTS")
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) // bankswitched: RAM and registers
AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank2")
ADDRESS_MAP_END
static ADDRESS_MAP_START( le_sound, AS_PROGRAM, 8 )
AM_RANGE(0x0000, 0xefff) AM_ROM
AM_RANGE(0xf000, 0xf7ff) AM_RAM
AM_RANGE(0xf800, 0xfa2f) AM_DEVREADWRITE("k054539", k054539_r, k054539_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
static INPUT_PORTS_START( lethalen )
PORT_START("INPUTS")
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 )
PORT_START("DSW")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* it must be 1 ? */
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 ) )
PORT_START( "EEPROMOUT" )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, write_bit)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_cs_line)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_clock_line)
PORT_START("LIGHT0_X")
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_START("LIGHT0_Y")
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_START("LIGHT1_X")
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_START("LIGHT1_Y")
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 )
PORT_INCLUDE( lethalen )
PORT_MODIFY("LIGHT0_X")
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
PORT_MODIFY("LIGHT0_Y")
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
PORT_MODIFY("LIGHT1_X")
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
PORT_MODIFY("LIGHT1_Y")
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 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( "gfx2", 0, lethal_6bpp, 0x000/*0x400*/, 256 ) /* sprites tiles */
GFXDECODE_END
/* sound */
static const k054539_interface k054539_config =
{
NULL,
NULL,
sound_nmi
};
static MACHINE_START( lethalen )
{
lethal_state *state = machine.driver_data<lethal_state>();
UINT8 *ROM = machine.region("maincpu")->base();
memory_configure_bank(machine, "bank1", 0, 0x20, &ROM[0x10000], 0x2000);
memory_set_bank(machine, "bank1", 0);
machine.generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 0x3800 + 0x02);
state->m_maincpu = machine.device("maincpu");
state->m_audiocpu = machine.device("soundcpu");
state->m_k054539 = machine.device("k054539");
state->m_k053244 = machine.device("k053244");
state->m_k056832 = machine.device("k056832");
state->m_k054000 = machine.device("k054000");
state->save_item(NAME(state->m_cur_control2));
state->save_item(NAME(state->m_sprite_colorbase));
state->save_item(NAME(state->m_layer_colorbase));
state_save_register_global_pointer(machine, machine.generic.paletteram.u8, 0x3800 + 0x02);
}
static MACHINE_RESET( lethalen )
{
lethal_state *state = machine.driver_data<lethal_state>();
UINT8 *prgrom = (UINT8 *)machine.region("maincpu")->base();
int i;
memory_set_bankptr(machine, "bank2", &prgrom[0x48000]);
/* force reset again to read proper reset vector */
machine.device("maincpu")->reset();
for (i = 0; i < 4; i++)
state->m_layer_colorbase[i] = 0;
state->m_sprite_colorbase = 0;
state->m_cur_control2 = 0;
}
static const k056832_interface lethalen_k056832_intf =
{
"gfx1", 1,
K056832_BPP_8LE,
1, 0,
KONAMI_ROM_DEINTERLEAVE_NONE,
lethalen_tile_callback, "none"
};
static const k05324x_interface lethalen_k05324x_intf =
{
"gfx3", 2,
NORMAL_PLANE_ORDER,
95, 0,
KONAMI_ROM_DEINTERLEAVE_2,
lethalen_sprite_callback
};
static const k05324x_interface lethalej_k05324x_intf =
{
"gfx3", 2,
NORMAL_PLANE_ORDER,
-105, 0,
KONAMI_ROM_DEINTERLEAVE_2,
lethalen_sprite_callback
};
static MACHINE_CONFIG_START( lethalen, lethal_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", HD6309, MAIN_CLOCK/2) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(le_main)
MCFG_CPU_VBLANK_INT("screen", lethalen_interrupt)
MCFG_CPU_ADD("soundcpu", Z80, MAIN_CLOCK/4) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(le_sound)
MCFG_MACHINE_START(lethalen)
MCFG_MACHINE_RESET(lethalen)
MCFG_EEPROM_ADD("eeprom", eeprom_intf)
MCFG_EEPROM_DATA(lethalen_default_eeprom, 48)
MCFG_GFXDECODE(lethal)
/* video hardware */
MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(59.62) /* verified on pcb */
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(216, 504-1, 16, 240-1)
MCFG_SCREEN_UPDATE(lethalen)
MCFG_PALETTE_LENGTH(7168+1)
MCFG_VIDEO_START(lethalen)
MCFG_K056832_ADD("k056832", lethalen_k056832_intf)
MCFG_K053244_ADD("k053244", lethalen_k05324x_intf)
MCFG_K054000_ADD("k054000")
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD("k054539", K054539, 48000)
MCFG_SOUND_CONFIG(k054539_config)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( lethalej, lethalen )
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_VISIBLE_AREA(224, 512-1, 16, 240-1)
MCFG_DEVICE_REMOVE("k053244")
MCFG_K053244_ADD("k053244", lethalej_k05324x_intf)
MACHINE_CONFIG_END
ROM_START( lethalen ) // US version UAE
ROM_REGION( 0x50000, "maincpu", 0 )
/* main program */
ROM_LOAD( "191uae01.u4", 0x10000, 0x40000, CRC(dca340e3) SHA1(8efbba0e3a459bcfe23c75c584bf3a4ce25148bb) )
ROM_REGION( 0x020000, "soundcpu", 0 )
/* Z80 sound program */
ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) )
ROM_RELOAD( 0x010000, 0x010000 )
ROM_REGION( 0x400000, "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, "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, "gfx3", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0,0, 0x200000)
ROM_REGION( 0x200000, "gfx4", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0x200000,0, 0x200000)
ROM_REGION( 0x200000, "k054539", 0 )
/* K054539 samples */
ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c))
ROM_REGION16_BE( 0x80, "eeprom", 0 )
ROM_LOAD( "lethalen.nv", 0x0000, 0x0080, CRC(6e7224e6) SHA1(86dea9262d55e58b573d397d0fea437c58728707) )
ROM_END
ROM_START( lethalenj ) // Japan version JAD
ROM_REGION( 0x50000, "maincpu", 0 )
/* main program */
ROM_LOAD( "191jad01.u4", 0x10000, 0x40000, CRC(160a25c0) SHA1(1d3ed5a158e461a73c079fe24a8e9d5e2a87e126) )
ROM_REGION( 0x020000, "soundcpu", 0 )
/* Z80 sound program */
ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) )
ROM_RELOAD( 0x010000, 0x010000 )
ROM_REGION( 0x400000, "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, "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, "gfx3", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0,0, 0x200000)
ROM_REGION( 0x200000, "gfx4", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0x200000,0, 0x200000)
ROM_REGION( 0x200000, "k054539", 0 )
/* K054539 samples */
ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c))
ROM_REGION16_BE( 0x80, "eeprom", 0 )
ROM_LOAD( "lethalenj.nv", 0x0000, 0x0080, CRC(20b28f2f) SHA1(53d212f2c006729a01dfdb49cb36b67b9425172e) )
ROM_END
ROM_START( lethalenux ) // US version ?, proto / hack?, very different to other sets
ROM_REGION( 0x50000, "maincpu", 0 )
/* main program */
ROM_LOAD( "191xxx01.u4", 0x10000, 0x40000, CRC(a3b9e790) SHA1(868b422850be129952c8b11c3c4aa730d8ea1544) ) // hacked? fails rom test, verified on multiple boards
ROM_REGION( 0x020000, "soundcpu", 0 )
/* Z80 sound program */
ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) )
ROM_RELOAD( 0x010000, 0x010000 )
ROM_REGION( 0x400000, "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, "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, "gfx3", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0,0, 0x200000)
ROM_REGION( 0x200000, "gfx4", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0x200000,0, 0x200000)
ROM_REGION( 0x200000, "k054539", 0 )
/* K054539 samples */
ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c))
ROM_REGION16_BE( 0x80, "eeprom", 0 )
ROM_LOAD( "lethalenux.nv", 0x0000, 0x0080, CRC(5d69c39d) SHA1(e468df829ee5094792289f9166d7e39b638ab70d) )
ROM_END
ROM_START( lethaleneab ) // Euro ver. EAB
ROM_REGION( 0x50000, "maincpu", 0 )
/* main program */
ROM_LOAD( "191eab01.u4", 0x10000, 0x40000, CRC(d7ce111e) SHA1(e56137a0ba7664f09b5d05bb39ec6eb4d1e412c7) )
ROM_REGION( 0x020000, "soundcpu", 0 )
/* Z80 sound program */
ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) )
ROM_RELOAD( 0x010000, 0x010000 )
ROM_REGION( 0x400000, "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, "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, "gfx3", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0,0, 0x200000)
ROM_REGION( 0x200000, "gfx4", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0x200000,0, 0x200000)
ROM_REGION( 0x200000, "k054539", 0 )
/* K054539 samples */
ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c))
ROM_REGION16_BE( 0x80, "eeprom", 0 )
ROM_LOAD( "lethaleneab.nv", 0x0000, 0x0080, CRC(4e9bb34d) SHA1(9502583bc9f5f6fc5bba333869398b24bf154b73) )
ROM_END
ROM_START( lethaleneae ) // Euro ver. EAE
ROM_REGION( 0x50000, "maincpu", 0 )
/* main program */
ROM_LOAD( "191eae01.u4", 0x10000, 0x40000, CRC(c6a3c6ac) SHA1(96a209a3a5b4af40af36bd7090c59a74f8c8df59) )
ROM_REGION( 0x020000, "soundcpu", 0 )
/* Z80 sound program */
ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) )
ROM_RELOAD( 0x010000, 0x010000 )
ROM_REGION( 0x400000, "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, "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, "gfx3", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0,0, 0x200000)
ROM_REGION( 0x200000, "gfx4", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0x200000,0, 0x200000)
ROM_REGION( 0x200000, "k054539", 0 )
/* K054539 samples */
ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c))
ROM_REGION16_BE( 0x80, "eeprom", 0 )
ROM_LOAD( "lethaleneae.nv", 0x0000, 0x0080, CRC(eb369a67) SHA1(6c67294669614e96de5efb38372dbed435ee04d3) )
ROM_END
ROM_START( lethalenua ) // *might* be UAA (writes UA to Eeprom)
ROM_REGION( 0x50000, "maincpu", 0 )
/* main program */
ROM_LOAD( "6_usa.u4", 0x10000, 0x40000, CRC(ab6b8f16) SHA1(8de6c429a6e71144270e79d18ad47b5aad13fe04) )
ROM_REGION( 0x020000, "soundcpu", 0 )
/* Z80 sound program */
ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) )
ROM_RELOAD( 0x010000, 0x010000 )
ROM_REGION( 0x400000, "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, "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, "gfx3", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0,0, 0x200000)
ROM_REGION( 0x200000, "gfx4", ROMREGION_ERASE00 )
ROM_COPY("gfx2",0x200000,0, 0x200000)
ROM_REGION( 0x200000, "k054539", 0 )
/* K054539 samples */
ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c))
ROM_REGION16_BE( 0x80, "eeprom", 0 )
ROM_LOAD( "lethalenua.nv", 0x0000, 0x0080, CRC(f71ad1c3) SHA1(04c7052d0895797af8a06183b8a877795bf2dbb3) )
ROM_END
static DRIVER_INIT( lethalen )
{
konamid_rom_deinterleave_2_half(machine, "gfx2");
konamid_rom_deinterleave_2(machine, "gfx4");
}
GAME( 1992, lethalen, 0, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver UAE, 11/19/92 15:04)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // writes UE to eeprom
GAME( 1992, lethalenua, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver unknown, US, 08/17/92 21:38)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // UAA? (writes UA to eeprom)
GAME( 1992, lethalenux, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver unknown, US, 08/06/92 15:11, hacked/proto?)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // writes UA to eeprom but earlier than suspected UAA set, might be a proto, might be hacked, fails rom test, definitely a good dump, another identical set was found in Italy
GAME( 1992, lethaleneab,lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAB, 10/14/92 19:53)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // writes EC to eeprom?!
GAME( 1992, lethaleneae,lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAE, 11/19/92 16:24)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // writes EE to eeprom
// different mirror / display setup, shoot off the top of the screen to reload..
GAME( 1992, lethalenj, lethalen, lethalej, lethalej, lethalen, ORIENTATION_FLIP_X, "Konami", "Lethal Enforcers (ver JAD, 12/04/92 17:16)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // writes JC to eeprom?!