1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles, Brian Troha 3 /************************************************************************* 4 5 Incredible Technologies/Strata system 6 (32-bit blitter variant) 7 8 **************************************************************************/ 9 #ifndef MAME_INCLUDES_ITECH32_H 10 #define MAME_INCLUDES_ITECH32_H 11 12 #pragma once 13 14 #include "machine/6522via.h" 15 #include "machine/gen_latch.h" 16 #include "machine/nvram.h" 17 #include "machine/ticket.h" 18 #include "machine/timekpr.h" 19 #include "sound/es5506.h" 20 #include "emupal.h" 21 #include "screen.h" 22 23 #define VIDEO_CLOCK XTAL(8'000'000) // video (pixel) clock 24 #define CPU_CLOCK XTAL(12'000'000) // clock for 68000-based systems 25 #define CPU020_CLOCK XTAL(25'000'000) // clock for 68EC020-based systems 26 #define SOUND_CLOCK XTAL(16'000'000) // clock for sound board 27 #define TMS_CLOCK XTAL(40'000'000) // TMS320C31 clocks on drivedge 28 29 30 class itech32_state : public driver_device 31 { 32 public: itech32_state(const machine_config & mconfig,device_type type,const char * tag)33 itech32_state(const machine_config &mconfig, device_type type, const char *tag) : 34 driver_device(mconfig, type, tag), 35 m_maincpu(*this, "maincpu"), 36 m_soundcpu(*this, "soundcpu"), 37 m_via(*this, "via6522_0"), 38 m_ensoniq(*this, "ensoniq"), 39 m_screen(*this, "screen"), 40 m_palette(*this, "palette"), 41 m_ticket(*this, "ticket"), 42 m_timekeeper(*this, "m48t02"), 43 m_soundlatch(*this, "soundlatch"), 44 m_soundlatch2(*this, "soundlatch2"), 45 m_main_ram(*this, "main_ram", 0), 46 m_nvram(*this, "nvram", 0), 47 m_video(*this, "video", 0), 48 m_main_rom(*this, "main_rom", 0), 49 m_grom(*this, "gfx1"), 50 m_soundbank(*this, "soundbank") 51 { } 52 53 void base_devices(machine_config &config); 54 void via(machine_config &config); 55 void tourny(machine_config &config); 56 void sftm(machine_config &config); 57 void bloodstm(machine_config &config); 58 void timekill(machine_config &config); 59 60 void init_gtclasscp(); 61 void init_shufshot(); 62 void init_wcbowlt(); 63 void init_hardyard(); 64 void init_s_ver(); 65 void init_sftm110(); 66 void init_wcbowln(); 67 void init_gt2kp(); 68 void init_sftm(); 69 void init_wcbowl(); 70 void init_wcbowlj(); 71 void init_aamat(); 72 void init_bloodstm(); 73 void init_aama(); 74 void init_timekill(); 75 void init_gt3d(); 76 void init_gt3dl(); 77 78 DECLARE_READ_LINE_MEMBER(special_port_r); 79 80 protected: 81 required_device<cpu_device> m_maincpu; 82 required_device<cpu_device> m_soundcpu; 83 optional_device<via6522_device> m_via; // sftm, wcbowl and gt games don't have the via 84 required_device<es5506_device> m_ensoniq; 85 required_device<screen_device> m_screen; 86 required_device<palette_device> m_palette; 87 required_device<ticket_dispenser_device> m_ticket; 88 optional_device<timekeeper_device> m_timekeeper; 89 required_device<generic_latch_8_device> m_soundlatch; 90 optional_device<generic_latch_8_device> m_soundlatch2; 91 92 optional_shared_ptr<u16> m_main_ram; 93 optional_shared_ptr<u16> m_nvram; 94 optional_shared_ptr<u16> m_video; 95 optional_shared_ptr<u16> m_main_rom; 96 97 required_region_ptr<u8> m_grom; 98 required_memory_bank m_soundbank; 99 100 virtual void nvram_init(nvram_device &nvram, void *base, size_t length); 101 102 std::unique_ptr<u16[]> m_videoram; 103 u8 m_vint_state; 104 u8 m_xint_state; 105 u8 m_qint_state; 106 u8 m_irq_base; 107 u8 m_sound_return; 108 offs_t m_itech020_prot_address; 109 int m_special_result; 110 int m_p1_effx; 111 int m_p1_effy; 112 int m_p1_lastresult; 113 attotime m_p1_lasttime; 114 int m_p2_effx; 115 int m_p2_effy; 116 int m_p2_lastresult; 117 attotime m_p2_lasttime; 118 u8 m_written[0x8000]; 119 u16 m_xfer_xcount; 120 u16 m_xfer_ycount; 121 u16 m_xfer_xcur; 122 u16 m_xfer_ycur; 123 rectangle m_clip_rect; 124 rectangle m_scaled_clip_rect; 125 rectangle m_clip_save; 126 emu_timer *m_scanline_timer; 127 u32 m_grom_bank; 128 u16 m_color_latch[2]; 129 u8 m_enable_latch[2]; 130 u16 *m_videoplane[2]; 131 132 // configuration at init time 133 u8 m_planes; 134 u16 m_vram_height; 135 u32 m_vram_mask; 136 u32 m_vram_xmask; 137 u32 m_vram_ymask; 138 u32 m_grom_bank_mask; 139 140 void int1_ack_w(u16 data); 141 u8 trackball_r(); 142 u8 trackball_p2_r(); 143 u16 trackball_8bit_r(); 144 u32 trackball32_4bit_p1_r(); 145 u32 trackball32_4bit_p2_r(); 146 u32 trackball32_4bit_combined_r(); 147 u16 wcbowl_prot_result_r(); 148 u8 itech020_prot_result_r(); 149 u32 gt2kp_prot_result_r(); 150 u32 gtclass_prot_result_r(); 151 void sound_bank_w(u8 data); 152 void sound_data_w(u8 data); 153 u8 sound_return_r(); 154 void sound_return_w(u8 data); 155 u8 sound_data_buffer_r(); 156 void sound_control_w(u8 data); 157 void firq_clear_w(u8 data); 158 void timekill_colora_w(u8 data); 159 void timekill_colorbc_w(u8 data); 160 void timekill_intensity_w(u8 data); 161 template<unsigned Layer> void color_w(u8 data); 162 void bloodstm_plane_w(u8 data); 163 void itech020_plane_w(u8 data); 164 void bloodstm_paletteram_w(offs_t offset, u16 data, u16 mem_mask = u16(~0)); 165 void video_w(offs_t offset, u16 data, u16 mem_mask = u16(~0)); 166 u16 video_r(offs_t offset); 167 void bloodstm_video_w(offs_t offset, u16 data, u16 mem_mask = u16(~0)); 168 u16 bloodstm_video_r(offs_t offset); 169 void pia_portb_out(u8 data); 170 171 virtual void machine_start() override; 172 virtual void machine_reset() override; 173 virtual void video_start() override; 174 void init_program_rom(); 175 void init_sftm_common(int prot_addr); 176 void init_shuffle_bowl_common(int prot_addr); 177 void install_timekeeper(); 178 void init_gt_common(); 179 180 u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 181 WRITE_LINE_MEMBER(generate_int1); 182 TIMER_CALLBACK_MEMBER(scanline_interrupt); 183 inline offs_t compute_safe_address(int x, int y); 184 inline void disable_clipping(); 185 inline void enable_clipping(); 186 virtual void logblit(const char *tag); 187 void update_interrupts(int fast); 188 void draw_raw(u16 *base, u16 color); 189 virtual void command_blit_raw(); 190 virtual void command_shift_reg(); 191 inline void draw_rle_fast(u16 *base, u16 color); 192 inline void draw_rle_fast_xflip(u16 *base, u16 color); 193 inline void draw_rle_slow(u16 *base, u16 color); 194 void draw_rle(u16 *base, u16 color); 195 virtual void shiftreg_clear(u16 *base, u16 *zbase); 196 void handle_video_command(); 197 virtual void update_interrupts(int vint, int xint, int qint); 198 void bloodstm_map(address_map &map); 199 void itech020_map(address_map &map); 200 void sound_020_map(address_map &map); 201 void sound_map(address_map &map); 202 void timekill_map(address_map &map); 203 }; 204 205 class drivedge_state : public itech32_state 206 { 207 public: drivedge_state(const machine_config & mconfig,device_type type,const char * tag)208 drivedge_state(const machine_config &mconfig, device_type type, const char *tag) : 209 itech32_state(mconfig, type, tag), 210 m_dsp(*this, "dsp%u", 1U), 211 m_zbuf_control(*this, "zctl"), 212 m_tms1_boot(*this, "tms1_boot"), 213 m_tms1_ram(*this, "tms1_ram"), 214 m_tms2_ram(*this, "tms2_ram"), 215 m_leds(*this, "led%u", 0U), 216 m_steer(*this, "STEER"), 217 m_gas(*this, "GAS") 218 { } 219 220 void drivedge(machine_config &config); 221 222 virtual void driver_init() override; 223 224 protected: 225 virtual void machine_start() override; 226 virtual void machine_reset() override; 227 228 u16 steering_r(); 229 u16 gas_r(); 230 231 u32 tms1_speedup_r(address_space &space); 232 u32 tms2_speedup_r(address_space &space); 233 void tms_reset_assert_w(u32 data); 234 void tms_reset_clear_w(u32 data); 235 void tms1_68k_ram_w(offs_t offset, u32 data, u32 mem_mask = ~0); 236 void tms2_68k_ram_w(offs_t offset, u32 data, u32 mem_mask = ~0); 237 void tms1_trigger_w(offs_t offset, u32 data, u32 mem_mask = ~0); 238 void tms2_trigger_w(offs_t offset, u32 data, u32 mem_mask = ~0); 239 240 void zbuf_control_w(offs_t offset, u32 data, u32 mem_mask = u32(~0)); 241 242 void portb_out(u8 data); 243 DECLARE_WRITE_LINE_MEMBER(turbo_light); 244 245 void main_map(address_map &map); 246 void tms1_map(address_map &map); 247 void tms2_map(address_map &map); 248 virtual void nvram_init(nvram_device &nvram, void *base, size_t length) override; 249 250 virtual void logblit(const char *tag) override; 251 virtual void shiftreg_clear(u16 *base, u16 *zbase) override; 252 virtual void command_blit_raw() override; 253 virtual void command_shift_reg() override; 254 void draw_raw(u16 *base, u16 *zbase, u16 color); 255 256 required_device_array<cpu_device, 2> m_dsp; 257 required_shared_ptr<u32> m_zbuf_control; 258 required_shared_ptr<u32> m_tms1_boot; 259 required_shared_ptr<u32> m_tms1_ram; 260 required_shared_ptr<u32> m_tms2_ram; 261 output_finder<4> m_leds; 262 required_ioport m_steer; 263 required_ioport m_gas; 264 265 u8 m_tms_spinning[2]; 266 }; 267 268 class shoottv_state : public itech32_state 269 { 270 public: shoottv_state(const machine_config & mconfig,device_type type,const char * tag)271 shoottv_state(const machine_config &mconfig, device_type type, const char *tag) : 272 itech32_state(mconfig, type, tag), 273 m_buttons(*this, "P%u", 1U), 274 m_dips(*this, "DIPS"), 275 m_gun_x(*this, "GUNX%u", 1U), 276 m_gun_y(*this, "GUNY%u", 1U), 277 m_nvram_b(*this, "nvram_b", 0), 278 m_gun_timer(nullptr) 279 { } 280 281 void shoottv(machine_config &config); 282 283 private: 284 void driver_init() override; 285 void video_start() override; 286 287 void update_interrupts(int vint, int xint, int qint) override; 288 289 void shoottv_map(address_map &map); 290 291 TIMER_CALLBACK_MEMBER(gun_interrupt); 292 293 required_ioport_array<3> m_buttons; 294 required_ioport m_dips; 295 required_ioport_array<2> m_gun_x; 296 required_ioport_array<2> m_gun_y; 297 optional_shared_ptr<u16> m_nvram_b; 298 emu_timer *m_gun_timer; 299 }; 300 301 #endif // MAME_INCLUDES_ITECH32_H 302