summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/taito_l.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/taito_l.cpp')
-rw-r--r--src/mame/drivers/taito_l.cpp186
1 files changed, 55 insertions, 131 deletions
diff --git a/src/mame/drivers/taito_l.cpp b/src/mame/drivers/taito_l.cpp
index 93ef25e5094..6a4b96264b0 100644
--- a/src/mame/drivers/taito_l.cpp
+++ b/src/mame/drivers/taito_l.cpp
@@ -74,49 +74,10 @@ puzznici note
#include "speaker.h"
-namespace {
-
-struct
-{
- void (taitol_state::*notifier)(int);
- u32 offset;
-} const rambank_modify_notifiers[12] =
-{
- { &taitol_state::taitol_chardef14_m, 0x0000 }, // 14
- { &taitol_state::taitol_chardef15_m, 0x1000 }, // 15
- { &taitol_state::taitol_chardef16_m, 0x2000 }, // 16
- { &taitol_state::taitol_chardef17_m, 0x3000 }, // 17
-
- { &taitol_state::taitol_bg18_m, 0x8000 }, // 18
- { &taitol_state::taitol_bg19_m, 0x9000 }, // 19
- { &taitol_state::taitol_char1a_m, 0xa000 }, // 1a
- { &taitol_state::taitol_obj1b_m, 0xb000 }, // 1b
-
- { &taitol_state::taitol_chardef1c_m, 0x4000 }, // 1c
- { &taitol_state::taitol_chardef1d_m, 0x5000 }, // 1d
- { &taitol_state::taitol_chardef1e_m, 0x6000 }, // 1e
- { &taitol_state::taitol_chardef1f_m, 0x7000 }, // 1f
-};
-
-} // anonymous namespace
-
-
-void taitol_state::palette_notifier(int addr)
-{
- u8 const *const p = m_palette_ram + (addr & ~1);
- u8 const byte0 = p[0];
- u8 const byte1 = p[1];
-
- // addr &= 0x1ff;
-
- if (addr > 0x200)
- logerror("%s:Large palette ? %03x\n", machine().describe_context(), addr);
- else
- m_palette->set_pen_color(addr / 2, pal4bit(byte0), pal4bit(byte0 >> 4), pal4bit(byte1));
-}
-
void taitol_state::state_register()
{
+ m_main_bnk->configure_entries(0, m_main_prg->bytes()/0x2000, m_main_prg->base(), 0x2000);
+
save_item(NAME(m_irq_adr_table));
save_item(NAME(m_irq_enable));
save_item(NAME(m_cur_rambank));
@@ -133,16 +94,19 @@ void taitol_state::state_register()
void taitol_2cpu_state::state_register()
{
+ if (m_audio_bnk.found())
+ m_audio_bnk->configure_entries(0, m_audio_prg->bytes()/0x4000, m_audio_prg->base(), 0x4000);
+
taitol_state::state_register();
}
void fhawk_state::state_register()
{
+ m_slave_bnk->configure_entries(0, m_slave_prg->bytes()/0x4000, m_slave_prg->base(), 0x4000);
taitol_2cpu_state::state_register();
save_item(NAME(m_cur_rombank2));
save_item(NAME(m_high2));
- save_item(NAME(m_cur_audio_bnk));
}
void champwr_state::state_register()
@@ -161,10 +125,6 @@ void taitol_1cpu_state::state_register()
MACHINE_START_MEMBER(taitol_state, taito_l)
{
- save_item(NAME(m_rambanks));
- save_item(NAME(m_palette_ram));
- save_item(NAME(m_empty_ram));
-
state_register();
}
@@ -178,15 +138,11 @@ void taitol_state::taito_machine_reset()
for (int i = 0; i < 4; i++)
{
m_cur_rambank[i] = 0x80;
- m_current_notifier[i] = &taitol_state::palette_notifier;
- m_current_base[i] = m_palette_ram;
- m_ram_bnks[i]->set_base(m_current_base[i]);
+ m_ram_bnks[i]->set_bank(m_cur_rambank[i]);
}
m_cur_rombank = 0;
- m_main_bnk->set_base(&m_main_prg[0]);
-
- m_gfxdecode->gfx(2)->set_source(m_rambanks);
+ m_main_bnk->set_entry(0);
m_last_irq_level = 0;
m_high = 0;
@@ -208,8 +164,10 @@ void fhawk_state::taito_machine_reset()
taitol_2cpu_state::taito_machine_reset();
m_cur_rombank2 = 0;
+ m_slave_bnk->set_entry(m_cur_rombank2);
+
m_high2 = 0;
- m_cur_audio_bnk = 1;
+ m_audio_bnk->set_entry(1);
}
void champwr_state::taito_machine_reset()
@@ -304,7 +262,7 @@ WRITE8_MEMBER(taitol_state::rombankswitch_w)
//logerror("robs %d, %02x (%04x)\n", offset, data, m_main_cpu->pc());
m_cur_rombank = data;
- m_main_bnk->set_base(&m_main_prg[0x2000 * m_cur_rombank]);
+ m_main_bnk->set_entry(m_cur_rombank);
}
}
@@ -323,7 +281,7 @@ WRITE8_MEMBER(fhawk_state::rombank2switch_w)
//logerror("robs2 %02x (%04x)\n", data, m_main_cpu->pc());
m_cur_rombank2 = data;
- m_slave_bnk->set_base(&m_slave_prg[0x4000 * m_cur_rombank2]);
+ m_slave_bnk->set_entry(m_cur_rombank2);
}
}
@@ -342,25 +300,7 @@ WRITE8_MEMBER(taitol_state::rambankswitch_w)
if (m_cur_rambank[offset] != data)
{
m_cur_rambank[offset] = data;
- //logerror("rabs %d, %02x (%04x)\n", offset, data, m_main_cpu->pc());
- if (data >= 0x14 && data <= 0x1f)
- {
- data -= 0x14;
- m_current_notifier[offset] = rambank_modify_notifiers[data].notifier;
- m_current_base[offset] = m_rambanks + rambank_modify_notifiers[data].offset;
- }
- else if (data == 0x80)
- {
- m_current_notifier[offset] = &taitol_state::palette_notifier;
- m_current_base[offset] = m_palette_ram;
- }
- else
- {
- logerror("unknown rambankswitch %d, %02x (%04x)\n", offset, data, m_main_cpu->pc());
- m_current_notifier[offset] = nullptr;
- m_current_base[offset] = m_empty_ram;
- }
- m_ram_bnks[offset]->set_base(m_current_base[offset]);
+ m_ram_bnks[offset]->set_bank(m_cur_rambank[offset]);
}
}
@@ -369,36 +309,6 @@ READ8_MEMBER(taitol_state::rambankswitch_r)
return m_cur_rambank[offset];
}
-void taitol_state::bank_w(address_space &space, offs_t offset, u8 data, int banknum )
-{
- if (m_current_base[banknum][offset] != data)
- {
- m_current_base[banknum][offset] = data;
- if (m_current_notifier[banknum])
- (this->*m_current_notifier[banknum])(offset);
- }
-}
-
-WRITE8_MEMBER(taitol_state::bank0_w)
-{
- bank_w(space, offset, data, 0);
-}
-
-WRITE8_MEMBER(taitol_state::bank1_w)
-{
- bank_w(space, offset, data, 1);
-}
-
-WRITE8_MEMBER(taitol_state::bank2_w)
-{
- bank_w(space, offset, data, 2);
-}
-
-WRITE8_MEMBER(taitol_state::bank3_w)
-{
- bank_w(space, offset, data, 3);
-}
-
WRITE8_MEMBER(taitol_state::coin_control_w)
{
machine().bookkeeping().coin_lockout_w(0, ~data & 0x01);
@@ -469,11 +379,11 @@ WRITE8_MEMBER(champwr_state::msm5205_volume_w)
ADDRESS_MAP_START(taitol_state::common_banks_map)
AM_RANGE(0x0000, 0x5fff) AM_ROM
- AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1")
- AM_RANGE(0xc000, 0xcfff) AM_ROMBANK("bank2") AM_WRITE(bank0_w)
- AM_RANGE(0xd000, 0xdfff) AM_ROMBANK("bank3") AM_WRITE(bank1_w)
- AM_RANGE(0xe000, 0xefff) AM_ROMBANK("bank4") AM_WRITE(bank2_w)
- AM_RANGE(0xf000, 0xfdff) AM_ROMBANK("bank5") AM_WRITE(bank3_w)
+ AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("mainbank")
+ AM_RANGE(0xc000, 0xcfff) AM_DEVICE("rambank1", address_map_bank_device, amap8)
+ AM_RANGE(0xd000, 0xdfff) AM_DEVICE("rambank2", address_map_bank_device, amap8)
+ AM_RANGE(0xe000, 0xefff) AM_DEVICE("rambank3", address_map_bank_device, amap8)
+ AM_RANGE(0xf000, 0xfdff) AM_DEVICE("rambank4", address_map_bank_device, amap8)
AM_RANGE(0xfe00, 0xfe03) AM_READWRITE(taitol_bankc_r, taitol_bankc_w)
AM_RANGE(0xfe04, 0xfe04) AM_READWRITE(taitol_control_r, taitol_control_w)
AM_RANGE(0xff00, 0xff02) AM_READWRITE(irq_adr_r, irq_adr_w)
@@ -483,6 +393,12 @@ ADDRESS_MAP_START(taitol_state::common_banks_map)
ADDRESS_MAP_END
+ADDRESS_MAP_START(taitol_state::tc0090lvc_map)
+ AM_RANGE(0x10000, 0x1ffff) AM_RAM_WRITE(vram_w) AM_SHARE("vram")
+ AM_RANGE(0x80000, 0x801ff) AM_MIRROR(0x00e00) AM_RAM_DEVWRITE("palette", palette_device, write8) AM_SHARE("palette")
+ADDRESS_MAP_END
+
+
ADDRESS_MAP_START(fhawk_state::fhawk_map)
AM_IMPORT_FROM(common_banks_map)
AM_RANGE(0x8000, 0x9fff) AM_RAM AM_SHARE("share1")
@@ -491,7 +407,7 @@ ADDRESS_MAP_END
ADDRESS_MAP_START(fhawk_state::fhawk_2_map)
AM_RANGE(0x0000, 0x7fff) AM_ROM
- AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank6")
+ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("slavebank")
AM_RANGE(0xc000, 0xc000) AM_WRITE(rombank2switch_w)
AM_RANGE(0xc800, 0xc800) AM_READNOP AM_DEVWRITE("ciu", pc060ha_device, master_port_w)
AM_RANGE(0xc801, 0xc801) AM_DEVREADWRITE("ciu", pc060ha_device, master_comm_r, master_comm_w)
@@ -501,7 +417,7 @@ ADDRESS_MAP_END
ADDRESS_MAP_START(fhawk_state::fhawk_3_map)
AM_RANGE(0x0000, 0x3fff) AM_ROM
- AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank7")
+ AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("audiobank")
AM_RANGE(0x8000, 0x9fff) AM_RAM
AM_RANGE(0xe000, 0xe000) AM_READNOP AM_DEVWRITE("ciu", pc060ha_device, slave_port_w)
AM_RANGE(0xe001, 0xe001) AM_DEVREADWRITE("ciu", pc060ha_device, slave_comm_r, slave_comm_w)
@@ -527,12 +443,12 @@ ADDRESS_MAP_END
WRITE8_MEMBER(taitol_2cpu_state::sound_bankswitch_w)
{
- m_audio_bnk->set_base(&m_audio_prg[(data & 0x03) * 0x4000]);
+ m_audio_bnk->set_entry(data & 0x03);
}
ADDRESS_MAP_START(taitol_2cpu_state::raimais_3_map)
AM_RANGE(0x0000, 0x3fff) AM_ROM
- AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank7")
+ AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("audiobank")
AM_RANGE(0xc000, 0xdfff) AM_RAM
AM_RANGE(0xe000, 0xe003) AM_DEVREADWRITE("ymsnd", ym2610_device, read, write)
AM_RANGE(0xe200, 0xe200) AM_READNOP AM_DEVWRITE("tc0140syt", tc0140syt_device, slave_port_w)
@@ -553,7 +469,7 @@ ADDRESS_MAP_END
ADDRESS_MAP_START(champwr_state::champwr_2_map)
AM_RANGE(0x0000, 0x7fff) AM_ROM
- AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank6")
+ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("slavebank")
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_SHARE("share1")
AM_RANGE(0xe000, 0xe007) AM_DEVREADWRITE("tc0220ioc", tc0220ioc_device, read, write)
AM_RANGE(0xe008, 0xe00f) AM_READNOP
@@ -564,7 +480,7 @@ ADDRESS_MAP_END
ADDRESS_MAP_START(champwr_state::champwr_3_map)
AM_RANGE(0x0000, 0x3fff) AM_ROM
- AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank7")
+ AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("audiobank")
AM_RANGE(0x8000, 0x8fff) AM_RAM
AM_RANGE(0x9000, 0x9001) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
AM_RANGE(0xa000, 0xa000) AM_READNOP AM_DEVWRITE("ciu", pc060ha_device, slave_port_w)
@@ -669,7 +585,7 @@ ADDRESS_MAP_START(taitol_2cpu_state::evilston_2_map)
AM_RANGE(0xc000, 0xdfff) AM_RAM
AM_RANGE(0xe000, 0xe7ff) AM_DEVREADWRITE("dpram", mb8421_device, left_r, left_w)
AM_RANGE(0xe800, 0xe801) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
- AM_RANGE(0xf000, 0xf7ff) AM_ROMBANK("bank7")
+ AM_RANGE(0xf000, 0xf7ff) AM_ROMBANK("audiobank")
ADDRESS_MAP_END
@@ -1489,7 +1405,7 @@ static const gfx_layout sp2_layout =
static const gfx_layout char_layout =
{
8, 8,
- 1024,
+ 0x10000 / (8*4),
4,
{ 8, 12, 0, 4 },
{ 3, 2, 1, 0, 19, 18, 17, 16},
@@ -1500,27 +1416,32 @@ static const gfx_layout char_layout =
static GFXDECODE_START( taito_l )
- GFXDECODE_ENTRY( "gfx1", 0, bg2_layout, 0, 16 )
- GFXDECODE_ENTRY( "gfx1", 0, sp2_layout, 0, 16 )
- GFXDECODE_ENTRY( nullptr, 0, char_layout, 0, 16 ) // Ram-based
+ GFXDECODE_ENTRY( "gfx1", 0, bg2_layout, 0, 16 )
+ GFXDECODE_ENTRY( "gfx1", 0, sp2_layout, 0, 16 )
+ GFXDECODE_RAM( "vram", 0, char_layout, 0, 16 ) // Ram-based
GFXDECODE_END
WRITE8_MEMBER(fhawk_state::portA_w)
{
- if (m_cur_audio_bnk != (data & 0x03))
- {
- int bankaddress;
-
- m_cur_audio_bnk = data & 0x03;
- bankaddress = m_cur_audio_bnk * 0x4000;
- m_audio_bnk->set_base(&m_audio_prg[bankaddress]);
- //logerror ("YM2203 bank change val=%02x %s\n", m_cur_audio_bnk, machine().describe_context() );
- }
+ m_audio_bnk->set_entry(data & 0x03);
+ //logerror ("YM2203 bank change val=%02x %s\n", data & 0x03, machine().describe_context() );
}
+#define TC0090LVC_BANK_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, ADDRESS_MAP_BANK, 0) \
+ MCFG_DEVICE_PROGRAM_MAP(tc0090lvc_map) \
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) \
+ MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) \
+ MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(20) \
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000)
MACHINE_CONFIG_START(taitol_state::l_system_video)
+ TC0090LVC_BANK_ADD("rambank1")
+ TC0090LVC_BANK_ADD("rambank2")
+ TC0090LVC_BANK_ADD("rambank3")
+ TC0090LVC_BANK_ADD("rambank4")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
@@ -1532,6 +1453,7 @@ MACHINE_CONFIG_START(taitol_state::l_system_video)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", taito_l)
MCFG_PALETTE_ADD("palette", 256)
+ MCFG_PALETTE_FORMAT(xRGBRRRRGGGGBBBB_bit0)
MCFG_VIDEO_START_OVERRIDE(taitol_state, taito_l)
@@ -2426,11 +2348,13 @@ ROM_END
DRIVER_INIT_MEMBER(taitol_1cpu_state, plottinga)
{
u8 tab[256];
+ u8 *RAM = m_main_prg->base();
+
for (unsigned i = 0; i < sizeof(tab); i++)
tab[i] = bitswap<8>(i, 0, 1, 2, 3, 4, 5, 6, 7);
- for (unsigned i = 0; i < m_main_prg.length(); i++)
- m_main_prg[i] = tab[m_main_prg[i]];
+ for (unsigned i = 0; i < m_main_prg->bytes(); i++)
+ RAM[i] = tab[RAM[i]];
}