1 // license:BSD-3-Clause
2 // copyright-holders:Philip Bennett
3 /*************************************************************************
4 
5      Microprose Games 3D hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_MICRO3D_H
9 #define MAME_INCLUDES_MICRO3D_H
10 
11 #pragma once
12 
13 #include "cpu/tms34010/tms34010.h"
14 #include "cpu/mcs51/mcs51.h"
15 #include "sound/upd7759.h"
16 #include "machine/adc0844.h"
17 #include "machine/mc68681.h"
18 #include "machine/scn_pci.h"
19 #include "emupal.h"
20 
21 
22 #define HOST_MONITOR_DISPLAY        0
23 #define VGB_MONITOR_DISPLAY         0
24 #define DRMATH_MONITOR_DISPLAY      0
25 
26 
27 class micro3d_sound_device;
28 
29 class micro3d_state : public driver_device
30 {
31 public:
micro3d_state(const machine_config & mconfig,device_type type,const char * tag)32 	micro3d_state(const machine_config &mconfig, device_type type, const char *tag) :
33 		driver_device(mconfig, type, tag),
34 		m_maincpu(*this, "maincpu"),
35 		m_audiocpu(*this, "audiocpu"),
36 		m_upd7759(*this, "upd7759"),
37 		m_drmath(*this, "drmath"),
38 		m_vgb(*this, "vgb"),
39 		m_palette(*this, "palette"),
40 		m_duart(*this, "duart"),
41 		m_noise_1(*this, "noise_1"),
42 		m_noise_2(*this, "noise_2"),
43 		m_adc(*this, "adc"),
44 		m_vertex(*this, "vertex"),
45 		m_sound_sw(*this, "SOUND_SW"),
46 		m_volume(*this, "VOLUME"),
47 		m_joystick_x(*this, "JOYSTICK_X"),
48 		m_joystick_y(*this, "JOYSTICK_Y"),
49 		m_shared_ram(*this, "shared_ram"),
50 		m_mac_sram(*this, "mac_sram"),
51 		m_sprite_vram(*this, "sprite_vram"),
52 		m_vgb_uart(*this, "uart")
53 	{ }
54 
55 	void micro3d(machine_config &config);
56 	void botss11(machine_config &config);
57 
58 	void init_micro3d();
59 	void init_botss();
60 
61 	DECLARE_READ_LINE_MEMBER(botss_hwchk_r);
62 
63 protected:
64 	enum
65 	{
66 		TIMER_MAC_DONE
67 	};
68 
69 	virtual void machine_reset() override;
70 	virtual void video_start() override;
71 	virtual void video_reset() override;
72 
73 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
74 
75 private:
76 	enum planes
77 	{
78 		CLIP_Z_MIN,
79 		CLIP_Z_MAX,
80 		CLIP_X_MIN,
81 		CLIP_X_MAX,
82 		CLIP_Y_MIN,
83 		CLIP_Y_MAX
84 	};
85 
86 	struct micro3d_vtx
87 	{
88 		int32_t x, y, z;
89 
90 		constexpr int64_t dot_product(micro3d_vtx const &that) const;
91 	};
92 
93 	required_device<cpu_device> m_maincpu;
94 	required_device<i8051_device> m_audiocpu;
95 	required_device<upd7759_device> m_upd7759;
96 	required_device<cpu_device> m_drmath;
97 	required_device<tms34010_device> m_vgb;
98 	required_device<palette_device> m_palette;
99 	required_device<mc68681_device> m_duart;
100 	required_device<micro3d_sound_device> m_noise_1;
101 	required_device<micro3d_sound_device> m_noise_2;
102 	optional_device<adc0844_device> m_adc;
103 	required_memory_region m_vertex;
104 
105 	required_ioport m_sound_sw;
106 	required_ioport m_volume;
107 	optional_ioport m_joystick_x;
108 	optional_ioport m_joystick_y;
109 
110 	required_shared_ptr<uint16_t> m_shared_ram;
111 	uint8_t               m_m68681_tx0;
112 
113 	/* Sound */
114 	uint8_t               m_sound_port_latch[4];
115 
116 	/* Hardware version-check latch for BOTSS 1.1a */
117 	uint8_t               m_botss_latch;
118 
119 	/* MAC */
120 	required_shared_ptr<uint32_t> m_mac_sram;
121 	uint32_t              m_sram_r_addr;
122 	uint32_t              m_sram_w_addr;
123 	uint32_t              m_vtx_addr;
124 	uint32_t              m_mrab11;
125 	uint32_t              m_mac_stat;
126 	uint32_t              m_mac_inst;
127 
128 	/* 2D video */
129 	required_shared_ptr<uint16_t> m_sprite_vram;
130 	uint16_t              m_creg;
131 	uint16_t              m_xfer3dk;
132 
133 	/* 3D pipeline */
134 	uint32_t              m_pipe_data;
135 	uint32_t              m_pipeline_state;
136 	int32_t               m_vtx_fifo[512];
137 	uint32_t              m_fifo_idx;
138 	uint32_t              m_draw_cmd;
139 	int                 m_draw_state;
140 	int32_t               m_x_min;
141 	int32_t               m_x_max;
142 	int32_t               m_y_min;
143 	int32_t               m_y_max;
144 	int32_t               m_z_min;
145 	int32_t               m_z_max;
146 	int32_t               m_x_mid;
147 	int32_t               m_y_mid;
148 	int                 m_dpram_bank;
149 	uint32_t              m_draw_dpram[1024];
150 	std::unique_ptr<uint16_t[]>              m_frame_buffers[2];
151 	std::unique_ptr<uint16_t[]>              m_tmp_buffer;
152 	int                 m_drawing_buffer;
153 	int                 m_display_buffer;
154 
155 	void vgb_uart_w(offs_t offset, uint8_t data);
156 	uint8_t vgb_uart_r(offs_t offset);
157 	void micro3d_mac1_w(uint32_t data);
158 	uint32_t micro3d_mac2_r();
159 	void micro3d_mac2_w(uint32_t data);
160 	uint16_t micro3d_encoder_h_r();
161 	uint16_t micro3d_encoder_l_r();
162 	uint8_t adc_volume_r();
163 	uint16_t botss_140000_r();
164 	uint16_t botss_180000_r();
165 	void micro3d_reset_w(uint16_t data);
166 	void host_drmath_int_w(uint16_t data);
167 	void micro3d_shared_w(offs_t offset, uint32_t data);
168 	uint32_t micro3d_shared_r(offs_t offset);
169 	void drmath_int_w(uint32_t data);
170 	void drmath_intr2_ack(uint32_t data);
171 	void micro3d_creg_w(uint16_t data);
172 	void micro3d_xfer3dk_w(uint16_t data);
173 	void micro3d_fifo_w(uint32_t data);
174 	void micro3d_alt_fifo_w(uint32_t data);
175 	uint32_t micro3d_pipe_r();
176 	void micro3d_snd_dac_a(uint8_t data);
177 	void micro3d_snd_dac_b(uint8_t data);
178 	void micro3d_sound_p1_w(uint8_t data);
179 	void micro3d_sound_p3_w(uint8_t data);
180 	uint8_t micro3d_sound_p1_r();
181 	uint8_t micro3d_sound_p3_r();
182 	INTERRUPT_GEN_MEMBER(micro3d_vblank);
183 	TIMER_CALLBACK_MEMBER(mac_done_callback);
184 	void micro3d_upd7759_w(uint8_t data);
185 	void data_from_i8031(uint8_t data);
186 	uint8_t data_to_i8031();
187 	DECLARE_WRITE_LINE_MEMBER(duart_irq_handler);
188 	uint8_t duart_input_r();
189 	void duart_output_w(uint8_t data);
190 	DECLARE_WRITE_LINE_MEMBER(duart_txb);
191 	DECLARE_WRITE_LINE_MEMBER(tms_interrupt);
192 	TMS340X0_SCANLINE_IND16_CB_MEMBER(scanline_update);
193 
194 	/* 3D graphics */
195 	int inside(micro3d_vtx *v, enum planes plane);
196 	micro3d_vtx intersect(micro3d_vtx *v1, micro3d_vtx *v2, enum planes plane);
197 	inline void write_span(uint32_t y, uint32_t x);
198 	void draw_line(uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2);
199 	void rasterise_spans(uint32_t min_y, uint32_t max_y, uint32_t attr);
200 	int clip_triangle(micro3d_vtx *v, micro3d_vtx *vout, int num_vertices, enum planes plane);
201 	void draw_triangles(uint32_t attr);
202 
203 	void cpu_space_map(address_map &map);
204 	void drmath_data(address_map &map);
205 	void drmath_prg(address_map &map);
206 	void hostmem(address_map &map);
207 	void soundmem_io(address_map &map);
208 	void soundmem_prg(address_map &map);
209 	void vgbmem(address_map &map);
210 
211 	required_device<scn2651_device> m_vgb_uart;
212 };
213 
214 #endif // MAME_INCLUDES_MICRO3D_H
215