// 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" #include "sound/2203intf.h" class taitol_state : public driver_device { public: taitol_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_main_cpu(*this, "maincpu") , m_upd4701(*this, "upd4701") , m_main_prg(*this, "maincpu") , m_main_bnk(*this, "mainbank") , m_ram_bnks(*this, "rambank%u", 1) , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") , m_vram(*this, "vram") { } static constexpr size_t SPRITERAM_SIZE = 0x400; /* memory pointers */ u8 * m_shared_ram; /* video-related */ 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 */ 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; DECLARE_WRITE8_MEMBER(irq_adr_w); DECLARE_READ8_MEMBER(irq_adr_r); DECLARE_WRITE8_MEMBER(irq_enable_w); DECLARE_READ8_MEMBER(irq_enable_r); DECLARE_WRITE8_MEMBER(rombankswitch_w); DECLARE_READ8_MEMBER(rombankswitch_r); DECLARE_WRITE8_MEMBER(rambankswitch_w); DECLARE_READ8_MEMBER(rambankswitch_r); DECLARE_WRITE8_MEMBER(coin_control_w); DECLARE_WRITE8_MEMBER(mcu_control_w); DECLARE_READ8_MEMBER(mcu_control_r); DECLARE_WRITE8_MEMBER(taitol_bankc_w); DECLARE_READ8_MEMBER(taitol_bankc_r); DECLARE_WRITE8_MEMBER(taitol_control_w); DECLARE_READ8_MEMBER(taitol_control_r); 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); u32 screen_update_taitol(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(screen_vblank_taitol); TIMER_DEVICE_CALLBACK_MEMBER(vbl_interrupt); IRQ_CALLBACK_MEMBER(irq_callback); void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 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_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; }; class taitol_2cpu_state : public taitol_state { public: taitol_2cpu_state(const machine_config &mconfig, device_type type, const char *tag) : taitol_state(mconfig, type, tag) , m_audio_cpu(*this, "audiocpu") , m_audio_prg(*this, "audiocpu") , m_audio_bnk(*this, "audiobank") { } DECLARE_WRITE8_MEMBER(sound_bankswitch_w); void kurikint(machine_config &config); void evilston(machine_config &config); void raimais(machine_config &config); void evilston_2_map(address_map &map); void evilston_map(address_map &map); void kurikint_2_map(address_map &map); void kurikint_map(address_map &map); void raimais_2_map(address_map &map); void raimais_3_map(address_map &map); void raimais_map(address_map &map); protected: virtual void state_register() override; virtual void taito_machine_reset() override; required_device m_audio_cpu; required_memory_region m_audio_prg; optional_memory_bank m_audio_bnk; }; class fhawk_state : public taitol_2cpu_state { 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, "slavebank") , m_cur_rombank2(0) , m_high2(0) { } DECLARE_WRITE8_MEMBER(rombank2switch_w); DECLARE_READ8_MEMBER(rombank2switch_r); DECLARE_WRITE8_MEMBER(portA_w); void fhawk(machine_config &config); void fhawk_2_map(address_map &map); void fhawk_3_map(address_map &map); void fhawk_map(address_map &map); protected: virtual void state_register() override; virtual void taito_machine_reset() override; required_memory_region m_slave_prg; required_memory_bank m_slave_bnk; u8 m_cur_rombank2; u8 m_high2; }; class champwr_state : public fhawk_state { public: champwr_state(const machine_config &mconfig, device_type type, const char *tag) : fhawk_state(mconfig, type, tag) , m_msm(*this, "msm") , m_adpcm_rgn(*this, "adpcm") , m_adpcm_pos(0) , m_adpcm_data(-1) { } DECLARE_WRITE_LINE_MEMBER(msm5205_vck); DECLARE_WRITE8_MEMBER(msm5205_lo_w); DECLARE_WRITE8_MEMBER(msm5205_hi_w); DECLARE_WRITE8_MEMBER(msm5205_start_w); DECLARE_WRITE8_MEMBER(msm5205_stop_w); DECLARE_WRITE8_MEMBER(msm5205_volume_w); void champwr(machine_config &config); void champwr_2_map(address_map &map); void champwr_3_map(address_map &map); void champwr_map(address_map &map); protected: virtual void state_register() override; virtual void taito_machine_reset() override; required_device m_msm; required_region_ptr m_adpcm_rgn; int m_adpcm_pos; int m_adpcm_data; }; class taitol_1cpu_state : public taitol_state { public: taitol_1cpu_state(const machine_config &mconfig, device_type type, const char *tag) : taitol_state(mconfig, type, tag) , m_ymsnd(*this, "ymsnd") , m_mux(*this, {"dswmux", "inmux"}) { } DECLARE_READ8_MEMBER(extport_select_and_ym2203_r); void init_plottinga(); DECLARE_MACHINE_RESET(plotting); DECLARE_MACHINE_RESET(puzznic); DECLARE_MACHINE_RESET(palamed); DECLARE_MACHINE_RESET(cachat); void palamed(machine_config &config); void plotting(machine_config &config); void puzznici(machine_config &config); void cachat(machine_config &config); void puzznic(machine_config &config); void cachat_map(address_map &map); void palamed_map(address_map &map); void plotting_map(address_map &map); void puzznic_map(address_map &map); void puzznici_map(address_map &map); protected: virtual void state_register() override; virtual void taito_machine_reset() override; required_device m_ymsnd; optional_device_array m_mux; }; class horshoes_state : public taitol_1cpu_state { public: horshoes_state(const machine_config &mconfig, device_type type, const char *tag) : taitol_1cpu_state(mconfig, type, tag) { } DECLARE_WRITE8_MEMBER(bankg_w); DECLARE_MACHINE_RESET(horshoes); void horshoes(machine_config &config); void horshoes_map(address_map &map); };