From 5deafe11fb003eb4575e5e14f24b7fdb0c8b1a64 Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 22 Feb 2018 22:22:48 +0900 Subject: [PATCH] taito_l : Cleanups (#3224) * taito_l.cpp : Convert vram banks to address_map_bank_device, Cleanup duplicates * taito_l : Cleanup duplicates * taito_l : Fix compiles --- src/mame/drivers/taito_l.cpp | 186 +++++++++++------------------------ src/mame/includes/taito_l.h | 73 +++++--------- src/mame/video/taito_l.cpp | 159 ++++++++++-------------------- 3 files changed, 133 insertions(+), 285 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]]; } diff --git a/src/mame/includes/taito_l.h b/src/mame/includes/taito_l.h index 05d59223c5e..8824f290749 100644 --- a/src/mame/includes/taito_l.h +++ b/src/mame/includes/taito_l.h @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert #include "machine/74157.h" +#include "machine/bankdev.h" #include "machine/timer.h" #include "machine/upd4701.h" #include "sound/msm5205.h" @@ -15,10 +16,11 @@ public: , m_main_cpu(*this, "maincpu") , m_upd4701(*this, "upd4701") , m_main_prg(*this, "maincpu") - , m_main_bnk(*this, "bank1") - , m_ram_bnks(*this, "bank%u", 2) + , m_main_bnk(*this, "mainbank") + , m_ram_bnks(*this, "rambank%u", 1) , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") + , m_vram(*this, "vram") { } @@ -28,30 +30,22 @@ public: u8 * m_shared_ram; /* video-related */ - tilemap_t *m_bg18_tilemap; - tilemap_t *m_bg19_tilemap; - tilemap_t *m_ch1a_tilemap; - u8 m_buff_spriteram[SPRITERAM_SIZE]; + tilemap_t *m_bg_tilemap[2]; + tilemap_t *m_tx_tilemap; + std::unique_ptr m_buff_spriteram; int m_cur_ctrl; int m_horshoes_gfxbank; int m_bankc[4]; int m_flipscreen; /* misc */ - void (taitol_state::*m_current_notifier[4])(int); - u8 *m_current_base[4]; - int m_cur_rombank; int m_cur_rambank[4]; int m_irq_adr_table[3]; int m_irq_enable; int m_last_irq_level; int m_high; - - /* memory buffers */ - u8 m_rambanks[0x1000 * 12]; - u8 m_palette_ram[0x1000]; - u8 m_empty_ram[0x1000]; + DECLARE_WRITE8_MEMBER(irq_adr_w); DECLARE_READ8_MEMBER(irq_adr_r); DECLARE_WRITE8_MEMBER(irq_enable_w); @@ -60,10 +54,6 @@ public: DECLARE_READ8_MEMBER(rombankswitch_r); DECLARE_WRITE8_MEMBER(rambankswitch_w); DECLARE_READ8_MEMBER(rambankswitch_r); - DECLARE_WRITE8_MEMBER(bank0_w); - DECLARE_WRITE8_MEMBER(bank1_w); - DECLARE_WRITE8_MEMBER(bank2_w); - DECLARE_WRITE8_MEMBER(bank3_w); DECLARE_WRITE8_MEMBER(coin_control_w); DECLARE_WRITE8_MEMBER(mcu_control_w); DECLARE_READ8_MEMBER(mcu_control_r); @@ -71,9 +61,9 @@ public: DECLARE_READ8_MEMBER(taitol_bankc_r); DECLARE_WRITE8_MEMBER(taitol_control_w); DECLARE_READ8_MEMBER(taitol_control_r); - TILE_GET_INFO_MEMBER(get_bg18_tile_info); - TILE_GET_INFO_MEMBER(get_bg19_tile_info); - TILE_GET_INFO_MEMBER(get_ch1a_tile_info); + DECLARE_WRITE8_MEMBER(vram_w); + template TILE_GET_INFO_MEMBER(get_tile_info); + TILE_GET_INFO_MEMBER(get_tx_tile_info); DECLARE_MACHINE_START(taito_l); DECLARE_VIDEO_START(taito_l); DECLARE_MACHINE_RESET(taito_l); @@ -81,35 +71,24 @@ public: DECLARE_WRITE_LINE_MEMBER(screen_vblank_taitol); TIMER_DEVICE_CALLBACK_MEMBER(vbl_interrupt); IRQ_CALLBACK_MEMBER(irq_callback); - void taitol_chardef14_m(int offset); - void taitol_chardef15_m(int offset); - void taitol_chardef16_m(int offset); - void taitol_chardef17_m(int offset); - void taitol_chardef1c_m(int offset); - void taitol_chardef1d_m(int offset); - void taitol_chardef1e_m(int offset); - void taitol_chardef1f_m(int offset); - void taitol_bg18_m(int offset); - void taitol_bg19_m(int offset); - void taitol_char1a_m(int offset); - void taitol_obj1b_m(int offset); void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void palette_notifier(int addr); - void bank_w(address_space &space, offs_t offset, u8 data, int banknum); void l_system_video(machine_config &config); void common_banks_map(address_map &map); + void tc0090lvc_map(address_map &map); protected: virtual void state_register(); virtual void taito_machine_reset(); - required_device m_main_cpu; - optional_device m_upd4701; - required_region_ptr m_main_prg; - required_memory_bank m_main_bnk; - required_memory_bank_array<4> m_ram_bnks; - required_device m_gfxdecode; - required_device m_palette; + required_device m_main_cpu; + optional_device m_upd4701; + required_memory_region m_main_prg; + required_memory_bank m_main_bnk; + required_device_array m_ram_bnks; + required_device m_gfxdecode; + required_device m_palette; + + required_shared_ptr m_vram; }; @@ -120,7 +99,7 @@ public: : taitol_state(mconfig, type, tag) , m_audio_cpu(*this, "audiocpu") , m_audio_prg(*this, "audiocpu") - , m_audio_bnk(*this, "bank7") + , m_audio_bnk(*this, "audiobank") { } @@ -141,7 +120,7 @@ protected: virtual void taito_machine_reset() override; required_device m_audio_cpu; - required_region_ptr m_audio_prg; + required_memory_region m_audio_prg; optional_memory_bank m_audio_bnk; }; @@ -152,10 +131,9 @@ public: fhawk_state(const machine_config &mconfig, device_type type, const char *tag) : taitol_2cpu_state(mconfig, type, tag) , m_slave_prg(*this, "slave") - , m_slave_bnk(*this, "bank6") + , m_slave_bnk(*this, "slavebank") , m_cur_rombank2(0) , m_high2(0) - , m_cur_audio_bnk(0) { } @@ -171,12 +149,11 @@ protected: virtual void state_register() override; virtual void taito_machine_reset() override; - required_region_ptr m_slave_prg; + required_memory_region m_slave_prg; required_memory_bank m_slave_bnk; u8 m_cur_rombank2; u8 m_high2; - u8 m_cur_audio_bnk; }; diff --git a/src/mame/video/taito_l.cpp b/src/mame/video/taito_l.cpp index ae5e3f26ce2..908697ddda1 100644 --- a/src/mame/video/taito_l.cpp +++ b/src/mame/video/taito_l.cpp @@ -4,16 +4,19 @@ #include "includes/taito_l.h" #include "screen.h" +#include + /*************************************************************************** Callbacks for the TileMap code ***************************************************************************/ -TILE_GET_INFO_MEMBER(taitol_state::get_bg18_tile_info) +template +TILE_GET_INFO_MEMBER(taitol_state::get_tile_info) { - int attr = m_rambanks[2 * tile_index + 0x8000 + 1]; - int code = m_rambanks[2 * tile_index + 0x8000] + int attr = m_vram[2 * tile_index + Offset + 1]; + int code = m_vram[2 * tile_index + Offset] | ((attr & 0x03) << 8) | ((m_bankc[(attr & 0xc) >> 2]) << 10) | (m_horshoes_gfxbank << 12); @@ -24,24 +27,10 @@ TILE_GET_INFO_MEMBER(taitol_state::get_bg18_tile_info) 0); } -TILE_GET_INFO_MEMBER(taitol_state::get_bg19_tile_info) +TILE_GET_INFO_MEMBER(taitol_state::get_tx_tile_info) { - int attr = m_rambanks[2 * tile_index + 0x9000 + 1]; - int code = m_rambanks[2 * tile_index + 0x9000] - | ((attr & 0x03) << 8) - | ((m_bankc[(attr & 0xc) >> 2]) << 10) - | (m_horshoes_gfxbank << 12); - - SET_TILE_INFO_MEMBER(0, - code, - (attr & 0xf0) >> 4, - 0); -} - -TILE_GET_INFO_MEMBER(taitol_state::get_ch1a_tile_info) -{ - int attr = m_rambanks[2 * tile_index + 0xa000 + 1]; - int code = m_rambanks[2 * tile_index + 0xa000] | ((attr & 0x01) << 8) | ((attr & 0x04) << 7); + int attr = m_vram[2 * tile_index + 0xa000 + 1]; + int code = m_vram[2 * tile_index + 0xa000] | ((attr & 0x07) << 8); SET_TILE_INFO_MEMBER(2, code, @@ -59,21 +48,24 @@ TILE_GET_INFO_MEMBER(taitol_state::get_ch1a_tile_info) VIDEO_START_MEMBER(taitol_state, taito_l) { + m_buff_spriteram = make_unique_clear(SPRITERAM_SIZE); int i; - m_bg18_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taitol_state::get_bg18_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); - m_bg19_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taitol_state::get_bg19_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); - m_ch1a_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taitol_state::get_ch1a_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taitol_state::get_tile_info<0x8000>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taitol_state::get_tile_info<0x9000>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taitol_state::get_tx_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); - m_bg18_tilemap->set_transparent_pen(0); - m_ch1a_tilemap->set_transparent_pen(0); + m_bg_tilemap[0]->set_transparent_pen(0); + m_tx_tilemap->set_transparent_pen(0); for (i = 0; i < 256; i++) m_palette->set_pen_color(i, rgb_t(0, 0, 0)); - m_ch1a_tilemap->set_scrolldx(-8, -8); - m_bg18_tilemap->set_scrolldx(28, -11); - m_bg19_tilemap->set_scrolldx(38, -21); + m_tx_tilemap->set_scrolldx(-8, -8); + m_bg_tilemap[0]->set_scrolldx(28, -11); + m_bg_tilemap[1]->set_scrolldx(38, -21); + + save_pointer(NAME(m_buff_spriteram.get()), SPRITERAM_SIZE); } @@ -90,8 +82,8 @@ WRITE8_MEMBER(horshoes_state::bankg_w) { m_horshoes_gfxbank = data; - m_bg18_tilemap->mark_all_dirty(); - m_bg19_tilemap->mark_all_dirty(); + for (int i = 0; i < 2; i++) + m_bg_tilemap[i]->mark_all_dirty(); } } @@ -102,8 +94,8 @@ WRITE8_MEMBER(taitol_state::taitol_bankc_w) m_bankc[offset] = data; // logerror("Bankc %d, %02x (%s)\n", offset, data, m_maincpu->pc()); - m_bg18_tilemap->mark_all_dirty(); - m_bg19_tilemap->mark_all_dirty(); + for (int i = 0; i < 2; i++) + m_bg_tilemap[i]->mark_all_dirty(); } } @@ -139,73 +131,30 @@ READ8_MEMBER(taitol_state::taitol_control_r) return m_cur_ctrl; } -void taitol_state::taitol_chardef14_m( int offset ) +WRITE8_MEMBER(taitol_state::vram_w) { - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 0); -} + // TODO : 0x10000-0x13fff Unused? + if ((offset & 0xc000) == 0) + return; -void taitol_state::taitol_chardef15_m( int offset ) -{ - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 128); -} + if((m_vram[offset] & mem_mask) == (data & mem_mask)) + return; -void taitol_state::taitol_chardef16_m( int offset ) -{ - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 256); -} - -void taitol_state::taitol_chardef17_m( int offset ) -{ - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 384); -} - -void taitol_state::taitol_chardef1c_m( int offset ) -{ - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 512); -} - -void taitol_state::taitol_chardef1d_m( int offset ) -{ - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 640); -} - -void taitol_state::taitol_chardef1e_m( int offset ) -{ - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 768); -} - -void taitol_state::taitol_chardef1f_m( int offset ) -{ - m_gfxdecode->gfx(2)->mark_dirty(offset / 32 + 896); -} - -void taitol_state::taitol_bg18_m( int offset ) -{ - m_bg18_tilemap->mark_tile_dirty(offset / 2); -} - -void taitol_state::taitol_bg19_m( int offset ) -{ - m_bg19_tilemap->mark_tile_dirty(offset / 2); -} - -void taitol_state::taitol_char1a_m( int offset ) -{ - m_ch1a_tilemap->mark_tile_dirty(offset / 2); -} - -void taitol_state::taitol_obj1b_m( int offset ) -{ -#if 0 - if (offset >= 0x3f0 && offset <= 0x3ff) + COMBINE_DATA(&m_vram[offset]); + m_gfxdecode->gfx(2)->mark_dirty(offset / 32); + switch (offset & 0xf000) { - /* scroll, handled in vh-screenrefresh */ + case 0x8000: + case 0x9000: + m_bg_tilemap[(offset >> 12) & 1]->mark_tile_dirty((offset & 0xfff) / 2); + break; + case 0xa000: + m_tx_tilemap->mark_tile_dirty((offset & 0xfff) / 2); + break; } -#endif } - /*************************************************************************** Display refresh @@ -271,36 +220,36 @@ uint32_t taitol_state::screen_update_taitol(screen_device &screen, bitmap_ind16 { int dx, dy; - dx = m_rambanks[0xb3f4] | (m_rambanks[0xb3f5] << 8); + dx = m_vram[0xb3f4] | (m_vram[0xb3f5] << 8); if (m_flipscreen) dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; - dy = m_rambanks[0xb3f6]; + dy = m_vram[0xb3f6]; - m_bg18_tilemap->set_scrollx(0, -dx); - m_bg18_tilemap->set_scrolly(0, -dy); + m_bg_tilemap[0]->set_scrollx(0, -dx); + m_bg_tilemap[0]->set_scrolly(0, -dy); - dx = m_rambanks[0xb3fc] | (m_rambanks[0xb3fd] << 8); + dx = m_vram[0xb3fc] | (m_vram[0xb3fd] << 8); if (m_flipscreen) dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; - dy = m_rambanks[0xb3fe]; + dy = m_vram[0xb3fe]; - m_bg19_tilemap->set_scrollx(0, -dx); - m_bg19_tilemap->set_scrolly(0, -dy); + m_bg_tilemap[1]->set_scrollx(0, -dx); + m_bg_tilemap[1]->set_scrolly(0, -dy); if (m_cur_ctrl & 0x20) /* display enable */ { screen.priority().fill(0, cliprect); - m_bg19_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); if (m_cur_ctrl & 0x08) /* sprites always over BG1 */ - m_bg18_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0); else /* split priority */ - m_bg18_tilemap->draw(screen, bitmap, cliprect, 0,1); + m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,1); draw_sprites(screen, bitmap, cliprect); - m_ch1a_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0); } else bitmap.fill(m_palette->pen(0), cliprect); @@ -314,8 +263,6 @@ WRITE_LINE_MEMBER(taitol_state::screen_vblank_taitol) // rising edge if (state) { - uint8_t *spriteram = m_rambanks + 0xb000; - - memcpy(m_buff_spriteram, spriteram, SPRITERAM_SIZE); + std::copy(&m_vram[0xb000], &m_vram[0xb000+SPRITERAM_SIZE], &m_buff_spriteram[0]); } }