1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     Sega System 32/Multi 32 hardware
6 
7 ***************************************************************************/
8 #ifndef MAME_INCLUDES_SEGAS32_H
9 #define MAME_INCLUDES_SEGAS32_H
10 
11 #pragma once
12 
13 #include "sound/multipcm.h"
14 #include "machine/s32comm.h"
15 #include "machine/timer.h"
16 #include "emupal.h"
17 #include "screen.h"
18 #include "tilemap.h"
19 
20 
21 
22 
23 class segas32_state : public device_t
24 {
25 public:
26 	segas32_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
27 
28 	void init_alien3();
29 	void init_arescue(int m_hasdsp);
30 	void init_arabfgt();
31 	void init_brival();
32 	void init_darkedge();
33 	void init_dbzvrvs();
34 	void init_f1en();
35 	void init_f1lap();
36 	void init_f1lapt();
37 	void init_ga2();
38 	void init_harddunk();
39 	void init_holo();
40 	void init_jpark();
41 	void init_orunners();
42 	void init_radm();
43 	void init_radr();
44 	void init_scross();
45 	void init_slipstrm();
46 	void init_sonic();
47 	void init_sonicp();
48 	void init_spidman();
49 	void init_svf();
50 	void init_jleague();
51 	void init_titlef();
52 
maincpu()53 	cpu_device* maincpu() { return m_maincpu; }
54 
55 	uint32_t screen_update_system32(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
56 	uint32_t screen_update_multi32_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
57 	uint32_t screen_update_multi32_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
58 
59 	DECLARE_WRITE_LINE_MEMBER(ym3438_irq_handler);
60 	TIMER_DEVICE_CALLBACK_MEMBER(signal_v60_irq_callback);
61 	INTERRUPT_GEN_MEMBER(start_of_vblank_int);
62 
63 	void misc_output_0_w(uint8_t data);
64 	void misc_output_1_w(uint8_t data);
65 	void sw2_output_0_w(uint8_t data);
66 	void sw2_output_1_w(uint8_t data);
67 	template<int Which> DECLARE_WRITE_LINE_MEMBER(display_enable_w);
68 	void tilebank_external_w(uint8_t data);
69 
70 protected:
71 	segas32_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_multi32);
72 
73 	typedef void (segas32_state::*sys32_output_callback)(int which, uint16_t data);
74 
75 	struct layer_info
76 	{
77 		bitmap_ind16 bitmap;
78 		std::unique_ptr<uint8_t[]> transparent;
79 		int num;
80 	};
81 
82 	struct extents_list
83 	{
84 		uint8_t                   scan_extent[256];
85 		uint16_t                  extent[32][16];
86 	};
87 
88 
89 	struct cache_entry
90 	{
91 		cache_entry *             next = nullptr;
92 		tilemap_t *               tmap = nullptr;
93 		uint8_t                   page = 0;
94 		uint8_t                   bank = 0;
95 	};
96 
97 	void sonic_level_load_protection(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
98 	uint16_t brival_protection_r(offs_t offset, uint16_t mem_mask = ~0);
99 	void brival_protection_w(offs_t offset, uint16_t data);
100 	void darkedge_protection_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
101 	uint16_t darkedge_protection_r(offs_t offset, uint16_t mem_mask = ~0);
102 	void dbzvrvs_protection_w(address_space &space, uint16_t data);
103 	uint16_t dbzvrvs_protection_r();
104 	void jleague_protection_w(address_space &space, offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
105 	uint16_t arescue_dsp_r(offs_t offset);
106 	void arescue_dsp_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
107 	template<int Which> uint16_t paletteram_r(offs_t offset);
108 	template<int Which> void paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
109 	uint16_t videoram_r(offs_t offset);
110 	void videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
111 	uint8_t sprite_control_r(offs_t offset);
112 	void sprite_control_w(offs_t offset, uint8_t data);
113 	uint16_t spriteram_r(offs_t offset);
114 	void spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
115 	template<int Which> uint16_t mixer_r(offs_t offset);
116 	template<int Which> void mixer_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
117 	uint8_t int_control_r(offs_t offset);
118 	void int_control_w(offs_t offset, uint8_t data);
119 
120 	void random_number_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
121 	uint16_t random_number_r();
122 	uint8_t shared_ram_r(offs_t offset);
123 	void shared_ram_w(offs_t offset, uint8_t data);
124 	void sound_int_control_lo_w(offs_t offset, uint8_t data);
125 	void sound_int_control_hi_w(offs_t offset, uint8_t data);
126 	void sound_bank_lo_w(uint8_t data);
127 	void sound_bank_hi_w(uint8_t data);
128 	uint8_t sound_dummy_r();
129 	void sound_dummy_w(uint8_t data);
130 
131 	void multipcm_bank_w(uint8_t data);
132 	void scross_bank_w(uint8_t data);
133 
134 	TILE_GET_INFO_MEMBER(get_tile_info);
135 
136 	TIMER_CALLBACK_MEMBER(end_of_vblank_int);
137 	TIMER_CALLBACK_MEMBER(update_sprites);
138 
139 	void system32_set_vblank(int state);
140 	inline uint16_t xBBBBBGGGGGRRRRR_to_xBGRBBBBGGGGRRRR(uint16_t value);
141 	inline uint16_t xBGRBBBBGGGGRRRR_to_xBBBBBGGGGGRRRRR(uint16_t value);
142 	inline void update_color(int offset, uint16_t data);
143 	tilemap_t *find_cache_entry(int page, int bank);
144 	inline void get_tilemaps(int bgnum, tilemap_t **tilemaps);
145 	uint8_t update_tilemaps(screen_device &screen, const rectangle &cliprect);
146 	void sprite_erase_buffer();
147 	void sprite_swap_buffers();
148 	int draw_one_sprite(uint16_t const *data, int xoffs, int yoffs, const rectangle &clipin, const rectangle &clipout);
149 	void sprite_render_list();
150 	inline uint8_t compute_color_offsets(int which, int layerbit, int layerflag);
151 	inline uint16_t compute_sprite_blend(uint8_t encoding);
152 	inline uint16_t *get_layer_scanline(int layer, int scanline);
153 	void mix_all_layers(int which, int xoffs, bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t enablemask);
154 	void print_mixer_data(int which);
155 	uint32_t multi32_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int index);
156 	void update_irq_state();
157 	void signal_v60_irq(int which);
158 	void update_sound_irq_state();
159 	void segas32_common_init();
160 	void radm_sw1_output( int which, uint16_t data );
161 	void radm_sw2_output( int which, uint16_t data );
162 	void radr_sw2_output( int which, uint16_t data );
163 	void alien3_sw1_output( int which, uint16_t data );
164 	void arescue_sw1_output( int which, uint16_t data );
165 	void f1lap_sw1_output( int which, uint16_t data );
166 	void jpark_sw1_output( int which, uint16_t data );
167 	void orunners_sw1_output( int which, uint16_t data );
168 	void orunners_sw2_output( int which, uint16_t data );
169 	void harddunk_sw1_output( int which, uint16_t data );
170 	void harddunk_sw2_output( int which, uint16_t data );
171 	void harddunk_sw3_output( int which, uint16_t data );
172 	void titlef_sw1_output( int which, uint16_t data );
173 	void titlef_sw2_output( int which, uint16_t data );
174 	void scross_sw1_output( int which, uint16_t data );
175 	void scross_sw2_output( int which, uint16_t data );
176 	int compute_clipping_extents(screen_device &screen, int enable, int clipout, int clipmask, const rectangle &cliprect, extents_list *list);
177 	void compute_tilemap_flips(int bgnum, int &flipx, int &flipy);
178 	void update_tilemap_zoom(screen_device &screen, layer_info &layer, const rectangle &cliprect, int bgnum);
179 	void update_tilemap_rowscroll(screen_device &screen, layer_info &layer, const rectangle &cliprect, int bgnum);
180 	void update_tilemap_text(screen_device &screen, layer_info &layer, const rectangle &cliprect);
181 	void update_bitmap(screen_device &screen, layer_info &layer, const rectangle &cliprect);
182 	void update_background(layer_info &layer, const rectangle &cliprect);
183 
184 	void signal_sound_irq(int which);
185 	void clear_sound_irq(int which);
186 	void darkedge_fd1149_vblank();
187 	void f1lap_fd1149_vblank();
188 
189 	void ga2_main_map(address_map &map);
190 	void multi32_6player_map(address_map &map);
191 	void multi32_map(address_map &map);
192 	void multi32_sound_map(address_map &map);
193 	void multi32_sound_portmap(address_map &map);
194 	void multipcm_map(address_map &map);
195 	void rf5c68_map(address_map &map);
196 	void system32_4player_map(address_map &map);
197 	void system32_analog_map(address_map &map);
198 	void system32_cd_map(address_map &map);
199 	void system32_map(address_map &map);
200 	void system32_sound_map(address_map &map);
201 	void system32_sound_portmap(address_map &map);
202 	void upd7725_data_map(address_map &map);
203 	void upd7725_prg_map(address_map &map);
204 	void v25_map(address_map &map);
205 
206 	virtual void device_add_mconfig(machine_config &config) override;
207 	virtual void device_start() override;
208 	virtual void device_reset() override;
209 
210 	required_shared_ptr<uint8_t> m_z80_shared_ram;
211 	optional_shared_ptr<uint16_t> m_system32_workram;
212 	required_shared_ptr<uint16_t> m_videoram;
213 	required_shared_ptr<uint16_t> m_spriteram;
214 	optional_shared_ptr<uint8_t> m_soundram;
215 	optional_shared_ptr_array<uint16_t, 2> m_paletteram;
216 
217 	required_device<cpu_device> m_maincpu;
218 	required_device<cpu_device> m_soundcpu;
219 	optional_device<multipcm_device> m_multipcm;
220 	required_device<gfxdecode_device> m_gfxdecode;
221 	required_device<screen_device> m_screen;
222 	required_device<palette_device> m_palette;
223 
224 	required_device<timer_device> m_irq_timer_0;
225 	required_device<timer_device> m_irq_timer_1;
226 	optional_device<s32comm_device> m_s32comm;
227 
228 	required_region_ptr<uint32_t> m_sprite_region;
229 	required_memory_region m_maincpu_region;
230 	required_memory_bank m_soundrom_bank;
231 	optional_memory_bank m_multipcm_bank_hi;
232 	optional_memory_bank m_multipcm_bank_lo;
233 
234 	const bool m_is_multi32;
235 
236 	uint8_t m_v60_irq_control[0x10];
237 	timer_device *m_v60_irq_timer[2];
238 	uint8_t m_sound_irq_control[4];
239 	uint8_t m_sound_irq_input;
240 	uint8_t m_sound_dummy_value;
241 	uint16_t m_sound_bank;
242 	sys32_output_callback m_sw1_output;
243 	sys32_output_callback m_sw2_output;
244 	sys32_output_callback m_sw3_output;
245 	std::unique_ptr<uint16_t[]> m_system32_protram;
246 	uint16_t m_system32_displayenable[2];
247 	uint16_t m_system32_tilebank_external;
248 	uint16_t m_arescue_dsp_io[6];
249 	std::unique_ptr<cache_entry[]> m_tmap_cache;
250 	cache_entry *m_cache_head;
251 	layer_info m_layer_data[11];
252 	uint16_t m_mixer_control[2][0x40];
253 	std::unique_ptr<uint16_t[]> m_solid_0000;
254 	std::unique_ptr<uint16_t[]> m_solid_ffff;
255 	uint8_t m_sprite_render_count;
256 	uint8_t m_sprite_control_latched[8];
257 	uint8_t m_sprite_control[8];
258 	std::unique_ptr<uint32_t[]> m_spriteram_32bit;
259 	typedef void (segas32_state::*prot_vblank_func)();
260 	prot_vblank_func m_system32_prot_vblank;
261 	int m_print_count;
262 	emu_timer *m_vblank_end_int_timer;
263 	emu_timer *m_update_sprites_timer;
264 };
265 
266 class segas32_regular_state : public segas32_state
267 {
268 public:
269 	segas32_regular_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
270 };
271 
272 class segas32_analog_state : public segas32_state
273 {
274 public:
275 	segas32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
276 
277 protected:
278 	segas32_analog_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
279 
280 	virtual void device_add_mconfig(machine_config &config) override;
281 };
282 
283 class segas32_trackball_state : public segas32_state
284 {
285 public:
286 	segas32_trackball_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
287 
288 	void system32_trackball_map(address_map &map);
289 protected:
290 	virtual void device_add_mconfig(machine_config &config) override;
291 };
292 
293 class segas32_4player_state : public segas32_state
294 {
295 public:
296 	segas32_4player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
297 
298 protected:
299 	segas32_4player_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
300 
301 	virtual void device_add_mconfig(machine_config &config) override;
302 };
303 
304 class segas32_v25_state : public segas32_4player_state
305 {
306 public:
307 	segas32_v25_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
308 
309 	static const uint8_t arf_opcode_table[256];
310 	static const uint8_t ga2_opcode_table[256];
311 
312 protected:
313 	virtual void device_add_mconfig(machine_config &config) override;
314 	virtual void device_start() override;
315 
316 private:
317 	void decrypt_protrom();
318 };
319 
320 class segas32_upd7725_state : public segas32_analog_state
321 {
322 public:
323 	segas32_upd7725_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
324 
325 protected:
326 	virtual void device_add_mconfig(machine_config &config) override;
327 };
328 
329 class segas32_cd_state : public segas32_state
330 {
331 public:
332 	segas32_cd_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
333 
334 	void lamps1_w(uint8_t data);
335 	void lamps2_w(uint8_t data);
336 	DECLARE_WRITE_LINE_MEMBER(scsi_irq_w);
337 	DECLARE_WRITE_LINE_MEMBER(scsi_drq_w);
338 
339 	static void cdrom_config(device_t *device);
340 protected:
341 	virtual void device_add_mconfig(machine_config &config) override;
342 	virtual void device_start() override;
343 
344 private:
345 	output_finder<16> m_lamps;
346 };
347 
348 class sega_multi32_state : public segas32_state
349 {
350 public:
351 	sega_multi32_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
352 
353 protected:
354 	sega_multi32_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
355 
356 	virtual void device_add_mconfig(machine_config &config) override;
357 };
358 
359 class sega_multi32_analog_state : public sega_multi32_state
360 {
361 public:
362 	sega_multi32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
363 
364 	ioport_value in2_analog_read();
365 	ioport_value in3_analog_read();
366 	void analog_bank_w(uint8_t data);
367 
368 	void multi32_analog_map(address_map &map);
369 protected:
370 	virtual void device_add_mconfig(machine_config &config) override;
371 	virtual void device_start() override;
372 
373 private:
374 	optional_ioport_array<8> m_analog_ports;
375 	uint8_t m_analog_bank;
376 };
377 
378 class sega_multi32_6player_state : public sega_multi32_state
379 {
380 public:
381 	sega_multi32_6player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
382 
383 protected:
384 	virtual void device_add_mconfig(machine_config &config) override;
385 };
386 
387 DECLARE_DEVICE_TYPE(SEGA_S32_PCB, segas32_state)
388 
389 #endif // MAME_INCLUDES_SEGAS32_H
390