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