summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/qix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/audio/qix.c')
-rw-r--r--src/mame/audio/qix.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/mame/audio/qix.c b/src/mame/audio/qix.c
new file mode 100644
index 00000000000..bddd05083db
--- /dev/null
+++ b/src/mame/audio/qix.c
@@ -0,0 +1,78 @@
+/*************************************************************************
+
+ 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