1 // license:BSD-3-Clause
2 // copyright-holders:smf, R. Belmont
3 
4 #ifndef MAME_INCLUDES_ZN_H
5 #define MAME_INCLUDES_ZN_H
6 
7 #pragma once
8 
9 #include "audio/rax.h"
10 #include "audio/taito_zm.h"
11 #include "audio/taitosnd.h"
12 
13 #include "bus/ata/atadev.h"
14 #include "bus/ata/ataintf.h"
15 #include "cpu/m68000/m68000.h"
16 #include "cpu/mcs51/mcs51.h"
17 #include "cpu/psx/psx.h"
18 #include "cpu/z80/z80.h"
19 #include "machine/7200fifo.h"
20 #include "machine/at28c16.h"
21 #include "machine/bankdev.h"
22 #include "machine/cat702.h"
23 #include "machine/gen_latch.h"
24 #include "machine/mb3773.h"
25 #include "machine/nvram.h"
26 #include "machine/ram.h"
27 #include "machine/vt83c461.h"
28 #include "machine/watchdog.h"
29 #include "machine/znmcu.h"
30 #include "sound/2610intf.h"
31 #include "sound/okim6295.h"
32 #include "sound/qsound.h"
33 #include "sound/spu.h"
34 #include "sound/ymf271.h"
35 #include "sound/ymz280b.h"
36 #include "video/psx.h"
37 
38 #include "screen.h"
39 #include "speaker.h"
40 
41 #include <algorithm>
42 
43 class zn_state : public driver_device
44 {
45 public:
zn_state(const machine_config & mconfig,device_type type,const char * tag)46 	zn_state(const machine_config &mconfig, device_type type, const char *tag) :
47 		driver_device(mconfig, type, tag),
48 		m_gpu(*this, "gpu"),
49 		m_gpu_screen(*this, "screen"),
50 		m_sio0(*this, "maincpu:sio0"),
51 		m_cat702(*this, "cat702_%u", 1),
52 		m_znmcu(*this, "znmcu"),
53 		m_maincpu(*this, "maincpu"),
54 		m_ram(*this, "maincpu:ram"),
55 		m_znmcu_dataout(1)
56 	{
57 		std::fill(std::begin(m_cat702_dataout), std::end(m_cat702_dataout), 1);
58 	}
59 
60 	void zn_1mb_vram(machine_config &config);
61 	void zn_2mb_vram(machine_config &config);
62 	void zn2(machine_config &config);
63 	void gameboard_cat702(machine_config &config);
64 
65 protected:
DECLARE_WRITE_LINE_MEMBER(cat702_dataout)66 	template<int Chip> DECLARE_WRITE_LINE_MEMBER(cat702_dataout) { m_cat702_dataout[Chip] = state; update_sio0_rxd(); }
DECLARE_WRITE_LINE_MEMBER(znmcu_dataout)67 	DECLARE_WRITE_LINE_MEMBER(znmcu_dataout) { m_znmcu_dataout = state; update_sio0_rxd(); }
update_sio0_rxd()68 	void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_dataout[0] && m_cat702_dataout[1] && m_znmcu_dataout); }
69 	uint8_t znsecsel_r(offs_t offset, uint8_t mem_mask = ~0);
70 	void znsecsel_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
71 	uint8_t boardconfig_r();
72 	uint16_t unknown_r(offs_t offset, uint16_t mem_mask = ~0);
73 	void coin_w(uint8_t data);
74 
75 	void zn_base_map(address_map &map);
76 	void zn_rom_base_map(address_map &map);
77 
78 	virtual void machine_start() override;
79 
80 	inline void ATTR_PRINTF(3,4) verboselog( int n_level, const char *s_fmt, ... );
81 	inline void psxwriteword( uint32_t *p_n_psxram, uint32_t n_address, uint16_t n_data );
82 
83 	uint8_t m_n_znsecsel;
84 
85 	required_device<psxgpu_device> m_gpu;
86 	required_device<screen_device> m_gpu_screen;
87 	required_device<psxsio0_device> m_sio0;
88 	required_device_array<cat702_device, 2> m_cat702;
89 	required_device<znmcu_device> m_znmcu;
90 	required_device<cpu_device> m_maincpu;
91 	required_device<ram_device> m_ram;
92 
93 	int m_cat702_dataout[2];
94 	int m_znmcu_dataout;
95 };
96 
97 //
98 // Capcom ZN1/2 hardware
99 //
100 
101 class capcom_zn_state : public zn_state
102 {
103 public:
capcom_zn_state(const machine_config & mconfig,device_type type,const char * tag)104 	capcom_zn_state(const machine_config &mconfig, device_type type, const char *tag) :
105 		zn_state(mconfig, type, tag),
106 		m_bankedroms(*this, "bankedroms"),
107 		m_rombank(*this, "rombank"),
108 		m_audiocpu(*this, "audiocpu"),
109 		m_soundlatch(*this, "soundlatch"),
110 		m_soundbank(*this, "soundbank")
111 	{
112 	}
113 
114 	void zn_base(machine_config &config);
115 
116 protected:
117 	virtual void machine_start() override;
118 	virtual void machine_reset() override;
119 
120 	required_memory_region m_bankedroms;
121 	required_memory_bank m_rombank;
122 	required_device<cpu_device> m_audiocpu;
123 	required_device<generic_latch_8_device> m_soundlatch;
124 	required_memory_bank m_soundbank;
125 
126 private:
127 	void main_map(address_map &map);
128 	void qsound_map(address_map &map);
129 	void qsound_portmap(address_map &map);
130 
131 	uint16_t kickharness_r(offs_t offset, uint16_t mem_mask = ~0);
132 	void bank_w(uint8_t data);
133 	void qsound_bankswitch_w(uint8_t data);
134 	INTERRUPT_GEN_MEMBER(qsound_interrupt);
135 };
136 
137 class zn1_state : public capcom_zn_state
138 {
139 public:
zn1_state(const machine_config & mconfig,device_type type,const char * tag)140 	zn1_state(const machine_config &mconfig, device_type type, const char *tag) :
141 		capcom_zn_state(mconfig, type, tag)
142 	{
143 	}
144 
145 	void coh1000c(machine_config &config);
146 	void coh1002c(machine_config &config);
147 };
148 
149 class glpracr_state : public zn1_state
150 {
151 public:
glpracr_state(const machine_config & mconfig,device_type type,const char * tag)152 	glpracr_state(const machine_config &mconfig, device_type type, const char *tag) :
153 		zn1_state(mconfig, type, tag)
154 	{
155 	}
156 
157 private:
158 	virtual void machine_reset() override;
159 };
160 
161 class zn2_state : public capcom_zn_state
162 {
163 public:
zn2_state(const machine_config & mconfig,device_type type,const char * tag)164 	zn2_state(const machine_config &mconfig, device_type type, const char *tag) :
165 		capcom_zn_state(mconfig, type, tag)
166 	{
167 	}
168 
169 	void coh3002c(machine_config &config);
170 };
171 
172 //
173 // Acclaim ZN-derived hardware
174 //
175 
176 class acclaim_zn_state : public zn_state
177 {
178 public:
acclaim_zn_state(const machine_config & mconfig,device_type type,const char * tag)179 	acclaim_zn_state(const machine_config &mconfig, device_type type, const char *tag) :
180 		zn_state(mconfig, type, tag)
181 	{
182 	}
183 
184 	void coh1000a(machine_config &config);
185 
186 protected:
187 	void coh1000a_map(address_map &map);
188 
189 private:
190 	void acpsx_00_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
191 	void acpsx_10_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
192 };
193 
194 class nbajamex_state : public acclaim_zn_state
195 {
196 public:
nbajamex_state(const machine_config & mconfig,device_type type,const char * tag)197 	nbajamex_state(const machine_config &mconfig, device_type type, const char *tag) :
198 		acclaim_zn_state(mconfig, type, tag),
199 		m_rax(*this, "rax"),
200 		m_bankmap(*this, "nbajamex_bankmap"),
201 		m_bankedroms(*this, "bankedroms"),
202 		m_rombank(*this, "rombank%u", 1)
203 	{
204 	}
205 
206 	void nbajamex(machine_config &config);
207 
208 private:
209 	virtual void driver_init() override;
210 	virtual void machine_start() override;
211 	virtual void machine_reset() override;
212 
213 	void bank_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
214 	void sound_80_w(uint16_t data);
215 	void backup_w(offs_t offset, uint8_t data);
216 	uint16_t sound_08_r(offs_t offset, uint16_t mem_mask = ~0);
217 	uint16_t sound_80_r(offs_t offset, uint16_t mem_mask = ~0);
218 
219 	void main_map(address_map &map);
220 	void bank_map(address_map &map);
221 
222 	std::unique_ptr<uint8_t[]> m_sram;
223 	uint32_t m_curr_rombank[2];
224 
225 	required_device<acclaim_rax_device> m_rax;
226 	required_device<address_map_bank_device> m_bankmap;
227 	required_memory_region m_bankedroms;
228 	required_memory_bank_array<2> m_rombank;
229 };
230 
231 class jdredd_state : public acclaim_zn_state
232 {
233 public:
jdredd_state(const machine_config & mconfig,device_type type,const char * tag)234 	jdredd_state(const machine_config &mconfig, device_type type, const char *tag) :
235 		acclaim_zn_state(mconfig, type, tag),
236 		m_gun_x(*this, "GUN%uX", 1U),
237 		m_gun_y(*this, "GUN%uY", 1U)
238 	{
239 	}
240 
241 	void jdredd(machine_config &config);
242 
243 	DECLARE_READ_LINE_MEMBER(gun_mux_r);
244 
245 private:
246 	virtual void machine_start() override;
247 
248 	void main_map(address_map &map);
249 
250 	DECLARE_WRITE_LINE_MEMBER(vblank);
251 
252 	required_ioport_array<2> m_gun_x;
253 	required_ioport_array<2> m_gun_y;
254 	bool m_gun_mux;
255 };
256 
257 //
258 // Atlus ZN-derived hardware
259 //
260 
261 class atlus_zn_state : public zn_state
262 {
263 public:
atlus_zn_state(const machine_config & mconfig,device_type type,const char * tag)264 	atlus_zn_state(const machine_config &mconfig, device_type type, const char *tag) :
265 		zn_state(mconfig, type, tag),
266 		m_bankedroms(*this, "bankedroms"),
267 		m_rombank(*this, "rombank"),
268 		m_audiocpu(*this, "audiocpu"),
269 		m_soundlatch16(*this, "soundlatch16")
270 	{
271 	}
272 
273 	void coh1001l(machine_config &config);
274 
275 private:
276 	virtual void machine_start() override;
277 	virtual void machine_reset() override;
278 
279 	void bank_w(uint8_t data);
280 	void sound_unk_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
281 
282 	void main_map(address_map &map);
283 	void sound_map(address_map &map);
284 
285 	required_memory_region m_bankedroms;
286 	required_memory_bank m_rombank;
287 	required_device<cpu_device> m_audiocpu;
288 	required_device<generic_latch_16_device> m_soundlatch16;
289 };
290 
291 //
292 // Video System Co. ZN-derived hardware
293 //
294 
295 class visco_zn_state : public zn_state
296 {
297 public:
visco_zn_state(const machine_config & mconfig,device_type type,const char * tag)298 	visco_zn_state(const machine_config &mconfig, device_type type, const char *tag) :
299 		zn_state(mconfig, type, tag),
300 		m_bankedroms(*this, "bankedroms"),
301 		m_rombank(*this, "rombank")
302 	{
303 	}
304 
305 	void coh1002v(machine_config &config);
306 
307 private:
308 	virtual void machine_start() override;
309 	virtual void machine_reset() override;
310 
311 	void bank_w(uint8_t data);
312 
313 	void main_map(address_map &map);
314 
315 	required_memory_region m_bankedroms;
316 	required_memory_bank m_rombank;
317 };
318 
319 //
320 // Eighting / Raizing ZN-derived hardware
321 //
322 
323 class raizing_zn_state : public zn_state
324 {
325 public:
raizing_zn_state(const machine_config & mconfig,device_type type,const char * tag)326 	raizing_zn_state(const machine_config &mconfig, device_type type, const char *tag) :
327 		zn_state(mconfig, type, tag),
328 		m_bankedroms(*this, "bankedroms"),
329 		m_rombank(*this, "rombank"),
330 		m_audiocpu(*this, "audiocpu"),
331 		m_soundlatch(*this, "soundlatch")
332 	{
333 	}
334 
335 	void coh1002e(machine_config &config);
336 
337 protected:
338 	virtual void machine_start() override;
339 	virtual void machine_reset() override;
340 
341 	void main_map(address_map &map);
342 	void psarc_sound_map(address_map &map);
343 
344 	void bank_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
345 	void sound_irq_w(uint8_t data);
346 
347 	required_memory_region m_bankedroms;
348 	required_memory_bank m_rombank;
349 	required_device<cpu_device> m_audiocpu;
350 	required_device<generic_latch_8_device> m_soundlatch;
351 };
352 
353 class beastrzrb_state : public raizing_zn_state
354 {
355 public:
beastrzrb_state(const machine_config & mconfig,device_type type,const char * tag)356 	beastrzrb_state(const machine_config &mconfig, device_type type, const char *tag) :
357 		raizing_zn_state(mconfig, type, tag),
358 		m_okibank(*this, "okibank")
359 	{
360 	}
361 
362 	void beastrzrb(machine_config &config);
363 
364 private:
365 	virtual void machine_start() override;
366 	virtual void machine_reset() override;
367 
368 	void sound_map(address_map &map);
369 	void oki_map(address_map &map);
370 
371 	required_memory_bank m_okibank;
372 };
373 
374 class bam2_state : public zn_state
375 {
376 public:
bam2_state(const machine_config & mconfig,device_type type,const char * tag)377 	bam2_state(const machine_config &mconfig, device_type type, const char *tag) :
378 		zn_state(mconfig, type, tag),
379 		m_bankedroms(*this, "bankedroms"),
380 		m_rombank(*this, "rombank")
381 	{
382 	}
383 
384 	void bam2(machine_config &config);
385 
386 private:
387 	virtual void machine_start() override;
388 	virtual void machine_reset() override;
389 
390 	void main_map(address_map &map);
391 
392 	uint16_t m_mcu_command;
393 
394 	void mcu_w(offs_t offset, uint16_t data);
395 	uint16_t mcu_r(offs_t offset, uint16_t mem_mask = ~0);
396 	uint16_t unk_r();
397 
398 	required_memory_region m_bankedroms;
399 	required_memory_bank m_rombank;
400 };
401 
402 //
403 // Taito FX1a/FX1b
404 //
405 
406 class taito_fx_state : public zn_state
407 {
408 public:
taito_fx_state(const machine_config & mconfig,device_type type,const char * tag)409 	taito_fx_state(const machine_config &mconfig, device_type type, const char *tag) :
410 		zn_state(mconfig, type, tag),
411 		m_bankedroms(*this, "bankedroms"),
412 		m_rombank(*this, "rombank"),
413 		m_mb3773(*this, "mb3773")
414 	{
415 	}
416 
417 protected:
418 	virtual void machine_start() override;
419 	virtual void machine_reset() override;
420 
421 	void bank_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
422 
423 	required_memory_region m_bankedroms;
424 	required_memory_bank m_rombank;
425 	required_device<mb3773_device> m_mb3773;
426 };
427 
428 class taito_fx1a_state : public taito_fx_state
429 {
430 public:
taito_fx1a_state(const machine_config & mconfig,device_type type,const char * tag)431 	taito_fx1a_state(const machine_config &mconfig, device_type type, const char *tag) :
432 		taito_fx_state(mconfig, type, tag),
433 		m_audiocpu(*this, "audiocpu"),
434 		m_soundbank(*this, "soundbank")
435 	{
436 	}
437 
438 	void coh1000ta(machine_config &config);
439 
440 private:
441 	virtual void machine_start() override;
442 	virtual void machine_reset() override;
443 
444 	void main_map(address_map &map);
445 	void sound_map(address_map &map);
446 
447 	void sound_bankswitch_w(uint8_t data);
448 
449 	required_device<cpu_device> m_audiocpu;
450 	required_memory_bank m_soundbank;
451 };
452 
453 class taito_fx1b_state : public taito_fx_state
454 {
455 public:
taito_fx1b_state(const machine_config & mconfig,device_type type,const char * tag)456 	taito_fx1b_state(const machine_config &mconfig, device_type type, const char *tag) :
457 		taito_fx_state(mconfig, type, tag),
458 		m_zoom(*this, "taito_zoom"),
459 		m_fm1208s(*this, "fm1208s")
460 	{
461 	}
462 
463 	void base_config(machine_config &config);
464 	void coh1000tb(machine_config &config);
465 
466 private:
467 	virtual void machine_start() override;
468 
469 	void main_map(address_map &map);
470 
471 	void fram_w(offs_t offset, uint8_t data);
472 	uint8_t fram_r(offs_t offset);
473 
474 	required_device<taito_zoom_device> m_zoom;
475 	required_device<nvram_device> m_fm1208s;
476 
477 	std::unique_ptr<uint8_t[]> m_fram;
478 };
479 
480 class gdarius_state : public taito_fx1b_state
481 {
482 public:
gdarius_state(const machine_config & mconfig,device_type type,const char * tag)483 	gdarius_state(const machine_config &mconfig, device_type type, const char *tag) :
484 		taito_fx1b_state(mconfig, type, tag)
485 	{
486 	}
487 
488 	void coh1002tb(machine_config &config);
489 };
490 
491 //
492 // Atari ZN-derived hardware (Primal Rage 2)
493 //
494 
495 class primrag2_state : public zn_state
496 {
497 public:
primrag2_state(const machine_config & mconfig,device_type type,const char * tag)498 	primrag2_state(const machine_config &mconfig, device_type type, const char *tag) :
499 		zn_state(mconfig, type, tag),
500 		m_vt83c461(*this, "ide")
501 	{
502 	}
503 
504 	void coh1000w(machine_config &config);
505 
506 private:
507 	virtual void machine_start() override;
508 
509 	void main_map(address_map &map);
510 
511 	void dma_read(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size);
512 	void dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size);
513 
514 	uint16_t vt83c461_16_r(offs_t offset, uint16_t mem_mask = ~0);
515 	void vt83c461_16_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
516 	uint16_t vt83c461_32_r(offs_t offset, uint16_t mem_mask = ~0);
517 	void vt83c461_32_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
518 
519 	required_device<vt83c461_device> m_vt83c461;
520 
521 	uint16_t m_vt83c461_latch;
522 };
523 
524 //
525 // Tecmo ZN-derived hardware
526 //
527 
528 class tecmo_zn_state : public zn_state
529 {
530 public:
tecmo_zn_state(const machine_config & mconfig,device_type type,const char * tag)531 	tecmo_zn_state(const machine_config &mconfig, device_type type, const char *tag) :
532 		zn_state(mconfig, type, tag),
533 		m_bankedroms(*this, "bankedroms"),
534 		m_rombank(*this, "rombank")
535 	{
536 	}
537 
538 	void coh1002m(machine_config &config);
539 	void coh1002ml(machine_config &config);
540 
541 protected:
542 	void base_map(address_map &map);
543 
544 private:
545 	virtual void machine_start() override;
546 	virtual void machine_reset() override;
547 
548 	void link_map(address_map &map);
549 	void link_port_map(address_map &map);
550 
551 	void bank_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
552 
553 	required_memory_region m_bankedroms;
554 	required_memory_bank m_rombank;
555 };
556 
557 class cbaj_state : public tecmo_zn_state
558 {
559 public:
cbaj_state(const machine_config & mconfig,device_type type,const char * tag)560 	cbaj_state(const machine_config &mconfig, device_type type, const char *tag) :
561 		tecmo_zn_state(mconfig, type, tag),
562 		m_audiocpu(*this, "audiocpu"),
563 		m_fifo(*this, "cbaj_fifo%u", 1)
564 	{
565 	}
566 
567 	void cbaj(machine_config &config);
568 
569 private:
570 	void main_map(address_map &map);
571 
572 	void z80_map(address_map &map);
573 	void z80_port_map(address_map &map);
574 
575 	uint8_t sound_main_status_r();
576 	uint8_t sound_z80_status_r();
577 
578 	required_device<cpu_device> m_audiocpu;
579 	required_device_array<fifo7200_device, 2> m_fifo;
580 };
581 
582 #endif // MAME_INCLUDES_ZN_H
583