1 // license:CC0
2 // copyright-holders:Aaron Giles
3 
4 //
5 // Netlist for Sundance
6 //
7 // Derived from the schematics in the Sundance manual.
8 //
9 // Known problems/issues:
10 //
11 //    * The "whoosh" sound is close to correct, though there may
12 //       be some missing harmonics in the HLE.
13 //
14 //    * The "wideband noise generator" is simulated with a generic
15 //       noise source. This seems to work fine and doesn't sound
16 //       too different from recordings.
17 //
18 //    * The pitch of the pings and bongs seems a little lower than
19 //       some recordings, though it's hard to say if this is due
20 //       to aging as the frequencies are controlled by 555 timers
21 //       and RC networks.
22 //
23 
24 #include "netlist/devices/net_lib.h"
25 #include "nl_cinemat_common.h"
26 
27 
28 //
29 // Optimizations
30 //
31 
32 #define HLE_NOISE_GEN (1)
33 #define HLE_WHOOSH_MOD (1)
34 
35 
36 //
37 // Main netlist
38 //
39 
40 NETLIST_START(sundance)
41 
42 	SOLVER(Solver, 1000)
43 	PARAM(Solver.DYNAMIC_TS, 1)
44 	PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
45 
46 	TTL_INPUT(I_OUT_0, 1)       // active low
47 	TTL_INPUT(I_OUT_1, 1)       // active low
48 	TTL_INPUT(I_OUT_2, 1)       // active low
49 	TTL_INPUT(I_OUT_3, 1)       // active low
50 	TTL_INPUT(I_OUT_4, 1)       // active low
51 	TTL_INPUT(I_OUT_7, 1)       // active low
52 
53 	NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND, I_OUT_7.GND)
54 	NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC, I_OUT_7.VCC)
55 
56 	CINEMAT_LOCAL_MODELS
57 
58 	ANALOG_INPUT(I_V5, 5)
59 	ANALOG_INPUT(I_V15, 15)
60 	ANALOG_INPUT(I_VM15, -15)
61 
62 	RES(R1, RES_M(1))
63 	RES(R2, 470)
64 	RES(R3, 470)
65 	RES(R4, RES_K(470))
66 	RES(R5, 100)
67 	RES(R6, RES_K(470))
68 	RES(R7, RES_K(10))
69 	RES(R8, RES_M(1))
70 	RES(R9, RES_K(10))
71 	RES(R10, RES_K(47))
72 	RES(R11, RES_K(100))
73 	RES(R12, RES_K(220))
74 	RES(R13, RES_M(3.3))
75 	RES(R14, RES_K(390))
76 	RES(R15, RES_K(56))
77 	RES(R16, RES_M(1))
78 	RES(R17, RES_K(100))
79 	RES(R18, RES_K(10))
80 	RES(R19, RES_K(3.3))
81 	RES(R20, RES_K(100))
82 	RES(R21, RES_K(47))
83 	RES(R22, RES_K(47))
84 	RES(R23, RES_K(750))
85 	RES(R24, 470)
86 	RES(R25, RES_K(220))
87 	RES(R26, 330)
88 	RES(R27, RES_K(10))
89 	RES(R28, RES_K(47))
90 	RES(R29, RES_K(330))
91 	RES(R30, RES_K(30))
92 	RES(R31, RES_K(10))
93 	RES(R32, RES_K(2.7))
94 	RES(R33, RES_K(2.7))
95 	RES(R34, RES_K(100))
96 	RES(R35, RES_K(10))
97 	RES(R36, RES_K(4.7))
98 	RES(R37, RES_K(8.2))
99 	RES(R38, RES_K(120))
100 	RES(R39, RES_M(3.3))
101 	RES(R40, RES_K(39))
102 	RES(R41, RES_K(2.7))
103 	RES(R42, RES_K(2.7))
104 	RES(R43, RES_K(47))
105 	RES(R44, RES_K(8.2))
106 	RES(R45, RES_K(2.7))
107 	RES(R46, RES_K(2.7))
108 	RES(R47, RES_M(10))
109 	RES(R48, RES_M(10))
110 	RES(R49, RES_K(1))
111 	RES(R50, 330)
112 	RES(R51, RES_K(510))
113 	RES(R52, RES_K(15))
114 	RES(R53, RES_K(20))
115 	RES(R54, RES_K(47))
116 	RES(R55, RES_K(2.7))
117 	RES(R56, RES_K(2.7))
118 	RES(R57, 330)
119 	RES(R58, RES_K(390))
120 	RES(R59, RES_K(15))
121 	RES(R60, RES_K(24))
122 	RES(R61, RES_K(56))
123 	RES(R62, RES_K(2.7))
124 	RES(R63, RES_K(2.7))
125 	RES(R64, 470)
126 //  RES(R65, 150)       -- part of final amp (not emulated)
127 //  RES(R66, RES_K(22)) -- part of final amp (not emulated)
128 //  RES(R67, 150)       -- part of final amp (not emulated)
129 	RES(R68, 330)
130 	RES(R69, RES_K(390))
131 	RES(R70, RES_K(15))
132 	RES(R71, RES_K(30))
133 	RES(R72, RES_K(68))
134 	RES(R73, RES_K(2.7))
135 	RES(R74, RES_K(2.7))
136 //  RES(R75, RES_K(10)) -- part of final amp (not emulated)
137 //  POT(R76, RES_K(100)) -- part of final amp (not emulated)
138 //  PARAM(R76.DIAL, 0.500000) -- part of final amp (not emulated)
139 	RES(R77, 330)
140 	RES(R78, RES_K(220))
141 
142 	CAP(C1, CAP_U(0.1))
143 	CAP(C2, CAP_U(100))
144 	CAP(C3, CAP_U(0.01))
145 	CAP(C4, CAP_U(0.1))
146 	CAP(C5, CAP_U(100))
147 	CAP(C6, CAP_U(1))
148 	CAP(C7, CAP_U(1))
149 	CAP(C8, CAP_U(10))
150 	CAP(C9, CAP_U(0.05))
151 	CAP(C10, CAP_U(0.1))
152 	CAP(C11, CAP_U(0.01))
153 	CAP(C12, CAP_U(0.1))
154 	CAP(C13, CAP_U(0.001))
155 	CAP(C14, CAP_U(0.005))
156 	CAP(C15, CAP_U(10))
157 //  CAP(C16, CAP_U(3.3)) -- not needed
158 //  CAP(C17, CAP_U(3.3)) -- not needed
159 //  CAP(C18, CAP_U(3.3)) -- not needed
160 //  CAP(C19, CAP_U(3.3)) -- not needed
161 //  CAP(C20, CAP_U(3.3)) -- not needed
162 	CAP(C21, CAP_U(0.1))
163 	CAP(C22, CAP_U(0.005))
164 	CAP(C23, CAP_U(0.1))
165 	CAP(C24, CAP_U(0.1))
166 	CAP(C25, CAP_U(0.1))
167 	CAP(C26, CAP_U(0.01))
168 	CAP(C27, CAP_U(0.1))
169 	CAP(C28, CAP_U(0.15))
170 	CAP(C29, CAP_U(0.1))
171 	CAP(C30, CAP_U(0.01))
172 	CAP(C31, CAP_U(0.1))
173 //  CAP(C32, CAP_P(470)) -- part of final amp (not emulated)
174 //  CAP(C33, CAP_P(470)) -- part of final amp (not emulated)
175 //  CAP(C34, CAP_P(470)) -- part of final amp (not emulated)
176 	CAP(C35, CAP_U(0.15))
177 	CAP(C36, CAP_U(0.1))
178 	CAP(C37, CAP_U(0.01))
179 	CAP(C38, CAP_U(0.1))
180 	CAP(C39, CAP_U(1))
181 
182 	D_1N5240(D1)
183 	D_1N914(D2)
184 	D_1N914(D3)
185 
186 	Q_2N3904(Q1)            // NPN
187 	Q_2N3904(Q2)            // NPN
188 	Q_2N3906(Q3)            // PNP
189 	Q_2N3906(Q4)            // PNP
190 	Q_2N3906(Q5)            // PNP
191 	Q_2N3906(Q6)            // PNP
192 //  Q_2N6292(Q7)            // NPN -- part of final amp (not emulated)
193 //  Q_2N6107(Q9)            // PNP -- part of final amp (not emulated)
194 	Q_2N3906(Q8)            // PNP
195 	Q_2N3906(Q10)           // PNP
196 
197 	TL081_DIP(IC1)          // Op. Amp.
198 //  NET_C(IC1.7, I_V15)     // (indirectly via R5)
199 	NET_C(IC1.4, I_VM15)
200 
201 	TL081_DIP(IC2)          // Op. Amp.
202 	NET_C(IC2.7, I_V15)
203 	NET_C(IC2.4, I_VM15)
204 
205 	TL081_DIP(IC3)          // Op. Amp.
206 	NET_C(IC3.7, I_V15)
207 	NET_C(IC3.4, I_VM15)
208 
209 	LM3900_DIP(IC4)
210 	NET_C(IC4.7, GND)
211 	NET_C(IC4.14, I_V15)
212 
213 //  TTL_7815_DIP(IC5)       // +15V Regulator -- not needed
214 //  TTL_7915_DIP(IC6)       // -15V Regulator -- not needed
215 
216 	LM555_DIP(IC7)
217 
218 	TL081_DIP(IC8)          // Op. Amp.
219 	NET_C(IC8.7, I_V15)
220 	NET_C(IC8.4, I_VM15)
221 
222 	CA3080_DIP(IC9)
223 	NET_C(IC9.7, I_V15)
224 	NET_C(IC9.4, I_VM15)
225 
226 	CA3080_DIP(IC10)
227 	NET_C(IC10.7, I_V15)
228 	NET_C(IC10.4, I_VM15)
229 
230 	LM555_DIP(IC11)
231 
232 	CA3080_DIP(IC12)
233 	NET_C(IC12.7, I_V15)
234 	NET_C(IC12.4, I_VM15)
235 
236 	TTL_74LS125_DIP(IC13)   // Quad 3-state buffer
237 	NET_C(IC13.7, GND)
238 	NET_C(IC13.14, I_V5)
239 
240 	LM555_DIP(IC14)
241 
242 	LM555_DIP(IC15)
243 
244 	LM555_DIP(IC16)
245 
246 	CA3080_DIP(IC17)
247 	NET_C(IC17.7, I_V15)
248 	NET_C(IC17.4, I_VM15)
249 
250 	CA3080_DIP(IC18)
251 	NET_C(IC18.7, I_V15)
252 	NET_C(IC18.4, I_VM15)
253 
254 	CA3080_DIP(IC19)
255 	NET_C(IC19.7, I_V15)
256 	NET_C(IC19.4, I_VM15)
257 
258 	TL081_DIP(IC20)         // Op. Amp.
259 	NET_C(IC20.7, I_V15)
260 	NET_C(IC20.4, I_VM15)
261 
262 #if (HLE_NOISE_GEN)
263 	//
264 	// The "wideband noise gen" relies on properties
265 	// of the components to create noise. Not only
266 	// does this simulate poorly, but it would be too
267 	// slow for realtime, so HLE it with some quality
268 	// noise.
269 	//
270 	// Note that Tail Gunner has the exact same
271 	// circuit.
272 	//
273 	CLOCK(NOISE_CLOCK, 10000)
274 	NET_C(NOISE_CLOCK.GND, GND)
275 	NET_C(NOISE_CLOCK.VCC, I_V5)
276 
277 	SYS_NOISE_MT_U(NOISE, 3)
278 	NET_C(NOISE.I, NOISE_CLOCK.Q)
279 	NET_C(NOISE.1, GND)
280 	NET_C(NOISE.2, R27.2, R36.1, R43.1)
281 
282 	NET_C(GND, C1.1, C1.2, C2.1, C2.2, C3.1, C3.2, C4.1, C4.2, C5.1, C5.2)
283 	NET_C(GND, D1.A, D1.K, D2.A, D2.K, D3.A, D3.K)
284 	NET_C(GND, R1.1, R1.2, R3.1, R3.2, R4.1, R4.2, R5.1, R5.2, R6.1, R6.2, R7.1, R7.2, R8.1, R8.2, R9.1, R9.2, R10.1, R10.2)
285 	NET_C(GND, IC1.2, IC1.3, IC1.7, IC2.2, IC2.3, IC3.2, IC3.3)
286 #else
287 	NET_C(C1.1, C2.2, R1.1, R3.1, C5.2, GND)
288 	NET_C(C1.2, C2.1, D1.K, R5.1, IC1.7)
289 	NET_C(R1.2, C3.1, D1.A)
290 	NET_C(R3.2, R4.1, C4.1)
291 	NET_C(R4.2, C3.2, IC1.3)
292 	NET_C(C4.2, IC1.2, R6.1)
293 	NET_C(R6.2, IC1.6, R7.1)
294 	NET_C(R5.2, C5.1, I_V15)
295 	NET_C(R7.2, IC2.2, R8.1, D3.A, D2.K)
296 	NET_C(IC2.3, GND)
297 	NET_C(IC2.6, R8.2, D3.K, D2.A, R9.1)
298 	NET_C(R9.2, R10.1, IC3.2)
299 	NET_C(IC3.3, GND)
300 	NET_C(IC3.6, R10.2, R43.1, R27.2, R36.1)
301 #endif
302 
303 	NET_C(I_OUT_1, R2.1, IC11.2)
304 	NET_C(R2.2, I_V5)
305 	NET_C(IC11.8, IC11.4, I_V5)     // -- IC11.4 not documented
306 	NET_C(IC11.3, R35.1)
307 	NET_C(IC11.1, GND)
308 	NET_C(R34.1, I_V5)
309 	NET_C(R34.2, IC11.6, IC11.7, C13.2)
310 	NET_C(C13.1, GND)
311 
312 	NET_C(R35.2, R17.1, IC4.13)
313 	NET_C(R11.1, R14.1, R17.2, IC4.9)
314 	NET_C(R11.2, IC4.3)
315 	NET_C(R12.1, IC4.2)
316 	NET_C(R12.2, R16.2, R18.2, Q2.C, R22.2, I_V15)
317 	NET_C(IC4.4, R13.1)
318 	NET_C(R13.2, C6.2, IC4.6)
319 	NET_C(R14.2, IC4.1)
320 	NET_C(IC4.5, C6.1, R15.1, Q1.B)
321 	NET_C(R15.2, R16.1, IC4.8)
322 
323 	NET_C(Q1.C, R18.1, Q2.B)
324 	NET_C(Q1.E, R19.2)
325 	NET_C(R19.1, GND)
326 	NET_C(Q2.E, Q3.B, R20.2)
327 	NET_C(R20.1, I_VM15)
328 	NET_C(Q3.E, R21.1)
329 	NET_C(R21.2, R22.1, R23.2)
330 	NET_C(R23.1, GND)
331 	NET_C(Q3.C, IC12.5)
332 
333 	NET_C(R36.2, C14.1)
334 	NET_C(C14.2, R37.2, R40.2, C15.1)
335 	NET_C(R37.1, GND)
336 
337 #if (HLE_WHOOSH_MOD)
338 	//
339 	// The "whoosh" sound has a noise modulator that is a steady
340 	// clock ~64.5Hz, generated by an LM3900 and an RC network.
341 	// When run at 48kHz, this network does not clock at the
342 	// correct frequency, so HLE this with a basic clock.
343 	//
344 	CLOCK(WHOOSH_CLK, 64.5)
345 	NET_C(WHOOSH_CLK.GND, GND)
346 	NET_C(WHOOSH_CLK.VCC, I_V15)
347 	NET_C(WHOOSH_CLK.Q, R40.1)
348 	NET_C(GND, C21.1, C21.2, R38.1, R38.2, R39.1, R39.2, R47.1, R47.2, R48.1, R48.2, IC4.11, IC4.12)
349 #else
350 	NET_C(R40.1, R38.2, IC4.10, R48.2)
351 	NET_C(C21.2, R38.1, R39.2)
352 	NET_C(C21.1, GND)
353 	NET_C(R39.1, IC4.11)
354 	NET_C(I_V15, R47.1)
355 	NET_C(R47.2, IC4.12, R48.1)
356 #endif
357 
358 	NET_C(C15.2, R41.2, IC12.2)
359 	NET_C(R41.1, R42.1, GND)
360 	NET_C(R42.2, IC12.3)
361 	NET_C(IC12.6, IC10.6, IC9.6, IC17.6, IC18.6, IC19.6, R64.1)
362 
363 	NET_C(I_OUT_2, R24.1, IC7.2)
364 	NET_C(R25.1, IC7.6, IC7.7, C7.1)
365 	NET_C(C7.2, IC7.1, GND)
366 	NET_C(R24.2, I_V5)
367 	NET_C(R25.2, IC7.8, IC7.4, I_V5)    // IC7.4 -- not documented
368 	NET_C(IC7.3, Q4.E)
369 	NET_C(Q4.B, R26.2)
370 	NET_C(R26.1, GND)
371 	NET_C(Q4.C, C8.1, R30.1)
372 	NET_C(C8.2, I_VM15)
373 	NET_C(R30.2, IC10.5)
374 
375 	NET_C(R27.1, C9.2, R28.1)
376 	NET_C(C9.1, GND)
377 	NET_C(R28.2, C10.1)
378 	NET_C(C10.2, C11.1, R29.1, IC8.2)
379 	NET_C(IC8.3, GND)
380 	NET_C(IC8.6, C11.2, R29.2, R31.1)
381 	NET_C(R31.2, C12.1)
382 	NET_C(C12.2, R32.2, IC10.2)
383 	NET_C(R32.1, R33.1, GND)
384 	NET_C(R33.2, IC10.3)
385 
386 	NET_C(R43.2, C22.1)
387 	NET_C(C22.2, R44.2, C23.1)
388 	NET_C(R44.1, GND)
389 	NET_C(C23.2, R45.2, IC9.2)
390 	NET_C(R45.1, GND)
391 	NET_C(R46.1, GND)
392 	NET_C(R46.2, IC9.3)
393 
394 	NET_C(I_OUT_7, IC13.1)
395 	NET_C(I_V5, R49.2)
396 	NET_C(R49.1, IC13.2, IC13.5, IC13.9, IC13.12)
397 	NET_C(IC13.3, Q5.E)
398 	NET_C(Q5.B, R50.2)
399 	NET_C(R50.1, GND)
400 	NET_C(Q5.C, C24.2, R51.1)
401 	NET_C(C24.1, I_VM15)
402 	NET_C(R51.2, IC9.5)
403 
404 	NET_C(I_OUT_3, IC13.4)
405 	NET_C(IC13.6, Q6.E)
406 	NET_C(Q6.B, R57.2)
407 	NET_C(R57.1, GND)
408 	NET_C(Q6.C, C28.1, R58.1)
409 	NET_C(C28.2, I_VM15)
410 	NET_C(R58.2, IC17.5)
411 	NET_C(IC14.4, IC14.8, I_V5)
412 	NET_C(IC14.3, R52.1)
413 	NET_C(R52.2, C25.1)
414 	NET_C(C25.2, R55.2, IC17.2)
415 	NET_C(IC14.2, IC14.6, R54.1, R53.2, C27.2)
416 	NET_C(R54.2, I_V5)
417 	NET_C(C27.1, GND)
418 	NET_C(IC14.7, R53.1)
419 	NET_C(IC14.5, C26.2)
420 	NET_C(C26.1, GND)
421 	NET_C(IC14.1, GND)
422 	NET_C(R55.1, GND)
423 	NET_C(R56.1, GND)
424 	NET_C(R56.2, IC17.3)
425 
426 	NET_C(I_OUT_4, IC13.10)
427 	NET_C(IC13.8, Q8.E)
428 	NET_C(Q8.B, R68.2)
429 	NET_C(R68.1, GND)
430 	NET_C(Q8.C, C35.1, R69.1)
431 	NET_C(C35.2, I_VM15)
432 	NET_C(R69.2, IC18.5)
433 	NET_C(IC15.4, IC15.8, I_V5)
434 	NET_C(IC15.3, R59.1)
435 	NET_C(R59.2, C29.1)
436 	NET_C(C29.2, R62.2, IC18.2)
437 	NET_C(IC15.2, IC15.6, R61.1, R60.2, C31.2)
438 	NET_C(R61.2, I_V5)
439 	NET_C(C31.1, GND)
440 	NET_C(IC15.7, R60.1)
441 	NET_C(IC15.5, C30.2)
442 	NET_C(C30.1, GND)
443 	NET_C(IC15.1, GND)
444 	NET_C(R62.1, GND)
445 	NET_C(R63.1, GND)
446 	NET_C(R63.2, IC18.3)
447 
448 	NET_C(I_OUT_0, IC13.13)
449 	NET_C(IC13.11, Q10.E)
450 	NET_C(Q10.B, R77.2)
451 	NET_C(R77.1, GND)
452 	NET_C(Q10.C, C39.1, R78.1)
453 	NET_C(C39.2, I_VM15)
454 	NET_C(R78.2, IC19.5)
455 	NET_C(IC16.4, IC16.8, I_V5)
456 	NET_C(IC16.3, R70.1)
457 	NET_C(R70.2, C36.1)
458 	NET_C(C36.2, R73.2, IC19.2)
459 	NET_C(IC16.2, IC16.6, R72.1, R71.2, C38.2)
460 	NET_C(R72.2, I_V5)
461 	NET_C(C38.1, GND)
462 	NET_C(IC16.7, R71.1)
463 	NET_C(IC16.5, C37.2)
464 	NET_C(C37.1, GND)
465 	NET_C(IC16.1, GND)
466 	NET_C(R73.1, GND)
467 	NET_C(R74.1, GND)
468 	NET_C(R74.2, IC19.3)
469 
470 	ALIAS(OUTPUT, R64.1)
471 	NET_C(R64.2, GND)
472 
473 
474 	//
475 	// Unconnected pins
476 	//
477 
478 	NET_C(GND, IC20.2, IC20.3)  // part of final amp
479 
480 //  NET_C(GND, IC6.3, IC28.8, IC28.9, IC28.10, IC28.11)
481 
482 NETLIST_END()
483