1 /************************************************************************/
2 /* Discrete sound systems for Atari games                               */
3 /************************************************************************/
4 
5 #include "driver.h"
6 
7 
8 /************************************************************************/
9 /* firetrk Sound System Analog emulation by K.Wilkins Feb 2001          */
10 /* Questions/Suggestions to mame@dysfunction.demon.co.uk                */
11 /* Modified and added superbug/montecar sounds.  Jan 2003 D.R.          */
12 /* Complete re-write Feb 2004, D. Renaud                                */
13 /************************************************************************/
14 const struct discrete_lfsr_desc firetrk_lfsr={
15 	16,			/* Bit Length */
16 	0,			/* Reset Value */
17 	0,			/* Use Bit 0 as XOR input 0 */
18 	14,			/* Use Bit 14 as XOR input 1 */
19 	DISC_LFSR_XNOR,		/* Feedback stage1 is XNOR */
20 	DISC_LFSR_OR,		/* Feedback stage2 is just stage 1 output OR with external feed */
21 	DISC_LFSR_REPLACE,	/* Feedback stage3 replaces the shifted register contents */
22 	0x000001,		/* Everything is shifted into the first bit only */
23 	0,			/* Output is not inverted */
24 	15			/* Output bit */
25 };
26 
27 const struct discrete_dac_r1_ladder firetrk_motor_v_dac =
28 {
29 	4,		// size of ladder
30 	{2200000, 1000000, 470000, 220000, 0,0,0,0},	// R24, R23, R22, R21
31 	4.4,		// 5V - diode junction (0.6V)
32 	68000,		// R25
33 	0,		// no rGnd
34 	1e-5		// C24
35 };
36 
37 const struct discrete_555_cc_desc firetrk_motor_vco =
38 {
39 	DISC_555_OUT_DC | DISC_555_OUT_SQW,
40 	5,		// B+ voltage of 555
41 	5.0 - 1.7,	// High output voltage of 555 (Usually v555 - 1.7)
42 	5.0 * 2 / 3,	// threshold
43 	5.0 /3,		// trigger
44 	5,		// B+ voltage of the Constant Current source
45 	0.7		// Q2 junction voltage
46 };
47 
48 const struct discrete_dac_r1_ladder firetrk_motor_out_dac =
49 {
50 	2,		// size of ladder
51 	{10000, 10000, 0,0,0,0,0,0},	// R74, R73
52 	3.4,		// TTL high voltage
53 	0,		// no rBias
54 	0,		// no rGnd
55 	1e-7		// C43
56 };
57 
58 const struct discrete_dac_r1_ladder firetrk_siren_cv_dac =
59 {
60 	4,		// size of ladder
61 	{2200000, 1000000, 470000, 220000, 0,0,0,0},	// R46, R47, R45, R48
62 	5,		// 5V
63 	100000,		// R49
64 	390000,		// R44
65 	1e-5		// C30
66 };
67 
68 const struct discrete_555_astbl_desc firetrk_siren_555 =
69 {
70 	DISC_555_OUT_SQW | DISC_555_OUT_DC,
71 	5,		// B+ voltage of 555
72 	5.0 - 1.7,	// High output voltage of 555 (Usually v555 - 1.7)
73 	5.0 * 2.0 /3.0,	// normally 2/3 of v555
74 	5.0 / 3.0	// normally 1/3 of v555
75 };
76 
77 const struct discrete_dac_r1_ladder firetrk_bang_dac =
78 {
79 	4,		// size of ladder
80 	{8200, 3900, 2200, 1000, 0,0,0,0},	// R37, R35, R36, R34
81 	0,		// no vBias
82 	0,		// no rBias
83 	0,		// no rGnd
84 	0		// no smoothing cap
85 };
86 
87 const struct discrete_schmitt_osc_desc firetrk_screech_osc =
88 {
89 	2200,	// R29
90 	330,	// R16
91 	2.2e-6,	// C8
92 	1.6,	// Rise Threshold of 74LS14
93 	0.8,	// Fall Threshold of 74LS14
94 	3.4,	// Output high voltage of 74LS14
95 	DISC_SCHMITT_OSC_IN_IS_LOGIC | DISC_SCHMITT_OSC_ENAB_IS_NOR
96 };
97 
98 const struct discrete_mixer_desc firetrk_mixer =
99 {
100 	DISC_MIXER_IS_OP_AMP,
101 	7,					// 7 inputs
102 	{4700, 22000, 31333, 33000, 10545.6, 32000, 150000, 0}, // R54, R55, R72||(R70+R71), R53, R56 + R37||R35||R36||R34, R58 + R73||R74, R52
103 	{0,0,0,0,0,0,0,0},			// No variable resistor nodes
104 	{2.2e-7, 2.2e-7, 1e-8, 2.2e-7, 2.2e-7, 0, 2.2e-7, 0}, // C34, C32, C44, C35, C33, NA, C31
105 	0,					// No rI
106 	22000,					// R43
107 	0,					// No Filter
108 	1e-5,					// C12
109 	5.0 * 820 / (270 + 820),		// vBias = 5V * R51/(R41+R51)
110 	3400
111 };
112 
113 /* Nodes - Inputs */
114 #define FIRETRUCK_MOTOR_DATA	NODE_01
115 #define FIRETRUCK_HORN_EN	NODE_02
116 #define FIRETRUCK_SIREN_DATA	NODE_03
117 #define FIRETRUCK_CRASH_DATA	NODE_04
118 #define FIRETRUCK_SKID_EN	NODE_05
119 #define FIRETRUCK_BELL_EN	NODE_06
120 #define FIRETRUCK_XTNDPLY_EN	NODE_07
121 #define FIRETRUCK_ATTRACT_EN	NODE_08
122 #define FIRETRUCK_ATTRACT_INV	NODE_09
123 /* Nodes - Sounds */
124 #define FIRETRUCK_NOISE		NODE_11
125 #define FIRETRUCK_MOTORSND	NODE_12
126 #define FIRETRUCK_HORNSND	NODE_13
127 #define FIRETRUCK_SIRENSND	NODE_14
128 #define FIRETRUCK_BANGSND	NODE_15
129 #define FIRETRUCK_SCREECHSND	NODE_16
130 #define FIRETRUCK_BELLSND	NODE_17
131 #define FIRETRUCK_XTNDPLYSND	NODE_18
132 
133 DISCRETE_SOUND_START(firetrk_sound_interface)
134 	/************************************************/
135 	/* Input register mapping for firetruck         */
136 	/************************************************/
137 	/*                  NODE             ADDR  MASK    GAIN    OFFSET  INIT */
138 	DISCRETE_INPUT(FIRETRUCK_MOTOR_DATA ,0x00,0x000f,                  0.0)
139 	DISCRETE_INPUT(FIRETRUCK_HORN_EN    ,0x01,0x000f,                  0.0)
140 	DISCRETE_INPUT(FIRETRUCK_SIREN_DATA ,0x02,0x000f,                  0.0)
141 	DISCRETE_INPUT(FIRETRUCK_CRASH_DATA ,0x03,0x000f,                 15.0)
142 	DISCRETE_INPUT(FIRETRUCK_SKID_EN    ,0x04,0x000f,                  0.0)
143 	DISCRETE_INPUT(FIRETRUCK_BELL_EN    ,0x05,0x000f,                  0.0)
144 	DISCRETE_INPUT(FIRETRUCK_ATTRACT_EN ,0x06,0x000f,                  0.0)
145 	DISCRETE_INPUT(FIRETRUCK_XTNDPLY_EN ,0x07,0x000f,                  0.0)
146 
147 	DISCRETE_LOGIC_INVERT(FIRETRUCK_ATTRACT_INV, 1, FIRETRUCK_ATTRACT_EN)
148 
149 	/************************************************/
150 	/* Motor sound circuit is based on a 556 VCO    */
151 	/* with the input frequency set by the MotorSND */
152 	/* latch (4 bit). This freqency is then used to */
153 	/* drive a modulo 12 counter, with div6 & div12 */
154 	/* summed as the output of the circuit.         */
155 	/************************************************/
156 	DISCRETE_ADJUSTMENT(NODE_20, 1,
157 				10000,	// R26 + R27 @ min
158 				260000,	// R26 + R27 @ max
159 				DISC_LOGADJ, 8)
160 	DISCRETE_DAC_R1(NODE_21, 1,		// base of Q1
161 			FIRETRUCK_MOTOR_DATA,	// IC F8, pins 2,5,6,9
162 			3.4,			// TTL ON level
163 			&firetrk_motor_v_dac)
164 	DISCRETE_555_CC(NODE_22, 1,	// IC B9 pin 3, always enabled
165 			NODE_21,	// vIn
166 			NODE_20,	// current adjust
167 			1.e-8,		// C25
168 			1000000, 0, 0,	// R28, no rGnd, no rDis
169 			&firetrk_motor_vco)
170 	DISCRETE_COUNTER(NODE_23, 1, FIRETRUCK_ATTRACT_EN,	// IC A9, QB-QD
171 			NODE_22,				// from IC B9, pin 3
172 			5, 1, 0, 1)				// /6 counter on rising edge
173 	DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 2, "01>")	// IC A9, pin 8
174 	DISCRETE_COUNTER(NODE_25, 1, FIRETRUCK_ATTRACT_EN,	// IC A9, pin 12
175 			NODE_24,					// from IC A9, pin 8
176 			1, 1, 0, 1)					// /2 counter on rising edge
177 	DISCRETE_TRANSFORM3(NODE_26, 1, NODE_24, NODE_25, 2, "12*0+")	// Mix the mess together in binary
178 	DISCRETE_DAC_R1(FIRETRUCK_MOTORSND, 1, NODE_26,
179 			3.4,				// TTL ON level
180 			&firetrk_motor_out_dac)
181 
182 	/************************************************/
183 	/* Horn, this is taken from the 64V signal.     */
184 	/*  64V = HSYNC/128                             */
185 	/*      = 15750/128                             */
186 	/************************************************/
187 	DISCRETE_SQUAREWFIX(NODE_30, FIRETRUCK_ATTRACT_INV, 15750.0/128, 3.4, 50.0, 3.4/2, 0)
188 	DISCRETE_ONOFF(FIRETRUCK_HORNSND, FIRETRUCK_HORN_EN, NODE_30)
189 
190 	/************************************************/
191 	/* Siren is built around a 556 based VCO, the   */
192 	/* 4 bit input value is smoothed between trans- */
193 	/* itions by a 10u capacitor.                   */
194 	/* 0000 = 666Hz with 35% duty cycle             */
195 	/* 1111 = 526Hz with 63% duty cycle             */
196 	/************************************************/
197 	DISCRETE_DAC_R1(NODE_40, 1,		// IC E9, pin 7
198 			FIRETRUCK_SIREN_DATA,	// IC F8, pins 15,16,12,19
199 			3.4,			// TTL ON level
200 			&firetrk_siren_cv_dac)
201 	DISCRETE_555_ASTABLE(FIRETRUCK_SIRENSND, FIRETRUCK_ATTRACT_INV,
202 				2200,	// R60
203 				10000,	// R59
204 				1e-7,	// C37
205 				NODE_40,	// CV is straight from DAC because op-amp E9 is just x1 buffer
206 				&firetrk_siren_555)
207 
208 	/************************************************/
209 	/* Crash circuit is built around a noise        */
210 	/* generator built from 2 shift registers that  */
211 	/* are clocked by the 2V signal.                */
212 	/* 2V = HSYNC/4                                 */
213 	/*    = 15750/4                                 */
214 	/* Output is binary weighted with 4 bits of     */
215 	/* crash volume.                                */
216 	/************************************************/
217 	DISCRETE_LFSR_NOISE(FIRETRUCK_NOISE, FIRETRUCK_ATTRACT_INV, FIRETRUCK_ATTRACT_INV, 15750.0/4, 1.0, 0, 0.5, &firetrk_lfsr)
218 
219 	DISCRETE_SWITCH(NODE_50, 1, FIRETRUCK_NOISE, 0,	// Enable gate K9
220 			FIRETRUCK_CRASH_DATA)		// IC K9, pins 3,6,11,8
221 	DISCRETE_DAC_R1(FIRETRUCK_BANGSND, 1,	// Bang
222 			NODE_50,		// from enable gates K9
223 			3.4,			// TTL ON level
224 			&firetrk_bang_dac)
225 
226 	/************************************************/
227 	/* Screech is just the noise modulating a       */
228 	/* Schmitt VCO.                                 */
229 	/************************************************/
230 	DISCRETE_SCHMITT_OSCILLATOR(FIRETRUCK_SCREECHSND, FIRETRUCK_SKID_EN, FIRETRUCK_NOISE, 3.4, &firetrk_screech_osc)
231 
232 	/************************************************/
233 	/* Bell circuit -                               */
234 	/* The Hsync signal is put into a div 16        */
235 	/* counter.                                     */
236 	/************************************************/
237 	DISCRETE_RCDISC2(NODE_70, FIRETRUCK_BELL_EN,
238 				4.4, 10,	// Q3 instantally charges C42
239 				0, 33000,	// discharges thru R66
240 				1e-5)		// C42
241 	DISCRETE_TRANSFORM2(NODE_71, 1, NODE_70,
242 				5.0 * 680 / (10000 + 680),	// vRef = 5V * R64 / (R65 + R64)
243 				"01<")				// Output is low until vIn drops below vRef
244 	DISCRETE_COUNTER_FIX(NODE_72, 1, NODE_71, 15750, 15, 1, 0)	// IC B10
245 	DISCRETE_TRANSFORM4(FIRETRUCK_BELLSND, 1, NODE_72,
246 				8,	// count 0-7 allow cap voltage to output.  8-15 ground output.
247 				NODE_70,	// scale logic to cap voltage
248 				47000.0 / (47000 + 47000 + 47000),	// to drop voltage per divider R72 / (R70+R71+R72)
249 				"01<2*3*")
250 
251 	/************************************************/
252 	/* Extended play circuit is just the 8V signal  */
253 	/* 8V = HSYNC/16                                */
254 	/*    = 15750/16                                */
255 	/************************************************/
256 	DISCRETE_SQUAREWFIX(FIRETRUCK_XTNDPLYSND, FIRETRUCK_XTNDPLY_EN, 15750.0/16, 3.4, 50.0, 3.4/2, 0.0)
257 
258 	/************************************************/
259 	/* Combine all 7 sound sources.                 */
260 	/************************************************/
261 	DISCRETE_MIXER7(NODE_90, 1, FIRETRUCK_XTNDPLYSND, FIRETRUCK_HORNSND, FIRETRUCK_BELLSND, FIRETRUCK_SCREECHSND, FIRETRUCK_BANGSND, FIRETRUCK_MOTORSND, FIRETRUCK_SIRENSND, &firetrk_mixer)
262 	DISCRETE_OUTPUT(NODE_90, 100)
263 DISCRETE_SOUND_END
264 
265 
266 /************************************************************************/
267 /* superbug Sound System Analog emulation                               */
268 /* Complete re-write Feb 2004, D. Renaud                                */
269 /************************************************************************/
270 
271 const struct discrete_dac_r1_ladder superbug_motor_v_dac =
272 {
273 	4,		// size of ladder
274 	{2200000, 1000000, 470000, 220000, 0,0,0,0},	// R8, R9, R6, R7
275 	4.4,	// 5V - diode junction (0.6V)
276 	68000,	// R10
277 	0,		// no rGnd
278 	1e-5	// C20
279 };
280 
281 const struct discrete_555_cc_desc superbug_motor_vco =
282 {
283 	DISC_555_OUT_DC | DISC_555_OUT_SQW,
284 	5,				// B+ voltage of 555
285 	5.0 - 1.7,		// High output voltage of 555 (Usually v555 - 1.7)
286 	5.0 * 2 / 3,	// threshold
287 	5.0 /3,			// trigger
288 	5,				// B+ voltage of the Constant Current source
289 	0.7				// Q1 junction voltage
290 };
291 
292 const struct discrete_dac_r1_ladder superbug_motor_out_dac =
293 {
294 	2,		// size of ladder
295 	{10000, 10000, 0,0,0,0,0,0},	// R32, R34
296 	3.4,	// TTL high voltage
297 	0,		// no rBias
298 	0,		// no rGnd
299 	1e-7	// C26
300 };
301 
302 const struct discrete_dac_r1_ladder superbug_bang_dac =
303 {
304 	4,		// size of ladder
305 	{8200, 3900, 2200, 1000, 0,0,0,0},	// R28, R28, R27, R26
306 	0,		// no vBias
307 	0,		// no rBias
308 	0,		// no rGnd
309 	1e-7	// C25
310 };
311 
312 const struct discrete_schmitt_osc_desc superbug_screech_osc =
313 {
314 	2200,	// R30
315 	330,	// R52
316 	2.2e-6,	// C27
317 	1.7,	// Rise Threshold of 7414
318 	0.9,	// Fall Threshold of 7414
319 	3.4,	// Output high voltage of 7414
320 	DISC_SCHMITT_OSC_IN_IS_LOGIC | DISC_SCHMITT_OSC_ENAB_IS_NOR
321 };
322 
323 const struct discrete_mixer_desc superbug_mixer =
324 {
325 	DISC_MIXER_IS_RESISTOR,
326 	4,							// 4 inputs
327 	{15000, 10545.6, 33000, 47000, 0,0,0,0}, // R54, R55, R72||(R70+R71), R53, R56 + R37||R35||R36||R34, R58 + R73||R74, R52
328 	{0,0,0,0,0,0,0,0},			// No variable resistor nodes
329 	{0, 0, 0, 0, 0,0,0,0},		// No caps
330 	0,							// No rI
331 	5000,						// R63
332 	0,							// No Filter
333 	1e-7,						// C35
334 	0,							// not used in resistor network
335 	33000
336 };
337 
338 /* Nodes - Inputs */
339 #define SUPERBUG_SPEED_DATA		NODE_01
340 #define SUPERBUG_CRASH_DATA		NODE_02
341 #define SUPERBUG_SKID_EN		NODE_03
342 #define SUPERBUG_ASR_EN			NODE_04
343 #define SUPERBUG_ATTRACT_EN		NODE_05
344 #define SUPERBUG_ATTRACT_INV	NODE_06
345 /* Nodes - Sounds */
346 #define SUPERBUG_NOISE			NODE_10
347 #define SUPERBUG_MOTORSND		NODE_11
348 #define SUPERBUG_BANGSND		NODE_12
349 #define SUPERBUG_SCREECHSND		NODE_13
350 #define SUPERBUG_ASRSND			NODE_14
351 
352 DISCRETE_SOUND_START(superbug_sound_interface)
353 	/************************************************/
354 	/* Input register mapping for superbug          */
355 	/************************************************/
356 	/*                   NODE             ADDR   MASK   GAIN    OFFSET  INIT */
357 	DISCRETE_INPUT(SUPERBUG_SPEED_DATA  , 0x00, 0x000f,                 15.0)
358 	DISCRETE_INPUT(SUPERBUG_CRASH_DATA  , 0x03, 0x000f,                 15.0)
359 	DISCRETE_INPUT(SUPERBUG_SKID_EN     , 0x04, 0x000f,                  0.0)
360 	DISCRETE_INPUT(SUPERBUG_ATTRACT_EN  , 0x06, 0x000f,                  0.0)
361 	DISCRETE_INPUT(SUPERBUG_ASR_EN      , 0x07, 0x000f,                  0.0)
362 
363 	DISCRETE_LOGIC_INVERT(SUPERBUG_ATTRACT_INV, 1, SUPERBUG_ATTRACT_EN)
364 
365 	/************************************************/
366 	/* Motor sound circuit is based on a 556 VCO    */
367 	/* with the input frequency set by the MotorSND */
368 	/* latch (4 bit). This freqency is then used to */
369 	/* drive a modulo 12 counter.                   */
370 	/************************************************/
371 	DISCRETE_ADJUSTMENT(NODE_20, 1,
372 				10000,	// R12 + R62 @ min
373 				260000,	// R12 + R62 @ max
374 				DISC_LOGADJ, 8)
375 	DISCRETE_DAC_R1(NODE_21, 1,		// base of Q1
376 			SUPERBUG_SPEED_DATA,	// IC B5, pins 3, 14, 6, 11
377 			3.4,			// TTL ON level
378 			&superbug_motor_v_dac)
379 	DISCRETE_555_CC(NODE_22, 1,	// IC A6 pin 3, always enabled
380 			NODE_21,	// vIn
381 			NODE_20,	// current adjust
382 			1.e-8,		// C21
383 			3300000, 0, 0,	// R11, no rGnd, no rDis
384 			&superbug_motor_vco)
385 	DISCRETE_COUNTER(NODE_23, 1, SUPERBUG_ATTRACT_EN,	// IC A7, QB-QD
386 			NODE_22,				// from IC A6, pin 3
387 			5, 1, 0, 1)				// /6 counter on rising edge
388 	DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 2, "01>")	// IC A7, pin 8-QD
389 	DISCRETE_TRANSFORM3(NODE_25, 1, NODE_23, 1, 4, "01=02=|")	// IC A7, pin 11-QB
390 	DISCRETE_LOGIC_XOR(NODE_26, 1, NODE_24, NODE_25)	// Gate A9, pin 8
391 	DISCRETE_COUNTER(NODE_27, 1, SUPERBUG_ATTRACT_EN,	// IC A7, pin 12-QA
392 			NODE_26,					// from IC A9, pin 8
393 			1, 1, 0, 1)					// /2 counter on rising edge
394 	DISCRETE_TRANSFORM3(NODE_28, 1, NODE_24, NODE_27, 2, "12*0+")	// Mix the mess together in binary
395 	DISCRETE_DAC_R1(SUPERBUG_MOTORSND, 1, NODE_28,
396 			3.4,				// TTL ON level
397 			&superbug_motor_out_dac)
398 
399 	/************************************************/
400 	/* Crash circuit is built around a noise        */
401 	/* generator built from 2 shift registers that  */
402 	/* are clocked by the 2V signal.                */
403 	/* 2V = HSYNC/4                                 */
404 	/*    = 15750/4                                 */
405 	/* Output is binary weighted with 4 bits of     */
406 	/* crash volume.                                */
407 	/************************************************/
408 	DISCRETE_LFSR_NOISE(SUPERBUG_NOISE, SUPERBUG_ATTRACT_INV, SUPERBUG_ATTRACT_INV, 15750.0/4, 1.0, 0, 0.5, &firetrk_lfsr)	// Same as firetrk
409 
410 	DISCRETE_SWITCH(NODE_40, 1, SUPERBUG_NOISE, 0,	// Enable gate C8
411 			SUPERBUG_CRASH_DATA)		// IC D8, pins 3,14,6,11
412 	DISCRETE_DAC_R1(SUPERBUG_BANGSND, 1,	// Bang
413 			NODE_40,		// from enable gates C8
414 			3.4,			// TTL ON level
415 			&superbug_bang_dac)
416 
417 	/************************************************/
418 	/* Screech is just the noise modulating a       */
419 	/* Schmitt VCO.                                 */
420 	/************************************************/
421 	DISCRETE_SCHMITT_OSCILLATOR(SUPERBUG_SCREECHSND, SUPERBUG_SKID_EN, SUPERBUG_NOISE, 3.4, &superbug_screech_osc)
422 
423 	/************************************************/
424 	/* ASR circuit is just the 8V signal            */
425 	/* 8V = HSYNC/16                                */
426 	/*    = 15750/16                                */
427 	/************************************************/
428 	DISCRETE_SQUAREWFIX(SUPERBUG_ASRSND, SUPERBUG_ASR_EN, 15750.0/16, 3.4, 50.0, 3.4/2, 0.0)
429 
430 	/************************************************/
431 	/* Combine all 4 sound sources.                 */
432 	/************************************************/
433 	DISCRETE_MIXER4(NODE_90, 1, SUPERBUG_MOTORSND, SUPERBUG_BANGSND, SUPERBUG_SCREECHSND, SUPERBUG_ASRSND, &superbug_mixer)
434 	DISCRETE_OUTPUT(NODE_90, 100)
435 DISCRETE_SOUND_END
436 
437 
438 /************************************************************************/
439 /* montecar Sound System Analog emulation                               */
440 /* Complete re-write Mar 2004, D. Renaud                                */
441 /************************************************************************/
442 
443 /* Both cars use same parts for v_dac, vco and out_dac */
444 const struct discrete_dac_r1_ladder montecar_motor_v_dac =
445 {
446 	4,		// size of ladder
447 	{2200000, 1000000, 470000, 220000, 0,0,0,0},	// R44, R43, R46, R45
448 	4.4,		// 5V - diode junction (0.6V)
449 	68000,		// R80
450 	0,		// no rGnd
451 	4.7e-6		// C77
452 };
453 
454 const struct discrete_555_cc_desc montecar_motor_vco =
455 {
456 	DISC_555_OUT_DC | DISC_555_OUT_SQW,
457 	5,		// B+ voltage of 555
458 	5.0 - 1.7,	// High output voltage of 555 (Usually v555 - 1.7)
459 	5.0 * 2 / 3,	// threshold
460 	5.0 /3,		// trigger
461 	5,		// B+ voltage of the Constant Current source
462 	0.7		// Q1 junction voltage
463 };
464 
465 const struct discrete_dac_r1_ladder montecar_motor_out_dac =
466 {
467 	3,		// size of ladder
468 	{10000, 10000, 10000, 0,0,0,0,0},	// R31, R30, R29
469 	3.4,		// TTL high voltage
470 	0,		// no rBias
471 	0,		// no rGnd
472 	1e-7		// C53
473 };
474 
475 const struct discrete_comp_adder_table montecar_drone_vol_res =
476 {
477 	DISC_COMP_P_RESISTOR,
478 	0,					// no default
479 	4,					// # of resistors
480 	{100250, 47250, 22250, 10250, 0,0,0,0}	// R105, R104, R103, R102 (250 added to all for 4066 resistance)
481 };
482 
483 const struct discrete_dac_r1_ladder montecar_bang_dac =
484 {
485 	4,		// size of ladder
486 	{8200, 3900, 2200, 1000, 0,0,0,0},	// R39, R42, R41, R40
487 	0,		// no vBias
488 	0,		// no rBias
489 	0,		// no rGnd
490 	0		// no cSmoothing
491 };
492 
493 const struct discrete_schmitt_osc_desc montecar_screech_osc =
494 {
495 	2200,	// R54
496 	330,	// R53
497 	2.2e-6,	// C57
498 	1.6,	// Rise Threshold of 74LS14
499 	0.8,	// Fall Threshold of 74LS14
500 	3.4,	// Output high voltage of 74LS14
501 	DISC_SCHMITT_OSC_IN_IS_LOGIC | DISC_SCHMITT_OSC_ENAB_IS_NOR
502 };
503 
504 const struct discrete_mixer_desc montecar_mixer =
505 {
506 	DISC_MIXER_IS_OP_AMP,
507 	5,					// 5 inputs
508 	{15000, 33000, 10000, 10000, 13333.3, 0,0,0}, // R93, R97, R96, variable , R95 + R31||R30||R29
509 	{0,0,0,NODE_30,0,0,0,0},			// Only drone has variable node
510 	{2.2e-7, 2.2e-7, 2.2e-7, 1e-6, 1e-6, 0,0,0},	// C83, C84, C85, C88, C47
511 	27000,					// R92
512 	82000,					// R98
513 	0,					// No Filter
514 	2.2e-7,					// C6
515 	5,					// vRef
516 	8000
517 };
518 
519 /* Nodes - Inputs */
520 #define MONTECAR_MOTOR_DATA		NODE_01	// Motor1 - Motor4
521 #define MONTECAR_DRONE_MOTOR_DATA	NODE_02	// Motor5 - Motor8
522 #define MONTECAR_CRASH_DATA		NODE_03
523 #define MONTECAR_SKID_EN		NODE_04
524 #define MONTECAR_DRONE_LOUD_DATA	NODE_05
525 #define MONTECAR_BEEPER_EN		NODE_06
526 #define MONTECAR_ATTRACT_EN		NODE_07
527 #define MONTECAR_ATTRACT_INV		NODE_08
528 /* Nodes - Sounds */
529 #define MONTECAR_NOISE			NODE_15
530 #define MONTECAR_MOTORSND		NODE_10	// MotorAud1
531 #define MONTECAR_BEEPSND		NODE_11
532 #define MONTECAR_DRONE_MOTORSND		NODE_12	// MotorAud2
533 #define MONTECAR_BANGSND		NODE_13
534 #define MONTECAR_SCREECHSND		NODE_14
535 
536 DISCRETE_SOUND_START(montecar_sound_interface)
537 	/************************************************/
538 	/* Input register mapping for montecar          */
539 	/************************************************/
540 	/*                   NODE                   ADDR   MASK   GAIN    OFFSET  INIT */
541 	DISCRETE_INPUT(MONTECAR_MOTOR_DATA        , 0x00, 0x000f,                  0.0)
542 	DISCRETE_INPUT(MONTECAR_DRONE_MOTOR_DATA  , 0x02, 0x000f,                  0.0)
543 	DISCRETE_INPUT(MONTECAR_CRASH_DATA        , 0x03, 0x000f,                 15.0)
544 	DISCRETE_INPUT(MONTECAR_SKID_EN           , 0x04, 0x000f,                  0.0)
545 	DISCRETE_INPUT(MONTECAR_DRONE_LOUD_DATA   , 0x05, 0x000f,                  0.0)
546 	DISCRETE_INPUT(MONTECAR_ATTRACT_INV       , 0x06, 0x000f,                  0.0)
547 	DISCRETE_INPUT(MONTECAR_BEEPER_EN         , 0x07, 0x000f,                  0.0)
548 
549 	DISCRETE_LOGIC_INVERT(MONTECAR_ATTRACT_EN, 1, MONTECAR_ATTRACT_INV)
550 
551 	/************************************************/
552 	/* Motor sound circuit is based on a 556 VCO    */
553 	/* with the input frequency set by the MotorSND */
554 	/* latch (4 bit). This freqency is then used to */
555 	/* driver a modulo 12 counter, with div6, 4 & 3 */
556 	/* summed as the output of the circuit.         */
557 	/************************************************/
558 	DISCRETE_ADJUSTMENT(NODE_20, 1,
559 				10000,	// R87 + R89 @ min
560 				260000,	// R87 + R89 @ max
561 				DISC_LOGADJ, 8)
562 	DISCRETE_DAC_R1(NODE_21, 1,		// base of Q7
563 			MONTECAR_MOTOR_DATA,	// IC H8, pins 5, 2, 9, 6
564 			3.4,			// TTL ON level
565 			&montecar_motor_v_dac)
566 	DISCRETE_555_CC(NODE_22, 1,	// IC C9 pin 9
567 			NODE_21,	// vIn
568 			NODE_20,	// current adjust
569 			1.e-8,		// C81
570 			1000000, 0, 0,	// R86, no rGnd, no rDis
571 			&montecar_motor_vco)
572 	DISCRETE_COUNTER(NODE_23, 1, MONTECAR_ATTRACT_EN,	// IC B/C9, QB-QD
573 			NODE_22,				// from IC C9, pin 9
574 			5, 1, 0, 1)				// /6 counter on rising edge
575 	DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 2, "01>")	// IC B/C9, pin 8-QD
576 	DISCRETE_TRANSFORM3(NODE_25, 1, NODE_23, 1, 4, "01=02=|")	// IC B/C9, pin 11-QB
577 	DISCRETE_LOGIC_XOR(NODE_26, 1, NODE_24, NODE_25)	// Gate A9, pin 11
578 	DISCRETE_COUNTER(NODE_27, 1, MONTECAR_ATTRACT_EN,	// IC B/C9, pin 12-QA
579 			NODE_26,					// from IC A9, pin 11
580 			1, 1, 0, 1)					// /2 counter on rising edge
581 	DISCRETE_TRANSFORM5(NODE_28, 1, NODE_27, NODE_25, NODE_24, 2, 4, "13*24*+0+")	// Mix the mess together in binary
582 	DISCRETE_DAC_R1(MONTECAR_MOTORSND, 1, NODE_28,
583 			3.4,				// TTL ON level
584 			&montecar_motor_out_dac)
585 
586 	/************************************************/
587 	/* Drone motor sound is basically the same as   */
588 	/* the regular car but with a volume control.   */
589 	/* Also I shifted the frequencies up for it to  */
590 	/* sound different from the player's car.       */
591 	/************************************************/
592 	DISCRETE_COMP_ADDER(NODE_30, 1, MONTECAR_DRONE_LOUD_DATA, &montecar_drone_vol_res)	// make sure to change the node value in the mixer table if you change this node number
593 
594 	DISCRETE_ADJUSTMENT(NODE_40, 1,
595 				10000,	// R85 + R88 @ min
596 				260000,	// R85 + R88 @ max
597 				DISC_LOGADJ, 9)
598 	DISCRETE_DAC_R1(NODE_41, 1,		// base of Q7
599 			MONTECAR_DRONE_MOTOR_DATA,	// IC H8, pins 19, 16, 12, 15
600 			3.4,			// TTL ON level
601 			&montecar_motor_v_dac)
602 	DISCRETE_555_CC(NODE_42, 1,	// IC C9 pin 5
603 			NODE_41,	// vIn
604 			NODE_40,	// current adjust
605 			1.e-8,		// C80
606 			1000000, 0, 0,	// R81, no rGnd, no rDis
607 			&montecar_motor_vco)
608 	DISCRETE_COUNTER(NODE_43, 1, MONTECAR_ATTRACT_EN,	// IC A/B9, QB-QD
609 			NODE_42,				// from IC C9, pin 5
610 			5, 1, 0, 1)				// /6 counter on rising edge
611 	DISCRETE_TRANSFORM2(NODE_44, 1, NODE_43, 2, "01>")	// IC A/B9, pin 8-QD
612 	DISCRETE_TRANSFORM3(NODE_45, 1, NODE_43, 1, 4, "01=02=|")	// IC A/B9, pin 11-QB
613 	DISCRETE_LOGIC_XOR(NODE_46, 1, NODE_44, NODE_45)	// Gate A9, pin 6
614 	DISCRETE_COUNTER(NODE_47, 1, MONTECAR_ATTRACT_EN,	// IC A/B9, pin 12-QA
615 			NODE_46,				// from IC A9, pin 6
616 			1, 1, 0, 1)				// /2 counter on rising edge
617 	DISCRETE_TRANSFORM5(NODE_48, 1, NODE_47, NODE_45, NODE_44, 2, 4, "13*24*+0+")	// Mix the mess together in binary
618 	DISCRETE_DAC_R1(MONTECAR_DRONE_MOTORSND, 1, NODE_48,
619 			3.4,				// TTL ON level
620 			&montecar_motor_out_dac)
621 
622 	/************************************************/
623 	/* Crash circuit is built around a noise        */
624 	/* generator built from 2 shift registers that  */
625 	/* are clocked by the 2V signal.                */
626 	/* 2V = HSYNC/4                                 */
627 	/*    = 15750/4                                 */
628 	/* Output is binary weighted with 4 bits of     */
629 	/* crash volume.                                */
630 	/*                                              */
631 	/* TO DO: add filtering !!!!!!!!!!!!!!!!!!!!!!! */
632 	/************************************************/
633 	DISCRETE_LFSR_NOISE(MONTECAR_NOISE, MONTECAR_ATTRACT_INV, MONTECAR_ATTRACT_INV, 15750.0/4, 1.0, 0, 0.5, &firetrk_lfsr)	// Same as firetrk
634 
635 	DISCRETE_SWITCH(NODE_50, 1, MONTECAR_NOISE, 0,	// Enable gate A9
636 			MONTECAR_CRASH_DATA)		// IC J8, pins 3,6,11,14
637 	DISCRETE_DAC_R1(MONTECAR_BANGSND, 1,	// Bang
638 			NODE_50,	// from enable gates A9
639 			3.4,		// TTL ON level
640 			&montecar_bang_dac)
641 
642 	/************************************************/
643 	/* Screech is just the noise modulating a       */
644 	/* Schmitt VCO.                                 */
645 	/************************************************/
646 	DISCRETE_SCHMITT_OSCILLATOR(NODE_60, MONTECAR_SKID_EN, MONTECAR_NOISE, 3.4, &montecar_screech_osc)
647 	DISCRETE_SWITCH(MONTECAR_SCREECHSND, 1, MONTECAR_ATTRACT_INV, 0, NODE_60)
648 
649 	/************************************************/
650 	/* Beep circuit is just the 8V signal           */
651 	/* 8V = HSYNC/16                                */
652 	/*    = 15750/16                                */
653 	/************************************************/
654 	DISCRETE_SQUAREWFIX(MONTECAR_BEEPSND, MONTECAR_BEEPER_EN, 15750.0/16, 3.4, 50.0, 3.4/2, 0.0)
655 
656 	/************************************************/
657 	/* Combine all 5 sound sources.                 */
658 	/************************************************/
659 	DISCRETE_MIXER5(NODE_90, 1, MONTECAR_BEEPSND, MONTECAR_SCREECHSND, MONTECAR_BANGSND, MONTECAR_DRONE_MOTORSND, MONTECAR_MOTORSND, &montecar_mixer)
660 	DISCRETE_OUTPUT(NODE_90, 100)
661 DISCRETE_SOUND_END
662