1 // license:BSD-3-Clause
2 // copyright-holders:Hans Andersson
3 /*************************************************************************
4 
5     audio\sprint2.c
6 
7 *************************************************************************/
8 #include "emu.h"
9 #include "includes/sprint2.h"
10 
11 
12 /************************************************************************/
13 /* Sprint2 / Sprint1 Sound System Analog emulation                      */
14 /* Rewritten by Hans Andersson. March 2005                              */
15 /************************************************************************/
16 
17 static const discrete_lfsr_desc sprint2_lfsr =
18 {
19 	DISC_CLK_IS_FREQ,
20 	16,                  /* Bit Length */
21 	0,                   /* Reset Value */
22 	0,                   /* Use Bit 0 as XOR input 0 */
23 	14,                  /* Use Bit 14 as XOR input 1 */
24 	DISC_LFSR_XNOR,      /* Feedback stage1 is XNOR */
25 	DISC_LFSR_OR,        /* Feedback stage2 is just stage 1 output OR with external feed */
26 	DISC_LFSR_REPLACE,   /* Feedback stage3 replaces the shifted register contents */
27 	0x000001,            /* Everything is shifted into the first bit only */
28 	0,                   /* Output is not inverted */
29 	15                   /* Output bit */
30 };
31 
32 static const discrete_dac_r1_ladder sprint2_motor_v_dac =
33 {
34 	4,          // size of ladder
35 	{RES_M(2.2), RES_M(1), RES_K(470), RES_K(220)}, // R5, R6, R7, R8
36 	4.4,        // 5V minus diode junction (0.6V)
37 	RES_K(68),  // R9
38 	0,          // no rGnd
39 	CAP_U(10)   // C17
40 };
41 
42 static const discrete_555_cc_desc sprint2_motor_vco =
43 {
44 	DISC_555_OUT_DC | DISC_555_OUT_SQW,
45 	5,      // B+ voltage of 555
46 	DEFAULT_555_VALUES,
47 	0.7 // VBE 2N3644 (Si)
48 };
49 
50 static const discrete_dac_r1_ladder sprint2_motor_out_dac =
51 {
52 	4,          // size of ladder
53 	{RES_K(10), RES_K(10), 0, RES_K(10)}, // R42, R43, -, R44
54 	DEFAULT_TTL_V_LOGIC_1,
55 	0,          // no rBias
56 	0,          // no rGnd
57 	CAP_U(0.1)  // C36
58 };
59 
60 static const discrete_dac_r1_ladder sprint2_crash_dac =
61 {
62 	4,      // size of ladder
63 	{RES_K(8.2), RES_K(3.9), RES_K(2.2), RES_K(1)}, // R27, R25, R26, R24
64 	0,      // no vBias
65 	0,      // no rBias
66 	0,      // no rGnd
67 	CAP_U(0.1) // C69
68 };
69 
70 static const discrete_schmitt_osc_desc sprint2_screech_osc =
71 {
72 	RES_K(1),   // R19
73 	100,        // R16
74 	CAP_U(10),  // C8
75 	DEFAULT_7414_VALUES,
76 	DISC_SCHMITT_OSC_IN_IS_LOGIC | DISC_SCHMITT_OSC_ENAB_IS_AND
77 };
78 
79 static const discrete_mixer_desc sprint2_mixer =
80 {
81 	DISC_MIXER_IS_RESISTOR,
82 	{RES_K(13.3333), RES_K(10.5456), RES_K(33)},    // R61 + motor, R60 + bang, R62
83 	{0},            // No variable resistor nodes
84 	{0},            // No caps
85 	0,              // No rI
86 	RES_K(5),       // R63
87 	0,              // No Filter
88 	CAP_U(0.1),     // C35
89 	0,              // not used in resistor network
90 	30000   // final gain
91 };
92 
93 /* Nodes - Sounds */
94 #define SPRINT2_MOTORSND1       NODE_10
95 #define SPRINT2_MOTORSND2       NODE_11
96 #define SPRINT2_CRASHSND        NODE_12
97 #define SPRINT2_SKIDSND1        NODE_13
98 #define SPRINT2_SKIDSND2        NODE_14
99 #define SPRINT2_NOISE           NODE_15
100 
101 #define SPRINT2_HSYNC   15750.0
102 #define SPRINT2_1V      SPRINT2_HSYNC/2
103 #define SPRINT2_2V      SPRINT2_1V/2
104 
105 DISCRETE_SOUND_START(sprint2_discrete)
106 
107 	/************************************************/
108 	/* Input register mapping for sprint2           */
109 	/************************************************/
110 	DISCRETE_INPUT_LOGIC(SPRINT2_ATTRACT_EN)
111 	DISCRETE_INPUT_LOGIC(SPRINT2_SKIDSND1_EN)
112 	DISCRETE_INPUT_LOGIC(SPRINT2_SKIDSND2_EN)
113 	DISCRETE_INPUTX_DATA(SPRINT2_MOTORSND1_DATA, -1, 0x0f, 0)
114 	DISCRETE_INPUTX_DATA(SPRINT2_MOTORSND2_DATA, -1, 0x0f, 0)
115 	DISCRETE_INPUT_DATA (SPRINT2_CRASHSND_DATA)
116 	DISCRETE_INPUT_NOT  (SPRINT2_NOISE_RESET)
117 
118 	/************************************************/
119 	/* Motor sound circuit is based on a 556 VCO    */
120 	/* with the input frequency set by the MotorSND */
121 	/* latch (4 bit). This freqency is then used to */
122 	/* drive three counters, that are summed up     */
123 	/* and are output through a DAC                 */
124 	/************************************************/
125 
126 	DISCRETE_ADJUSTMENT(NODE_20,
127 				RES_K(260), // R21 + R23 @ max
128 				RES_K(10),  // R21 + R23 @ min
129 				DISC_LOGADJ, "MOTOR1")
130 
131 	DISCRETE_DAC_R1(NODE_21,
132 			SPRINT2_MOTORSND1_DATA,
133 			DEFAULT_TTL_V_LOGIC_1,
134 			&sprint2_motor_v_dac)
135 
136 	DISCRETE_555_CC(NODE_22, 1,
137 			NODE_21,
138 			NODE_20,
139 			CAP_U(0.01),        // C22
140 			RES_M(3.3), 0, 0,   // R22
141 			&sprint2_motor_vco)
142 
143 	/* QB-D of 7492 */
144 	DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22, DISC_CLK_ON_F_EDGE)
145 
146 	/* Mask the bits and XOR for clock input */
147 	DISCRETE_TRANSFORM2(NODE_24, NODE_23, 1, "01&")
148 	DISCRETE_TRANSFORM2(NODE_25, NODE_23, 4, "01&")
149 	DISCRETE_LOGIC_XOR(NODE_26, NODE_24, NODE_25)
150 
151 	/* QA of 7492 */
152 	DISCRETE_COUNTER(NODE_27, 1, SPRINT2_ATTRACT_EN, NODE_26, 0, 1, 1, 0, DISC_CLK_ON_F_EDGE)
153 
154 	/* Mix QA and QB-D together */
155 	DISCRETE_TRANSFORM3(NODE_28, NODE_23, 2, NODE_27, "01*2+")
156 
157 	DISCRETE_DAC_R1(SPRINT2_MOTORSND1, NODE_28,
158 			DEFAULT_TTL_V_LOGIC_1,
159 			&sprint2_motor_out_dac)
160 
161 	/************************************************/
162 	/* Car2 motor sound                             */
163 	/************************************************/
164 	DISCRETE_ADJUSTMENT(NODE_40,
165 				RES_K(260), // R21 + R23 @ max
166 				RES_K(10),  // R21 + R23 @ min
167 				DISC_LOGADJ, "MOTOR2")
168 
169 	DISCRETE_DAC_R1(NODE_41,
170 			SPRINT2_MOTORSND2_DATA,
171 			DEFAULT_TTL_V_LOGIC_1,
172 			&sprint2_motor_v_dac)
173 
174 	DISCRETE_555_CC(NODE_42, 1,
175 			NODE_41,
176 			NODE_40,
177 			CAP_U(0.01),
178 			RES_M(3.3), 0, 0,
179 			&sprint2_motor_vco)
180 
181 	/* QB-D of 7492 */
182 	DISCRETE_COUNTER_7492(NODE_43, 1, SPRINT2_ATTRACT_EN, NODE_42, DISC_CLK_ON_F_EDGE)
183 
184 	/* Mask the bits and XOR for clock input */
185 	DISCRETE_TRANSFORM2(NODE_44, NODE_43, 1, "01&")
186 	DISCRETE_TRANSFORM2(NODE_45, NODE_43, 4, "01&")
187 	DISCRETE_LOGIC_XOR(NODE_46, NODE_44, NODE_45)
188 
189 	/* QA of 7492 */
190 	DISCRETE_COUNTER(NODE_47, 1, SPRINT2_ATTRACT_EN, NODE_46, 0, 1, 1, 0, DISC_CLK_ON_F_EDGE)
191 
192 	/* Mix QA and QB-D together */
193 	DISCRETE_TRANSFORM3(NODE_48, NODE_43, 2, NODE_47, "01*2+")
194 
195 	DISCRETE_DAC_R1(SPRINT2_MOTORSND2, NODE_48,
196 			DEFAULT_TTL_V_LOGIC_1,
197 			&sprint2_motor_out_dac)
198 
199 	/************************************************/
200 	/* Crash circuit is built around a noise        */
201 	/* generator built from 2 shift registers that  */
202 	/* are clocked by the 2V signal.                */
203 	/* Output is binary weighted with 4 bits of     */
204 	/* crash volume.                                */
205 	/************************************************/
206 	DISCRETE_LFSR_NOISE(SPRINT2_NOISE, SPRINT2_NOISE_RESET, SPRINT2_NOISE_RESET, SPRINT2_2V, 1.0, 0, 0.5, &sprint2_lfsr)
207 
208 	DISCRETE_SWITCH(NODE_60, 1, SPRINT2_NOISE, 0, SPRINT2_CRASHSND_DATA)
209 
210 	DISCRETE_DAC_R1(SPRINT2_CRASHSND, NODE_60, DEFAULT_TTL_V_LOGIC_1, &sprint2_crash_dac)
211 
212 	/************************************************/
213 	/* Screech is noise modulating a  Schmitt VCO.  */
214 	/************************************************/
215 	DISCRETE_SCHMITT_OSCILLATOR(SPRINT2_SKIDSND1, SPRINT2_SKIDSND1_EN, SPRINT2_NOISE, DEFAULT_TTL_V_LOGIC_1, &sprint2_screech_osc)
216 
217 	DISCRETE_SCHMITT_OSCILLATOR(SPRINT2_SKIDSND2, SPRINT2_SKIDSND2_EN, SPRINT2_NOISE, DEFAULT_TTL_V_LOGIC_1, &sprint2_screech_osc)
218 
219 	/************************************************/
220 	/* Combine all 5 sound sources.                 */
221 	/************************************************/
222 	DISCRETE_MIXER3(NODE_90, 1, SPRINT2_MOTORSND1, SPRINT2_CRASHSND, SPRINT2_SKIDSND1, &sprint2_mixer)
223 	DISCRETE_MIXER3(NODE_91, 1, SPRINT2_MOTORSND2, SPRINT2_CRASHSND, SPRINT2_SKIDSND2, &sprint2_mixer)
224 
225 	DISCRETE_OUTPUT(NODE_90, 1)
226 	DISCRETE_OUTPUT(NODE_91, 1)
227 DISCRETE_SOUND_END
228 
229 
230 DISCRETE_SOUND_START(sprint1_discrete)
231 
232 	/************************************************/
233 	/* Input register mapping for sprint1           */
234 	/************************************************/
235 	DISCRETE_INPUT_LOGIC(SPRINT2_ATTRACT_EN)
236 	DISCRETE_INPUT_LOGIC(SPRINT2_SKIDSND1_EN)
237 	DISCRETE_INPUTX_DATA(SPRINT2_MOTORSND1_DATA, -1, 0x0f, 0)
238 	DISCRETE_INPUT_DATA (SPRINT2_CRASHSND_DATA)
239 	DISCRETE_INPUT_NOT  (SPRINT2_NOISE_RESET)
240 
241 	/************************************************/
242 	/* Motor sound circuit is based on a 556 VCO    */
243 	/* with the input frequency set by the MotorSND */
244 	/* latch (4 bit). This freqency is then used to */
245 	/* drive three counters, that are summed up     */
246 	/* and are output through a DAC                 */
247 	/************************************************/
248 
249 	DISCRETE_ADJUSTMENT(NODE_20,
250 				RES_K(260), // R21 + R23 @ max
251 				RES_K(10),  // R21 + R23 @ min
252 				DISC_LOGADJ, "MOTOR")
253 
254 	DISCRETE_DAC_R1(NODE_21,
255 			SPRINT2_MOTORSND1_DATA,
256 			DEFAULT_TTL_V_LOGIC_1,
257 			&sprint2_motor_v_dac)
258 
259 	DISCRETE_555_CC(NODE_22, 1,
260 			NODE_21,
261 			NODE_20,
262 			CAP_U(0.01),        // C22
263 			RES_M(3.3), 0, 0,   // R22
264 			&sprint2_motor_vco)
265 
266 	/* QB-D of 7492 */
267 	DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22, DISC_CLK_ON_F_EDGE)
268 
269 	/* Mask the bits and XOR for clock input */
270 	DISCRETE_TRANSFORM2(NODE_24, NODE_23, 1, "01&")
271 	DISCRETE_TRANSFORM2(NODE_25, NODE_23, 4, "01&")
272 	DISCRETE_LOGIC_XOR(NODE_26, NODE_24, NODE_25)
273 
274 	/* QA of 7492 */
275 	DISCRETE_COUNTER(NODE_27, 1, SPRINT2_ATTRACT_EN, NODE_26, 0, 1, 1, 0, DISC_CLK_ON_F_EDGE)
276 
277 	/* Mix QA and QB-D together */
278 	DISCRETE_TRANSFORM3(NODE_28, NODE_23, 2, NODE_27, "01*2+")
279 
280 	DISCRETE_DAC_R1(SPRINT2_MOTORSND1, NODE_28,
281 			DEFAULT_TTL_V_LOGIC_1,
282 			&sprint2_motor_out_dac)
283 
284 	/************************************************/
285 	/* Crash circuit is built around a noise        */
286 	/* generator built from 2 shift registers that  */
287 	/* are clocked by the 2V signal.                */
288 	/* Output is binary weighted with 4 bits of     */
289 	/* crash volume.                                */
290 	/************************************************/
291 	DISCRETE_LFSR_NOISE(SPRINT2_NOISE, SPRINT2_NOISE_RESET, SPRINT2_NOISE_RESET, SPRINT2_2V, 1.0, 0, 0.5, &sprint2_lfsr)
292 
293 	DISCRETE_SWITCH(NODE_60, 1, SPRINT2_NOISE, 0, SPRINT2_CRASHSND_DATA)
294 
295 	DISCRETE_DAC_R1(SPRINT2_CRASHSND, NODE_60, DEFAULT_TTL_V_LOGIC_1, &sprint2_crash_dac)
296 
297 	/************************************************/
298 	/* Screech is noise modulating a  Schmitt VCO.  */
299 	/************************************************/
300 	DISCRETE_SCHMITT_OSCILLATOR(SPRINT2_SKIDSND1, SPRINT2_SKIDSND1_EN, SPRINT2_NOISE, DEFAULT_TTL_V_LOGIC_1, &sprint2_screech_osc)
301 
302 	/************************************************/
303 	/* Combine all 3 sound sources.                 */
304 	/* Add some final gain to get to a good sound   */
305 	/* level.                                       */
306 	/************************************************/
307 	DISCRETE_MIXER3(NODE_90, 1, SPRINT2_MOTORSND1, SPRINT2_CRASHSND, SPRINT2_SKIDSND1, &sprint2_mixer)
308 
309 	DISCRETE_OUTPUT(NODE_90, 1)
310 DISCRETE_SOUND_END
311 
312 
313 /************************************************************************/
314 /* dominos Sound System Analog emulation                                */
315 /* updated to new code March 2005, DR.                                  */
316 /************************************************************************/
317 
318 static const discrete_dac_r1_ladder dominos_tone_vco_dac =
319 {
320 	4,
321 	{RES_M(2.2), RES_M(1), RES_K(470), RES_K(220)}, // R5, R6, R7, R8
322 	4.4,        // 5V - diode junction (0.6V)
323 	RES_K(68),  // R9
324 	RES_K(470), // R87
325 	CAP_U(.1)   // C17
326 };
327 
328 static const discrete_555_cc_desc dominos_tone_vco =
329 {
330 	DISC_555_OUT_DC | DISC_555_OUT_SQW,
331 	5,      // B+ voltage of 555
332 	DEFAULT_555_VALUES,
333 	0.7     // Q1 junction voltage
334 };
335 
336 static const discrete_dac_r1_ladder dominos_tone_dac =
337 {
338 	4,
339 	{RES_K(8.2), RES_K(3.9), RES_K(2.2), RES_K(1)}, // R27, R24, R25, R26
340 	0, 0, 0,
341 	CAP_U(.1)   // C69
342 };
343 
344 static const discrete_mixer_desc dominos_mixer =
345 {
346 	DISC_MIXER_IS_RESISTOR,
347 	{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
348 	{0},            // No variable resistor nodes
349 	{0},            // No caps
350 	0,              // No rI
351 	RES_K(5),       // R66
352 	CAP_U(0.1),     // C71
353 	CAP_U(0.1),     // C54
354 	0,              // not used in resistor network
355 	40000   // final gain
356 };
357 
358 /* Nodes - Sounds */
359 #define DOMINOS_TONE_SND        NODE_10
360 #define DOMINOS_TOPPLE_SND      NODE_11
361 /* Nodes - Adjusters */
362 #define DOMINOS_R23             NODE_15
363 
364 DISCRETE_SOUND_START(dominos_discrete)
365 	/************************************************/
366 	/* Input register mapping for dominos           */
367 	/************************************************/
368 	DISCRETE_INPUT_LOGIC(DOMINOS_TUMBLE_EN)
369 	DISCRETE_INPUTX_DATA(DOMINOS_FREQ_DATA, -1, 0x0f, 0)    // IC D4
370 	DISCRETE_INPUT_DATA (DOMINOS_AMP_DATA)                  // IC C4
371 	DISCRETE_INPUT_LOGIC(DOMINOS_ATTRACT_EN)
372 
373 	DISCRETE_ADJUSTMENT(DOMINOS_R23,
374 				RES_K(60),  // R21 + R23 @ max
375 				RES_K(10),  // R21 + R23 @ min
376 				DISC_LINADJ, "R23")
377 
378 	/************************************************/
379 	/* Tone Sound                                   */
380 	/************************************************/
381 	DISCRETE_DAC_R1(NODE_20, DOMINOS_FREQ_DATA, DEFAULT_TTL_V_LOGIC_1, &dominos_tone_vco_dac)
382 	DISCRETE_555_CC(NODE_21, 1, NODE_20, DOMINOS_R23, CAP_U(.01), 0, 0, 0, &dominos_tone_vco)
383 	DISCRETE_COUNTER_7492(NODE_22, 1, DOMINOS_ATTRACT_EN,   // IC D8, QB-QD
384 			NODE_21, DISC_CLK_ON_F_EDGE)                    // from IC D7/8, pin 3
385 	DISCRETE_TRANSFORM2(NODE_23, NODE_22, 0x01, "01&")  // IC D8, pin 11-QB
386 	DISCRETE_SWITCH(NODE_24, 1, NODE_23, 0, // Enable gate C5
387 			DOMINOS_AMP_DATA)       // IC C4
388 	DISCRETE_DAC_R1(DOMINOS_TONE_SND, NODE_24, DEFAULT_TTL_V_LOGIC_1, &dominos_tone_dac)
389 
390 	/************************************************/
391 	/* Topple sound is just the 4V source           */
392 	/* 4V = HSYNC/8                                 */
393 	/*    = 15750/8                                 */
394 	/************************************************/
395 	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)
396 
397 	/************************************************/
398 	/* Combine both sound sources.                  */
399 	/* Add some final gain to get to a good sound   */
400 	/* level.                                       */
401 	/************************************************/
402 	DISCRETE_MIXER2(NODE_90, 1, DOMINOS_TOPPLE_SND, DOMINOS_TONE_SND, &dominos_mixer)
403 
404 	DISCRETE_OUTPUT(NODE_90, 1)
405 DISCRETE_SOUND_END
406