// license:BSD-3-Clause
// copyright-holders:Hans Andersson
/*************************************************************************
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_discrete)
/************************************************/
/* 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_discrete)
/************************************************/
/* 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_discrete)
/************************************************/
/* 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