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