1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Driver for Midway V-Unit games
6 
7 **************************************************************************/
8 
9 #include "audio/dcs.h"
10 #include "bus/ata/ataintf.h"
11 #include "machine/adc0844.h"
12 #include "machine/midwayic.h"
13 #include "machine/timer.h"
14 #include "machine/watchdog.h"
15 #include "video/poly.h"
16 #include "emupal.h"
17 #include "screen.h"
18 
19 #define MIDVUNIT_VIDEO_CLOCK    33000000
20 
21 struct midvunit_object_data
22 {
23 	uint16_t *    destbase;
24 	uint8_t *     texbase;
25 	uint16_t      pixdata;
26 	uint8_t       dither;
27 };
28 
29 class midvunit_state;
30 
31 class midvunit_renderer : public poly_manager<float, midvunit_object_data, 2, 4000>
32 {
33 public:
34 	midvunit_renderer(midvunit_state &state);
35 	void process_dma_queue();
36 	void make_vertices_inclusive(vertex_t *vert);
37 
38 private:
39 	midvunit_state &m_state;
40 
41 	void render_flat(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid);
42 	void render_tex(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid);
43 	void render_textrans(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid);
44 	void render_textransmask(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid);
45 };
46 
47 class midvunit_state : public driver_device
48 {
49 public:
midvunit_state(const machine_config & mconfig,device_type type,const char * tag)50 	midvunit_state(const machine_config &mconfig, device_type type, const char *tag)
51 		: driver_device(mconfig, type, tag),
52 		m_videoram(*this, "videoram", 32),
53 		m_textureram(*this, "textureram"),
54 		m_screen(*this, "screen"),
55 		m_nvram(*this, "nvram"),
56 		m_ram_base(*this, "ram_base"),
57 		m_fastram_base(*this, "fastram_base"),
58 		m_tms32031_control(*this, "32031_control"),
59 		m_midvplus_misc(*this, "midvplus_misc"),
60 		m_maincpu(*this, "maincpu"),
61 		m_watchdog(*this, "watchdog"),
62 		m_palette(*this, "palette"),
63 		m_adc(*this, "adc"),
64 		m_midway_serial_pic2(*this, "serial_pic2"),
65 		m_midway_ioasic(*this, "ioasic"),
66 		m_ata(*this, "ata"),
67 		m_timer(*this, "timer%u", 0U),
68 		m_dcs(*this, "dcs"),
69 		m_generic_paletteram_32(*this, "paletteram"),
70 		m_optional_drivers(*this, "lamp%u", 0U),
71 		m_in1(*this, "IN1"),
72 		m_dsw(*this, "DSW"),
73 		m_motion(*this, "MOTION") { }
74 
75 	void midvcommon(machine_config &config);
76 	void crusnwld(machine_config &config);
77 	void midvplus(machine_config &config);
78 	void offroadc(machine_config &config);
79 	void midvunit(machine_config &config);
80 
81 	void init_crusnu40();
82 	void init_crusnu21();
83 	void init_crusnwld();
84 	void init_wargods();
85 	void init_offroadc();
86 	void init_crusnusa();
87 
88 	uint16_t m_page_control;
89 	uint16_t m_dma_data[16];
90 	uint8_t m_video_changed;
91 
92 	required_shared_ptr<uint16_t> m_videoram;
93 	required_shared_ptr<uint32_t> m_textureram;
94 	required_device<screen_device> m_screen;
95 
96 	DECLARE_CUSTOM_INPUT_MEMBER(motion_r);
97 
98 private:
99 	enum
100 	{
101 		TIMER_SCANLINE
102 	};
103 
104 	optional_shared_ptr<uint32_t> m_nvram;
105 	required_shared_ptr<uint32_t> m_ram_base;
106 	optional_shared_ptr<uint32_t> m_fastram_base;
107 	required_shared_ptr<uint32_t> m_tms32031_control;
108 	optional_shared_ptr<uint32_t> m_midvplus_misc;
109 
110 	uint8_t m_cmos_protected;
111 	uint16_t m_control_data;
112 	uint8_t m_adc_shift;
113 	uint16_t m_last_port0;
114 	uint8_t m_shifter_state;
115 	double m_timer_rate;
116 	uint16_t m_bit_index;
117 	int m_lastval;
118 	uint32_t *m_generic_speedup;
119 	uint16_t m_video_regs[16];
120 	uint8_t m_dma_data_index;
121 	emu_timer *m_scanline_timer;
122 	std::unique_ptr<midvunit_renderer> m_poly;
123 	uint8_t m_galil_input_index;
124 	uint8_t m_galil_input_length;
125 	const char *m_galil_input;
126 	uint8_t m_galil_output_index;
127 	char m_galil_output[450];
128 	uint8_t m_wheel_board_output;
129 	uint32_t m_wheel_board_last;
130 	uint32_t m_wheel_board_u8_latch;
131 	uint8_t m_comm_flags;
132 	uint16_t m_comm_data;
133 	void midvunit_dma_queue_w(uint32_t data);
134 	uint32_t midvunit_dma_queue_entries_r();
135 	uint32_t midvunit_dma_trigger_r(offs_t offset);
136 	void midvunit_page_control_w(uint32_t data);
137 	uint32_t midvunit_page_control_r();
138 	void midvunit_video_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
139 	uint32_t midvunit_scanline_r();
140 	void midvunit_videoram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
141 	uint32_t midvunit_videoram_r(offs_t offset);
142 	void midvunit_paletteram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
143 	void midvunit_textureram_w(offs_t offset, uint32_t data);
144 	uint32_t midvunit_textureram_r(offs_t offset);
145 	uint32_t port0_r();
146 	uint32_t adc_r();
147 	void adc_w(uint32_t data);
148 	void midvunit_cmos_protect_w(uint32_t data);
149 	void midvunit_cmos_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
150 	uint32_t midvunit_cmos_r(offs_t offset);
151 	void midvunit_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
152 	void crusnwld_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
153 	void midvunit_sound_w(uint32_t data);
154 	uint32_t tms32031_control_r(offs_t offset);
155 	void tms32031_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
156 	uint32_t crusnwld_serial_status_r();
157 	uint32_t crusnwld_serial_data_r();
158 	void crusnwld_serial_data_w(uint32_t data);
159 	uint32_t bit_data_r(offs_t offset);
160 	void bit_reset_w(uint32_t data);
161 	uint32_t midvplus_misc_r(offs_t offset);
162 	void midvplus_misc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
163 	void midvplus_xf1_w(uint8_t data);
164 	uint32_t generic_speedup_r(offs_t offset);
165 	uint32_t midvunit_wheel_board_r();
166 	void midvunit_wheel_board_w(uint32_t data);
167 	uint32_t midvunit_intcs_r();
168 	uint32_t midvunit_comcs_r(offs_t offset);
169 	void midvunit_comcs_w(offs_t offset, uint32_t data);
170 	void set_input(const char *s);
171 	void init_crusnwld_common(offs_t speedup);
172 	void init_crusnusa_common(offs_t speedup);
173 	virtual void machine_start() override;
174 	virtual void machine_reset() override;
175 	virtual void video_start() override;
176 	DECLARE_MACHINE_RESET(midvplus);
177 	uint32_t screen_update_midvunit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
178 	TIMER_CALLBACK_MEMBER(scanline_timer_cb);
179 	required_device<tms32031_device> m_maincpu;
180 	required_device<watchdog_timer_device> m_watchdog;
181 	required_device<palette_device> m_palette;
182 	optional_device<adc0844_device> m_adc;
183 	optional_device<midway_serial_pic2_device> m_midway_serial_pic2;
184 	optional_device<midway_ioasic_device> m_midway_ioasic;
185 	optional_device<ata_interface_device> m_ata;
186 	required_device_array<timer_device, 2> m_timer;
187 	required_device<dcs_audio_device> m_dcs;
188 	required_shared_ptr<uint32_t> m_generic_paletteram_32;
189 	output_finder<8> m_optional_drivers;
190 	optional_ioport m_in1;
191 	optional_ioport m_dsw;
192 	optional_ioport m_motion;
193 	void postload();
194 
195 	uint16_t comm_bus_out();
196 	uint16_t comm_bus_in();
197 
198 	void midvplus_map(address_map &map);
199 	void midvunit_map(address_map &map);
200 
201 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
202 };
203