summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/audio/sprint2.cpp
blob: b5cff7b19461b2695baca9d31c938529ea2f656b (plain) (tree)
1
2
3
4
5
6
7
8
9
                       
                                   




                                                                          
                
                             























                                                                                               





                                                                         




                                                     
                                    
                           
                              



                                                           
                                     

                                                                 


                               



                                                       




                                                                             




                                                            


                          






                                                                   








                                                                                       


                    





                                       
 


                                       
 
                                      
















                                                                 
                                                          

                                                          
                                    

                                                              

                                                      
                                






                                               

                                                  


                                           
                                                                                          

                                                   

                                                       
                                                     

                        
                                                                                                 

                                      
                                                                  
 
                                                   





                                                          
                                    

                                                              

                                                      
                                











                                               
                                                                                          

                                                   

                                                       
                                                     

                        
                                                                                                 

                                      
                                                                  
 
                                                   













                                                                                                                            
                                                                                             


















                                                                                                                                      
                                      














                                                                 
                                                          

                                                          
                                    

                                                              

                                                     
                                






                                               

                                                  


                                           
                                                                                          

                                                   

                                                       
                                                     

                        
                                                                                                 

                                      
                                                                  
 
                                                   













                                                                                                                            
                                                                                             
























                                                                                                                                      




                                                                         




                                                    
                                    
                           
                                      




                                                      
                                                                             
                
                          





                                                                                                                                       







                                                       


                    

                                       
                       
                                       
 
                                      



                                                          

                                                                        

                                                
                                        

                                                              




                                                          
                                                                                                 
                                                                                                 




                                                                                              
                                                                                            
















                                                                                                                                      
// 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