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