summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/audio/vicdual-97271p.cpp
blob: 6d202e73a15098a86c15283313708107a5736f2f (plain) (tree)


















                                                                            
                                                                                  































                                                          
    

















                                                                            







                                                                                                                 
                                                      




                                                   
                                                

                                                   

                                                               
                                               

                     




                                                        





















































                                                                
                                         
         


                                                              
         

                                                              





































                                                              
// 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);
	}
}