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