1 // license:BSD-3-Clause
2 // copyright-holders:R. Belmont, Ville Linde
3 #ifndef MAME_INCLUDES_MODEL3_H
4 #define MAME_INCLUDES_MODEL3_H
5 
6 #pragma once
7 
8 #include "cpu/powerpc/ppc.h"
9 #include "video/poly.h"
10 #include "bus/scsi/scsi.h"
11 #include "machine/53c810.h"
12 #include "audio/dsbz80.h"
13 #include "machine/eepromser.h"
14 #include "machine/i8251.h"
15 #include "sound/scsp.h"
16 #include "machine/315_5649.h"
17 #include "machine/315-5881_crypt.h"
18 #include "machine/segabill.h"
19 #include "machine/msm6242.h"
20 #include "machine/timer.h"
21 #include "emupal.h"
22 #include "screen.h"
23 #include "tilemap.h"
24 
25 typedef float MATRIX[4][4];
26 typedef float VECTOR[4];
27 typedef float VECTOR3[3];
28 
29 struct cached_texture
30 {
31 	cached_texture *next;
32 	uint8_t       width;
33 	uint8_t       height;
34 	uint8_t       format;
35 	uint8_t       alpha;
36 	rgb_t       data[1];
37 };
38 
39 struct m3_vertex
40 {
41 	float x;
42 	float y;
43 	float z;
44 	float u;
45 	float v;
46 	float nx;
47 	float ny;
48 	float nz;
49 };
50 
51 typedef frustum_clip_vertex<float, 4> m3_clip_vertex;
52 
53 struct m3_triangle
54 {
55 	m3_clip_vertex v[3];
56 
57 	cached_texture *texture;
58 	int param;
59 	int transparency;
60 	int color;
61 };
62 
63 class model3_renderer;
64 
65 class model3_state : public driver_device
66 {
67 public:
model3_state(const machine_config & mconfig,device_type type,const char * tag)68 	model3_state(const machine_config &mconfig, device_type type, const char *tag) :
69 		driver_device(mconfig, type, tag),
70 		m_maincpu(*this,"maincpu"),
71 		m_lsi53c810(*this, "lsi53c810"),
72 		m_audiocpu(*this, "audiocpu"),
73 		m_scsp1(*this, "scsp1"),
74 		m_eeprom(*this, "eeprom"),
75 		m_screen(*this, "screen"),
76 		m_rtc(*this, "rtc"),
77 		m_io(*this, "io"),
78 		m_work_ram(*this, "work_ram"),
79 		m_paletteram64(*this, "paletteram64"),
80 		m_dsbz80(*this, DSBZ80_TAG),
81 		m_uart(*this, "uart"),
82 		m_soundram(*this, "soundram"),
83 		m_gfxdecode(*this, "gfxdecode"),
84 		m_palette(*this, "palette"),
85 		m_cryptdevice(*this, "315_5881"),
86 		m_billboard(*this, "billboard")
87 	{
88 		m_step15_with_mpc106 = false;
89 		m_step20_with_old_real3d = false;
90 	}
91 
92 	void add_cpu_66mhz(machine_config &config);
93 	void add_cpu_100mhz(machine_config &config);
94 	void add_cpu_166mhz(machine_config &config);
95 
96 	void add_base_devices(machine_config &config);
97 	void add_scsi_devices(machine_config &config);
98 	void add_crypt_devices(machine_config &config);
99 
100 	void model3_21_5881(machine_config &config);
101 	void model3_20_5881(machine_config &config);
102 	void model3_15(machine_config &config);
103 	void model3_10(machine_config &config);
104 	void model3_20(machine_config &config);
105 	void model3_21(machine_config &config);
106 
107 	void getbass(machine_config &config);
108 	void scud(machine_config &config);
109 	void lostwsga(machine_config &config);
110 
111 	void init_lemans24();
112 	void init_vs298();
113 	void init_vs299();
114 	void init_swtrilgy();
115 	void init_scudplus();
116 	void init_model3_20();
117 	void init_bass();
118 	void init_vs2();
119 	void init_daytona2();
120 	void init_eca();
121 	void init_srally2();
122 	void init_harleya();
123 	void init_skichamp();
124 	void init_spikeofe();
125 	void init_scud();
126 	void init_harley();
127 	void init_swtrilga();
128 	void init_swtrilgp();
129 	void init_vs29815();
130 	void init_model3_10();
131 	void init_vs215();
132 	void init_getbass();
133 	void init_scudplusa();
134 	void init_dirtdvls();
135 	void init_vf3();
136 	void init_von2();
137 	void init_lostwsga();
138 	void init_oceanhun();
139 	void init_dayto2pe();
140 	void init_spikeout();
141 	void init_magtruck();
142 	void init_lamachin();
143 	void init_model3_15();
144 
145 private:
146 	required_device<ppc_device> m_maincpu;
147 	optional_device<lsi53c810_device> m_lsi53c810;
148 	required_device<cpu_device> m_audiocpu;
149 	required_device<scsp_device> m_scsp1;
150 	required_device<eeprom_serial_93cxx_device> m_eeprom;
151 	required_device<screen_device> m_screen;
152 	required_device<rtc72421_device> m_rtc;
153 	required_device<sega_315_5649_device> m_io;
154 
155 	required_shared_ptr<uint64_t> m_work_ram;
156 	required_shared_ptr<uint64_t> m_paletteram64;
157 	optional_device<dsbz80_device> m_dsbz80;    // Z80-based MPEG Digital Sound Board
158 	optional_device<i8251_device> m_uart;
159 	required_shared_ptr<uint16_t> m_soundram;
160 
161 	required_device<gfxdecode_device> m_gfxdecode;
162 	required_device<palette_device> m_palette;
163 	optional_device<sega_315_5881_crypt_device> m_cryptdevice;
164 
165 	required_device<sega_billboard_device> m_billboard;
166 
167 	tilemap_t *m_layer4[4];
168 	tilemap_t *m_layer8[4];
169 
170 	int m_sound_irq_enable;
171 	emu_timer *m_sound_timer;
172 	emu_timer *m_real3d_dma_timer;
173 	emu_timer *m_scan_timer;
174 	uint8_t m_irq_enable;
175 	uint8_t m_irq_state;
176 	uint8_t m_scsi_irq_state;
177 	int m_crom_bank;
178 	int m_controls_bank;
179 	bool m_step15_with_mpc106;
180 	bool m_step20_with_old_real3d;
181 	uint32_t m_real3d_device_id;
182 	int m_pci_bus;
183 	int m_pci_device;
184 	int m_pci_function;
185 	int m_pci_reg;
186 	uint32_t m_mpc105_regs[0x40];
187 	uint32_t m_mpc105_addr;
188 	uint32_t m_mpc106_regs[0x40];
189 	uint32_t m_mpc106_addr;
190 	uint32_t m_dma_data;
191 	uint32_t m_dma_status;
192 	uint32_t m_dma_source;
193 	uint32_t m_dma_dest;
194 	uint32_t m_dma_endian;
195 	uint32_t m_dma_irq;
196 	uint32_t m_dma_busy;
197 	uint64_t m_controls_2;
198 	uint64_t m_controls_3;
199 	uint8_t m_serial_fifo1;
200 	uint8_t m_serial_fifo2;
201 	int m_lightgun_reg_sel;
202 	int m_adc_channel;
203 	uint64_t m_real3d_status;
204 	int m_prot_data_ptr;
205 	std::unique_ptr<uint32_t[]> m_vrom;
206 	int m_step;
207 	int m_m3_step;
208 	int32_t m_tap_state;
209 	uint64_t m_ir;
210 	uint8_t m_id_data[32];
211 	int32_t m_id_size;
212 	int m_tdo;
213 	uint16_t m_layer_priority;
214 	uint32_t m_layer_modulate_r;
215 	uint32_t m_layer_modulate_g;
216 	uint32_t m_layer_modulate_b;
217 	uint32_t m_layer_modulate1;
218 	uint32_t m_layer_modulate2;
219 	uint64_t m_layer_scroll[2];
220 	std::unique_ptr<uint64_t[]> m_m3_char_ram;
221 	std::unique_ptr<uint64_t[]> m_m3_tile_ram;
222 	std::unique_ptr<uint32_t[]> m_texture_fifo;
223 	int m_texture_fifo_pos;
224 	std::unique_ptr<uint16_t[]> m_texture_ram[2];
225 	std::unique_ptr<uint32_t[]> m_display_list_ram;
226 	std::unique_ptr<uint32_t[]> m_culling_ram;
227 	std::unique_ptr<uint32_t[]> m_polygon_ram;
228 	int m_real3d_display_list;
229 	rectangle m_clip3d;
230 	rectangle *m_screen_clip;
231 	VECTOR3 m_parallel_light;
232 	float m_parallel_light_intensity;
233 	float m_ambient_light_intensity;
234 	uint64_t m_vid_reg0;
235 	int m_matrix_stack_ptr;
236 	int m_list_depth;
237 	MATRIX *m_matrix_stack;
238 	MATRIX m_coordinate_system;
239 	MATRIX m_projection_matrix;
240 	float m_viewport_x;
241 	float m_viewport_y;
242 	float m_viewport_width;
243 	float m_viewport_height;
244 	float m_viewport_near;
245 	float m_viewport_far;
246 	uint32_t m_matrix_base_address;
247 	cached_texture *m_texcache[2][1024/32][2048/32];
248 
249 	model3_renderer *m_renderer;
250 	m3_triangle* m_tri_buffer;
251 	m3_triangle* m_tri_alpha_buffer;
252 	int m_tri_buffer_ptr;
253 	int m_tri_alpha_buffer_ptr;
254 	int m_viewport_tri_index[4];
255 	int m_viewport_tri_alpha_index[4];
256 
257 	uint32_t rtc72421_r(offs_t offset);
258 	void rtc72421_w(offs_t offset, uint32_t data);
259 	uint64_t model3_char_r(offs_t offset);
260 	void model3_char_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
261 	uint64_t model3_tile_r(offs_t offset);
262 	void model3_tile_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
263 	uint64_t model3_vid_reg_r(offs_t offset);
264 	void model3_vid_reg_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
265 	void model3_palette_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
266 	uint64_t model3_palette_r(offs_t offset);
267 	void real3d_display_list_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
268 	void real3d_polygon_ram_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
269 	void real3d_cmd_w(uint64_t data);
270 	uint64_t mpc105_addr_r(offs_t offset, uint64_t mem_mask = ~0);
271 	void mpc105_addr_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
272 	uint64_t mpc105_data_r();
273 	void mpc105_data_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
274 	uint64_t mpc105_reg_r(offs_t offset);
275 	void mpc105_reg_w(offs_t offset, uint64_t data);
276 	void mpc105_init();
277 	uint64_t mpc106_addr_r(offs_t offset, uint64_t mem_mask = ~0);
278 	void mpc106_addr_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
279 	uint64_t mpc106_data_r(offs_t offset, uint64_t mem_mask = ~0);
280 	void mpc106_data_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
281 	uint64_t mpc106_reg_r(offs_t offset);
282 	void mpc106_reg_w(offs_t offset, uint64_t data);
283 	void mpc106_init();
284 	uint64_t scsi_r(offs_t offset, uint64_t mem_mask = ~0);
285 	void scsi_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
286 	uint64_t real3d_dma_r(offs_t offset, uint64_t mem_mask = ~0);
287 	void real3d_dma_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
288 
289 	void eeprom_w(uint8_t data);
290 	uint8_t input_r();
291 	void lostwsga_ser1_w(uint8_t data);
292 	uint8_t lostwsga_ser2_r();
293 	void lostwsga_ser2_w(uint8_t data);
294 
295 	uint64_t model3_sys_r(offs_t offset, uint64_t mem_mask = ~0);
296 	void model3_sys_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
297 	uint64_t model3_rtc_r(offs_t offset, uint64_t mem_mask = ~0);
298 	void model3_rtc_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
299 	uint64_t real3d_status_r(offs_t offset);
300 	uint8_t model3_sound_r(offs_t offset);
301 	void model3_sound_w(offs_t offset, uint8_t data);
302 
303 	void daytona2_rombank_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
304 	void model3snd_ctrl(uint16_t data);
305 	uint32_t pci_device_get_reg();
306 	void pci_device_set_reg(uint32_t value);
307 	void configure_fast_ram();
308 	void interleave_vroms();
309 
310 	DECLARE_MACHINE_START(model3_10);
311 	DECLARE_MACHINE_RESET(model3_10);
312 	DECLARE_MACHINE_START(model3_15);
313 	DECLARE_MACHINE_RESET(model3_15);
314 	DECLARE_MACHINE_START(model3_20);
315 	DECLARE_MACHINE_RESET(model3_20);
316 	DECLARE_MACHINE_START(model3_21);
317 	DECLARE_MACHINE_RESET(model3_21);
318 	TIMER_CALLBACK_MEMBER(model3_sound_timer_tick);
319 	TIMER_CALLBACK_MEMBER(real3d_dma_timer_callback);
320 	TIMER_CALLBACK_MEMBER(model3_scan_timer_tick);
321 	TIMER_DEVICE_CALLBACK_MEMBER(model3_interrupt);
322 	void model3_exit();
323 	void scsp_irq(offs_t offset, uint8_t data);
324 	void real3d_dma_callback(uint32_t src, uint32_t dst, int length, int byteswap);
325 	uint32_t scsi_fetch(uint32_t dsp);
326 	void scsi_irq_callback(int state);
327 	void update_irq_state();
328 	void set_irq_line(uint8_t bit, int line);
329 	void model3_init(int step);
330 	// video
331 	virtual void video_start() override;
332 	uint32_t screen_update_model3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
333 	TILE_GET_INFO_MEMBER(tile_info_layer0_4bit);
334 	TILE_GET_INFO_MEMBER(tile_info_layer1_4bit);
335 	TILE_GET_INFO_MEMBER(tile_info_layer2_4bit);
336 	TILE_GET_INFO_MEMBER(tile_info_layer3_4bit);
337 	TILE_GET_INFO_MEMBER(tile_info_layer0_8bit);
338 	TILE_GET_INFO_MEMBER(tile_info_layer1_8bit);
339 	TILE_GET_INFO_MEMBER(tile_info_layer2_8bit);
340 	TILE_GET_INFO_MEMBER(tile_info_layer3_8bit);
341 	void reset_triangle_buffers();
342 	m3_triangle* push_triangle(bool alpha);
343 	void draw_layer(bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, int sx, int sy, int prio);
344 	void invalidate_texture(int page, int texx, int texy, int texwidth, int texheight);
345 	cached_texture *get_texture(int page, int texx, int texy, int texwidth, int texheight, int format);
346 	inline void write_texture16(int xpos, int ypos, int width, int height, int page, uint16_t *data);
347 	inline void write_texture8(int xpos, int ypos, int width, int height, int page, int upper, int lower, uint16_t *data);
348 	void real3d_upload_texture(uint32_t header, uint32_t *data);
349 	void init_matrix_stack();
350 	void get_top_matrix(MATRIX *out);
351 	void push_matrix_stack();
352 	void pop_matrix_stack();
353 	void multiply_matrix_stack(MATRIX matrix);
354 	void translate_matrix_stack(float x, float y, float z);
355 	void draw_model(uint32_t addr);
356 	uint32_t *get_memory_pointer(uint32_t address);
357 	void set_projection(float left, float right, float top, float bottom, float near, float far);
358 	void load_matrix(int matrix_num, MATRIX *out);
359 	void traverse_list4(int lod_num, uint32_t address);
360 	void traverse_list(uint32_t address);
361 	inline void process_link(uint32_t address, uint32_t link);
362 	void draw_block(uint32_t address);
363 	void draw_viewport(int pri, uint32_t address);
364 	void real3d_traverse_display_list();
365 	void real3d_display_list_end();
366 	void real3d_display_list1_dma(uint32_t src, uint32_t dst, int length, int byteswap);
367 	void real3d_display_list2_dma(uint32_t src, uint32_t dst, int length, int byteswap);
368 	void real3d_vrom_texture_dma(uint32_t src, uint32_t dst, int length, int byteswap);
369 	void real3d_texture_fifo_dma(uint32_t src, int length, int byteswap);
370 	void real3d_polygon_ram_dma(uint32_t src, uint32_t dst, int length, int byteswap);
371 	// machine
372 	void insert_id(uint32_t id, int32_t start_bit);
373 	int tap_read();
374 	void tap_write(int tck, int tms, int tdi, int trst);
375 	void tap_reset();
376 	void tap_set_asic_ids();
377 
378 	uint16_t crypt_read_callback(uint32_t addr);
379 
380 	void model3_5881_mem(address_map &map);
381 	void model3_10_mem(address_map &map);
382 	void model3_mem(address_map &map);
383 	void model3_snd(address_map &map);
384 	void scsp1_map(address_map &map);
385 	void scsp2_map(address_map &map);
386 	void getbass_iocpu_mem(address_map &map);
387 	void getbass_iocpu_io(address_map &map);
388 };
389 
390 #endif // MAME_INCLUDES_MODEL3_H
391