lethal.c: sanify palette size and bankdev address map; add placeholder for gfx ROM read (nw)

This commit is contained in:
Alex W. Jackson 2014-11-15 05:44:55 -05:00
parent 1e24f820ce
commit 7f012b5afc
3 changed files with 56 additions and 53 deletions

View File

@ -109,8 +109,8 @@ Address Dir Data Name Description
---------------- --- -------- --------- ----------------------- ---------------- --- -------- --------- -----------------------
000xxxxxxxxxxxxx R xxxxxxxx PROM program ROM (banked) 000xxxxxxxxxxxxx R xxxxxxxx PROM program ROM (banked)
001xxxxxxxxxxxxx R/W xxxxxxxx WRAM work RAM 001xxxxxxxxxxxxx R/W xxxxxxxx WRAM work RAM
010000--00xxxxxx W xxxxxxxx VREG 056832 control 010000--00xxxxxx W xxxxxxxx VREG 054156 control
010000--01--xxxx W xxxxxxxx VSCG 056832 control 010000--01--xxxx W xxxxxxxx VSCG 054157 control
010000--1000---- R/W -------- AFR watchdog reset 010000--1000---- R/W -------- AFR watchdog reset
010000--1001---- W SDON sound enable? 010000--1001---- W SDON sound enable?
010000--1010 CCLR ? 010000--1010 CCLR ?
@ -121,7 +121,7 @@ Address Dir Data Name Description
010000--11-000-- W --x----- CRDB / 010000--11-000-- W --x----- CRDB /
010000--11-001-- W -----xxx EEP EEPROM DI, CS, CLK 010000--11-001-- W -----xxx EEP EEPROM DI, CS, CLK
010000--11-001-- W ----x--- MUT sound mute? 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 --x----- n.c.
010000--11-001-- W xx------ SHD0/1 shadow control 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/XBA palette bank (tilemap A)
@ -138,11 +138,11 @@ Address Dir Data Name Description
010000--11-11011 R -------x NCPU ? 010000--11-11011 R -------x NCPU ?
010000--11-111-- W --xxxxxx BREG ROM bank select 010000--11-111-- W --xxxxxx BREG ROM bank select
010010--00------ n.c. 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--10-xxxxx R/W xxxxxxxx HIP 054000
010010--11 R/W xxxxxxxx PAR sound communication 010010--11 R/W xxxxxxxx PAR sound communication
010100xxxxxxxxxx R/W xxxxxxxx OBJ 053245 010100xxxxxxxxxx R/W xxxxxxxx OBJ 053245 sprite RAM
011xxxxxxxxxxxxx R/W xxxxxxxx VRAM 056832 011xxxxxxxxxxxxx R/W xxxxxxxx VRAM 054156 video RAM
1xxxxxxxxxxxxxxx R xxxxxxxx PROM program ROM 1xxxxxxxxxxxxxxx R xxxxxxxx PROM program ROM
@ -231,9 +231,12 @@ Notes:
note: note:
lethal enforcers has 2 sprite rendering chips working in parallel mixing Lethal Enforcers has two sprite rendering chips working in parallel with their
data together to give 6bpp.. we cheat by using a custom function in output mixed to give 6bpp, and two tilemap rendering chips working in parallel
konamiic.c and a fixed 6bpp decode. 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 mirror not set up correctly
@ -265,13 +268,13 @@ WRITE8_MEMBER(lethal_state::control2_w)
/* bit 1 is cs (active low) */ /* bit 1 is cs (active low) */
/* bit 2 is clock (active high) */ /* bit 2 is clock (active high) */
/* bit 3 is "MUT" on the schematics (audio mute?) */ /* 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 6 is "SHD0" (some kind of shadow control) */
/* bit 7 is "SHD1" (ditto) */ /* bit 7 is "SHD1" (ditto) */
m_cur_control2 = data; 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); ioport("EEPROMOUT")->write(m_cur_control2, 0xff);
} }
@ -302,12 +305,6 @@ WRITE8_MEMBER(lethal_state::le_bankswitch_w)
membank("bank1")->set_entry(data); 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) READ8_MEMBER(lethal_state::guns_r)
{ {
switch (offset) 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(0x40d9, 0x40d9) AM_READ_PORT("INPUTS")
AM_RANGE(0x40db, 0x40db) AM_READ(gunsaux_r) // top X bit of guns AM_RANGE(0x40db, 0x40db) AM_READ(gunsaux_r) // top X bit of guns
AM_RANGE(0x40dc, 0x40dc) AM_WRITE(le_bankswitch_w) AM_RANGE(0x40dc, 0x40dc) AM_WRITE(le_bankswitch_w)
AM_RANGE(0x47fe, 0x47ff) AM_WRITE(le_bgcolor_w) // BG color AM_RANGE(0x4000, 0x43ff) AM_UNMAP // first 0x400 bytes of palette RAM are inaccessible
AM_RANGE(0x4800, 0x7fff) AM_DEVICE("bank4800", address_map_bank_device, amap8) AM_RANGE(0x4000, 0x7fff) AM_DEVICE("bank4000", address_map_bank_device, amap8)
AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("maincpu", 0x38000) AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("maincpu", 0x38000)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( bank4800_map, AS_PROGRAM, 8, lethal_state ) static ADDRESS_MAP_START( bank4000_map, AS_PROGRAM, 8, lethal_state )
AM_RANGE(0x0040, 0x004f) AM_DEVREADWRITE("k053244", k05324x_device, k053244_r, k053244_w) // VRD = 0 or 1, CBNK = 0
AM_RANGE(0x0080, 0x009f) AM_DEVREADWRITE("k054000", k054000_device, read, write) AM_RANGE(0x0840, 0x084f) AM_MIRROR(0x8000) AM_DEVREADWRITE("k053244", k05324x_device, k053244_r, k053244_w)
AM_RANGE(0x00c6, 0x00c6) AM_WRITE(sound_cmd_w) AM_RANGE(0x0880, 0x089f) AM_MIRROR(0x8000) AM_DEVREADWRITE("k054000", k054000_device, read, write)
AM_RANGE(0x00c7, 0x00c7) AM_WRITE(sound_irq_w) AM_RANGE(0x08c6, 0x08c6) AM_MIRROR(0x8000) AM_WRITE(sound_cmd_w)
AM_RANGE(0x00ca, 0x00ca) AM_READ(sound_status_r) AM_RANGE(0x08c7, 0x08c7) AM_MIRROR(0x8000) AM_WRITE(sound_irq_w)
AM_RANGE(0x0800, 0x17ff) AM_MASK(0x07ff) AM_DEVREADWRITE("k053244", k05324x_device, k053245_r, k053245_w) AM_RANGE(0x08ca, 0x08ca) AM_MIRROR(0x8000) AM_READ(sound_status_r)
AM_RANGE(0x1800, 0x1fff) AM_DEVREADWRITE("k056832", k056832_device, ram_code_lo_r, ram_code_lo_w) AM_RANGE(0x1000, 0x17ff) AM_MIRROR(0x8000) AM_DEVREADWRITE("k053244", k05324x_device, k053245_r, k053245_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) // VRD = 0, CBNK = 0
AM_RANGE(0x3000, 0x37ff) AM_DEVREADWRITE("k056832", k056832_device, ram_attr_hi_r, ram_attr_hi_w) AM_RANGE(0x2000, 0x27ff) AM_DEVREADWRITE("k056832", k056832_device, ram_code_lo_r, ram_code_lo_w)
AM_RANGE(0x3800, 0x7001) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // 2 extra bytes for the BG color 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 ADDRESS_MAP_END
static ADDRESS_MAP_START( le_sound, AS_PROGRAM, 8, lethal_state ) 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); membank("bank1")->set_entry(0);
save_item(NAME(m_cur_control2)); save_item(NAME(m_cur_control2));
save_item(NAME(m_sprite_colorbase));
save_item(NAME(m_layer_colorbase)); save_item(NAME(m_layer_colorbase));
save_item(NAME(m_sprite_colorbase));
save_item(NAME(m_back_colorbase));
} }
void lethal_state::machine_reset() void lethal_state::machine_reset()
@ -477,8 +483,9 @@ void lethal_state::machine_reset()
m_layer_colorbase[i] = 0; m_layer_colorbase[i] = 0;
m_sprite_colorbase = 0; m_sprite_colorbase = 0;
m_back_colorbase = 0;
m_cur_control2 = 0; m_cur_control2 = 0;
m_bank4800->set_bank(0); m_bank4000->set_bank(0);
} }
static MACHINE_CONFIG_START( lethalen, lethal_state ) 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_ADD("soundcpu", Z80, MAIN_CLOCK/4) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(le_sound) MCFG_CPU_PROGRAM_MAP(le_sound)
MCFG_DEVICE_ADD("bank4800", ADDRESS_MAP_BANK, 0) MCFG_DEVICE_ADD("bank4000", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(bank4800_map) MCFG_DEVICE_PROGRAM_MAP(bank4000_map)
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG) MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(15) MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(16)
MCFG_ADDRESS_MAP_BANK_STRIDE(0x3800) MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
MCFG_EEPROM_SERIAL_ER5911_8BIT_ADD("eeprom") 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_UPDATE_DRIVER(lethal_state, screen_update_lethalen)
MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 7168+1) MCFG_PALETTE_ADD("palette", 8192)
MCFG_PALETTE_ENABLE_SHADOWS() MCFG_PALETTE_ENABLE_SHADOWS()
MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR)

View File

@ -18,7 +18,7 @@ public:
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"), m_soundcpu(*this, "soundcpu"),
m_bank4800(*this, "bank4800"), m_bank4000(*this, "bank4000"),
m_k056832(*this, "k056832"), m_k056832(*this, "k056832"),
m_k053244(*this, "k053244"), m_k053244(*this, "k053244"),
m_palette(*this, "palette") { } m_palette(*this, "palette") { }
@ -26,6 +26,7 @@ public:
/* video-related */ /* video-related */
int m_layer_colorbase[4]; int m_layer_colorbase[4];
int m_sprite_colorbase; int m_sprite_colorbase;
int m_back_colorbase;
/* misc */ /* misc */
UINT8 m_cur_control2; UINT8 m_cur_control2;
@ -33,7 +34,7 @@ public:
/* devices */ /* devices */
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu; required_device<cpu_device> m_soundcpu;
required_device<address_map_bank_device> m_bank4800; required_device<address_map_bank_device> m_bank4000;
required_device<k056832_device> m_k056832; required_device<k056832_device> m_k056832;
required_device<k05324x_device> m_k053244; required_device<k05324x_device> m_k053244;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
@ -43,7 +44,6 @@ public:
DECLARE_WRITE8_MEMBER(sound_irq_w); DECLARE_WRITE8_MEMBER(sound_irq_w);
DECLARE_READ8_MEMBER(sound_status_r); DECLARE_READ8_MEMBER(sound_status_r);
DECLARE_WRITE8_MEMBER(le_bankswitch_w); DECLARE_WRITE8_MEMBER(le_bankswitch_w);
DECLARE_WRITE8_MEMBER(le_bgcolor_w);
DECLARE_READ8_MEMBER(guns_r); DECLARE_READ8_MEMBER(guns_r);
DECLARE_READ8_MEMBER(gunsaux_r); DECLARE_READ8_MEMBER(gunsaux_r);
DECLARE_WRITE8_MEMBER(lethalen_palette_control); DECLARE_WRITE8_MEMBER(lethalen_palette_control);

View File

@ -14,7 +14,7 @@ K05324X_CB_MEMBER(lethal_state::sprite_callback)
{ {
int pri = (*color & 0xfff0); int pri = (*color & 0xfff0);
*color = *color & 0x000f; *color = *color & 0x000f;
*color += 0x400 / 64; // colourbase? *color += m_sprite_colorbase;
/* this isn't ideal.. shouldn't need to hardcode it? not 100% sure about it anyway*/ /* this isn't ideal.. shouldn't need to hardcode it? not 100% sure about it anyway*/
if (pri == 0x10) if (pri == 0x10)
@ -65,11 +65,6 @@ void lethal_state::video_start()
m_k056832->set_layer_offs(2, 192, 0); m_k056832->set_layer_offs(2, 192, 0);
m_k056832->set_layer_offs(3, 194, 0); m_k056832->set_layer_offs(3, 194, 0);
} }
m_layer_colorbase[0] = 0x00;
m_layer_colorbase[1] = 0x40;
m_layer_colorbase[2] = 0x80;
m_layer_colorbase[3] = 0xc0;
} }
WRITE8_MEMBER(lethal_state::lethalen_palette_control) WRITE8_MEMBER(lethal_state::lethalen_palette_control)
@ -77,28 +72,29 @@ WRITE8_MEMBER(lethal_state::lethalen_palette_control)
switch (offset) switch (offset)
{ {
case 0: // 40c8 - PCU1 from schematics case 0: // 40c8 - PCU1 from schematics
m_layer_colorbase[0] = ((data & 0x7) - 1) * 0x40; m_layer_colorbase[0] = (data & 0x7) * 1024 / 16;
m_layer_colorbase[1] = (((data >> 4) & 0x7) - 1) * 0x40; m_layer_colorbase[1] = ((data >> 4) & 0x7) * 1024 / 16;
m_k056832->mark_plane_dirty( 0); m_k056832->mark_plane_dirty( 0);
m_k056832->mark_plane_dirty( 1); m_k056832->mark_plane_dirty( 1);
break; break;
case 4: // 40cc - PCU2 from schematics case 4: // 40cc - PCU2 from schematics
m_layer_colorbase[2] = ((data & 0x7) - 1) * 0x40; m_layer_colorbase[2] = (data & 0x7) * 1024 / 16;
m_layer_colorbase[3] = (((data >> 4) & 0x7) - 1) * 0x40; m_layer_colorbase[3] = ((data >> 4) & 0x7) * 1024 / 16;
m_k056832->mark_plane_dirty( 2); m_k056832->mark_plane_dirty( 2);
m_k056832->mark_plane_dirty( 3); m_k056832->mark_plane_dirty( 3);
break; break;
case 8: // 40d0 - PCU3 from schematics case 8: // 40d0 - PCU3 from schematics
m_sprite_colorbase = ((data & 0x7) - 1) * 0x40; m_sprite_colorbase = (data & 0x7) * 1024 / 64;
m_back_colorbase = ((data >> 4) & 0x7) * 1024 + 1023;
break; break;
} }
} }
UINT32 lethal_state::screen_update_lethalen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) UINT32 lethal_state::screen_update_lethalen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
bitmap.fill(7168, cliprect); bitmap.fill(m_back_colorbase, cliprect);
screen.priority().fill(0, cliprect); screen.priority().fill(0, cliprect);
m_k056832->tilemap_draw(screen, bitmap, cliprect, 3, K056832_DRAW_FLAG_MIRROR, 1); m_k056832->tilemap_draw(screen, bitmap, cliprect, 3, K056832_DRAW_FLAG_MIRROR, 1);