From 636cd43733b3e4a253b0647d1ffe01bd89d66115 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 11 Apr 2019 21:48:35 -0400 Subject: [PATCH] intrgmes: Re-add CRTC as multiplexed with PSG; add stub handlers for protection accesses (nw) --- src/mame/drivers/funworld.cpp | 71 +++++++++++++++++++++++++---------- src/mame/includes/funworld.h | 40 +++++++++++++++++--- 2 files changed, 85 insertions(+), 26 deletions(-) diff --git a/src/mame/drivers/funworld.cpp b/src/mame/drivers/funworld.cpp index bb44d02badd..5e7fbd0c120 100644 --- a/src/mame/drivers/funworld.cpp +++ b/src/mame/drivers/funworld.cpp @@ -1143,8 +1143,6 @@ #include "cpu/m6502/r65c02.h" #include "machine/6821pia.h" #include "machine/nvram.h" -#include "sound/ay8910.h" -#include "video/mc6845.h" #include "screen.h" #include "speaker.h" @@ -1393,17 +1391,56 @@ void funworld_state::witchryl_map(address_map &map) map(0x8000, 0xffff).rom(); } -void funworld_state::intergames_map(address_map &map) +uint8_t intergames_state::crtc_or_psg_r(offs_t offset) +{ + if (m_crtc_selected) + return m_crtc->register_r(); + else + return m_ay8910->data_r(); // read back from both $3000 and $3001! +} + +void intergames_state::crtc_or_psg_w(offs_t offset, uint8_t data) +{ + if (!m_crtc_selected) + m_ay8910->address_data_w(offset, data); + else if (BIT(offset, 0)) + m_crtc->register_w(data); + else + m_crtc->address_w(data); +} + +uint8_t intergames_state::prot_r(offs_t offset) +{ + if (!machine().side_effects_disabled()) + { + if (offset == 0x99) + m_crtc_selected = false; + else + logerror("%s: Protection read from $%04X\n", machine().describe_context(), offset + 0x3600); + } + + return 0xff; +} + +void intergames_state::prot_w(offs_t offset, uint8_t data) +{ + logerror("%s: Writing $#%02X to $%04X\n", machine().describe_context(), data, offset + 0x3600); +} + +void intergames_state::machine_reset() +{ + m_crtc_selected = true; +} + +void intergames_state::intergames_map(address_map &map) { map(0x0000, 0x0fff).ram().share("nvram"); - map(0x2000, 0x2fff).ram().w(FUNC(funworld_state::funworld_videoram_w)).share("videoram"); - map(0x3000, 0x3001).r("ay8910", FUNC(ay8910_device::data_r)); - map(0x3000, 0x3001).w("ay8910", FUNC(ay8910_device::address_data_w)); -// map(0x3000, 0x3000).w("crtc", FUNC(mc6845_device::address_w)); -// map(0x3001, 0x3001).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); + map(0x2000, 0x2fff).ram().w(FUNC(intergames_state::funworld_videoram_w)).share("videoram"); + map(0x3000, 0x3001).rw(FUNC(intergames_state::crtc_or_psg_r), FUNC(intergames_state::crtc_or_psg_w)); map(0x3200, 0x3203).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0x3400, 0x3403).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0x5000, 0x5fff).mirror(0x2000).ram().w(FUNC(funworld_state::funworld_colorram_w)).share("colorram"); + map(0x3600, 0x37ff).rw(FUNC(intergames_state::prot_r), FUNC(intergames_state::prot_w)); + map(0x5000, 0x5fff).mirror(0x2000).ram().w(FUNC(intergames_state::funworld_colorram_w)).share("colorram"); map(0x8000, 0xdfff).rom(); map(0xe000, 0xefff).ram(); map(0xf000, 0xffff).rom(); @@ -3471,15 +3508,13 @@ void chinatow_state::rcdino4(machine_config &config) } -void funworld_state::intrgmes(machine_config &config) +void intergames_state::intrgmes(machine_config &config) { fw1stpal(config); M65SC02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::intergames_map); - m_maincpu->set_periodic_int(FUNC(funworld_state::nmi_line_pulse), attotime::from_hz(60)); - - config.device_remove("crtc"); + m_maincpu->set_addrmap(AS_PROGRAM, &intergames_state::intergames_map); + //m_maincpu->set_periodic_int(FUNC(intergames_state::nmi_line_pulse), attotime::from_hz(60)); m_gfxdecode->set_info(gfx_fw2ndpal); } @@ -7176,10 +7211,6 @@ ROM_END AY8910 at $3000-$3001. CRTC at... $3000-$3001 too!!!. - Can't find a safe way to map both devices in the same address. - For now, just mapped the sound device in this offset, and generated - a periodic interrupt at 60Hz. - There are multiple buffers and compare from some registers, reminding the way some hardwares handle inputs without PIAs. @@ -8003,7 +8034,7 @@ void funworld_state::init_jolycdig() } -void funworld_state::init_intrgmes() +void intergames_state::driver_init() { // NOP'ing some values in ROM space to avoid the hardware error. @@ -8153,7 +8184,7 @@ GAME( 199?, soccernw, 0, royalcd1, royalcrd, funworld_state, init_socc // Other games... GAME( 198?, funquiz, 0, funquiz, funquiz, funworld_state, empty_init, ROT0, "Fun World", "Fun World Quiz (Austrian)", 0 ) GAMEL( 1986, novoplay, 0, fw2ndpal, novoplay, funworld_state, empty_init, ROT0, "Admiral/Novomatic","Novo Play Multi Card / Club Card", 0, layout_novoplay ) -GAME( 1991, intrgmes, 0, intrgmes, intrgmes, funworld_state, init_intrgmes,ROT0, "Inter Games", "Joker Card (Inter Games)", 0 ) +GAME( 1991, intrgmes, 0, intrgmes, intrgmes, intergames_state, empty_init, ROT0, "Inter Games", "Joker Card (Inter Games)", 0 ) GAMEL( 1985, fw_a7_11, 0, fw_brick_2, fw_brick1, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A7-11 game 1", MACHINE_NOT_WORKING, layout_jollycrd ) GAMEL( 1985, fw_a7_11a, fw_a7_11, fw_brick_2, fw_brick1, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A7-11 game 2", MACHINE_NOT_WORKING, layout_jollycrd ) GAMEL( 1991, fw_a0_1, 0, fw_brick_2, fw_brick1, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A0-1 game", MACHINE_NOT_WORKING, layout_jollycrd ) diff --git a/src/mame/includes/funworld.h b/src/mame/includes/funworld.h index 3e55ad7a1ce..3cf0c313602 100644 --- a/src/mame/includes/funworld.h +++ b/src/mame/includes/funworld.h @@ -7,6 +7,8 @@ #include "emupal.h" #include "machine/i2cmem.h" +#include "sound/ay8910.h" +#include "video/mc6845.h" class funworld_state : public driver_device { @@ -30,7 +32,6 @@ public: void cuoreuno(machine_config &config); void funquiz(machine_config &config); void witchryl(machine_config &config); - void intrgmes(machine_config &config); void fw_brick_1(machine_config &config); void fw_brick_2(machine_config &config); @@ -41,7 +42,6 @@ public: void init_dino4(); void init_ctunk(); void init_jolycdig(); - void init_intrgmes(); protected: DECLARE_WRITE8_MEMBER(funworld_videoram_w); @@ -72,7 +72,6 @@ private: void funquiz_map(address_map &map); void funworld_map(address_map &map); void fw_brick_map(address_map &map); - void intergames_map(address_map &map); void saloon_map(address_map &map); void witchryl_map(address_map &map); @@ -159,11 +158,10 @@ private: class royalcrdf_state : public funworld_state { public: - using funworld_state::funworld_state; void royalcrdf(machine_config& config); - + void driver_init() override; private: @@ -174,4 +172,34 @@ private: void royalcrdf_opcodes_map(address_map& map); }; -#endif // MAME_INCLUDES_FUNWORLD_H \ No newline at end of file +class intergames_state : public funworld_state +{ +public: + intergames_state(const machine_config &mconfig, device_type type, const char *tag) : + funworld_state(mconfig, type, tag), + m_crtc(*this, "crtc"), + m_ay8910(*this, "ay8910"), + m_crtc_selected(false) + { } + + void intrgmes(machine_config &config); + +protected: + virtual void driver_init() override; + virtual void machine_reset() override; + +private: + uint8_t crtc_or_psg_r(offs_t offset); + void crtc_or_psg_w(offs_t offset, uint8_t data); + uint8_t prot_r(offs_t offset); + void prot_w(offs_t offset, uint8_t data); + + void intergames_map(address_map &map); + + required_device m_crtc; + required_device m_ay8910; + + bool m_crtc_selected; +}; + +#endif // MAME_INCLUDES_FUNWORLD_H