1 // license:CC0 2 // copyright-holders:Aaron Giles 3 4 // 5 // Netlist for Sega Universal Sound Board 6 // 7 // The Sega Universal Sound Board was used by several early G80 8 // vector and raster games, notably Star Trek and Tac/Scan, 9 // among others. It is largely implemented as a MAME device, but 10 // the analog audio section is implemented here. 11 // 12 // Known problems/issues: 13 // 14 // * WIP. 15 // 16 17 #include "netlist/devices/net_lib.h" 18 #include "nl_segausb.h" 19 20 21 22 // 23 // Optimizations 24 // 25 26 #define USE_AFUNC_MIXING (1) 27 #define ENABLE_NOISE_FRONTIERS (1) 28 #define UNDERCLOCK_NOISE_GEN (1) 29 #define ENABLE_FRONTIERS (0) 30 31 32 33 // 34 // Hacks 35 // 36 37 38 39 NETLIST_START(segausb) 40 41 SOLVER(Solver, 1000) 42 PARAM(Solver.DYNAMIC_TS, 1) 43 PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5) 44 45 ANALOG_INPUT(I_U12_DAC, 0) // AD7524 46 ANALOG_INPUT(I_U13_DAC, 0) // AD7524 47 ANALOG_INPUT(I_U14_DAC, 0) // AD7524 48 TTL_INPUT(I_U2B_SEL, 0) // 74LS74 49 50 ANALOG_INPUT(I_U24_DAC, 0) // AD7524 51 ANALOG_INPUT(I_U25_DAC, 0) // AD7524 52 ANALOG_INPUT(I_U26_DAC, 0) // AD7524 53 TTL_INPUT(I_U38B_SEL, 0) // 74LS74 54 55 ANALOG_INPUT(I_U27_DAC, 0) // AD7524 56 ANALOG_INPUT(I_U28_DAC, 0) // AD7524 57 ANALOG_INPUT(I_U29_DAC, 0) // AD7524 58 TTL_INPUT(I_U2A_SEL, 0) // 74LS74 59 60 NET_C(GND, I_U2B_SEL.GND, I_U38B_SEL.GND, I_U2A_SEL.GND) 61 NET_C(I_V5, I_U2B_SEL.VCC, I_U38B_SEL.VCC, I_U2A_SEL.VCC) 62 63 TTL_INPUT(I_U41_OUT0, 0) // 8253 PIT U41 64 TTL_INPUT(I_U41_OUT1, 0) 65 TTL_INPUT(I_U41_OUT2, 0) 66 67 TTL_INPUT(I_U42_OUT0, 0) // 8253 PIT U42 68 TTL_INPUT(I_U42_OUT1, 0) 69 TTL_INPUT(I_U42_OUT2, 0) 70 71 TTL_INPUT(I_U43_OUT0, 0) // 8253 PIT U43 72 TTL_INPUT(I_U43_OUT1, 0) 73 TTL_INPUT(I_U43_OUT2, 0) 74 75 NET_C(GND, I_U41_OUT0.GND, I_U41_OUT1.GND, I_U41_OUT2.GND) 76 NET_C(I_V5, I_U41_OUT0.VCC, I_U41_OUT1.VCC, I_U41_OUT2.VCC) 77 78 NET_C(GND, I_U42_OUT0.GND, I_U42_OUT1.GND, I_U42_OUT2.GND) 79 NET_C(I_V5, I_U42_OUT0.VCC, I_U42_OUT1.VCC, I_U42_OUT2.VCC) 80 81 NET_C(GND, I_U43_OUT0.GND, I_U43_OUT1.GND, I_U43_OUT2.GND) 82 NET_C(I_V5, I_U43_OUT0.VCC, I_U43_OUT1.VCC, I_U43_OUT2.VCC) 83 84 ANALOG_INPUT(I_V5, 5) 85 ANALOG_INPUT(I_V12, 12) 86 ANALOG_INPUT(I_VM12, -12) 87 88 RES(R7, RES_K(100)) 89 RES(R8, RES_K(100)) 90 RES(R9, RES_K(100)) 91 RES(R10, RES_K(100)) 92 RES(R12, RES_K(100)) 93 RES(R13, RES_K(100)) 94 RES(R14, RES_K(33)) 95 RES(R15, RES_K(100)) 96 RES(R16, RES_K(100)) 97 RES(R17, RES_K(5.6)) 98 RES(R18, RES_K(100)) 99 RES(R19, RES_K(100)) 100 RES(R20, RES_K(10)) 101 RES(R21, RES_K(10)) 102 RES(R22, RES_K(10)) 103 RES(R23, RES_K(1)) 104 RES(R24, RES_K(1)) 105 RES(R25, RES_K(100)) 106 RES(R26, RES_K(5.6)) 107 RES(R27, RES_K(10)) 108 RES(R28, RES_K(100)) 109 RES(R29, RES_K(100)) 110 RES(R30, RES_K(1)) 111 RES(R31, RES_K(100)) 112 RES(R32, RES_K(100)) 113 RES(R33, RES_K(1)) 114 RES(R34, RES_K(100)) 115 RES(R35, RES_K(100)) 116 RES(R36, RES_K(100)) 117 RES(R37, RES_K(33)) 118 RES(R38, RES_K(100)) 119 RES(R39, RES_K(100)) 120 RES(R40, RES_K(10)) 121 RES(R41, RES_K(10)) 122 RES(R42, RES_K(100)) 123 RES(R43, RES_K(100)) 124 RES(R44, RES_K(33)) 125 RES(R45, RES_K(100)) 126 RES(R46, RES_K(100)) 127 RES(R47, RES_K(5.6)) 128 RES(R48, RES_K(100)) 129 RES(R49, RES_K(100)) 130 RES(R50, RES_K(10)) 131 RES(R51, RES_K(10)) 132 RES(R52, RES_K(10)) 133 RES(R53, RES_K(1)) 134 RES(R54, RES_K(100)) 135 RES(R55, RES_K(100)) 136 RES(R56, RES_K(1)) 137 RES(R59, RES_K(1)) 138 RES(R60, RES_K(2.2)) 139 RES(R61, RES_K(33)) 140 RES(R62, 270) 141 RES(R63, RES_K(1)) 142 RES(R64, RES_K(2.7)) 143 RES(R65, RES_K(2.7)) 144 145 // CAP(C6, CAP_P(100)) 146 // CAP(C7, CAP_P(100)) 147 // CAP(C8, CAP_P(100)) 148 CAP(C9, CAP_U(0.01)) 149 CAP(C13, CAP_U(0.01)) 150 CAP(C14, CAP_U(1)) 151 CAP(C15, CAP_U(1)) 152 CAP(C16, CAP_U(0.01)) 153 CAP(C17, CAP_U(0.01)) 154 // CAP(C19, CAP_P(100)) 155 // CAP(C20, CAP_P(100)) 156 // CAP(C21, CAP_P(100)) 157 // CAP(C22, CAP_P(100)) 158 // CAP(C23, CAP_P(100)) 159 // CAP(C24, CAP_P(100)) 160 CAP(C25, CAP_U(0.01)) 161 CAP(C32, CAP_U(0.01)) 162 CAP(C33, CAP_U(1)) 163 CAP(C34, CAP_U(1)) 164 CAP(C35, CAP_U(1)) 165 CAP(C36, CAP_U(1)) 166 CAP(C51, CAP_U(0.15)) 167 CAP(C52, CAP_U(0.1)) 168 CAP(C53, CAP_U(0.082)) 169 CAP(C54, CAP_U(1)) 170 CAP(C55, CAP_U(0.15)) 171 CAP(C56, CAP_U(0.15)) 172 173 // TL082_DIP(U1) // Op. Amp. 174 // NET_C(U1.7, I_V12) 175 // NET_C(U1.4, I_VM12) 176 177 // TTL_74LS74(U2) // Dual D-Type Positive Edge-Triggered Flip-Flop -- not emulated 178 // NET_C(U2.7, GND) 179 // NET_C(U2.14, I_V5) 180 181 TL082_DIP(U3) // Op. Amp. 182 NET_C(U3.8, I_V12) 183 NET_C(U3.4, I_VM12) 184 185 TL082_DIP(U4) // Op. Amp. 186 NET_C(U4.8, I_V12) 187 NET_C(U4.4, I_VM12) 188 189 TL082_DIP(U5) // Op. Amp. 190 NET_C(U5.8, I_V12) 191 NET_C(U5.4, I_VM12) 192 193 TL082_DIP(U6) // Op. Amp. 194 NET_C(U6.8, I_V12) 195 NET_C(U6.4, I_VM12) 196 197 CD4053_DIP(U7) // 3x analog demuxer 198 NET_C(U7.16, I_V5) 199 NET_C(U7.6, GND) // INH 200 NET_C(U7.7, I_V12) // VEE 201 NET_C(U7.8, GND) 202 203 CD4053_DIP(U8) // 3x analog demuxer 204 NET_C(U8.16, I_V5) 205 NET_C(U8.6, GND) // INH 206 NET_C(U8.7, I_V12) // VEE 207 NET_C(U8.8, GND) 208 209 TL082_DIP(U9) // Op. Amp. 210 NET_C(U9.8, I_V12) 211 NET_C(U9.4, I_VM12) 212 213 // TTL_74LS139_DIP(U10) // Dual 1-of-4 Decoder -- not emulated 214 215 // TTL_74LS139_DIP(U11) // Dual 1-of-4 Decoder -- not emulated 216 217 // AD7524_DIP(U12) // DAC -- not emulated 218 // NET_C(U12.3, GND) 219 // NET_C(U12.14, I_V5) 220 221 // AD7524_DIP(U13) // DAC -- not emulated 222 // NET_C(U12.3, GND) 223 // NET_C(U12.14, I_V5) 224 225 // AD7524_DIP(U14) // DAC -- not emulated 226 // NET_C(U12.3, GND) 227 // NET_C(U12.14, I_V5) 228 229 CD4053_DIP(U15) // 3x analog demuxer 230 NET_C(U15.16, I_V5) 231 NET_C(U15.6, GND) // INH 232 NET_C(U15.7, I_V12) // VEE 233 NET_C(U15.8, GND) 234 235 CD4053_DIP(U16) // 3x analog demuxer 236 NET_C(U16.16, I_V5) 237 NET_C(U16.6, GND) // INH 238 NET_C(U16.7, I_V12) // VEE 239 NET_C(U16.8, GND) 240 241 TL082_DIP(U17) // Op. Amp. 242 NET_C(U17.8, I_V12) 243 NET_C(U17.4, I_VM12) 244 245 TL082_DIP(U18) // Op. Amp. 246 NET_C(U18.8, I_V12) 247 NET_C(U18.4, I_VM12) 248 249 TL082_DIP(U19) // Op. Amp. 250 NET_C(U19.8, I_V12) 251 NET_C(U19.4, I_VM12) 252 253 TL082_DIP(U20) // Op. Amp. 254 NET_C(U20.8, I_V12) 255 NET_C(U20.4, I_VM12) 256 257 TL082_DIP(U21) // Op. Amp. 258 NET_C(U21.8, I_V12) 259 NET_C(U21.4, I_VM12) 260 261 TL082_DIP(U22) // Op. Amp. 262 NET_C(U22.8, I_V12) 263 NET_C(U22.4, I_VM12) 264 265 TL082_DIP(U23) // Op. Amp. 266 NET_C(U23.8, I_V12) 267 NET_C(U23.4, I_VM12) 268 269 // AD7524_DIP(U24) // DAC -- not emulated 270 // NET_C(U24.3, GND) 271 // NET_C(U24.14, I_V5) 272 273 // AD7524_DIP(U25) // DAC -- not emulated 274 // NET_C(U25.3, GND) 275 // NET_C(U25.14, I_V5) 276 277 // AD7524_DIP(U26) // DAC -- not emulated 278 // NET_C(U26.3, GND) 279 // NET_C(U26.14, I_V5) 280 281 // AD7524_DIP(U27) // DAC -- not emulated 282 // NET_C(U27.3, GND) 283 // NET_C(U27.14, I_V5) 284 285 // AD7524_DIP(U28) // DAC -- not emulated 286 // NET_C(U28.3, GND) 287 // NET_C(U28.14, I_V5) 288 289 // AD7524_DIP(U29) // DAC -- not emulated 290 // NET_C(U29.3, GND) 291 // NET_C(U29.14, I_V5) 292 293 CD4053_DIP(U30) // 3x analog demuxer 294 NET_C(U30.16, I_V5) 295 NET_C(U30.6, GND) // INH 296 NET_C(U30.7, I_V12) // VEE 297 NET_C(U30.8, GND) 298 299 CD4053_DIP(U31) // 3x analog demuxer 300 NET_C(U31.16, I_V5) 301 NET_C(U31.6, GND) // INH 302 NET_C(U31.7, I_V12) // VEE 303 NET_C(U31.8, GND) 304 305 // TTL_74LS74(U38) // Dual D-Type Positive Edge-Triggered Flip-Flop -- not emulated 306 // NET_C(U38.7, GND) 307 // NET_C(U38.14, I_V5) 308 309 TL081_DIP(U49) // Op. Amp. 310 NET_C(U49.7, I_V12) 311 NET_C(U49.4, I_VM12) 312 313 MM5837_DIP(U60) 314 NET_C(U60.2, I_VM12) 315 NET_C(U60.4, I_V12) 316 #if (UNDERCLOCK_NOISE_GEN) 317 // officially runs at 48-112kHz, but little noticeable difference 318 // in exchange for a big performance boost 319 PARAM(U60.FREQ, 24000) 320 #endif 321 322 // 323 // Sheet 6, noise source 324 // 325 326 NET_C(U60.1, GND) 327 NET_C(U60.3, R65.1) 328 NET_C(R65.2, R64.2, R63.2, R62.2, C53.2, C52.1) 329 NET_C(R64.1, C54.1) 330 NET_C(C54.2, GND) 331 NET_C(R63.1, C55.2, C56.2) 332 NET_C(C55.1, GND) 333 NET_C(C56.1, GND) 334 NET_C(R62.1, C51.2) 335 NET_C(C51.1, GND) 336 NET_C(C53.1, GND) 337 NET_C(C52.2, R61.2, U49.3) 338 NET_C(R61.1, GND) 339 NET_C(U49.2, R60.1, R59.2) 340 NET_C(R60.2, U49.6) 341 NET_C(R59.1, GND) 342 #if (ENABLE_NOISE_FRONTIERS) 343 AFUNC(NOISEFUNC, 1, "A0") 344 NET_C(R60.2, NOISEFUNC.A0) 345 ALIAS(NOISE, NOISEFUNC.Q) 346 #else 347 ALIAS(NOISE, R60.2) 348 #endif 349 350 // 351 // Sheet 7, top-left 352 // 353 354 NET_C(I_U42_OUT0, C14.1) 355 NET_C(C14.2, R20.2, U3.5) 356 NET_C(R20.1, GND) 357 NET_C(U3.6, U3.7) 358 AFUNC(DAC_U12, 2, "A0*A1") 359 NET_C(DAC_U12.A0, U3.7) 360 NET_C(DAC_U12.A1, I_U12_DAC) 361 NET_C(DAC_U12.Q, R12.2) 362 363 NET_C(I_U42_OUT1, C15.1) 364 NET_C(C15.2, R21.2, U4.5) 365 NET_C(R21.1, GND) 366 NET_C(U4.6, U4.7) 367 AFUNC(DAC_U13, 2, "A0*A1") 368 NET_C(DAC_U13.A0, U4.7) 369 NET_C(DAC_U13.A1, I_U13_DAC) 370 NET_C(DAC_U13.Q, R13.2) 371 372 NET_C(I_U42_OUT2, U15.10, U15.9) 373 NET_C(U15.15, U15.14, R32.1) 374 NET_C(U15.1, R33.1) 375 NET_C(U15.12, NOISE) 376 NET_C(U15.13, U16.3) 377 NET_C(U15.11, U16.11, U16.10, U16.9, I_U2B_SEL) 378 NET_C(R33.2, C13.2, R32.2, R31.1, U15.4) 379 NET_C(C13.1, GND) 380 NET_C(U15.3, R30.1) 381 NET_C(R31.2, R30.2, C9.2, U6.3) 382 NET_C(C9.1, GND) 383 NET_C(U6.2, R22.2, R17.1) 384 NET_C(R22.1, GND) 385 NET_C(R17.2, U6.1, U16.14) 386 387 NET_C(U16.13, U16.5, R9.1) 388 NET_C(U16.12, R19.2) 389 NET_C(U16.15, NOISE) 390 NET_C(U16.1, R18.2) 391 NET_C(R18.1, R19.1, U5.6, R15.2) 392 NET_C(U5.5, GND) 393 NET_C(R15.1, U5.7) 394 AFUNC(DAC_U14, 2, "A0*A1") 395 PARAM(DAC_U14.THRESH, 1e-5) 396 NET_C(DAC_U14.A0, U5.7) 397 NET_C(DAC_U14.A1, I_U14_DAC) 398 NET_C(DAC_U14.Q, R14.2) 399 NET_C(R14.1, R13.1, R12.1, U6.6, R16.1) 400 NET_C(U6.5, GND) 401 NET_C(U6.7, R16.2, U16.4) 402 403 // 404 // Sheet 7, bottom-left 405 // 406 407 NET_C(I_U41_OUT0, C34.1) 408 NET_C(C34.2, R41.2, U19.5) 409 NET_C(R41.1, GND) 410 NET_C(U19.6, U19.7) 411 AFUNC(DAC_U26, 2, "A0*A1") 412 NET_C(DAC_U26.A0, U19.7) 413 NET_C(DAC_U26.A1, I_U26_DAC) 414 NET_C(DAC_U26.Q, R39.2) 415 416 NET_C(I_U41_OUT1, C33.1) 417 NET_C(C33.2, R40.2, U18.5) 418 NET_C(R40.1, GND) 419 NET_C(U18.6, U18.7) 420 AFUNC(DAC_U25, 2, "A0*A1") 421 NET_C(DAC_U25.A0, U18.7) 422 NET_C(DAC_U25.A1, I_U25_DAC) 423 NET_C(DAC_U25.Q, R38.2) 424 425 NET_C(I_U41_OUT2, U8.10, U8.9) 426 NET_C(U8.15, U8.14, R25.1) 427 NET_C(U8.1, R24.1) 428 NET_C(U8.12, NOISE) 429 NET_C(U8.13, U7.3) 430 NET_C(U8.11, U7.11, U7.10, U7.9, I_U38B_SEL) 431 NET_C(R24.2, C16.2, R25.2, R29.1, U8.4) 432 NET_C(C16.1, GND) 433 NET_C(U8.3, R23.1) 434 NET_C(R23.2, R29.2, C17.2, U9.3) 435 NET_C(C17.1, GND) 436 NET_C(U9.2, R27.2, R26.1) 437 NET_C(R27.1, GND) 438 NET_C(R26.2, U9.1, U7.14) 439 440 NET_C(U7.13, U7.5, R8.1) 441 NET_C(U7.12, R35.2) 442 NET_C(U7.15, NOISE) 443 NET_C(U7.1, R34.2) 444 NET_C(R34.1, R35.1, U17.6, R36.2) 445 NET_C(U17.5, GND) 446 NET_C(R36.1, U17.7) 447 AFUNC(DAC_U24, 2, "A0*A1") 448 PARAM(DAC_U24.THRESH, 1e-5) 449 NET_C(DAC_U24.A0, U17.7) 450 NET_C(DAC_U24.A1, I_U24_DAC) 451 NET_C(DAC_U24.Q, R37.2) 452 NET_C(R37.1, R38.1, R39.1, U9.6, R28.1) 453 NET_C(U9.5, GND) 454 NET_C(U9.7, R28.2, U7.4) 455 456 // 457 // Sheet 7, top-right 458 // 459 460 NET_C(I_U43_OUT0, C35.1) 461 NET_C(C35.2, R50.2, U20.5) 462 NET_C(R50.1, GND) 463 NET_C(U20.6, U20.7) 464 AFUNC(DAC_U27, 2, "A0*A1") 465 NET_C(DAC_U27.A0, U20.7) 466 NET_C(DAC_U27.A1, I_U27_DAC) 467 NET_C(DAC_U27.Q, R42.2) 468 469 NET_C(I_U43_OUT1, C36.1) 470 NET_C(C36.2, R51.2, U21.5) 471 NET_C(R51.1, GND) 472 NET_C(U21.6, U21.7) 473 AFUNC(DAC_U28, 2, "A0*A1") 474 NET_C(DAC_U28.A0, U21.7) 475 NET_C(DAC_U28.A1, I_U28_DAC) 476 NET_C(DAC_U28.Q, R43.2) 477 478 NET_C(I_U43_OUT2, U30.10, U30.9) 479 NET_C(U30.15, U30.14, R55.1) 480 NET_C(U30.1, R56.1) 481 NET_C(U30.12, NOISE) 482 NET_C(U30.13, U31.3) 483 NET_C(U30.11, U31.11, U31.10, U31.9, I_U2A_SEL) 484 NET_C(R54.2, C32.2, R55.2, R56.2, U30.4) 485 NET_C(C32.1, GND) 486 NET_C(U30.3, R53.1) 487 NET_C(R53.2, R54.1, C25.2, U23.3) 488 NET_C(C25.1, GND) 489 NET_C(U23.2, R52.2, R47.1) 490 NET_C(R52.1, GND) 491 NET_C(R47.2, U23.1, U31.14) 492 493 NET_C(U31.13, U31.5, R10.1) 494 NET_C(U31.12, R49.2) 495 NET_C(U31.15, NOISE) 496 NET_C(U31.1, R48.2) 497 NET_C(R48.1, R49.1, U22.6, R45.2) 498 NET_C(U22.5, GND) 499 NET_C(R45.1, U22.7) 500 AFUNC(DAC_U29, 2, "A0*A1") 501 PARAM(DAC_U29.THRESH, 1e-5) 502 NET_C(DAC_U29.A0, U22.7) 503 NET_C(DAC_U29.A1, I_U29_DAC) 504 NET_C(DAC_U29.Q, R44.2) 505 NET_C(R42.1, R43.1, R44.1, U23.6, R46.1) 506 NET_C(U23.5, GND) 507 NET_C(U23.7, R46.2, U31.4) 508 509 #if (USE_AFUNC_MIXING) 510 // This prevents the individual sound nets from combining 511 // at the mixing resistors. 512 AFUNC(MIXFUNC, 4, "(A0+A1+A2+A3)/4") 513 NET_C(MIXFUNC.A0, R7.1) 514 NET_C(MIXFUNC.A1, R10.2) 515 NET_C(MIXFUNC.A2, R9.2) 516 NET_C(MIXFUNC.A3, R8.2) 517 ALIAS(OUTPUT, MIXFUNC.Q) 518 #else 519 NET_C(R7.1, R10.2, R9.2, R8.2) 520 ALIAS(OUTPUT, R8.2) 521 #endif 522 523 // 524 // Unconnected inputs 525 // 526 NET_C(GND, R7.2) 527 NET_C(GND, U3.2, U3.3, U4.2, U4.3, U5.2, U5.3) 528 NET_C(GND, U17.2, U17.3, U18.2, U18.3, U19.2, U19.3) 529 NET_C(GND, U20.2, U20.3, U21.2, U21.3, U22.2, U22.3) 530 531 // unconnected inputs to analog switch -- what's the right approach? 532 NET_C(GND, U8.2, U8.5, U7.2) 533 NET_C(GND, U15.2, U15.5, U16.2) 534 NET_C(GND, U30.2, U30.5, U31.2) 535 /* 536 OPTIMIZE_FRONTIER(R48.1, RES_M(1), 50) 537 OPTIMIZE_FRONTIER(R49.1, RES_M(1), 50) 538 OPTIMIZE_FRONTIER(R18.1, RES_M(1), 50) 539 OPTIMIZE_FRONTIER(R19.1, RES_M(1), 50) 540 OPTIMIZE_FRONTIER(R34.1, RES_M(1), 50) 541 OPTIMIZE_FRONTIER(R35.1, RES_M(1), 50) 542 */ 543 544 NETLIST_END() 545