// 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 //************************************************************************** DEFINE_DEVICE_TYPE(S97271P, s97271p_device, "s97271p", "N-Sub Oscillator 97271-P") /* 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 }; //************************************************************************** // 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, tag, owner, clock), m_samples(*this, "samples") { } //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- void s97271p_device::device_add_mconfig(machine_config &config) { SPEAKER(config, "mono").front_center(); /* samples */ SAMPLES(config, m_samples); m_samples->set_channels(13); m_samples->set_samples_names(nsub_sample_names); m_samples->add_route(ALL_OUTPUTS, "mono", 0.5); } //------------------------------------------------- // 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_EXPL_L) { m_samples->start(SND_EXPL_L0, SND_EXPL_L0, 1); m_samples->stop(SND_EXPL_L1); } else if (bitsGoneHigh & S97271P_EXPL_L) { m_samples->start(SND_EXPL_L1, SND_EXPL_L1, 0); m_samples->stop(SND_EXPL_L0); } 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); } }