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