1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles, Zsolt Vasvari 3 // thanks-to: John Butler, Ed Mueller 4 /*************************************************************************** 5 6 Taito Qix hardware 7 8 ***************************************************************************/ 9 #ifndef MAME_INCLUDES_QIX_H 10 #define MAME_INCLUDES_QIX_H 11 12 #pragma once 13 14 #include "cpu/m6809/m6809.h" 15 #include "cpu/m6805/m68705.h" 16 17 #include "machine/6821pia.h" 18 19 #include "sound/discrete.h" 20 #include "sound/sn76496.h" 21 22 #include "video/mc6845.h" 23 24 #include "screen.h" 25 26 27 #define MAIN_CLOCK_OSC 20000000 /* 20 MHz */ 28 #define SLITHER_CLOCK_OSC 21300000 /* 21.3 MHz */ 29 #define SOUND_CLOCK_OSC 7372800 /* 7.3728 MHz */ 30 #define COIN_CLOCK_OSC 4000000 /* 4 MHz */ 31 #define QIX_CHARACTER_CLOCK (20000000/2/16) 32 33 class qix_state : public driver_device 34 { 35 public: qix_state(const machine_config & mconfig,device_type type,const char * tag)36 qix_state(const machine_config &mconfig, device_type type, const char *tag) : 37 driver_device(mconfig, type, tag), 38 m_maincpu(*this, "maincpu"), 39 m_audiocpu(*this, "audiocpu"), 40 m_videocpu(*this, "videocpu"), 41 m_crtc(*this, "vid_u18"), 42 m_pia0(*this, "pia0"), 43 m_pia1(*this, "pia1"), 44 m_pia2(*this, "pia2"), 45 m_sndpia0(*this, "sndpia0"), 46 m_sndpia1(*this, "sndpia1"), 47 m_sndpia2(*this, "sndpia2"), 48 m_sn1(*this, "sn1"), 49 m_sn2(*this, "sn2"), 50 m_discrete(*this, "discrete"), 51 m_paletteram(*this, "paletteram"), 52 m_videoram(*this, "videoram"), 53 m_videoram_address(*this, "videoram_addr"), 54 m_videoram_mask(*this, "videoram_mask"), 55 m_scanline_latch(*this, "scanline_latch"), 56 m_bank0(*this, "bank0"), 57 m_bank1(*this, "bank1"), 58 m_screen(*this, "screen") 59 { } 60 61 void qix_base(machine_config &config); 62 void qix(machine_config &config); 63 void qix_video(machine_config &config); 64 void qix_audio(machine_config &config); 65 void kram3(machine_config &config); 66 void kram3_video(machine_config &config); 67 void slither(machine_config &config); 68 void slither_video(machine_config &config); 69 void slither_audio(machine_config &config); 70 71 void init_kram3(); 72 73 protected: 74 virtual void video_start() override; 75 76 /* devices */ 77 required_device<mc6809e_device> m_maincpu; 78 optional_device<cpu_device> m_audiocpu; 79 required_device<mc6809e_device> m_videocpu; 80 required_device<mc6845_device> m_crtc; 81 required_device<pia6821_device> m_pia0; 82 required_device<pia6821_device> m_pia1; 83 required_device<pia6821_device> m_pia2; 84 required_device<pia6821_device> m_sndpia0; 85 optional_device<pia6821_device> m_sndpia1; 86 optional_device<pia6821_device> m_sndpia2; 87 optional_device<sn76489_device> m_sn1; 88 optional_device<sn76489_device> m_sn2; 89 optional_device<discrete_sound_device> m_discrete; 90 91 /* video state */ 92 required_shared_ptr<uint8_t> m_paletteram; 93 optional_shared_ptr<uint8_t> m_videoram; 94 required_shared_ptr<uint8_t> m_videoram_address; 95 optional_shared_ptr<uint8_t> m_videoram_mask; 96 required_shared_ptr<uint8_t> m_scanline_latch; 97 uint8_t m_flip; 98 uint8_t m_palette_bank; 99 uint8_t m_leds; 100 101 optional_memory_bank m_bank0; 102 optional_memory_bank m_bank1; 103 required_device<screen_device> m_screen; 104 105 pen_t m_pens[0x400]; 106 void qix_data_firq_w(uint8_t data); 107 void qix_data_firq_ack_w(uint8_t data); 108 uint8_t qix_data_firq_r(address_space &space); 109 uint8_t qix_data_firq_ack_r(address_space &space); 110 void qix_video_firq_w(uint8_t data); 111 void qix_video_firq_ack_w(uint8_t data); 112 uint8_t qix_video_firq_r(address_space &space); 113 uint8_t qix_video_firq_ack_r(address_space &space); 114 uint8_t qix_videoram_r(offs_t offset); 115 void qix_videoram_w(offs_t offset, uint8_t data); 116 void slither_videoram_w(offs_t offset, uint8_t data); 117 uint8_t qix_addresslatch_r(offs_t offset); 118 void qix_addresslatch_w(offs_t offset, uint8_t data); 119 void slither_addresslatch_w(offs_t offset, uint8_t data); 120 void qix_paletteram_w(offs_t offset, uint8_t data); 121 void qix_palettebank_w(uint8_t data); 122 123 TIMER_CALLBACK_MEMBER(pia_w_callback); 124 TIMER_CALLBACK_MEMBER(deferred_sndpia1_porta_w); 125 DECLARE_WRITE_LINE_MEMBER(qix_vsync_changed); 126 void qix_pia_w(offs_t offset, uint8_t data); 127 void qix_coinctl_w(uint8_t data); 128 void slither_76489_0_w(uint8_t data); 129 void slither_76489_1_w(uint8_t data); 130 uint8_t slither_trak_lr_r(); 131 uint8_t slither_trak_ud_r(); 132 DECLARE_WRITE_LINE_MEMBER(display_enable_changed); 133 DECLARE_WRITE_LINE_MEMBER(qix_flip_screen_w); 134 void qix_dac_w(uint8_t data); 135 void qix_vol_w(uint8_t data); 136 void sndpia_2_warning_w(uint8_t data); 137 void sync_sndpia1_porta_w(uint8_t data); 138 void slither_coinctl_w(uint8_t data); 139 DECLARE_WRITE_LINE_MEMBER(qix_pia_dint); 140 DECLARE_WRITE_LINE_MEMBER(qix_pia_sint); 141 MC6845_BEGIN_UPDATE(crtc_begin_update); 142 MC6845_UPDATE_ROW(crtc_update_row); 143 void set_pen(int offs); 144 int kram3_permut1(int idx, int value); 145 int kram3_permut2(int tbl_index, int idx, const uint8_t *xor_table); 146 int kram3_decrypt(int address, int value); 147 DECLARE_WRITE_LINE_MEMBER(kram3_lic_maincpu_changed); 148 DECLARE_WRITE_LINE_MEMBER(kram3_lic_videocpu_changed); 149 150 void audio_map(address_map &map); 151 void kram3_main_map(address_map &map); 152 void kram3_video_map(address_map &map); 153 void main_map(address_map &map); 154 void qix_video_map(address_map &map); 155 void slither_video_map(address_map &map); 156 }; 157 158 class qixmcu_state : public qix_state 159 { 160 public: qixmcu_state(const machine_config & mconfig,device_type type,const char * tag)161 qixmcu_state(const machine_config &mconfig, device_type type, const char *tag) : 162 qix_state(mconfig, type, tag), 163 m_mcu(*this, "mcu") 164 { } 165 166 void mcu(machine_config &config); 167 168 protected: 169 virtual void machine_start() override; 170 171 optional_device<m68705p_device> m_mcu; 172 173 private: 174 uint8_t coin_r(); 175 void coin_w(uint8_t data); 176 void coinctrl_w(uint8_t data); 177 178 uint8_t mcu_portb_r(); 179 uint8_t mcu_portc_r(); 180 void mcu_porta_w(uint8_t data); 181 void mcu_portb_w(uint8_t data); 182 183 /* machine state */ 184 uint8_t m_68705_porta_out; 185 uint8_t m_coinctrl; 186 }; 187 188 class zookeep_state : public qixmcu_state 189 { 190 public: zookeep_state(const machine_config & mconfig,device_type type,const char * tag)191 zookeep_state(const machine_config &mconfig, device_type type, const char *tag) : 192 qixmcu_state(mconfig, type, tag), 193 m_vidbank(*this, "bank1") 194 { } 195 196 void zookeep(machine_config &config); 197 void zookeepbl(machine_config &config); 198 void video(machine_config &config); 199 200 protected: 201 virtual void machine_start() override; 202 203 private: 204 void bankswitch_w(uint8_t data); 205 206 void main_map(address_map &map); 207 void video_map(address_map &map); 208 209 required_memory_bank m_vidbank; 210 }; 211 212 #endif // MAME_INCLUDES_QIX_H 213