mr/nl_drlibling.cpp: Fixed the PARATA netlist and optimized performance (#12180)

* Fixed the PARATA netlist and removed the SOUND_INCOMPLETE tag
* Putting stop_palla and calcio netlists behind FRONTIER
* Put all sublists behind a temp FRONTIER
This commit is contained in:
Paperinik 2024-05-03 14:12:00 +02:00 committed by GitHub
parent 1c5dd104c1
commit 0fb47e8baa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 5313 additions and 5404 deletions

File diff suppressed because it is too large Load Diff

0
src/lib/netlist/nl_create_mame_solvers.sh Normal file → Executable file
View File

View File

@ -628,8 +628,8 @@ ROM_END
*
*************************************/
GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
GAME( 1983, driblinga, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
GAME( 1983, driblingo, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
GAME( 1983, driblingam, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Automave license)", "Dribbling (Automave)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1983, driblingvm, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "bootleg (Videomac)", "Dribbling (Videomac bootleg, Brazil)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 1)", MACHINE_SUPPORTS_SAVE)
GAME( 1983, driblinga, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 2)", MACHINE_SUPPORTS_SAVE)
GAME( 1983, driblingo, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", MACHINE_SUPPORTS_SAVE)
GAME( 1983, driblingam, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Automave license)", "Dribbling (Automave)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, driblingvm, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "bootleg (Videomac)", "Dribbling (Videomac bootleg, Brazil)", MACHINE_SUPPORTS_SAVE)

View File

@ -3,10 +3,6 @@
// Netlist for Model Racing Dribbling: derived from the schematics in the Dribbling manual, located here:
// https://archive.org/details/ArcadeGameManualDribbling
// Known issues:
// In the PARATA netlist the JFET emulation based on MOSFET doesn't work well. The whole netlist has been
// replaced with a quite similar one, at least to my ears. The real netlist is commented behind the FAKE_PARATA
// define.
#include "netlist/devices/net_lib.h"
@ -16,7 +12,10 @@
#define TTL_74LS164_DIP TTL_74164_DIP
#define ATTENUATE_FOLLA 200
#define USE_SIMPLIFIED_LM339
#define USE_FAKE_PARATA
// By using FRONTIER, the second JFET is not necessary, but we need to drop the voltage by ~1.5V
// using two diodes. Performance increase is 60% with an undistinguishable difference in the output.
// Two JFETs is accurate to the hardware, while one JFET plut two diodes still generates correct sound and runs faster.
#define REPLACE_PARATA_JFET_WITH_DIODES
// The schematic incorrectly labels two JFETS in the PARATA circuit as 2N3812. They're actually 2N3819.
// JFET transistors not supported, but this should do the trick; but not for this game.
@ -103,11 +102,11 @@ static NETLIST_START(LM339)
// CALCIO_A and CALCIO_B differ only for the parameters of 3 capacitors.
static NETLIST_START(calcio)
{
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(GND, 0)
DEFPARAM(CAP1, 33)
DEFPARAM(CAP2, 68)
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V6, 6)
ANALOG_INPUT(I_V12, 12)
QBJT_EB(Q8, "BC239C")
QBJT_EB(Q9, "BC239C")
ALIAS(INPUT, R45.2)
@ -131,7 +130,7 @@ static NETLIST_START(calcio)
CAP(C33, CAP_N($(@.CAP1)))
CAP(C34, CAP_N($(@.CAP1)))
NET_C(INPUT, R46.1)
ALIAS(GND, R45.1)
NET_C(GND, R45.1)
NET_C(R46.2, C33.2, C34.1)
NET_C(C33.1, R49.1, C29.1)
NET_C(C34.2, R50.2, R51.1, Q8.B)
@ -146,17 +145,23 @@ static NETLIST_START(calcio)
NET_C(R48.2, I_V5)
NET_C(R56.1, GND)
NET_C(Q9.C, R55.1)
ALIAS(OUTPUT, Q9.C)
NET_C(R55.2, I_V5)
NET_C(Q9.E, R57.2, C32.2)
NET_C(R57.1, GND)
NET_C(C32.1, R58.2)
NET_C(R58.1, GND)
RES(R0, 1)
NET_C(R0.1, Q9.C)
ALIAS(OUTPUT, R0.2)
OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1)
}
static NETLIST_START(stop_palla)
{
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(GND, 0)
QBJT_EB(Q1, "BC309")
RES(R5, RES_K(1))
RES(R6, RES_K(160))
@ -167,7 +172,7 @@ static NETLIST_START(stop_palla)
CAP(C6, CAP_U(1))
DIODE(D1, "1N914")
SUBMODEL(LM339, IC_B9)
ALIAS(GND, IC_B9.4)
NET_C(GND, IC_B9.4)
ALIAS(INPUT, R5.1)
NET_C(R5.2, Q1.B)
NET_C(Q1.E, I_V5)
@ -180,59 +185,32 @@ static NETLIST_START(stop_palla)
NET_C(C6.1, GND)
NET_C(R9.2, I_V5)
NET_C(IC_B9.3, I_V5)
RES(R0, 1)
NET_C(R0.1, IC_B9.5)
ALIAS(OUTPUT, R0.2)
ALIAS(OUTPUT, IC_B9.5)
OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1)
}
// The actual PARATA schematics requires JFETs (2N3819) and using 'MOSFET(Q21, "NMOS(VTO=-1.0)")' as proposed in the FAQ
// doesn't work. So using the same circuit STOP_PALLA with different values to emulate the sound which has a higher pitch.
#ifdef USE_FAKE_PARATA
static NETLIST_START(parata)
{
ANALOG_INPUT(I_V5, 5)
QBJT_EB(Q1, "BC309")
RES(R5, RES_K(1))
RES(R6, RES_K(160))
RES(R7, RES_K(75))
RES(R8, RES_K(3.75))
RES(R9, RES_K(2.2))
CAP(C5, CAP_U(1))
CAP(C6, CAP_U(1))
DIODE(D1, "1N914")
SUBMODEL(LM339, IC_B9)
ALIAS(GND, IC_B9.4)
ALIAS(INPUT, R5.1)
NET_C(R5.2, Q1.B)
NET_C(Q1.E, I_V5)
NET_C(Q1.C, C5.2, R7.2, R6.1)
NET_C(C5.1, GND)
NET_C(R7.1, GND)
NET_C(R6.2, IC_B9.1, D1.A)
NET_C(D1.K, R9.1, IC_B9.5, R8.2)
NET_C(IC_B9.2, C6.2, R8.1)
NET_C(C6.1, GND)
NET_C(R9.2, I_V5)
NET_C(IC_B9.3, I_V5)
ANALOG_INPUT(GND, 0)
ALIAS(OUTPUT, IC_B9.5)
}
#else // USE_FAKE_PARATA
static NETLIST_START(parata)
{
ANALOG_INPUT(I_V5, 5)
QBJT_EB(Q1, "BC309")
Q_2N3819(Q2)
Q_2N3819(Q3)
RES(R5, RES_K(1))
RES(R6, RES_K(150))
RES(R7, RES_K(220))
RES(R8, RES_K(1))
RES(R9, RES_K(2.2))
CAP(C5, CAP_U(2.2))
CAP(C6, CAP_U(1))
DIODE(D1, "1N914")
DIODE(D2, "1N914")
DIODE(D3, "1N914")
SUBMODEL(LM339, IC_B9)
ALIAS(GND, IC_B9.4)
NET_C(GND, IC_B9.4)
ALIAS(INPUT, R5.1)
NET_C(R5.2, Q1.B)
NET_C(Q1.E, I_V5)
@ -241,35 +219,57 @@ static NETLIST_START(parata)
NET_C(R7.1, GND)
NET_C(R6.2, IC_B9.1, D1.A)
NET_C(D1.K, R9.1, IC_B9.5, Q2.G, Q2.S)
NET_C(IC_B9.2, C6.2, Q2.D, Q3.G)
NET_C(IC_B9.2, C6.2, Q2.D)
NET_C(C6.1, GND)
NET_C(R9.2, Q3.D, I_V5)
NET_C(R9.2, I_V5)
NET_C(IC_B9.3, I_V5)
NET_C(Q3.D, R8.2)
NET_C(R8.1, GND)
NET_C(D2.A, Q2.G)
NET_C(D2.K, Q2.S)
#ifdef REPLACE_PARATA_JFET_WITH_DIODES
DIODE(D4, "1N914")
NET_C(Q2.D, D3.A)
NET_C(D3.K, D4.A)
RES(R0, 1)
NET_C(R0.1, D4.K)
ALIAS(OUTPUT, R0.2)
OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1)
#elif
NET_C(Q2.D, Q3.G)
NET_C(Q3.D, I_V5)
NET_C(D3.A, Q3.G)
NET_C(D3.K, Q3.S)
ALIAS(OUTPUT, Q3.S)
OPTIMIZE_FRONTIER(Q3.S, RES_K(100), 1)
#endif
}
#endif // USE_FAKE_PARATA
// Sallen-Key approximation of a third-order Butterworth filter with 15KHz cutoff frequency.
// Values computed using http://sim.okawa-denshi.jp/en/Sallen3tool.php .
// This is because the tone generator outputs a 40KHz square wave at idle, and this is to avoid aliasing when outputing at 48KHz.
// Cutoff frequence is set to 12Khz because cleaning the output more by using FRONTIER shows there is a bit of noise left.
static NETLIST_START(output_filter)
{
OPAMP(AMP, "OPAMP(TYPE=1 FPF=5 RI=1M RO=50 UGF=1M SLEW=1M VLH=0.5 VLL=0.03 DAB=0.0015)")
RES(R1, RES_K(11))
RES(R2, RES_K(110))
RES(R3, RES_K(33))
CAP(C1, CAP_U(0.001))
CAP(C2, CAP_P(470))
CAP(C3, CAP_P(68))
ANALOG_INPUT(VPLUS, 12)
ANALOG_INPUT(VMINUS, -12)
ANALOG_INPUT(GND, 0)
OPAMP(AMP, "OPAMP(TYPE=1 FPF=5 RI=1M RO=50 UGF=1M SLEW=1M VLH=0.5 VLL=0.03 DAB=0.0015)")
RES(R1, RES_K(9.1))
RES(R2, RES_K(91))
RES(R3, RES_K(27))
CAP(C1, CAP_U(0.0015))
CAP(C2, CAP_P(680))
CAP(C3, CAP_P(100))
NET_C(VPLUS, AMP.VCC)
NET_C(VMINUS, AMP.GND)
ALIAS(INPUT, R1.1)
ALIAS(OUTPUT, AMP.OUT)
ALIAS(GND, C1.2)
NET_C(GND, C1.2)
NET_C(GND, C3.2)
NET_C(R1.2, R2.1, C1.1)
@ -278,80 +278,35 @@ static NETLIST_START(output_filter)
NET_C(OUTPUT, C2.2, AMP.MINUS)
}
NETLIST_START(dribling)
static NETLIST_START(inverter)
{
NET_MODEL("BC239C NPN(IS=1.5813E-15 ISE=4.637E-14 ISC=8.0864E-18 XTI=3 BF=113.32 BR=86.718 IKF=1.4907 IKR=0.03360 XTB=0 VAF=12.331 VAR=31.901 VJE=0.71518 VJC=1.1381 RE=0.22081 RC=0.01636 RB=1.0078 CJE=3.3904E-14 CJC=2.9774E-12 XCJC=0.02899 FC=0.99886 NF=1.0653 NR=1.8047 NE=1.4254 NC=1.8821 MJE=0.36824 MJC=0.31461 TF=2.0691E-11 TR=1.0033E-09 EG=1.11 IRB=0.00083992 RBM=0 XTF=0.31338 VTF=0.10174 ITF=0.0045579 PTF=0 CJS=0 MJS=0 VJS=0.75)") // )")
NET_MODEL("BC309 PNP(IS=1.0366E-15 ISE=1.6295E-14 ISC=9.4971E-17 XTI=3 BF=80 BR=16.116 IKF=0.47497 IKR=0.012081 XTB=0 VAF=8.486 VAR=9.5149 VJE=0.84456 VJC=1.0282 RE=1.9597 RC=1.1393 RB=3.2133 CJE=2.0636E-14 CJC=2.6904E-12 XCJC=0.075977 FC=0.54298 NF=1.03136 NR=1.2907 NE=1.3702 NC=1.038 MJE=0.68352 MJC=0.5401 TF=5.4303E-11 TR=3.4233E-10 EG=1.11 IRB=0.00046855 RBM=2.0822 XTF=0.27447 VTF=0.19311 ITF=0.0030573 PTF=0 CJS=0 VJS=0.75 MJS=0)")
SOLVER(Solver, 1000)
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 1e-5)
CLOCK(clk, 40000) // 40KHz
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V6, 6)
ANALOG_INPUT(I_V12, 12)
ANALOG_INPUT(GND, 0)
TTL_7414_DIP(IC_L9) // SHARED INVERTER, FISCHIO 1-2, TOS 3-9
NC_PIN(NC)
NET_C(IC_L9.10, GND.Q)
NET_C(IC_L9.12, GND.Q)
TTL_7414_DIP(IC_L9)
LOCAL_SOURCE(LM339)
LOCAL_SOURCE(calcio)
LOCAL_SOURCE(stop_palla)
LOCAL_SOURCE(parata)
LOCAL_SOURCE(output_filter)
// TOS Section
TTL_INPUT(I_PB0, 0)
TTL_INPUT(I_PB1, 0)
TTL_INPUT(I_PB2, 0)
TTL_INPUT(I_PB3, 0)
TTL_INPUT(I_PB4, 0)
TTL_INPUT(I_PB5, 0)
TTL_INPUT(I_PB6, 0)
TTL_INPUT(I_PB7, 0)
NET_C(GND, I_PB0.GND, I_PB1.GND, I_PB2.GND, I_PB3.GND, I_PB4.GND, I_PB5.GND, I_PB6.GND, I_PB7.GND, clk.GND)
NET_C(I_V5, I_PB0.VCC, I_PB1.VCC, I_PB2.VCC, I_PB3.VCC, I_PB4.VCC, I_PB5.VCC, I_PB6.VCC, I_PB7.VCC, clk.VCC)
CAP(C7_1, CAP_P(330))
CAP(C7_2, CAP_P(330))
TTL_74161_DIP(IC_D7) // 4 bit counter
TTL_74161_DIP(IC_E7) // same
TTL_74LS107_DIP(IC_C7) // dual JK flip flop
NET_C(GND, IC_C7.7, IC_D7.8, IC_E7.8, C7_1.2)
NET_C(I_V5, IC_C7.14, IC_D7.16, IC_E7.16)
NET_C(I_PB0, IC_D7.3)
NET_C(I_PB1, IC_D7.4)
NET_C(I_PB2, IC_D7.5)
NET_C(I_PB3, IC_D7.6)
NET_C(I_PB4, IC_E7.3)
NET_C(I_PB5, IC_E7.4)
NET_C(I_PB6, IC_E7.5)
NET_C(I_PB7, IC_E7.6)
NET_C(IC_E7.1, IC_D7.1, I_V5) // CLEAR FLAG
NET_C(IC_D7.7, IC_D7.10, I_V5)
NET_C(IC_E7.9, IC_D7.9, C7_1.1, IC_L9.4)
NET_C(IC_D7.15, IC_E7.7, IC_E7.10)
NET_C(IC_E7.15, IC_L9.3)
NET_C(IC_L9.6, IC_E7.2, IC_D7.2)
NET_C(IC_L9.5, C7_2.1, IC_C7.9, IC_L9.8)
NET_C(GND, C7_2.2)
NET_C(IC_L9.9, clk)
NET_C(IC_C7.10, I_V5)
NET_C(IC_C7.1, IC_C7.13, IC_C7.4, IC_C7.12, GND.Q)
NET_C(IC_C7.8, IC_E7.15) // FLIP-FLOP
NET_C(IC_C7.11, IC_E7.15)
ALIAS(TOS, IC_C7.5)
// FISCHIO
TTL_INPUT(I_FISCHIO, 0)
NET_C(GND, I_FISCHIO.GND)
NET_C(I_V5, I_FISCHIO.VCC)
SUBMODEL(NE556_DIP, IC_N9)
TTL_74393_DIP(IC_M9)
NET_C(IC_L9.7, GND)
NET_C(GND, IC_L9.7)
NET_C(IC_L9.14, I_V5)
ALIAS(INPUT,IC_L9.1)
ALIAS(OUTPUT,IC_L9.2)
NET_C(IC_L9.4, GND)
NET_C(IC_L9.6, GND)
NET_C(IC_L9.8, GND)
NET_C(IC_L9.10, GND)
NET_C(IC_L9.12, GND)
}
static NETLIST_START(fischio)
{
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(GND, 0)
LOCAL_SOURCE(inverter)
SUBMODEL(NE556_DIP, IC_N9)
SUBMODEL(inverter, INV)
TTL_74393_DIP(IC_M9)
NET_C(IC_M9.7, GND)
NET_C(IC_M9.14, I_V5)
NET_C(IC_N9.7, GND)
@ -362,9 +317,9 @@ NETLIST_START(dribling)
RES(R4, RES_K(47))
CAP(C42, CAP_U(4.2))
CAP(C2, CAP_N(2.2))
NET_C(IC_M9.6, IC_L9.1)
NET_C(IC_N9.4, IC_L9.2)
NET_C(IC_N9.10, IC_L9.2)
NET_C(IC_M9.6, INV.INPUT)
NET_C(IC_N9.4, INV.OUTPUT)
NET_C(IC_N9.10, INV.OUTPUT)
NET_C(I_V5, R1.1)
NET_C(I_V5, R2.1)
NET_C(R1.2, IC_N9.1, R3.1, IC_N9.2, IC_N9.6, C42.1)
@ -373,9 +328,9 @@ NETLIST_START(dribling)
NET_C(R4.1, R2.2, IC_N9.13)
NET_C(C2.2, GND)
NET_C(IC_N9.5, IC_M9.1) // Counter tick
NET_C(I_FISCHIO, IC_M9.2) // Counter CLEAR
NET_C(I_FISCHIO, IC_M9.12)
NET_C(GND.Q, IC_L9.11, IC_L9.13 )
ALIAS(INPUT, IC_M9.2) // Counter CLEAR
NET_C(INPUT, IC_M9.12)
NET_C(IC_M9.6, IC_M9.13)
HINT(IC_M9.3, NC)
HINT(IC_M9.4, NC)
@ -384,49 +339,21 @@ NETLIST_START(dribling)
HINT(IC_M9.9, NC)
HINT(IC_M9.10, NC)
HINT(IC_M9.11, NC)
ALIAS(FISCHIO, IC_N9.9)
// ALIAS(OUTPUT, IC_N9.9)
// STOP_PALLA
TTL_INPUT(I_STOP_PALLA, 0)
NET_C(GND, I_STOP_PALLA.GND)
NET_C(I_V6, I_STOP_PALLA.VCC)
SUBMODEL(stop_palla, STOP_PALLA)
NET_C(STOP_PALLA.GND, GND)
NET_C(STOP_PALLA.INPUT, I_STOP_PALLA)
RES(R0, 1)
NET_C(R0.1, IC_N9.9)
ALIAS(OUTPUT, R0.2)
// PARATA
TTL_INPUT(I_PARATA, 0)
NET_C(GND, I_PARATA.GND)
NET_C(I_V6, I_PARATA.VCC)
SUBMODEL(parata, PARATA)
NET_C(PARATA.GND, GND)
NET_C(PARATA.INPUT, I_PARATA)
OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1)
}
// CALCIO_A and CALCIO_B
TTL_INPUT(I_CALCIO_A, 0)
NET_C(GND, I_CALCIO_A.GND)
NET_C(I_V5, I_CALCIO_A.VCC)
TTL_INPUT(I_CALCIO_B, 0)
NET_C(GND, I_CALCIO_B.GND)
NET_C(I_V5, I_CALCIO_B.VCC)
SUBMODEL(calcio, CALCIO_A)
PARAM(CALCIO_A.CAP1, 22)
PARAM(CALCIO_A.CAP1, 47)
NET_C(I_CALCIO_A, CALCIO_A.INPUT)
NET_C(CALCIO_A.GND, GND)
SUBMODEL(calcio, CALCIO_B)
PARAM(CALCIO_B.CAP1, 33)
PARAM(CALCIO_B.CAP1, 68)
NET_C(I_CALCIO_B, CALCIO_B.INPUT)
NET_C(CALCIO_B.GND, GND)
static NETLIST_START(folla)
{
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V12, 12)
ANALOG_INPUT(GND, 0)
// FOLLA A, M, B
TTL_INPUT(I_FOLLA_A, 0)
TTL_INPUT(I_FOLLA_M, 0)
TTL_INPUT(I_FOLLA_B, 0)
TTL_INPUT(I_CONTRASTO, 0)
NET_C(GND, I_FOLLA_A.GND, I_FOLLA_M.GND, I_FOLLA_B.GND, I_CONTRASTO.GND)
NET_C(I_V5, I_FOLLA_A.VCC, I_FOLLA_M.VCC, I_FOLLA_B.VCC, I_CONTRASTO.VCC)
NET_C(GND, IC_E8.5, IC_C8.9, IC_C8.6, IC_C8.2, IC_C8.3, IC_8B.12, IC_8B.5, IC_8B.9, IC_7B.12, IC_7B.10, IC_7B.2, IC_7B.8)
NET_C(GND, IC_8B.4, IC_C8.5, IC_7B.8, IC_8B.10, IC_8B.13, IC_C8.10, IC_E8.4)
TTL_74LS164_DIP(IC_7A)
@ -460,9 +387,9 @@ NETLIST_START(dribling)
NET_C(C20.1, GND)
ALIAS(NOISE, IC_7A.13)
ALIAS(C_IN, IC_8A.8)
NET_C(I_FOLLA_B, IC_E8.10)
NET_C(I_FOLLA_M, IC_E8.12)
NET_C(I_FOLLA_A, IC_E8.1)
ALIAS(FOLLA_B, IC_E8.10)
ALIAS(FOLLA_M, IC_E8.12)
ALIAS(FOLLA_A, IC_E8.1)
NET_C(IC_E8.9, IC_E8.13, IC_E8.2, NOISE)
NET_C(IC_E8.8, R33.1)
NET_C(IC_E8.11, R34.1)
@ -470,7 +397,7 @@ NETLIST_START(dribling)
NET_C(R35.1, GND)
NET_C(R33.2, R34.2, R35.2, R36.2, C22.1, C21.1)
NET_C(C21.2, R47.2, IC_C8.14)
ALIAS(FOLLA, IC_C8.14)
NET_C(R37.2, I_V5)
NET_C(C22.2, R47.1, IC_C8.13)
NET_C(R37.1, C24.2, IC_C8.12)
@ -493,29 +420,161 @@ NETLIST_START(dribling)
NET_C(IC_Q9.5, IC_Q9.10)
NET_C(IC_Q9.9, C23.1)
NET_C(IC_Q9.4, I_V5)
NET_C(I_CONTRASTO, IC_Q9.6)
ALIAS(CONTRASTO, IC_Q9.6)
ALIAS(CONT_OUT, C23.2)
NET_C(C23.2, R36.2)
RES(R0, 1)
NET_C(R0.1, IC_C8.14)
ALIAS(OUTPUT, R0.2)
OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1)
}
NETLIST_START(dribling)
{
NET_MODEL("BC239C NPN(IS=1.5813E-15 ISE=4.637E-14 ISC=8.0864E-18 XTI=3 BF=113.32 BR=86.718 IKF=1.4907 IKR=0.03360 XTB=0 VAF=12.331 VAR=31.901 VJE=0.71518 VJC=1.1381 RE=0.22081 RC=0.01636 RB=1.0078 CJE=3.3904E-14 CJC=2.9774E-12 XCJC=0.02899 FC=0.99886 NF=1.0653 NR=1.8047 NE=1.4254 NC=1.8821 MJE=0.36824 MJC=0.31461 TF=2.0691E-11 TR=1.0033E-09 EG=1.11 IRB=0.00083992 RBM=0 XTF=0.31338 VTF=0.10174 ITF=0.0045579 PTF=0 CJS=0 MJS=0 VJS=0.75)") // )")
NET_MODEL("BC309 PNP(IS=1.0366E-15 ISE=1.6295E-14 ISC=9.4971E-17 XTI=3 BF=80 BR=16.116 IKF=0.47497 IKR=0.012081 XTB=0 VAF=8.486 VAR=9.5149 VJE=0.84456 VJC=1.0282 RE=1.9597 RC=1.1393 RB=3.2133 CJE=2.0636E-14 CJC=2.6904E-12 XCJC=0.075977 FC=0.54298 NF=1.03136 NR=1.2907 NE=1.3702 NC=1.038 MJE=0.68352 MJC=0.5401 TF=5.4303E-11 TR=3.4233E-10 EG=1.11 IRB=0.00046855 RBM=2.0822 XTF=0.27447 VTF=0.19311 ITF=0.0030573 PTF=0 CJS=0 VJS=0.75 MJS=0)")
SOLVER(Solver, 1000)
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
PARAM(Solver.NR_LOOPS, 300)
PARAM(Solver.GS_LOOPS, 10)
PARAM(Solver.PARALLEL, 2) // More does not help
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V6, 6)
ANALOG_INPUT(I_V12, 12)
LOCAL_SOURCE(LM339)
LOCAL_SOURCE(calcio)
LOCAL_SOURCE(stop_palla)
LOCAL_SOURCE(parata)
LOCAL_SOURCE(output_filter)
LOCAL_SOURCE(fischio)
LOCAL_SOURCE(folla)
// TOS Section
TTL_INPUT(I_PB0, 0)
TTL_INPUT(I_PB1, 0)
TTL_INPUT(I_PB2, 0)
TTL_INPUT(I_PB3, 0)
TTL_INPUT(I_PB4, 0)
TTL_INPUT(I_PB5, 0)
TTL_INPUT(I_PB6, 0)
TTL_INPUT(I_PB7, 0)
NET_C(GND, I_PB0.GND, I_PB1.GND, I_PB2.GND, I_PB3.GND, I_PB4.GND, I_PB5.GND, I_PB6.GND, I_PB7.GND)
NET_C(I_V5, I_PB0.VCC, I_PB1.VCC, I_PB2.VCC, I_PB3.VCC, I_PB4.VCC, I_PB5.VCC, I_PB6.VCC, I_PB7.VCC)
LOCAL_SOURCE(inverter)
CLOCK(clk, 40000) // 40KHz
NET_C(clk.VCC, I_V5)
NET_C(clk.GND, GND)
SUBMODEL(inverter, INV1)
SUBMODEL(inverter, INV2)
SUBMODEL(inverter, INV3)
CAP(C7_1, CAP_P(330))
CAP(C7_2, CAP_P(330))
TTL_74161_DIP(IC_D7) // 4 bit counter
TTL_74161_DIP(IC_E7) // same
TTL_74LS107_DIP(IC_C7) // dual JK flip flop
NET_C(GND, IC_C7.7, IC_D7.8, IC_E7.8, C7_1.2)
NET_C(I_V5, IC_C7.14, IC_D7.16, IC_E7.16)
NET_C(I_PB0, IC_D7.3)
NET_C(I_PB1, IC_D7.4)
NET_C(I_PB2, IC_D7.5)
NET_C(I_PB3, IC_D7.6)
NET_C(I_PB4, IC_E7.3)
NET_C(I_PB5, IC_E7.4)
NET_C(I_PB6, IC_E7.5)
NET_C(I_PB7, IC_E7.6)
NET_C(IC_E7.1, IC_D7.1, I_V5) // CLEAR FLAG
NET_C(IC_D7.7, IC_D7.10, I_V5)
NET_C(IC_E7.9, IC_D7.9, C7_1.1, INV1.OUTPUT)
NET_C(IC_D7.15, IC_E7.7, IC_E7.10)
NET_C(IC_E7.15, INV1.INPUT)
NET_C(INV2.OUTPUT, IC_E7.2, IC_D7.2)
NET_C(INV2.INPUT, C7_2.1, IC_C7.9, INV3.OUTPUT)
NET_C(GND, C7_2.2)
NET_C(INV3.INPUT, clk)
NET_C(IC_C7.10, I_V5)
NET_C(IC_C7.1, IC_C7.13, IC_C7.4, IC_C7.12, GND.Q)
NET_C(IC_C7.8, IC_E7.15) // FLIP-FLOP
NET_C(IC_C7.11, IC_E7.15)
ALIAS(TOS_OUTPUT, IC_C7.5)
// FISCHIO
TTL_INPUT(I_FISCHIO, 0)
NET_C(GND, I_FISCHIO.GND)
NET_C(I_V5, I_FISCHIO.VCC)
SUBMODEL(fischio, FISCHIO)
NET_C(I_FISCHIO, FISCHIO.INPUT)
// STOP_PALLA
TTL_INPUT(I_STOP_PALLA, 0)
NET_C(GND, I_STOP_PALLA.GND)
NET_C(I_V6, I_STOP_PALLA.VCC)
SUBMODEL(stop_palla, STOP_PALLA)
NET_C(STOP_PALLA.INPUT, I_STOP_PALLA)
// PARATA
TTL_INPUT(I_PARATA, 0)
NET_C(GND, I_PARATA.GND)
NET_C(I_V6, I_PARATA.VCC)
SUBMODEL(parata, PARATA)
NET_C(PARATA.INPUT, I_PARATA)
// CALCIO_A and CALCIO_B
TTL_INPUT(I_CALCIO_A, 0)
NET_C(GND, I_CALCIO_A.GND)
NET_C(I_V5, I_CALCIO_A.VCC)
TTL_INPUT(I_CALCIO_B, 0)
NET_C(GND, I_CALCIO_B.GND)
NET_C(I_V5, I_CALCIO_B.VCC)
SUBMODEL(calcio, CALCIO_A)
PARAM(CALCIO_A.CAP1, 22)
PARAM(CALCIO_A.CAP1, 47)
NET_C(I_CALCIO_A, CALCIO_A.INPUT)
SUBMODEL(calcio, CALCIO_B)
PARAM(CALCIO_B.CAP1, 33)
PARAM(CALCIO_B.CAP1, 68)
NET_C(I_CALCIO_B, CALCIO_B.INPUT)
// FOLLA A, M, B
TTL_INPUT(I_FOLLA_A, 0)
TTL_INPUT(I_FOLLA_M, 0)
TTL_INPUT(I_FOLLA_B, 0)
TTL_INPUT(I_CONTRASTO, 0)
NET_C(GND, I_FOLLA_A.GND, I_FOLLA_M.GND, I_FOLLA_B.GND, I_CONTRASTO.GND)
NET_C(I_V5, I_FOLLA_A.VCC, I_FOLLA_M.VCC, I_FOLLA_B.VCC, I_CONTRASTO.VCC)
SUBMODEL(folla, FOLLA)
NET_C(FOLLA.FOLLA_A, I_FOLLA_A)
NET_C(FOLLA.FOLLA_M, I_FOLLA_M)
NET_C(FOLLA.FOLLA_B, I_FOLLA_B)
NET_C(FOLLA.CONTRASTO, I_CONTRASTO)
// OUTPUT SECTION ----------------------
// TOS
CAP(C_TOS, CAP_N(100))
RES(R_TOS, RES_K(220))
NET_C(TOS, C_TOS.1)
NET_C(TOS_OUTPUT, C_TOS.1)
NET_C(R_TOS.1, C_TOS.2)
// FISCHIO
CAP(C_FISCHIO, CAP_N(1000))
RES(R_FISCHIO, RES_K(220))
NET_C(FISCHIO, C_FISCHIO.1)
NET_C(FISCHIO.OUTPUT, C_FISCHIO.1)
NET_C(R_FISCHIO.1, C_FISCHIO.2)
// FOLLA
CAP(C_FOLLA, CAP_N(10))
RES(R_FOLLA, RES_K(100))
NET_C(FOLLA, C_FOLLA.1)
NET_C(FOLLA.OUTPUT, C_FOLLA.1)
NET_C(C_FOLLA.2, R_FOLLA.1)
// CALCIO_A
@ -558,9 +617,6 @@ NETLIST_START(dribling)
NET_C(Q_OUT.E, GND)
SUBMODEL(output_filter, OUTPUT_FILTER)
NET_C(OUTPUT_FILTER.INPUT, Q_OUT.C)
NET_C(OUTPUT_FILTER.GND, GND)
ALIAS(OUTPUT, OUTPUT_FILTER.OUTPUT)
}