summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/audio/avalnche.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/audio/avalnche.c')
-rw-r--r--trunk/src/mame/audio/avalnche.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/trunk/src/mame/audio/avalnche.c b/trunk/src/mame/audio/avalnche.c
new file mode 100644
index 00000000000..ab262e5f851
--- /dev/null
+++ b/trunk/src/mame/audio/avalnche.c
@@ -0,0 +1,135 @@
+/*************************************************************************
+
+ audio\avalnche.c
+
+*************************************************************************/
+#include "emu.h"
+#include "includes/avalnche.h"
+#include "sound/discrete.h"
+
+
+/* Avalanche Discrete Sound Input Nodes */
+#define AVALNCHE_AUD0_EN NODE_01
+#define AVALNCHE_AUD1_EN NODE_02
+#define AVALNCHE_AUD2_EN NODE_03
+#define AVALNCHE_SOUNDLVL_DATA NODE_04
+#define AVALNCHE_ATTRACT_EN NODE_05
+
+
+/***************************************************************************
+ Avalanche memory audio output handlers
+***************************************************************************/
+
+WRITE8_DEVICE_HANDLER( avalnche_noise_amplitude_w )
+{
+ discrete_sound_w(device, AVALNCHE_SOUNDLVL_DATA, data & 0x3f);
+}
+
+WRITE8_DEVICE_HANDLER( avalnche_attract_enable_w )
+{
+ discrete_sound_w(device, AVALNCHE_ATTRACT_EN, data & 0x01);
+}
+
+WRITE8_DEVICE_HANDLER( avalnche_audio_w )
+{
+ int bit = data & 0x01;
+
+ switch (offset & 0x07)
+ {
+ case 0x00: /* AUD0 */
+ discrete_sound_w(device, AVALNCHE_AUD0_EN, bit);
+ break;
+
+ case 0x01: /* AUD1 */
+ discrete_sound_w(device, AVALNCHE_AUD1_EN, bit);
+ break;
+
+ case 0x02: /* AUD2 */
+ default:
+ discrete_sound_w(device, AVALNCHE_AUD2_EN, bit);
+ break;
+ }
+}
+
+
+/***************************************************************************
+ Avalanche sound system analog emulation
+***************************************************************************/
+
+static const discrete_lfsr_desc avalnche_lfsr={
+ DISC_CLK_IS_FREQ,
+ 16, /* Bit Length */
+ 0, /* Reset Value */
+ 0, /* Use Bit 0 as XOR input 0 */
+ 14, /* Use Bit 14 as XOR input 1 */
+ DISC_LFSR_XNOR, /* Feedback stage1 is XNOR */
+ DISC_LFSR_OR, /* Feedback stage2 is just stage 1 output OR with external feed */
+ DISC_LFSR_REPLACE, /* Feedback stage3 replaces the shifted register contents */
+ 0x000001, /* Everything is shifted into the first bit only */
+ 0, /* Output is already inverted by XNOR */
+ 15 /* Output bit */
+};
+
+/* Nodes - Sounds */
+#define AVALNCHE_NOISE NODE_10
+#define AVALNCHE_AUD1_SND NODE_11
+#define AVALNCHE_AUD2_SND NODE_12
+#define AVALNCHE_SOUNDLVL_AUD0_SND NODE_13
+
+DISCRETE_SOUND_START(avalnche)
+ /************************************************/
+ /* avalnche Effects Relataive Gain Table */
+ /* */
+ /* Effect V-ampIn Gain ratio Relative */
+ /* Aud0 3.8 50/(50+33+39) 725.6 */
+ /* Aud1 3.8 50/(50+68) 750.2 */
+ /* Aud2 3.8 50/(50+68) 750.2 */
+ /* Soundlvl 3.8 50/(50+33+.518) 1000.0 */
+ /************************************************/
+
+ /************************************************/
+ /* Input register mapping for avalnche */
+ /************************************************/
+ /* NODE GAIN OFFSET INIT */
+ DISCRETE_INPUT_LOGIC (AVALNCHE_AUD0_EN)
+ DISCRETE_INPUT_LOGIC (AVALNCHE_AUD1_EN)
+ DISCRETE_INPUT_LOGIC (AVALNCHE_AUD2_EN)
+ DISCRETE_INPUTX_DATA (AVALNCHE_SOUNDLVL_DATA, 500.0/63, 0, 0.0)
+ DISCRETE_INPUT_NOT (AVALNCHE_ATTRACT_EN)
+
+ /************************************************/
+ /* Aud0 = 2V = HSYNC/4 = 15750/4 */
+ /* Aud1 = 32V = HSYNC/64 = 15750/64 */
+ /* Aud2 = 8V = HSYNC/16 = 15750/16 */
+ /************************************************/
+ DISCRETE_SQUAREWFIX(NODE_20, AVALNCHE_AUD0_EN, 15750.0/4, 725.6, 50.0, 0, 0.0) // Aud0
+ DISCRETE_SQUAREWFIX(AVALNCHE_AUD1_SND, AVALNCHE_AUD1_EN, 15750.0/64, 750.2, 50.0, 0, 0.0)
+ DISCRETE_SQUAREWFIX(AVALNCHE_AUD2_SND, AVALNCHE_AUD2_EN, 15750.0/16, 750.2, 50.0, 0, 0.0)
+
+ /************************************************/
+ /* Soundlvl is variable amplitude, filtered */
+ /* random noise. */
+ /* LFSR clk = 16V = 15750.0Hz/16/2 */
+ /************************************************/
+ DISCRETE_LFSR_NOISE(AVALNCHE_NOISE, AVALNCHE_ATTRACT_EN, AVALNCHE_ATTRACT_EN, 15750.0, AVALNCHE_SOUNDLVL_DATA, 0, 0, &avalnche_lfsr)
+ DISCRETE_ADDER2(NODE_30, 1, NODE_20, AVALNCHE_NOISE)
+ DISCRETE_RCFILTER(AVALNCHE_SOUNDLVL_AUD0_SND, NODE_30, 556.7, 1e-7)
+
+ /************************************************/
+ /* Final mix and output. */
+ /************************************************/
+ DISCRETE_ADDER3(NODE_90, AVALNCHE_ATTRACT_EN, AVALNCHE_AUD1_SND, AVALNCHE_AUD2_SND, AVALNCHE_SOUNDLVL_AUD0_SND)
+
+ DISCRETE_OUTPUT(NODE_90, 65534.0/(725.6+750.2+750.2+1000.0))
+DISCRETE_SOUND_END
+
+
+/***************************************************************************
+ Catch memory audio output handlers
+***************************************************************************/
+
+WRITE8_HANDLER( catch_audio_w )
+{
+ /* Different from avalnche, it plays a sound (offset 0/1/2) on data bit 0 rising edge.
+ There's no indication that the game silences sound, it's probably done automatically. */
+}