diff options
Diffstat (limited to 'src/mame/drivers/lethal.c')
-rw-r--r-- | src/mame/drivers/lethal.c | 83 |
1 files changed, 45 insertions, 38 deletions
diff --git a/src/mame/drivers/lethal.c b/src/mame/drivers/lethal.c index e3cf9f0db34..e53e7bcf7ee 100644 --- a/src/mame/drivers/lethal.c +++ b/src/mame/drivers/lethal.c @@ -109,8 +109,8 @@ 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--00xxxxxx W xxxxxxxx VREG 054156 control +010000--01--xxxx W xxxxxxxx VSCG 054157 control 010000--1000---- R/W -------- AFR watchdog reset 010000--1001---- W SDON sound enable? 010000--1010 CCLR ? @@ -121,7 +121,7 @@ Address Dir Data Name Description 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---- CBNK bank switch 4400-7FFF region between palette and 053245/054156 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) @@ -138,11 +138,11 @@ Address Dir Data Name Description 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--01---xxx R/W xxxxxxxx OREG 053244/053245 control 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 +010100xxxxxxxxxx R/W xxxxxxxx OBJ 053245 sprite RAM +011xxxxxxxxxxxxx R/W xxxxxxxx VRAM 054156 video RAM 1xxxxxxxxxxxxxxx R xxxxxxxx PROM program ROM @@ -231,9 +231,12 @@ Notes: 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. +Lethal Enforcers has two sprite rendering chips working in parallel with their +output mixed to give 6bpp, and two tilemap rendering chips working in parallel +to give 8bpp. We currently cheat, using just one of each device but using +alternate gfx layouts. Emulating it accurately will require separating the +"front end" chips (053245, 054156) from the "back end" chips (053244, 054157) +as only the latter are doubled. mirror not set up correctly @@ -265,13 +268,13 @@ WRITE8_MEMBER(lethal_state::control2_w) /* 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-7fff region: 0 = registers, 1 = RAM ("CBNK" on schematics) */ + /* bit 4 bankswitches the 4400-7fff region: 0 = registers, 1 = palette RAM ("CBNK" on schematics) */ /* bit 6 is "SHD0" (some kind of shadow control) */ /* bit 7 is "SHD1" (ditto) */ m_cur_control2 = data; - m_bank4800->set_bank((m_cur_control2 >> 4) & 1); + m_bank4000->set_bank(BIT(m_cur_control2, 4)); ioport("EEPROMOUT")->write(m_cur_control2, 0xff); } @@ -302,12 +305,6 @@ WRITE8_MEMBER(lethal_state::le_bankswitch_w) membank("bank1")->set_entry(data); } -// use one more palette entry for the BG color -WRITE8_MEMBER(lethal_state::le_bgcolor_w) -{ - m_palette->write(space, 0x3800 + offset, data); -} - READ8_MEMBER(lethal_state::guns_r) { switch (offset) @@ -356,23 +353,31 @@ static ADDRESS_MAP_START( le_main, AS_PROGRAM, 8, lethal_state ) 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_DEVICE("bank4800", address_map_bank_device, amap8) + AM_RANGE(0x4000, 0x43ff) AM_UNMAP // first 0x400 bytes of palette RAM are inaccessible + AM_RANGE(0x4000, 0x7fff) AM_DEVICE("bank4000", address_map_bank_device, amap8) AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("maincpu", 0x38000) ADDRESS_MAP_END -static ADDRESS_MAP_START( bank4800_map, AS_PROGRAM, 8, lethal_state ) - AM_RANGE(0x0040, 0x004f) AM_DEVREADWRITE("k053244", k05324x_device, k053244_r, k053244_w) - AM_RANGE(0x0080, 0x009f) AM_DEVREADWRITE("k054000", k054000_device, read, write) - AM_RANGE(0x00c6, 0x00c6) AM_WRITE(sound_cmd_w) - AM_RANGE(0x00c7, 0x00c7) AM_WRITE(sound_irq_w) - AM_RANGE(0x00ca, 0x00ca) AM_READ(sound_status_r) - AM_RANGE(0x0800, 0x17ff) AM_MASK(0x07ff) AM_DEVREADWRITE("k053244", k05324x_device, k053245_r, k053245_w) - AM_RANGE(0x1800, 0x1fff) AM_DEVREADWRITE("k056832", k056832_device, ram_code_lo_r, ram_code_lo_w) - AM_RANGE(0x2000, 0x27ff) AM_DEVREADWRITE("k056832", k056832_device, ram_code_hi_r, ram_code_hi_w) - AM_RANGE(0x2800, 0x2fff) AM_DEVREADWRITE("k056832", k056832_device, ram_attr_lo_r, ram_attr_lo_w) - AM_RANGE(0x3000, 0x37ff) AM_DEVREADWRITE("k056832", k056832_device, ram_attr_hi_r, ram_attr_hi_w) - AM_RANGE(0x3800, 0x7001) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // 2 extra bytes for the BG color +static ADDRESS_MAP_START( bank4000_map, AS_PROGRAM, 8, lethal_state ) + // VRD = 0 or 1, CBNK = 0 + AM_RANGE(0x0840, 0x084f) AM_MIRROR(0x8000) AM_DEVREADWRITE("k053244", k05324x_device, k053244_r, k053244_w) + AM_RANGE(0x0880, 0x089f) AM_MIRROR(0x8000) AM_DEVREADWRITE("k054000", k054000_device, read, write) + AM_RANGE(0x08c6, 0x08c6) AM_MIRROR(0x8000) AM_WRITE(sound_cmd_w) + AM_RANGE(0x08c7, 0x08c7) AM_MIRROR(0x8000) AM_WRITE(sound_irq_w) + AM_RANGE(0x08ca, 0x08ca) AM_MIRROR(0x8000) AM_READ(sound_status_r) + AM_RANGE(0x1000, 0x17ff) AM_MIRROR(0x8000) AM_DEVREADWRITE("k053244", k05324x_device, k053245_r, k053245_w) + + // VRD = 0, CBNK = 0 + AM_RANGE(0x2000, 0x27ff) AM_DEVREADWRITE("k056832", k056832_device, ram_code_lo_r, ram_code_lo_w) + AM_RANGE(0x2800, 0x2fff) AM_DEVREADWRITE("k056832", k056832_device, ram_code_hi_r, ram_code_hi_w) + AM_RANGE(0x3000, 0x37ff) AM_DEVREADWRITE("k056832", k056832_device, ram_attr_lo_r, ram_attr_lo_w) + AM_RANGE(0x3800, 0x3fff) AM_DEVREADWRITE("k056832", k056832_device, ram_attr_hi_r, ram_attr_hi_w) + + // VRD = 1, CBNK = 0 or 1 + AM_RANGE(0xa000, 0xbfff) AM_MIRROR(0x4000) AM_UNMAP // AM_DEVREAD("k056832", k056832_device, rom_byte_r) + + // CBNK = 1; partially overlaid when VRD = 1 + AM_RANGE(0x4000, 0x7fff) AM_MIRROR(0x8000) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") ADDRESS_MAP_END static ADDRESS_MAP_START( le_sound, AS_PROGRAM, 8, lethal_state ) @@ -467,8 +472,9 @@ void lethal_state::machine_start() membank("bank1")->set_entry(0); save_item(NAME(m_cur_control2)); - save_item(NAME(m_sprite_colorbase)); save_item(NAME(m_layer_colorbase)); + save_item(NAME(m_sprite_colorbase)); + save_item(NAME(m_back_colorbase)); } void lethal_state::machine_reset() @@ -477,8 +483,9 @@ void lethal_state::machine_reset() m_layer_colorbase[i] = 0; m_sprite_colorbase = 0; + m_back_colorbase = 0; m_cur_control2 = 0; - m_bank4800->set_bank(0); + m_bank4000->set_bank(0); } static MACHINE_CONFIG_START( lethalen, lethal_state ) @@ -491,12 +498,12 @@ static MACHINE_CONFIG_START( lethalen, lethal_state ) MCFG_CPU_ADD("soundcpu", Z80, MAIN_CLOCK/4) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(le_sound) - MCFG_DEVICE_ADD("bank4800", ADDRESS_MAP_BANK, 0) - MCFG_DEVICE_PROGRAM_MAP(bank4800_map) + MCFG_DEVICE_ADD("bank4000", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(bank4000_map) MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG) MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) - MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(15) - MCFG_ADDRESS_MAP_BANK_STRIDE(0x3800) + MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(16) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000) MCFG_EEPROM_SERIAL_ER5911_8BIT_ADD("eeprom") @@ -511,7 +518,7 @@ static MACHINE_CONFIG_START( lethalen, lethal_state ) MCFG_SCREEN_UPDATE_DRIVER(lethal_state, screen_update_lethalen) MCFG_SCREEN_PALETTE("palette") - MCFG_PALETTE_ADD("palette", 7168+1) + MCFG_PALETTE_ADD("palette", 8192) MCFG_PALETTE_ENABLE_SHADOWS() MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) |