/*************************************************************************
audio\qix.c
*************************************************************************/
#include "driver.h"
#include "qix.h"
#include "sound/discrete.h"
/* Discrete Sound Input Nodes */
#define QIX_DAC_DATA NODE_01
#define QIX_VOL_DATA NODE_02
#define QIX_VOL_DATA_L NODE_03
#define QIX_VOL_DATA_R NODE_04
/***************************************************************************
Sound handlers
***************************************************************************/
WRITE8_HANDLER( qix_dac_w )
{
discrete_sound_w(QIX_DAC_DATA, data);
}
WRITE8_HANDLER( qix_vol_w )
{
discrete_sound_w(QIX_VOL_DATA, data);
}
/************************************************************************/
/* qix Sound System Analog emulation */
/************************************************************************/
/*
* This hardware is capable of independant L/R volume control,
* but only sdungeon uses it for a stereo effect.
* Other games just use it for fixed L/R volume control.
*
* This is such a basic sound system that there is only one effect.
* So I won't bother keeping proper voltages levels, and will just
* start with the final gain.
*/
static const discrete_comp_adder_table qix_attn_table =
{
DISC_COMP_P_RESISTOR, 0, 4,
{RES_K(22)+250, RES_K(10)+250, RES_K(5.6)+250, RES_K(3.3)+250}
};
DISCRETE_SOUND_START(qix)
/* NODE */
DISCRETE_INPUTX_DATA(QIX_DAC_DATA, 128, -128*128, 128)
DISCRETE_INPUT_DATA (QIX_VOL_DATA)
/* Seperate the two 4-bit channels. */
DISCRETE_TRANSFORM3(QIX_VOL_DATA_L, 1, QIX_VOL_DATA, 16, 0x0f, "01/2&")
DISCRETE_TRANSFORM2(QIX_VOL_DATA_R, 1, QIX_VOL_DATA, 0x0f, "01&")
/* Work out the parallel resistance of the selected resistors. */
DISCRETE_COMP_ADDER(NODE_10, 1, QIX_VOL_DATA_L, &qix_attn_table)
DISCRETE_COMP_ADDER(NODE_20, 1, QIX_VOL_DATA_R, &qix_attn_table)
/* Then use it for the resistor divider network. */
DISCRETE_TRANSFORM3(NODE_11, 1, NODE_10, RES_K(10), QIX_DAC_DATA, "001+/2*")
DISCRETE_TRANSFORM3(NODE_21, 1, NODE_20, RES_K(10), QIX_DAC_DATA, "001+/2*")
/* If no resistors are selected (0), then the volume is full. */
DISCRETE_SWITCH(NODE_12, 1, QIX_VOL_DATA_L, QIX_DAC_DATA, NODE_11)
DISCRETE_SWITCH(NODE_22, 1, QIX_VOL_DATA_R, QIX_DAC_DATA, NODE_21)
/* Filter the DC using the lowest case filter. */
DISCRETE_CRFILTER(NODE_13, 1, NODE_12, RES_K(1.5), CAP_U(1))
DISCRETE_CRFILTER(NODE_23, 1, NODE_22, RES_K(1.5), CAP_U(1))
DISCRETE_OUTPUT(NODE_13, 1)
DISCRETE_OUTPUT(NODE_23, 1)
DISCRETE_SOUND_END