summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-04-11 21:48:35 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-04-11 22:05:08 -0400
commit636cd43733b3e4a253b0647d1ffe01bd89d66115 (patch)
tree281e95d3ad5b234a0835fcc9f0dab67ff4035dec
parent546dbda1f3b99c728454eeab220ccbf506cfb148 (diff)
intrgmes: Re-add CRTC as multiplexed with PSG; add stub handlers for protection accesses (nw)
-rw-r--r--src/mame/drivers/funworld.cpp71
-rw-r--r--src/mame/includes/funworld.h40
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<mc6845_device> m_crtc;
+ required_device<ay8910_device> m_ay8910;
+
+ bool m_crtc_selected;
+};
+
+#endif // MAME_INCLUDES_FUNWORLD_H