summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/audio/sprint2.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/audio/sprint2.c')
-rw-r--r--trunk/src/mame/audio/sprint2.c403
1 files changed, 403 insertions, 0 deletions
diff --git a/trunk/src/mame/audio/sprint2.c b/trunk/src/mame/audio/sprint2.c
new file mode 100644
index 00000000000..de5b1256bfa
--- /dev/null
+++ b/trunk/src/mame/audio/sprint2.c
@@ -0,0 +1,403 @@
+/*************************************************************************
+
+ audio\sprint2.c
+
+*************************************************************************/
+#include "emu.h"
+#include "includes/sprint2.h"
+
+
+/************************************************************************/
+/* Sprint2 / Sprint1 Sound System Analog emulation */
+/* Rewritten by Hans Andersson. March 2005 */
+/************************************************************************/
+
+static const discrete_lfsr_desc sprint2_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 not inverted */
+ 15 /* Output bit */
+};
+
+static const discrete_dac_r1_ladder sprint2_motor_v_dac =
+{
+ 4, // size of ladder
+ {RES_M(2.2), RES_M(1), RES_K(470), RES_K(220)}, // R5, R6, R7, R8
+ 4.4, // 5V minus diode junction (0.6V)
+ RES_K(68), // R9
+ 0, // no rGnd
+ CAP_U(10) // C17
+};
+
+static const discrete_555_cc_desc sprint2_motor_vco =
+{
+ DISC_555_OUT_DC | DISC_555_OUT_SQW,
+ 5, // B+ voltage of 555
+ DEFAULT_555_VALUES,
+ 0.7 // VBE 2N3644 (Si)
+};
+
+static const discrete_dac_r1_ladder sprint2_motor_out_dac =
+{
+ 4, // size of ladder
+ {RES_K(10), RES_K(10), 0, RES_K(10)}, // R42, R43, -, R44
+ DEFAULT_TTL_V_LOGIC_1,
+ 0, // no rBias
+ 0, // no rGnd
+ CAP_U(0.1) // C36
+};
+
+static const discrete_dac_r1_ladder sprint2_crash_dac =
+{
+ 4, // size of ladder
+ {RES_K(8.2), RES_K(3.9), RES_K(2.2), RES_K(1)}, // R27, R25, R26, R24
+ 0, // no vBias
+ 0, // no rBias
+ 0, // no rGnd
+ CAP_U(0.1) // C69
+};
+
+static const discrete_schmitt_osc_desc sprint2_screech_osc =
+{
+ RES_K(1), // R19
+ 100, // R16
+ CAP_U(10), // C8
+ DEFAULT_7414_VALUES,
+ DISC_SCHMITT_OSC_IN_IS_LOGIC | DISC_SCHMITT_OSC_ENAB_IS_AND
+};
+
+static const discrete_mixer_desc sprint2_mixer =
+{
+ DISC_MIXER_IS_RESISTOR,
+ {RES_K(13.3333), RES_K(10.5456), RES_K(33)}, // R61 + motor, R60 + bang, R62
+ {0}, // No variable resistor nodes
+ {0}, // No caps
+ 0, // No rI
+ RES_K(5), // R63
+ 0, // No Filter
+ CAP_U(0.1), // C35
+ 0, // not used in resistor network
+ 30000 // final gain
+};
+
+/* Nodes - Sounds */
+#define SPRINT2_MOTORSND1 NODE_10
+#define SPRINT2_MOTORSND2 NODE_11
+#define SPRINT2_CRASHSND NODE_12
+#define SPRINT2_SKIDSND1 NODE_13
+#define SPRINT2_SKIDSND2 NODE_14
+#define SPRINT2_NOISE NODE_15
+
+#define SPRINT2_HSYNC 15750.0
+#define SPRINT2_1V SPRINT2_HSYNC/2
+#define SPRINT2_2V SPRINT2_1V/2
+
+DISCRETE_SOUND_START(sprint2)
+
+ /************************************************/
+ /* Input register mapping for sprint2 */
+ /************************************************/
+ DISCRETE_INPUT_LOGIC(SPRINT2_ATTRACT_EN)
+ DISCRETE_INPUT_LOGIC(SPRINT2_SKIDSND1_EN)
+ DISCRETE_INPUT_LOGIC(SPRINT2_SKIDSND2_EN)
+ DISCRETE_INPUTX_DATA(SPRINT2_MOTORSND1_DATA, -1, 0x0f, 0)
+ DISCRETE_INPUTX_DATA(SPRINT2_MOTORSND2_DATA, -1, 0x0f, 0)
+ DISCRETE_INPUT_DATA (SPRINT2_CRASHSND_DATA)
+ DISCRETE_INPUT_NOT (SPRINT2_NOISE_RESET)
+
+ /************************************************/
+ /* Motor sound circuit is based on a 556 VCO */
+ /* with the input frequency set by the MotorSND */
+ /* latch (4 bit). This freqency is then used to */
+ /* drive three counters, that are summed up */
+ /* and are output through a DAC */
+ /************************************************/
+
+ DISCRETE_ADJUSTMENT(NODE_20,
+ RES_K(260), // R21 + R23 @ max
+ RES_K(10), // R21 + R23 @ min
+ DISC_LOGADJ, "MOTOR1")
+
+ DISCRETE_DAC_R1(NODE_21,
+ SPRINT2_MOTORSND1_DATA,
+ DEFAULT_TTL_V_LOGIC_1,
+ &sprint2_motor_v_dac)
+
+ DISCRETE_555_CC(NODE_22, 1,
+ NODE_21,
+ NODE_20,
+ CAP_U(0.01), // C22
+ RES_M(3.3), 0, 0, // R22
+ &sprint2_motor_vco)
+
+ /* QB-D of 7492 */
+ DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22, DISC_CLK_ON_F_EDGE)
+
+ /* Mask the bits and XOR for clock input */
+ DISCRETE_TRANSFORM2(NODE_24, NODE_23, 1, "01&")
+ DISCRETE_TRANSFORM2(NODE_25, NODE_23, 4, "01&")
+ DISCRETE_LOGIC_XOR(NODE_26, NODE_24, NODE_25)
+
+ /* QA of 7492 */
+ DISCRETE_COUNTER(NODE_27, 1, SPRINT2_ATTRACT_EN, NODE_26, 0, 1, 1, 0, DISC_CLK_ON_F_EDGE)
+
+ /* Mix QA and QB-D together */
+ DISCRETE_TRANSFORM3(NODE_28, NODE_23, 2, NODE_27, "01*2+")
+
+ DISCRETE_DAC_R1(SPRINT2_MOTORSND1, NODE_28,
+ DEFAULT_TTL_V_LOGIC_1,
+ &sprint2_motor_out_dac)
+
+ /************************************************/
+ /* Car2 motor sound */
+ /************************************************/
+ DISCRETE_ADJUSTMENT(NODE_40,
+ RES_K(260), // R21 + R23 @ max
+ RES_K(10), // R21 + R23 @ min
+ DISC_LOGADJ, "MOTOR2")
+
+ DISCRETE_DAC_R1(NODE_41,
+ SPRINT2_MOTORSND2_DATA,
+ DEFAULT_TTL_V_LOGIC_1,
+ &sprint2_motor_v_dac)
+
+ DISCRETE_555_CC(NODE_42, 1,
+ NODE_41,
+ NODE_40,
+ CAP_U(0.01),
+ RES_M(3.3), 0, 0,
+ &sprint2_motor_vco)
+
+ /* QB-D of 7492 */
+ DISCRETE_COUNTER_7492(NODE_43, 1, SPRINT2_ATTRACT_EN, NODE_42, DISC_CLK_ON_F_EDGE)
+
+ /* Mask the bits and XOR for clock input */
+ DISCRETE_TRANSFORM2(NODE_44, NODE_43, 1, "01&")
+ DISCRETE_TRANSFORM2(NODE_45, NODE_43, 4, "01&")
+ DISCRETE_LOGIC_XOR(NODE_46, NODE_44, NODE_45)
+
+ /* QA of 7492 */
+ DISCRETE_COUNTER(NODE_47, 1, SPRINT2_ATTRACT_EN, NODE_46, 0, 1, 1, 0, DISC_CLK_ON_F_EDGE)
+
+ /* Mix QA and QB-D together */
+ DISCRETE_TRANSFORM3(NODE_48, NODE_43, 2, NODE_47, "01*2+")
+
+ DISCRETE_DAC_R1(SPRINT2_MOTORSND2, NODE_48,
+ DEFAULT_TTL_V_LOGIC_1,
+ &sprint2_motor_out_dac)
+
+ /************************************************/
+ /* Crash circuit is built around a noise */
+ /* generator built from 2 shift registers that */
+ /* are clocked by the 2V signal. */
+ /* Output is binary weighted with 4 bits of */
+ /* crash volume. */
+ /************************************************/
+ DISCRETE_LFSR_NOISE(SPRINT2_NOISE, SPRINT2_NOISE_RESET, SPRINT2_NOISE_RESET, SPRINT2_2V, 1.0, 0, 0.5, &sprint2_lfsr)
+
+ DISCRETE_SWITCH(NODE_60, 1, SPRINT2_NOISE, 0, SPRINT2_CRASHSND_DATA)
+
+ DISCRETE_DAC_R1(SPRINT2_CRASHSND, NODE_60, DEFAULT_TTL_V_LOGIC_1, &sprint2_crash_dac)
+
+ /************************************************/
+ /* Screech is noise modulating a Schmitt VCO. */
+ /************************************************/
+ DISCRETE_SCHMITT_OSCILLATOR(SPRINT2_SKIDSND1, SPRINT2_SKIDSND1_EN, SPRINT2_NOISE, DEFAULT_TTL_V_LOGIC_1, &sprint2_screech_osc)
+
+ DISCRETE_SCHMITT_OSCILLATOR(SPRINT2_SKIDSND2, SPRINT2_SKIDSND2_EN, SPRINT2_NOISE, DEFAULT_TTL_V_LOGIC_1, &sprint2_screech_osc)
+
+ /************************************************/
+ /* Combine all 5 sound sources. */
+ /************************************************/
+ DISCRETE_MIXER3(NODE_90, 1, SPRINT2_MOTORSND1, SPRINT2_CRASHSND, SPRINT2_SKIDSND1, &sprint2_mixer)
+ DISCRETE_MIXER3(NODE_91, 1, SPRINT2_MOTORSND2, SPRINT2_CRASHSND, SPRINT2_SKIDSND2, &sprint2_mixer)
+
+ DISCRETE_OUTPUT(NODE_90, 1)
+ DISCRETE_OUTPUT(NODE_91, 1)
+DISCRETE_SOUND_END
+
+
+DISCRETE_SOUND_START(sprint1)
+
+ /************************************************/
+ /* Input register mapping for sprint1 */
+ /************************************************/
+ DISCRETE_INPUT_LOGIC(SPRINT2_ATTRACT_EN)
+ DISCRETE_INPUT_LOGIC(SPRINT2_SKIDSND1_EN)
+ DISCRETE_INPUTX_DATA(SPRINT2_MOTORSND1_DATA, -1, 0x0f, 0)
+ DISCRETE_INPUT_DATA (SPRINT2_CRASHSND_DATA)
+ DISCRETE_INPUT_NOT (SPRINT2_NOISE_RESET)
+
+ /************************************************/
+ /* Motor sound circuit is based on a 556 VCO */
+ /* with the input frequency set by the MotorSND */
+ /* latch (4 bit). This freqency is then used to */
+ /* drive three counters, that are summed up */
+ /* and are output through a DAC */
+ /************************************************/
+
+ DISCRETE_ADJUSTMENT(NODE_20,
+ RES_K(260), // R21 + R23 @ max
+ RES_K(10), // R21 + R23 @ min
+ DISC_LOGADJ, "MOTOR")
+
+ DISCRETE_DAC_R1(NODE_21,
+ SPRINT2_MOTORSND1_DATA,
+ DEFAULT_TTL_V_LOGIC_1,
+ &sprint2_motor_v_dac)
+
+ DISCRETE_555_CC(NODE_22, 1,
+ NODE_21,
+ NODE_20,
+ CAP_U(0.01), // C22
+ RES_M(3.3), 0, 0, // R22
+ &sprint2_motor_vco)
+
+ /* QB-D of 7492 */
+ DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22, DISC_CLK_ON_F_EDGE)
+
+ /* Mask the bits and XOR for clock input */
+ DISCRETE_TRANSFORM2(NODE_24, NODE_23, 1, "01&")
+ DISCRETE_TRANSFORM2(NODE_25, NODE_23, 4, "01&")
+ DISCRETE_LOGIC_XOR(NODE_26, NODE_24, NODE_25)
+
+ /* QA of 7492 */
+ DISCRETE_COUNTER(NODE_27, 1, SPRINT2_ATTRACT_EN, NODE_26, 0, 1, 1, 0, DISC_CLK_ON_F_EDGE)
+
+ /* Mix QA and QB-D together */
+ DISCRETE_TRANSFORM3(NODE_28, NODE_23, 2, NODE_27, "01*2+")
+
+ DISCRETE_DAC_R1(SPRINT2_MOTORSND1, NODE_28,
+ DEFAULT_TTL_V_LOGIC_1,
+ &sprint2_motor_out_dac)
+
+ /************************************************/
+ /* Crash circuit is built around a noise */
+ /* generator built from 2 shift registers that */
+ /* are clocked by the 2V signal. */
+ /* Output is binary weighted with 4 bits of */
+ /* crash volume. */
+ /************************************************/
+ DISCRETE_LFSR_NOISE(SPRINT2_NOISE, SPRINT2_NOISE_RESET, SPRINT2_NOISE_RESET, SPRINT2_2V, 1.0, 0, 0.5, &sprint2_lfsr)
+
+ DISCRETE_SWITCH(NODE_60, 1, SPRINT2_NOISE, 0, SPRINT2_CRASHSND_DATA)
+
+ DISCRETE_DAC_R1(SPRINT2_CRASHSND, NODE_60, DEFAULT_TTL_V_LOGIC_1, &sprint2_crash_dac)
+
+ /************************************************/
+ /* Screech is noise modulating a Schmitt VCO. */
+ /************************************************/
+ DISCRETE_SCHMITT_OSCILLATOR(SPRINT2_SKIDSND1, SPRINT2_SKIDSND1_EN, SPRINT2_NOISE, DEFAULT_TTL_V_LOGIC_1, &sprint2_screech_osc)
+
+ /************************************************/
+ /* Combine all 3 sound sources. */
+ /* Add some final gain to get to a good sound */
+ /* level. */
+ /************************************************/
+ DISCRETE_MIXER3(NODE_90, 1, SPRINT2_MOTORSND1, SPRINT2_CRASHSND, SPRINT2_SKIDSND1, &sprint2_mixer)
+
+ DISCRETE_OUTPUT(NODE_90, 1)
+DISCRETE_SOUND_END
+
+
+/************************************************************************/
+/* dominos Sound System Analog emulation */
+/* updated to new code March 2005, DR. */
+/************************************************************************/
+
+static const discrete_dac_r1_ladder dominos_tone_vco_dac =
+{
+ 4,
+ {RES_M(2.2), RES_M(1), RES_K(470), RES_K(220)}, // R5, R6, R7, R8
+ 4.4, // 5V - diode junction (0.6V)
+ RES_K(68), // R9
+ RES_K(470), // R87
+ CAP_U(.1) // C17
+};
+
+static const discrete_555_cc_desc dominos_tone_vco =
+{
+ DISC_555_OUT_DC | DISC_555_OUT_SQW,
+ 5, // B+ voltage of 555
+ DEFAULT_555_VALUES,
+ 0.7 // Q1 junction voltage
+};
+
+static const discrete_dac_r1_ladder dominos_tone_dac =
+{
+ 4,
+ {RES_K(8.2), RES_K(3.9), RES_K(2.2), RES_K(1)}, // R27, R24, R25, R26
+ 0, 0, 0,
+ CAP_U(.1) // C69
+};
+
+static const discrete_mixer_desc dominos_mixer =
+{
+ DISC_MIXER_IS_RESISTOR,
+ {RES_K(33), RES_K(10)+ 1.0/(1.0/RES_K(8.2) + 1.0/RES_K(3.9) + 1.0/RES_K(2.2) + 1.0/RES_K(1))}, // R62, R60 + R27||R24||R25||R26
+ {0}, // No variable resistor nodes
+ {0}, // No caps
+ 0, // No rI
+ RES_K(5), // R66
+ CAP_U(0.1), // C71
+ CAP_U(0.1), // C54
+ 0, // not used in resistor network
+ 40000 // final gain
+};
+
+/* Nodes - Sounds */
+#define DOMINOS_TONE_SND NODE_10
+#define DOMINOS_TOPPLE_SND NODE_11
+/* Nodes - Adjusters */
+#define DOMINOS_R23 NODE_15
+
+DISCRETE_SOUND_START(dominos)
+ /************************************************/
+ /* Input register mapping for dominos */
+ /************************************************/
+ DISCRETE_INPUT_LOGIC(DOMINOS_TUMBLE_EN)
+ DISCRETE_INPUTX_DATA(DOMINOS_FREQ_DATA, -1, 0x0f, 0) // IC D4
+ DISCRETE_INPUT_DATA (DOMINOS_AMP_DATA) // IC C4
+ DISCRETE_INPUT_LOGIC(DOMINOS_ATTRACT_EN)
+
+ DISCRETE_ADJUSTMENT(DOMINOS_R23,
+ RES_K(60), // R21 + R23 @ max
+ RES_K(10), // R21 + R23 @ min
+ DISC_LINADJ, "R23")
+
+ /************************************************/
+ /* Tone Sound */
+ /************************************************/
+ DISCRETE_DAC_R1(NODE_20, DOMINOS_FREQ_DATA, DEFAULT_TTL_V_LOGIC_1, &dominos_tone_vco_dac)
+ DISCRETE_555_CC(NODE_21, 1, NODE_20, DOMINOS_R23, CAP_U(.01), 0, 0, 0, &dominos_tone_vco)
+ DISCRETE_COUNTER_7492(NODE_22, 1, DOMINOS_ATTRACT_EN, // IC D8, QB-QD
+ NODE_21, DISC_CLK_ON_F_EDGE) // from IC D7/8, pin 3
+ DISCRETE_TRANSFORM2(NODE_23, NODE_22, 0x01, "01&") // IC D8, pin 11-QB
+ DISCRETE_SWITCH(NODE_24, 1, NODE_23, 0, // Enable gate C5
+ DOMINOS_AMP_DATA) // IC C4
+ DISCRETE_DAC_R1(DOMINOS_TONE_SND, NODE_24, DEFAULT_TTL_V_LOGIC_1, &dominos_tone_dac)
+
+ /************************************************/
+ /* Topple sound is just the 4V source */
+ /* 4V = HSYNC/8 */
+ /* = 15750/8 */
+ /************************************************/
+ DISCRETE_SQUAREWFIX(DOMINOS_TOPPLE_SND, DOMINOS_TUMBLE_EN, 15750.0/8, DEFAULT_TTL_V_LOGIC_1, 50.0, DEFAULT_TTL_V_LOGIC_1/2, 0)
+
+ /************************************************/
+ /* Combine both sound sources. */
+ /* Add some final gain to get to a good sound */
+ /* level. */
+ /************************************************/
+ DISCRETE_MIXER2(NODE_90, 1, DOMINOS_TOPPLE_SND, DOMINOS_TONE_SND, &dominos_mixer)
+
+ DISCRETE_OUTPUT(NODE_90, 1)
+DISCRETE_SOUND_END