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