summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/vicdual-97271p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/audio/vicdual-97271p.cpp')
-rw-r--r--src/mame/audio/vicdual-97271p.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/mame/audio/vicdual-97271p.cpp b/src/mame/audio/vicdual-97271p.cpp
new file mode 100644
index 00000000000..0807961a37f
--- /dev/null
+++ b/src/mame/audio/vicdual-97271p.cpp
@@ -0,0 +1,207 @@
+// license:BSD-3-Clause
+// copyright-holders:Ariane Fugmann
+
+/*
+N-Sub Oscillator 97271-P
+-----------------------------
+for the time being this is a simple sample player based on the work by MASH.
+*/
+
+#include "emu.h"
+#include "speaker.h"
+#include "audio/vicdual-97271p.h"
+
+#define S97271P_TAG "s97271p"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type S97271P = device_creator<s97271p_device>;
+
+/* bit definitions - sound effect drive outputs */
+#define S97271P_WARNING 0x01
+#define S97271P_SONAR 0x02
+#define S97271P_LAUNCH 0x04
+#define S97271P_EXPL_L 0x08
+#define S97271P_EXPL_S 0x10
+#define S97271P_BONUS 0x20
+#define S97271P_CODE 0x40
+#define S97271P_BOAT 0x80
+
+/* sample file names */
+static const char *const nsub_sample_names[] =
+{
+ "*nsub",
+ "SND_EXPL_L0",
+ "SND_EXPL_L1",
+ "SND_SONAR",
+ "SND_LAUNCH0",
+ "SND_LAUNCH1",
+ "SND_WARNING0",
+ "SND_WARNING1",
+ "SND_EXPL_S0",
+ "SND_EXPL_S1",
+ "SND_BONUS0",
+ "SND_BONUS1",
+ "SND_CODE",
+ "SND_BOAT",
+ nullptr
+};
+
+/* sample ids - must match sample file name table above */
+enum
+{
+ SND_EXPL_L0 = 0,
+ SND_EXPL_L1,
+ SND_SONAR,
+ SND_LAUNCH0,
+ SND_LAUNCH1,
+ SND_WARNING0,
+ SND_WARNING1,
+ SND_EXPL_S0,
+ SND_EXPL_S1,
+ SND_BONUS0,
+ SND_BONUS1,
+ SND_CODE,
+ SND_BOAT
+};
+
+
+//**************************************************************************
+// MACHINE FRAGMENTS
+//**************************************************************************
+
+static MACHINE_CONFIG_FRAGMENT( nsub_audio )
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ /* samples */
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(13)
+ MCFG_SAMPLES_NAMES(nsub_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// s97271p_device - constructor
+//-------------------------------------------------
+
+s97271p_device::s97271p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, S97271P, "N-Sub Oscillator 97271-P", tag, owner, clock, "s97271p", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor s97271p_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( nsub_audio );
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void s97271p_device::device_start()
+{
+ save_item(NAME(m_state));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void s97271p_device::device_reset()
+{
+ m_state = 0xff;
+}
+
+void s97271p_device::port_w(uint8_t data)
+{
+ uint8_t bitsChanged = m_state ^ data;
+ uint8_t bitsGoneHigh = bitsChanged & data;
+ uint8_t bitsGoneLow = bitsChanged & ~data;
+ m_state = data;
+
+ if (bitsGoneLow & S97271P_WARNING)
+ {
+ m_samples->start(SND_WARNING0, SND_WARNING0, 1);
+ m_samples->stop(SND_WARNING1);
+ } else if (bitsGoneHigh & S97271P_WARNING)
+ {
+ m_samples->start(SND_WARNING1, SND_WARNING1, 0);
+ m_samples->stop(SND_WARNING0);
+ }
+
+ if (bitsGoneLow & S97271P_SONAR)
+ {
+ m_samples->start(SND_SONAR, SND_SONAR, 1);
+ } else if (bitsGoneHigh & S97271P_SONAR)
+ {
+ m_samples->stop(SND_SONAR);
+ }
+
+ if (bitsGoneLow & S97271P_LAUNCH)
+ {
+ m_samples->start(SND_LAUNCH0, SND_LAUNCH0, 1);
+ m_samples->stop(SND_LAUNCH1);
+ } else if (bitsGoneHigh & S97271P_LAUNCH)
+ {
+ m_samples->start(SND_LAUNCH1, SND_LAUNCH1, 0);
+ m_samples->stop(SND_LAUNCH0);
+ }
+
+ if (bitsGoneLow & S97271P_WARNING)
+ {
+ m_samples->start(SND_WARNING0, SND_WARNING0, 1);
+ m_samples->stop(SND_WARNING1);
+ } else if (bitsGoneHigh & S97271P_WARNING)
+ {
+ m_samples->start(SND_WARNING1, SND_WARNING1, 0);
+ m_samples->stop(SND_WARNING0);
+ }
+
+ if (bitsGoneLow & S97271P_EXPL_S)
+ {
+ m_samples->start(SND_EXPL_S0, SND_EXPL_S0, 1);
+ m_samples->stop(SND_EXPL_S1);
+ } else if (bitsGoneHigh & S97271P_EXPL_S)
+ {
+ m_samples->start(SND_EXPL_S1, SND_EXPL_S1, 0);
+ m_samples->stop(SND_EXPL_S0);
+ }
+
+ if (bitsGoneLow & S97271P_BONUS)
+ {
+ m_samples->start(SND_BONUS0, SND_BONUS0, 1);
+ m_samples->stop(SND_BONUS1);
+ } else if (bitsGoneHigh & S97271P_BONUS)
+ {
+ m_samples->start(SND_BONUS1, SND_BONUS1, 0);
+ m_samples->stop(SND_BONUS0);
+ }
+
+ if (bitsGoneLow & S97271P_CODE)
+ {
+ m_samples->start(SND_CODE, SND_CODE, 1);
+ } else if (bitsGoneHigh & S97271P_CODE)
+ {
+ m_samples->stop(SND_CODE);
+ }
+
+ if (bitsGoneLow & S97271P_BOAT)
+ {
+ m_samples->start(SND_BOAT, SND_BOAT, 1);
+ } else if (bitsGoneHigh & S97271P_BOAT)
+ {
+ m_samples->stop(SND_BOAT);
+ }
+}