summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-05-26 16:34:14 +1000
committer Vas Crabb <vas@vastheman.com>2017-05-26 16:43:29 +1000
commit308c2bb72d370ec873d9737ee35c5817d2c90d7f (patch)
treeec68683921071589bd8021a55d9613fb1c8629c3
parent504071e721206f3c0bfe2696e66a7dbd9c54db1f (diff)
cheekyms: add preliminary netlist sound based on schematics provided by Sam Grech
(nw) It doesn't work quite right yet. The "Hammer" and "Pest" sounds are generated by free-running 555/556 timers and gated with LM324 applifiers. For whatever reason, the netlist system produces a kind of buzzing from the "Hammer" circuit when it's supposed to be suppressed, and it doesn't think the pest sound should be suppressed completely so you can always hear it at a low level in the background. The "Cheese" circuit is a bit weird - either they're using the base-emitter junction of a 2SC945 as a signal diode, or there's an error in the schematic (collector is shown unconnected). Connecting this part of the circuit causes the netlist system to hang, so R2/R3/C8/Q2 are not connected for now.
-rw-r--r--scripts/target/mame/arcade.lua4
-rw-r--r--[-rwxr-xr-x]src/lib/netlist/nl_base.h0
-rw-r--r--[-rwxr-xr-x]src/lib/netlist/nl_factory.cpp0
-rw-r--r--[-rwxr-xr-x]src/lib/netlist/nl_factory.h0
-rw-r--r--src/mame/audio/cheekyms.cpp64
-rw-r--r--src/mame/audio/cheekyms.h44
-rw-r--r--src/mame/audio/nl_cheekyms.cpp266
-rw-r--r--src/mame/audio/nl_cheekyms.h12
-rw-r--r--src/mame/drivers/cheekyms.cpp5
-rw-r--r--src/mame/includes/cheekyms.h87
-rw-r--r--src/mame/video/cheekyms.cpp19
11 files changed, 446 insertions, 55 deletions
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index eb7877171c7..30e15d0cc8f 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -4073,6 +4073,10 @@ files {
createMAMEProjects(_target, _subtarget, "univers")
files {
+ MAME_DIR .. "src/mame/audio/cheekyms.cpp",
+ MAME_DIR .. "src/mame/audio/cheekyms.h",
+ MAME_DIR .. "src/mame/audio/nl_cheekyms.cpp",
+ MAME_DIR .. "src/mame/audio/nl_cheekyms.h",
MAME_DIR .. "src/mame/drivers/cheekyms.cpp",
MAME_DIR .. "src/mame/includes/cheekyms.h",
MAME_DIR .. "src/mame/video/cheekyms.cpp",
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 7afed824630..7afed824630 100755..100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index 2bb49590c4b..2bb49590c4b 100755..100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index 6dad6c5e171..6dad6c5e171 100755..100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
diff --git a/src/mame/audio/cheekyms.cpp b/src/mame/audio/cheekyms.cpp
new file mode 100644
index 00000000000..59687742be4
--- /dev/null
+++ b/src/mame/audio/cheekyms.cpp
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+
+#include "emu.h"
+#include "audio/cheekyms.h"
+#include "audio/nl_cheekyms.h"
+
+#include "speaker.h"
+
+
+DEFINE_DEVICE_TYPE(CHEEKY_MOUSE_AUDIO, cheekyms_audio_device, "cheekyms_audio", "Cheeky Mouse Sound Board")
+
+
+cheekyms_audio_device::cheekyms_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, CHEEKY_MOUSE_AUDIO, tag, owner, clock)
+ , m_mute(*this, "sound_nl:mute")
+ , m_cheese(*this, "sound_nl:cheese")
+ , m_music(*this, "sound_nl:music")
+ , m_mouse(*this, "sound_nl:mouse")
+ , m_hammer(*this, "sound_nl:hammer")
+ , m_pest(*this, "sound_nl:pest")
+ , m_mouse_dies(*this, "sound_nl:mouse_dies")
+ , m_pest_dies(*this, "sound_nl:pest_dies")
+ , m_coin_extra(*this, "sound_nl:coin_extra")
+{
+}
+
+
+WRITE_LINE_MEMBER(cheekyms_audio_device::mute_w) { m_mute->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::cheese_w) { m_cheese->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::music_w) { m_music->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::mouse_w) { m_mouse->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::hammer_w) { m_hammer->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::pest_w) { m_pest->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::mouse_dies_w) { m_mouse_dies->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::pest_dies_w) { m_pest_dies->write_line(state); }
+WRITE_LINE_MEMBER(cheekyms_audio_device::coin_extra_w) { m_coin_extra->write_line(state); }
+
+
+MACHINE_CONFIG_MEMBER(cheekyms_audio_device::device_add_mconfig)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("sound_nl", NETLIST_SOUND, 48000)
+ MCFG_NETLIST_SETUP(cheekyms)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "mute", "I_MUTE.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "cheese", "I_CHEESE.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "music", "I_MUSIC.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "mouse", "I_MOUSE.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "hammer", "I_HAMMER.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "pest", "I_PEST.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "mouse_dies", "I_MOUSE_DIES.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "pest_dies", "I_PEST_DIES.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("sound_nl", "coin_extra", "I_COIN_EXTRA.IN", 0)
+
+ MCFG_NETLIST_STREAM_OUTPUT("sound_nl", 0, "VR1.2")
+ MCFG_NETLIST_ANALOG_MULT_OFFSET(30000.0 * 10.0, 0.0) // FIXME: no clue what numbers to use here
+MACHINE_CONFIG_END
+
+
+void cheekyms_audio_device::device_start()
+{
+}
diff --git a/src/mame/audio/cheekyms.h b/src/mame/audio/cheekyms.h
new file mode 100644
index 00000000000..65b25753e5f
--- /dev/null
+++ b/src/mame/audio/cheekyms.h
@@ -0,0 +1,44 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#ifndef MAME_AUDIO_CHEEKYMS_H
+#define MAME_AUDIO_CHEEKYMS_H
+
+#pragma once
+
+#include "machine/netlist.h"
+
+
+class cheekyms_audio_device : public device_t
+{
+public:
+ cheekyms_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_WRITE_LINE_MEMBER(mute_w); // 15
+ DECLARE_WRITE_LINE_MEMBER(cheese_w); // 13
+ DECLARE_WRITE_LINE_MEMBER(music_w); // 14
+ DECLARE_WRITE_LINE_MEMBER(mouse_w); // 9
+ DECLARE_WRITE_LINE_MEMBER(hammer_w); // 12
+ DECLARE_WRITE_LINE_MEMBER(pest_w); // 8
+ DECLARE_WRITE_LINE_MEMBER(mouse_dies_w); // 11
+ DECLARE_WRITE_LINE_MEMBER(pest_dies_w); // 10
+ DECLARE_WRITE_LINE_MEMBER(coin_extra_w); // 16
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+
+private:
+ required_device<netlist_mame_logic_input_device> m_mute;
+ required_device<netlist_mame_logic_input_device> m_cheese;
+ required_device<netlist_mame_logic_input_device> m_music;
+ required_device<netlist_mame_logic_input_device> m_mouse;
+ required_device<netlist_mame_logic_input_device> m_hammer;
+ required_device<netlist_mame_logic_input_device> m_pest;
+ required_device<netlist_mame_logic_input_device> m_mouse_dies;
+ required_device<netlist_mame_logic_input_device> m_pest_dies;
+ required_device<netlist_mame_logic_input_device> m_coin_extra;
+};
+
+DECLARE_DEVICE_TYPE(CHEEKY_MOUSE_AUDIO, cheekyms_audio_device)
+
+#endif // MAME_AUDIO_CHEEKYMS_H
diff --git a/src/mame/audio/nl_cheekyms.cpp b/src/mame/audio/nl_cheekyms.cpp
new file mode 100644
index 00000000000..8f021fe9c50
--- /dev/null
+++ b/src/mame/audio/nl_cheekyms.cpp
@@ -0,0 +1,266 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+
+#include "audio/nl_cheekyms.h"
+#include "netlist/devices/net_lib.h"
+
+
+#ifndef __PLIB_PREPROCESSOR__
+
+#endif
+
+
+NETLIST_START(cheekyms_schematics)
+
+ // Shared chips
+ TTL_7404_DIP(IC1)
+ LM324_DIP(IC5)
+ NET_C(IC1.14, IC5.4, I_V5.Q)
+ NET_C(IC1.7, IC5.11, GND)
+
+ // shut the netlist parser up about unconnected inputs
+ NET_C(I_V5.Q, IC1.11, IC1.13)
+
+ // Mute
+ RES(R1, RES_K(10))
+ CAP(C10, CAP_U(10))
+ QBJT_EB(Q1, "2SC945")
+ NET_C(IC1.2, R1.1)
+ NET_C(R1.2, C10.1, Q1.B)
+ NET_C(C10.2, Q1.E, GND)
+
+ // Cheese
+#if 0
+ // FIXME: Not working right, causes the netlist system to die
+ // Note that the collector of Q2 is not connected, they're just using the base-emitter junction as a diode
+ // Well, either that or there's an error in the schematic
+ RES(R2, RES_M(1))
+ RES(R3, RES_K(1))
+ RES(R4, RES_K(100))
+ RES(R5, RES_K(1))
+ RES(R6, RES_K(100))
+ RES(R7, RES_K(1))
+ RES(R8, RES_M(1))
+ RES(R9, RES_K(10))
+ RES(R10, RES_K(10))
+ RES(R11, RES_K(10))
+ RES(R12, RES_K(100))
+ CAP(C8, CAP_U(0.1))
+ CAP(C9, CAP_U(0.1))
+ CAP(C11, CAP_U(0.1))
+ QBJT_EB(Q2, "2SC945")
+ NET_C(R2.1, I_VPLUS.Q)
+ NET_C(R2.2, C8.1, Q2.E)
+ NET_C(R3.1, C8.2)
+ NET_C(R3.2, R4.1, IC5.10)
+ NET_C(R5.2, R6.1, IC5.9)
+ NET_C(R6.2, C9.1, IC5.8)
+ NET_C(R7.1, C9.2)
+ NET_C(R7.2, R8.1, IC5.13)
+ NET_C(R8.2, C11.1, IC5.14)
+ NET_C(R10.2, IC1.4)
+ NET_C(R9.1, R10.1, IC5.12)
+ NET_C(R9.2, I_V5.Q)
+ NET_C(R11.1, R12.1, C11.2)
+ NET_C(R4.2, R5.1, R11.2, Q2.B, GND)
+#else
+ // Rip out just enough to make it not blow up
+ RES(R4, RES_K(100))
+ RES(R5, RES_K(1))
+ RES(R6, RES_K(100))
+ RES(R7, RES_K(1))
+ RES(R8, RES_M(1))
+ RES(R9, RES_K(10))
+ RES(R10, RES_K(10))
+ RES(R11, RES_K(10))
+ RES(R12, RES_K(100))
+ CAP(C9, CAP_U(0.1))
+ CAP(C11, CAP_U(0.1))
+ NET_C(R4.1, IC5.10)
+ NET_C(R5.2, R6.1, IC5.9)
+ NET_C(R6.2, C9.1, IC5.8)
+ NET_C(R7.1, C9.2)
+ NET_C(R7.2, R8.1, IC5.13)
+ NET_C(R8.2, C11.1, IC5.14)
+ NET_C(R10.1, IC1.4)
+ NET_C(R9.1, R10.2, IC5.12)
+ NET_C(R9.2, I_V5.Q)
+ NET_C(R11.1, R12.1, C11.2)
+ NET_C(R4.2, R5.1, R11.2, GND)
+#endif
+
+ // Music
+ RES(R13, RES_K(100))
+
+ // Mouse
+ RES(R14, RES_K(4.7))
+ RES(R15, RES_K(1))
+ RES(R16, RES_K(68))
+ RES(R17, RES_K(100))
+ CAP(C12, CAP_U(0.01))
+ CAP(C13, CAP_U(10))
+ DIODE(D4, "1S1588")
+ NE555(IC4_1) // one half of a 556 (other half does coin & extra)
+ NET_C(D4.K, R14.1, IC4_1.RESET)
+ NET_C(D4.A, R14.2, C13.1, IC4_1.CONT)
+ NET_C(R15.1, IC4_1.VCC, I_V5.Q)
+ NET_C(R15.2, R16.1, IC4_1.DISCH)
+ NET_C(R16.2, C12.1, IC4_1.TRIG, IC4_1.THRESH)
+ NET_C(C13.2, C12.2, IC4_1.GND, GND)
+ NET_C(R17.1, IC4_1.OUT)
+
+ // Hammer
+ RES(R18, RES_K(1))
+ RES(R19, RES_K(150))
+ RES(R20, RES_K(10))
+ RES(R21, RES_K(100))
+ RES(R22, RES_K(100))
+ RES(R23, RES_M(1))
+ RES(R24, RES_K(51))
+ CAP(C14, CAP_U(0.01))
+ CAP(C15, CAP_U(0.01))
+ CAP(C16, CAP_U(0.1))
+ DIODE(D5, "1S1588")
+ DIODE(D6, "1S1588")
+ NE555(IC6_1) // one half of a 556 (other half does pest)
+ NET_C(R18.1, R23.1, IC6_1.RESET, IC6_1.VCC, I_V5.Q)
+ NET_C(R18.2, R19.1, IC6_1.DISCH)
+ NET_C(R19.2, C14.1, IC6_1.TRIG, IC6_1.THRESH)
+ NET_C(R20.1, IC6_1.OUT)
+ NET_C(R20.2, R21.1, C15.1)
+ NET_C(R21.2, R22.1, IC5.6)
+ NET_C(R22.2, R24.1, IC5.7)
+ NET_C(D5.K, IC1.6)
+ NET_C(D5.A, D6.K)
+ NET_C(R23.2, C16.1, D6.A, IC5.5)
+ NET_C(C14.2, C15.2, C16.2, IC6_1.GND, GND)
+
+ // Pest
+ RES(R25, RES_K(20))
+ RES(R26, RES_K(10))
+ RES(R27, 220)
+ RES(R28, RES_K(100))
+ RES(R29, RES_K(4.7))
+ RES(R30, RES_K(1))
+ RES(R31, RES_K(68))
+ RES(R32, RES_K(100))
+ RES(R33, RES_K(100))
+ RES(R34, RES_K(51))
+ RES(R35, RES_M(1))
+ CAP(C17, CAP_U(2.2))
+ CAP(C18, CAP_U(10))
+ CAP(C19, CAP_U(0.01))
+ CAP(C20, CAP_U(0.22))
+ DIODE(D7, "1S1588")
+ DIODE(D8, "1S1588")
+ DIODE(D9, "1S1588")
+ NE555(IC3)
+ NE555(IC6_2) // one half of a 556 (other half does hammer)
+ NET_C(R25.1, R29.1, R30.1, R35.2, IC3.RESET, IC3.VCC, IC6_2.RESET, IC6_2.VCC, I_V5.Q)
+ NET_C(R25.2, R26.1, IC3.DISCH)
+ NET_C(R26.2, C17.1, IC3.TRIG, IC3.THRESH)
+ NET_C(R27.1, R28.1, IC3.OUT)
+ NET_C(R27.2, D7.K)
+ NET_C(R28.2, R29.2, C18.1, D7.A, IC6_2.CONT)
+ NET_C(R30.2, R31.1, IC6_2.DISCH)
+ NET_C(R31.2, C19.1, IC6_2.TRIG, IC6_2.THRESH)
+ NET_C(R32.1, IC6_2.OUT)
+ NET_C(R32.2, R33.1, IC5.2)
+ NET_C(R33.2, R34.1, IC5.1)
+ NET_C(D8.K, IC1.8)
+ NET_C(D8.A, D9.K)
+ NET_C(R35.1, C20.1, D9.A, IC5.3)
+ NET_C(C17.2, C18.2, C19.2, C20.2, IC3.GND, IC6_2.GND, GND)
+
+ // Mouse dies
+ RES(R36, RES_K(1))
+ RES(R37, RES_K(33))
+ RES(R38, 560)
+ RES(R39, RES_K(100))
+ CAP(C21, CAP_U(0.01))
+ CAP(C22, CAP_U(47))
+ NE555(IC2_2) // one half of a 556 (other half does pest dies)
+ NET_C(R38.1, IC2_2.RESET)
+ NET_C(R38.2, C22.1, IC2_2.CONT)
+ NET_C(R36.1, IC2_2.VCC, I_V5.Q)
+ NET_C(R36.2, R37.1, IC2_2.DISCH)
+ NET_C(R37.2, C21.1, IC2_2.TRIG, IC2_2.THRESH)
+ NET_C(C22.2, C21.2, IC2_2.GND, GND)
+ NET_C(R39.1, IC2_2.OUT)
+
+ // Pest dies
+ RES(R40, RES_K(1))
+ RES(R41, RES_K(47))
+ RES(R42, RES_K(100))
+ CAP(C23, CAP_U(0.033))
+ NE555(IC2_1) // one half of a 556 (other half does mouse dies)
+ NET_C(R40.1, IC2_1.VCC, I_V5.Q)
+ NET_C(R40.2, R41.1, IC2_1.DISCH)
+ NET_C(R41.2, C23.1, IC2_1.TRIG, IC2_1.THRESH)
+ NET_C(C23.2, IC2_1.GND, GND)
+ NET_C(R42.1, IC2_1.OUT)
+
+ // Coin & extra
+ RES(R44, RES_K(1))
+ RES(R45, RES_K(47))
+ RES(R46, RES_K(100))
+ CAP(C24, CAP_U(0.01))
+ NE555(IC4_2) // one half of a 556 (other half does mouse)
+ NET_C(R44.1, IC4_2.VCC, I_V5.Q)
+ NET_C(R44.2, R45.1, IC4_2.DISCH)
+ NET_C(R45.2, C24.1, IC4_2.TRIG, IC4_2.THRESH)
+ NET_C(C24.2, IC4_2.GND, GND)
+ NET_C(R46.1, IC4_2.OUT)
+
+ // Mixdown
+ RES(R43, RES_K(10))
+ POT(VR1, RES_K(1))
+ NET_C(R12.2, R13.2, R17.2, R24.2, R34.2, R39.2, R42.2, R43.1, Q1.C)
+ NET_C(R46.2, R43.2, VR1.1)
+ NET_C(VR1.3, GND)
+
+NETLIST_END()
+
+
+NETLIST_START(cheekyms)
+
+ SOLVER(Solver, 18000)
+ PARAM(Solver.ACCURACY, 1e-8)
+ PARAM(Solver.NR_LOOPS, 300)
+ PARAM(Solver.GS_LOOPS, 1)
+ PARAM(Solver.METHOD, "MAT_CR")
+ PARAM(Solver.PARALLEL, 0)
+ PARAM(Solver.SOR_FACTOR, 1.00)
+ PARAM(Solver.DYNAMIC_TS, 0)
+ PARAM(Solver.DYNAMIC_LTE, 5e-4)
+ PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 20e-6)
+
+ LOCAL_SOURCE(cheekyms_schematics)
+
+ ANALOG_INPUT(I_V5, 5)
+ ANALOG_INPUT(I_VPLUS, 12.9) // very approximate - 15V dropped by three diodes and filtered
+ //ANALOG_INPUT(I_V0, 0)
+ ALIAS(I_V0.Q, GND)
+
+ INCLUDE(cheekyms_schematics)
+
+ LOGIC_INPUT(I_MUTE, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_CHEESE, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_MUSIC, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_MOUSE, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_HAMMER, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_PEST, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_MOUSE_DIES, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_PEST_DIES, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ LOGIC_INPUT(I_COIN_EXTRA, 1, "74XX") // FIXME: need 74LS family model (half the sink capability)
+ NET_C(I_MUTE.Q, IC1.1)
+ NET_C(I_CHEESE.Q, IC1.3)
+ NET_C(I_MUSIC.Q, R13.1)
+ NET_C(I_MOUSE.Q, IC4_1.RESET)
+ NET_C(I_HAMMER.Q, IC1.5)
+ NET_C(I_PEST.Q, IC1.9)
+ NET_C(I_MOUSE_DIES.Q, IC2_2.RESET)
+ NET_C(I_PEST_DIES.Q, IC2_1.RESET)
+ NET_C(I_COIN_EXTRA.Q, IC4_2.RESET)
+
+NETLIST_END()
diff --git a/src/mame/audio/nl_cheekyms.h b/src/mame/audio/nl_cheekyms.h
new file mode 100644
index 00000000000..769ea23e3f3
--- /dev/null
+++ b/src/mame/audio/nl_cheekyms.h
@@ -0,0 +1,12 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#ifndef MAME_AUDIO_NL_CHEEKYMS_H
+#define MAME_AUDIO_NL_CHEEKYMS_H
+
+#pragma once
+
+#include "netlist/nl_setup.h"
+
+NETLIST_EXTERNAL(cheekyms)
+
+#endif // MAME_AUDIO_NL_CHEEKYMS_H
diff --git a/src/mame/drivers/cheekyms.cpp b/src/mame/drivers/cheekyms.cpp
index 85f1e09a641..cefe0b8e02e 100644
--- a/src/mame/drivers/cheekyms.cpp
+++ b/src/mame/drivers/cheekyms.cpp
@@ -10,8 +10,6 @@
#include "includes/cheekyms.h"
#include "cpu/z80/z80.h"
-#include "sound/volt_reg.h"
-#include "speaker.h"
INPUT_CHANGED_MEMBER(cheekyms_state::coin_inserted)
@@ -144,6 +142,8 @@ static MACHINE_CONFIG_START( cheekyms )
MCFG_PALETTE_INIT_OWNER(cheekyms_state, cheekyms)
/* audio hardware */
+ MCFG_DEVICE_ADD("soundboard", CHEEKY_MOUSE_AUDIO, 0)
+#if 0
MCFG_SPEAKER_STANDARD_MONO("speaker")
MCFG_SOUND_ADD("dac0", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
@@ -163,6 +163,7 @@ static MACHINE_CONFIG_START( cheekyms )
MCFG_SOUND_ROUTE_EX(0, "dac5", 1.0, DAC_VREF_POS_INPUT)
MCFG_SOUND_ROUTE_EX(0, "dac6", 1.0, DAC_VREF_POS_INPUT)
MCFG_SOUND_ROUTE_EX(0, "dac7", 1.0, DAC_VREF_POS_INPUT)
+#endif
MACHINE_CONFIG_END
diff --git a/src/mame/includes/cheekyms.h b/src/mame/includes/cheekyms.h
index 02ddeeac82e..1aeeaec87ab 100644
--- a/src/mame/includes/cheekyms.h
+++ b/src/mame/includes/cheekyms.h
@@ -5,7 +5,12 @@
Cheeky Mouse
*************************************************************************/
+#ifndef MAME_INCLUDES_CHEEKYMS_H
+#define MAME_INCLUDES_CHEEKYMS_H
+#pragma once
+
+#include "audio/cheekyms.h"
#include "sound/dac.h"
#include "screen.h"
@@ -13,47 +18,17 @@ class cheekyms_state : public driver_device
{
public:
cheekyms_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dac0(*this, "dac0"),
- m_dac1(*this, "dac1"),
- m_dac2(*this, "dac2"),
- m_dac3(*this, "dac3"),
- m_dac4(*this, "dac4"),
- m_dac5(*this, "dac5"),
- m_dac6(*this, "dac6"),
- m_dac7(*this, "dac7"),
- m_gfxdecode(*this, "gfxdecode"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette"),
- m_videoram(*this, "videoram"),
- m_spriteram(*this, "spriteram"),
- m_port_80(*this, "port_80") { }
-
- /* devices */
- required_device<cpu_device> m_maincpu;
- required_device<dac_bit_interface> m_dac0;
- required_device<dac_bit_interface> m_dac1;
- required_device<dac_bit_interface> m_dac2;
- required_device<dac_bit_interface> m_dac3;
- required_device<dac_bit_interface> m_dac4;
- required_device<dac_bit_interface> m_dac5;
- required_device<dac_bit_interface> m_dac6;
- required_device<dac_bit_interface> m_dac7;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<screen_device> m_screen;
- required_device<palette_device> m_palette;
-
- /* memory pointers */
- required_shared_ptr<uint8_t> m_videoram;
- required_shared_ptr<uint8_t> m_spriteram;
- required_shared_ptr<uint8_t> m_port_80;
-
- /* video-related */
- tilemap_t *m_cm_tilemap;
- std::unique_ptr<bitmap_ind16> m_bitmap_buffer;
-
- uint8_t m_irq_mask;
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_sound_board(*this, "soundboard")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_screen(*this, "screen")
+ , m_palette(*this, "palette")
+ , m_videoram(*this, "videoram")
+ , m_spriteram(*this, "spriteram")
+ , m_port_80(*this, "port_80")
+ {
+ }
DECLARE_WRITE8_MEMBER(port_40_w);
DECLARE_WRITE8_MEMBER(port_80_w);
@@ -63,10 +38,34 @@ public:
TILE_GET_INFO_MEMBER(get_tile_info);
- virtual void machine_start() override;
- virtual void video_start() override;
DECLARE_PALETTE_INIT(cheekyms);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, int flip );
+
+protected:
+ virtual void machine_start() override;
+ virtual void video_start() override;
+
+ void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, int flip);
+
+private:
+ // devices
+ required_device<cpu_device> m_maincpu;
+ required_device<cheekyms_audio_device> m_sound_board;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+
+ // memory pointers
+ required_shared_ptr<uint8_t> m_videoram;
+ required_shared_ptr<uint8_t> m_spriteram;
+ required_shared_ptr<uint8_t> m_port_80;
+
+ // video-related
+ tilemap_t *m_cm_tilemap;
+ std::unique_ptr<bitmap_ind16> m_bitmap_buffer;
+
+ uint8_t m_irq_mask;
};
+
+#endif // MAME_INCLUDES_CHEEKYMS_H
diff --git a/src/mame/video/cheekyms.cpp b/src/mame/video/cheekyms.cpp
index 8e41a38bfbc..7c7470c13aa 100644
--- a/src/mame/video/cheekyms.cpp
+++ b/src/mame/video/cheekyms.cpp
@@ -40,20 +40,21 @@ PALETTE_INIT_MEMBER(cheekyms_state, cheekyms)
WRITE8_MEMBER(cheekyms_state::port_40_w)
{
- m_dac0->write(BIT(data, 7)); // tune
- m_dac1->write(BIT(data, 6)); // mouse eating cheese
- m_dac2->write(BIT(data, 5)); // hammer
- m_dac3->write(BIT(data, 4)); // mouse died
- m_dac4->write(BIT(data, 3)); // mystery died
- m_dac5->write(BIT(data, 2)); // mouse appears
- m_dac6->write(BIT(data, 1)); // mystery appears
- m_dac7->write(BIT(data, 0));
+ m_sound_board->music_w(BIT(data, 7));
+ m_sound_board->cheese_w(BIT(data, 6));
+ m_sound_board->hammer_w(BIT(data, 5));
+ m_sound_board->mouse_dies_w(BIT(data, 4));
+ m_sound_board->pest_dies_w(BIT(data, 3));
+ m_sound_board->mouse_w(BIT(data, 2));
+ m_sound_board->pest_w(BIT(data, 1));
}
WRITE8_MEMBER(cheekyms_state::port_80_w)
{
- /* d0-d1 - sound enables, not sure which bit is which */
+ m_sound_board->coin_extra_w(BIT(data, 1));
+ m_sound_board->mute_w(BIT(data, 0));
+
/* d3-d5 - man scroll amount */
/* d6 - palette select (selects either 0 = PROM M9, 1 = PROM M8) */
/* d7 - screen flip */