summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio
diff options
context:
space:
mode:
author Ryan Holtz <ryan.holtz@arrowheadgs.com>2020-08-10 22:15:32 +0200
committer Ryan Holtz <ryan.holtz@arrowheadgs.com>2020-08-10 22:15:53 +0200
commit1c11ecb00041121add4e1b235ddb6bc92a7015d1 (patch)
treef1de5a5543f6f3af53f1bf12b8584e6b64c85108 /src/mame/audio
parentdf96c0e94420deb0cd7811ff31bcab1275dcb2e0 (diff)
-starfire: Removed MACHINE_IMPERFECT_SOUND flags. Added missing music and Alert sound effect to Fire One netlist and added Star Fire netlist. [Ryan Holtz, Colin Howell, Aaron Giles]
Diffstat (limited to 'src/mame/audio')
-rw-r--r--src/mame/audio/nl_fireone.cpp190
-rw-r--r--src/mame/audio/nl_starfire.cpp437
-rw-r--r--src/mame/audio/nl_starfire.h10
3 files changed, 612 insertions, 25 deletions
diff --git a/src/mame/audio/nl_fireone.cpp b/src/mame/audio/nl_fireone.cpp
index 508092e1852..3c0523cb36c 100644
--- a/src/mame/audio/nl_fireone.cpp
+++ b/src/mame/audio/nl_fireone.cpp
@@ -7,7 +7,7 @@
//
// Known problems/issues:
//
-// * None.
+// * Slow!
//
#include "netlist/devices/net_lib.h"
@@ -16,10 +16,7 @@
// 556 is just two 555s in one package
//
-#define NE556_DIP(name) SUBMODEL(_NE556_DIP, name)
-#define LM556_DIP NE556_DIP
-
-static NETLIST_START(_NE556_DIP)
+static NETLIST_START(NE556_DIP)
NE555(A)
NE555(B)
@@ -38,6 +35,64 @@ static NETLIST_START(_NE556_DIP)
)
NETLIST_END()
+
+//
+// ICL8038 is broadly similar to a 566 VCO, and can be simulated partially as such.
+//
+
+static NETLIST_START(ICL8038_DIP)
+ VCVS(VI, 1)
+ CCCS(CI1, -1)
+ CCCS(CI2, 2)
+ SYS_COMPD(COMP)
+ SYS_DSW2(SW)
+ VCVS(VO, 1)
+ RES(R_SHUNT, RES_R(50))
+
+ PARAM(VO.RO, 50)
+ PARAM(COMP.MODEL, "FAMILY(TYPE=CUSTOM IVL=0.16 IVH=0.4 OVL=0.01 OVH=0.01 ORL=50 ORH=50)")
+ PARAM(SW.GOFF, 0) // This has to be zero to block current sources
+
+ NET_C(VI.OP, CI1.IN, CI2.IN)
+ NET_C(CI1.OP, VO.IP)
+ NET_C(COMP.Q, SW.I)
+ NET_C(CI2.OP, SW.2)
+ NET_C(COMP.VCC, R_SHUNT.1)
+ NET_C(SW.1, R_SHUNT.2)
+ NET_C(SW.3, VO.IP)
+ NET_C(VO.OP, COMP.IN)
+
+ // Avoid singular Matrix due to G=0 switch
+ RES(RX1, 1e10)
+ RES(RX2, 1e10)
+ NET_C(RX1.1, SW.1)
+ NET_C(RX2.1, SW.3)
+
+ NET_C(COMP.GND, RX1.2, RX2.2)
+
+ RES(R1, 5000)
+ RES(R2, 5000)
+ RES(R3, 5000)
+
+ // Square output wave
+ VCVS(V_SQR, 1)
+ NET_C(COMP.Q, V_SQR.IP)
+
+ NET_C(COMP.GND, SW.GND, VI.ON, VI.IN, CI1.ON, CI2.ON, VO.IN, VO.ON, R2.2, V_SQR.IN, V_SQR.ON)
+ NET_C(COMP.VCC, SW.VCC, R1.2)
+ NET_C(COMP.IP, R1.1, R2.1, R3.1)
+ NET_C(COMP.Q, R3.2)
+
+ ALIAS(11, VI.ON) // GND
+ ALIAS(9, V_SQR.OP) // Square out
+ ALIAS(3, VO.OP) // Triag out
+ ALIAS(8, VI.IP) // VC
+ ALIAS(4, CI1.IP) // R1
+ ALIAS(5, CI2.IP) // R2
+ ALIAS(10, VO.IP) // C1
+ ALIAS(6, COMP.VCC) // V+
+NETLIST_END()
+
//
// Main netlist
//
@@ -46,15 +101,19 @@ NETLIST_START(fireone)
NET_MODEL("2N3704 NPN(IS=26.03f VAF=90.7 Bf=736.1K IKF=.1983 XTB=1.5 BR=1.024 CJC=11.01p CJE=24.07p RB=10 RC=.5 RE=.5 TR=233.8n TF=1.03n ITF=0 VTF=0 XTF=0 mfg=Motorola)")
SOLVER(Solver, 48000)
+
ANALOG_INPUT(V12, 12)
ANALOG_INPUT(VM12, -12)
ANALOG_INPUT(V5, 5)
ALIAS(VCC, V5)
+ NET_MODEL("PIT8253PORT FAMILY(TYPE=NMOS OVL=0.05 OVH=0.05 ORL=100.0 ORH=0.5k)")
+
TTL_INPUT(LTORP, 0) // active high
TTL_INPUT(LSHPHT, 0) // active high
TTL_INPUT(LBOOM, 0) // active high
- TTL_INPUT(SOUND_OFF, 0) // active high
+ TTL_INPUT(SOUND_OFF_L, 0) // active high
+ TTL_INPUT(SOUND_OFF_R, 0) // active high
TTL_INPUT(RTORP, 0) // active high
TTL_INPUT(RSHPHT, 0) // active high
TTL_INPUT(RBOOM, 0) // active high
@@ -64,17 +123,24 @@ NETLIST_START(fireone)
//TTL_INPUT(SONAR_ENABLE, 0) // active high
TTL_INPUT(SONAR_SYNC, 0) // active low
- NET_C(VCC, LTORP.VCC, LSHPHT.VCC, LBOOM.VCC, SOUND_OFF.VCC, RTORP.VCC, RSHPHT.VCC, RBOOM.VCC, TORPCOLL.VCC, SUBENG.VCC, ALERT.VCC, SONAR_SYNC.VCC)
- NET_C(GND, LTORP.GND, LSHPHT.GND, LBOOM.GND, SOUND_OFF.GND, RTORP.GND, RSHPHT.GND, RBOOM.GND, TORPCOLL.GND, SUBENG.GND, ALERT.GND, SONAR_SYNC.GND)
+ LOGIC_INPUT(MUSIC_A, 0, "PIT8253PORT")
+ LOGIC_INPUT(MUSIC_B, 0, "PIT8253PORT")
+ LOGIC_INPUT(MUSIC_C, 0, "PIT8253PORT")
+
+ NET_C(VCC, LTORP.VCC, LSHPHT.VCC, LBOOM.VCC, SOUND_OFF_L.VCC, SOUND_OFF_R.VCC, RTORP.VCC, RSHPHT.VCC, RBOOM.VCC, TORPCOLL.VCC, SUBENG.VCC, ALERT.VCC, SONAR_SYNC.VCC)
+ NET_C(GND, LTORP.GND, LSHPHT.GND, LBOOM.GND, SOUND_OFF_L.GND, SOUND_OFF_R.GND, RTORP.GND, RSHPHT.GND, RBOOM.GND, TORPCOLL.GND, SUBENG.GND, ALERT.GND, SONAR_SYNC.GND)
+ NET_C(VCC, MUSIC_A.VCC, MUSIC_B.VCC, MUSIC_C.VCC)
+ NET_C(GND, MUSIC_A.GND, MUSIC_B.GND, MUSIC_C.GND)
- LOCAL_SOURCE(_NE556_DIP)
+ LOCAL_SOURCE(NE556_DIP)
+ LOCAL_SOURCE(ICL8038_DIP)
TTL_7406_GATE(IC27_A)
+ TTL_7406_GATE(IC27_B)
TTL_7406_GATE(IC27_C)
TTL_7406_GATE(IC27_D)
- NET_C(VCC, IC27_A.VCC, IC27_C.VCC, IC27_D.VCC)
- NET_C(GND, IC27_A.GND, IC27_C.GND, IC27_D.GND)
- //TTL_7406_GATE(IC27_E)
+ NET_C(VCC, IC27_A.VCC, IC27_B.VCC, IC27_C.VCC, IC27_D.VCC)
+ NET_C(GND, IC27_A.GND, IC27_B.GND, IC27_C.GND, IC27_D.GND)
//CD4070_GATE(IC41_A)
//CD4070_GATE(IC41_B)
@@ -91,9 +157,10 @@ NETLIST_START(fireone)
NET_C(V12, IC25.16)
NET_C(GND, IC25.8)
- CD4013(IC3)
- NET_C(V12, IC3.VDD)
- NET_C(GND, IC3.VSS)
+ CD4013(IC3_A)
+ CD4013(IC3_B)
+ NET_C(V12, IC3_A.VDD, IC3_B.VDD)
+ NET_C(GND, IC3_A.VSS, IC3_A.SET, IC3_A.RESET, IC3_B.VSS, IC3_B.SET)
MC1558_DIP(IC6)
NET_C(IC6.8, V12)
@@ -109,7 +176,7 @@ NETLIST_START(fireone)
NE555(IC29)
- NE556_DIP(IC31)
+ SUBMODEL(NE556_DIP, IC31)
NET_C(IC31.14, V5)
NET_C(IC31.7, GND)
@@ -121,6 +188,10 @@ NETLIST_START(fireone)
NET_C(IC30.8, V12)
NET_C(IC30.3, GND)
+ SUBMODEL(ICL8038_DIP, IC15)
+ NET_C(V12, IC15.6)
+ NET_C(GND, IC15.11)
+
LM3900(IC2_A)
LM3900(IC2_D)
LM3900(IC4_A)
@@ -133,14 +204,23 @@ NETLIST_START(fireone)
NET_C(V12, IC2_A.VCC, IC2_D.VCC, IC4_A.VCC, IC4_B.VCC, IC4_D.VCC, IC14_A.VCC, IC14_B.VCC, IC14_C.VCC, IC14_D.VCC)
NET_C(GND, IC2_A.GND, IC2_D.GND, IC4_A.GND, IC4_B.GND, IC4_D.GND, IC14_A.GND, IC14_B.GND, IC14_C.GND, IC14_D.GND)
+ RES(R1, RES_K(560))
+ RES(R2, RES_K(560))
+ RES(R3, RES_K(560))
+ RES(R4, RES_K(560))
+ RES(R5, RES_K(560))
+ RES(R6, RES_K(560))
RES(R8, RES_M(2))
RES(R9, RES_K(820))
RES(R10, RES_K(220))
RES(R11, RES_K(620))
RES(R12, RES_K(3.9))
RES(R13, RES_K(3.9))
+ RES(R14, RES_K(3.9))
RES(R15, RES_M(5.6))
RES(R16, RES_K(680))
+ RES(R17, RES_K(10))
+ RES(R18, RES_K(1))
RES(R19, RES_K(150))
RES(R20, RES_K(2))
RES(R21, RES_K(180))
@@ -179,8 +259,12 @@ NETLIST_START(fireone)
RES(R55, RES_K(1))
RES(R56, RES_K(10))
RES(R57, RES_K(680))
+ RES(R58, RES_M(1))
+ RES(R59, RES_K(43))
+ RES(R60, RES_K(43))
RES(R61, RES_K(150))
RES(R62, RES_M(1))
+ //RES(R63, RES_K(82))
POT(R64, RES_K(10))
POT(R65, RES_K(10))
RES(R66, RES_K(27))
@@ -198,6 +282,7 @@ NETLIST_START(fireone)
RES(R78, RES_K(150))
RES(R79, RES_K(130))
RES(R80, RES_K(130))
+ RES(R81, RES_K(560))
RES(R82, RES_K(160))
RES(R83, RES_M(1))
RES(R84, RES_K(100))
@@ -206,6 +291,7 @@ NETLIST_START(fireone)
RES(R87, RES_K(100))
RES(R94, RES_K(1))
RES(R95, RES_K(1))
+ RES(R96, RES_K(1))
RES(R99, RES_K(1))
RES(R100, RES_K(1))
//RES(R101, RES_K(10))
@@ -218,8 +304,10 @@ NETLIST_START(fireone)
RES(R108, RES_K(20))
RES(R109, RES_K(560))
RES(R110, RES_K(1))
+ RES(R116, RES_K(4.7))
RES(R117, RES_K(20))
RES(R118, RES_K(560))
+ RES(R119, RES_K(560))
RES(R120, RES_K(5.6))
RES(R122, RES_K(2.7))
RES(R123, RES_K(100))
@@ -234,19 +322,19 @@ NETLIST_START(fireone)
RES(R137, RES_K(5.6))
RES(R138, RES_K(47))
RES(R139, 100)
+ RES(R140, RES_K(10))
RES(R141, RES_K(3))
//RES(R142, RES_K(56))
//RES(R143, RES_K(56))
- RES(R140, RES_K(10))
RES(R144, RES_K(100))
RES(R150, RES_K(100))
- //RES(R, RES_K())
CAP(C3, CAP_U(1.0))
CAP(C4, CAP_U(0.1))
CAP(C6, CAP_U(4.7))
CAP(C7, CAP_U(0.33))
CAP(C8, CAP_U(0.33))
+ CAP(C10, CAP_U(0.1))
CAP(C11, CAP_U(2.2))
CAP(C12, CAP_U(2.2))
CAP(C13, CAP_U(4.7))
@@ -265,7 +353,9 @@ NETLIST_START(fireone)
CAP(C38, CAP_U(0.1))
CAP(C39, CAP_U(0.0022))
CAP(C40, CAP_U(0.033))
+ CAP(C41, CAP_U(1.0))
CAP(C42, CAP_U(1.0))
+ CAP(C44, CAP_U(0.0047))
CAP(C45, CAP_U(0.1))
CAP(C48, CAP_U(0.1))
CAP(C49, CAP_U(0.0022))
@@ -292,7 +382,6 @@ NETLIST_START(fireone)
CAP(C114, CAP_U(0.1))
CAP(C121, CAP_U(0.001))
CAP(C122, CAP_U(0.001))
- //CAP(C, CAP_U())
DIODE(D1, "1N914")
DIODE(D2, "1N914")
@@ -308,11 +397,13 @@ NETLIST_START(fireone)
DIODE(D12, "1N914")
DIODE(D13, "1N914")
DIODE(D14, "1N914")
+ DIODE(D15, "1N914")
+ QBJT_EB(Q1, "2N3704")
QBJT_EB(Q2, "2N3704")
// Noise Generator
- CLOCK(HLE_SONAR_CLOCK, 998)
+ CLOCK(HLE_SONAR_CLOCK, 1000)
NET_C(HLE_SONAR_CLOCK.GND, GND)
NET_C(HLE_SONAR_CLOCK.VCC, V12)
@@ -342,10 +433,9 @@ NETLIST_START(fireone)
NET_C(R110.2, V12)
NET_C(IC29.THRESH, IC29.TRIG, R107.2, C72.1)
NET_C(C72.2, GND)
- NET_C(IC29.OUT, D3.K, IC3.CLOCK)
- NET_C(IC3.QQ, IC3.DATA)
- NET_C(IC3.SET, IC3.RESET, GND)
- NET_C(IC3.Q, D2.K, IC25.14)
+ NET_C(IC29.OUT, D3.K, IC3_A.CLOCK)
+ NET_C(IC3_A.QQ, IC3_A.DATA)
+ NET_C(IC3_A.Q, D2.K, IC25.14)
NET_C(IC25.13, GND)
NET_C(IC25.2, R36.1)
NET_C(IC25.4, R72.1)
@@ -517,8 +607,34 @@ NETLIST_START(fireone)
NET_C(R77.2, MIX_L)
NET_C(R76.2, MIX_R)
+ // Alert
+ NET_C(ALERT.Q, IC27_B.A)
+ NET_C(IC27_B.Y, R96.2, D15.A, IC3_B.RESET)
+ NET_C(D15.K, C41.2, Q1.C, IC15.8)
+ NET_C(R14.2, R17.1, Q1.B)
+ NET_C(Q1.E, R58.1)
+ NET_C(IC15.10, C44.1)
+ NET_C(IC15.4, R59.2)
+ NET_C(IC15.5, R60.2)
+ NET_C(IC15.9, R116.2, IC3_B.CLOCK)
+ NET_C(IC3_B.QQ, IC3_B.DATA)
+ NET_C(IC3_B.Q, R18.1)
+ NET_C(R18.2, C10.1, R119.1, R81.1)
+ NET_C(V12, R96.1, C41.1, R14.1, R116.1, R59.1, R60.1)
+ NET_C(GND, R17.2, R58.2, C44.2, C10.2)
+ NET_C(R119.2, MIX_L)
+ NET_C(R81.2, MIX_R)
+
// Mixers (shared)
- NET_C(SOUND_OFF.Q, D4.A, D5.A)
+ NET_C(SOUND_OFF_L.Q, D4.A)
+ NET_C(SOUND_OFF_R.Q, D5.A)
+
+ // Music
+ NET_C(MUSIC_A.Q, R1.1, R4.1)
+ NET_C(MUSIC_B.Q, R5.1, R6.1)
+ NET_C(MUSIC_C.Q, R3.1, R2.1)
+ NET_C(R1.2, R3.2, R5.2, MIX_L)
+ NET_C(R2.2, R4.2, R6.2, MIX_R)
// Mixer (L)
NET_C(MIX_L, C15.1)
@@ -547,4 +663,28 @@ NETLIST_START(fireone)
NET_C(R65.2, C109.1)
NET_C(C109.2, R150.1)
ALIAS(OUT_R, C109.2)
+
+ // Separate each input into the summing network
+ OPTIMIZE_FRONTIER(R27.1, RES_K(270), 50) // SONAR (L)
+ OPTIMIZE_FRONTIER(R77.1, RES_K(33), 50) // TORPCOLL (L)
+ OPTIMIZE_FRONTIER(R78.1, RES_K(150), 50) // L SHPHT
+ OPTIMIZE_FRONTIER(R79.1, RES_K(130), 50) // SUBENG (L)
+ OPTIMIZE_FRONTIER(R117.1, RES_K(20), 50) // L BOOM
+ OPTIMIZE_FRONTIER(R118.1, RES_K(560), 50) // L TORP
+
+ OPTIMIZE_FRONTIER(R85.1, RES_K(270), 50) // SONAR (R)
+ OPTIMIZE_FRONTIER(R76.1, RES_K(33), 50) // TORPCOLL (R)
+ OPTIMIZE_FRONTIER(R61.1, RES_K(150), 50) // R SHPHT
+ OPTIMIZE_FRONTIER(R80.1, RES_K(130), 50) // SUBENG (R)
+ OPTIMIZE_FRONTIER(R108.1, RES_K(20), 50) // R BOOM
+ OPTIMIZE_FRONTIER(R109.1, RES_K(560), 50) // R TORP
+
+ OPTIMIZE_FRONTIER(R138.1, RES_K(47), 50) // Isolation for NOISE_A going into SONAR section
+ OPTIMIZE_FRONTIER(R42.1, RES_K(820), 50) // Isolation for NOISE going into L TORP section
+ OPTIMIZE_FRONTIER(R50.1, RES_K(820), 50) // Isolation for NOISE going into R TORP section
+ OPTIMIZE_FRONTIER(R31.1, RES_K(560), 50) // Isolation for NOISE going into L SHPHT section
+ OPTIMIZE_FRONTIER(R44.1, RES_K(560), 50) // Isolation for NOISE going into R SHPHT section
+ OPTIMIZE_FRONTIER(R11.1, RES_K(620), 50) // Isolation for NOISE going into TORPCOLL section
+ OPTIMIZE_FRONTIER(R87.1, RES_K(100), 50) // Isolation for RUMBLE going into L BOOM section
+ OPTIMIZE_FRONTIER(R105.1, RES_K(100), 50) // Isolation for RUMBLE going into R BOOM section
NETLIST_END()
diff --git a/src/mame/audio/nl_starfire.cpp b/src/mame/audio/nl_starfire.cpp
new file mode 100644
index 00000000000..f2ed1546161
--- /dev/null
+++ b/src/mame/audio/nl_starfire.cpp
@@ -0,0 +1,437 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+//
+// Netlist for Star Fire
+//
+// Derived from the schematics in the manual.
+//
+// Known problems/issues:
+//
+// * Tracking computer might not be 100% right, compared to recordings.
+// * Slow.
+//
+
+#include "netlist/devices/net_lib.h"
+
+//
+// 556 is just two 555s in one package
+//
+
+static NETLIST_START(NE556_DIP)
+ NE555(A)
+ NE555(B)
+
+ NET_C(A.GND, B.GND)
+ NET_C(A.VCC, B.VCC)
+
+ DIPPINS( /* +--------------+ */
+ A.DISCH, /* 1DISCH |1 ++ 14| VCC */ A.VCC,
+ A.THRESH, /* 1THRES |2 13| 2DISCH */ B.DISCH,
+ A.CONT, /* 1CONT |3 12| 2THRES */ B.THRESH,
+ A.RESET, /* 1RESET |4 NE556 11| 2CONT */ B.CONT,
+ A.OUT, /* 1OUT |5 10| 2RESET */ B.RESET,
+ A.TRIG, /* 1TRIG |6 9| 2OUT */ B.OUT,
+ A.GND, /* GND |7 8| 2TRIG */ B.TRIG
+ /* +--------------+ */
+ )
+NETLIST_END()
+
+static NETLIST_START(ICL8038_DIP)
+ VCVS(VI, 1)
+ CCCS(CI1, -1)
+ CCCS(CI2, 2)
+ SYS_COMPD(COMP)
+ SYS_DSW2(SW)
+ VCVS(VO, 1)
+ RES(R_SHUNT, RES_R(50))
+
+ PARAM(VO.RO, 50)
+ PARAM(COMP.MODEL, "FAMILY(TYPE=CUSTOM IVL=0.16 IVH=0.4 OVL=0.01 OVH=0.01 ORL=50 ORH=50)")
+ PARAM(SW.GOFF, 0) // This has to be zero to block current sources
+
+ NET_C(VI.OP, CI1.IN, CI2.IN)
+ NET_C(CI1.OP, VO.IP)
+ NET_C(COMP.Q, SW.I)
+ NET_C(CI2.OP, SW.2)
+ NET_C(COMP.VCC, R_SHUNT.1)
+ NET_C(SW.1, R_SHUNT.2)
+ NET_C(SW.3, VO.IP)
+ NET_C(VO.OP, COMP.IN)
+
+ // Avoid singular Matrix due to G=0 switch
+ RES(RX1, 1e10)
+ RES(RX2, 1e10)
+ NET_C(RX1.1, SW.1)
+ NET_C(RX2.1, SW.3)
+
+ NET_C(COMP.GND, RX1.2, RX2.2)
+
+ RES(R1, 5000)
+ RES(R2, 5000)
+ RES(R3, 5000)
+
+ // Square output wave
+ VCVS(V_SQR, 1)
+ NET_C(COMP.Q, V_SQR.IP)
+
+ NET_C(COMP.GND, SW.GND, VI.ON, VI.IN, CI1.ON, CI2.ON, VO.IN, VO.ON, R2.2, V_SQR.IN, V_SQR.ON)
+ NET_C(COMP.VCC, SW.VCC, R1.2)
+ NET_C(COMP.IP, R1.1, R2.1, R3.1)
+ NET_C(COMP.Q, R3.2)
+
+ ALIAS(11, VI.ON) // GND
+ ALIAS(9, V_SQR.OP) // Square out
+ ALIAS(3, VO.OP) // Triag out
+ ALIAS(8, VI.IP) // VC
+ ALIAS(4, CI1.IP) // R1
+ ALIAS(5, CI2.IP) // R2
+ ALIAS(10, VO.IP) // C1
+ ALIAS(6, COMP.VCC) // V+
+NETLIST_END()
+
+//
+// Main netlist
+//
+
+NETLIST_START(starfire)
+ NET_MODEL("2N3702 PNP(Is=650.6E-18 Xti=3 Eg=1.11 Vaf=115.7 Bf=133.8 Ne=1.832 Ise=97.16f Ikf=1.081 Xtb=1.5 Br=3.73 Nc=2 Isc=0 Ikr=0 Rc=.715 Cjc=14.76p Mjc=.5383 Vjc=.75 Fc=.5 Cje=19.82p Mje=.3357 Vje=.75 Tr=114.1n Tf=761.3p Itf=.65 Vtf=5 Xtf=1.7 Rb=10 mfg=National)")
+ NET_MODEL("LM324_12V OPAMP(TYPE=3 VLH=1.6 VLL=0.16 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.00075)")
+ NET_MODEL("LM324_5V OPAMP(TYPE=3 VLH=0.667 VLL=0.0667 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.00075)")
+
+ SOLVER(Solver, 48000)
+ ANALOG_INPUT(V1_2, 1.2)
+ ANALOG_INPUT(V12, 12)
+ ANALOG_INPUT(VM12, -12)
+ ANALOG_INPUT(V5, 5)
+ ANALOG_INPUT(VM5, -5)
+ ALIAS(VCC, V5)
+
+ TTL_INPUT(SIZE, 0) // active high
+ TTL_INPUT(SEXPLO, 0) // active high
+ TTL_INPUT(STIE, 0) // active high
+ TTL_INPUT(SLASER, 0) // active high
+ TTL_INPUT(TRACK, 0) // active high
+ TTL_INPUT(LOCK, 0) // active high
+ TTL_INPUT(SCANNER, 0) // active high
+ TTL_INPUT(OHEAT, 0) // active high
+
+ NET_C(VCC, SIZE.VCC, SEXPLO.VCC, STIE.VCC, SLASER.VCC, TRACK.VCC, LOCK.VCC, SCANNER.VCC, OHEAT.VCC)
+ NET_C(GND, SIZE.GND, SEXPLO.GND, STIE.GND, SLASER.GND, TRACK.GND, LOCK.GND, SCANNER.GND, OHEAT.GND)
+
+ LOCAL_SOURCE(NE556_DIP)
+ LOCAL_SOURCE(ICL8038_DIP)
+
+ RES(R12, RES_K(10))
+ RES(R13, RES_K(470))
+ RES(R14, RES_K(470))
+ POT(R15, RES_K(100))
+ POT(R16, RES_K(100))
+ POT(R17, RES_K(100))
+ POT(R18, RES_K(100))
+ POT(R19, RES_K(33))
+ POT(R20, RES_K(10))
+ POT(R21, RES_K(10))
+ RES(R23, RES_K(47))
+ RES(R24, 470)
+ RES(R25, RES_K(10))
+ RES(R26, RES_K(1))
+ RES(R27, RES_K(30))
+ RES(R28, RES_K(30))
+ RES(R29, RES_K(1))
+ RES(R30, RES_K(4.7))
+ RES(R31, RES_M(1))
+ RES(R37, RES_K(10))
+ RES(R38, RES_K(2.7))
+ RES(R39, RES_K(10))
+ RES(R40, RES_K(2.7))
+ RES(R41, RES_K(3))
+ RES(R42, RES_K(1))
+ RES(R43, RES_M(1))
+ RES(R44, RES_K(2.2))
+ RES(R45, RES_K(3.3))
+ RES(R46, RES_K(27))
+ RES(R47, RES_K(82))
+ RES(R48, RES_K(10))
+ RES(R49, RES_K(100))
+ RES(R50, RES_K(160))
+ RES(R51, RES_K(16))
+ RES(R52, RES_K(16))
+ RES(R53, RES_K(16))
+ RES(R54, RES_K(100))
+ RES(R55, RES_K(100))
+ RES(R56, RES_K(4.7))
+ RES(R57, RES_K(10))
+ RES(R58, RES_K(82))
+ RES(R59, RES_K(27))
+ RES(R60, RES_K(2.7))
+ RES(R61, RES_K(10))
+ RES(R62, RES_M(1))
+ RES(R63, RES_M(1))
+ RES(R64, RES_K(4.7))
+ RES(R67, RES_K(10))
+ RES(R68, RES_K(2.7))
+ RES(R69, RES_K(470))
+ RES(R70, RES_K(470))
+ RES(R71, RES_K(100))
+ RES(R72, RES_K(330))
+ RES(R73, RES_K(4.7))
+ RES(R74, RES_K(100))
+ RES(R75, RES_K(27))
+ RES(R77, RES_K(470))
+ RES(R78, RES_K(4.7))
+ RES(R79, RES_K(10))
+ RES(R80, RES_K(3))
+ RES(R81, RES_K(1))
+ RES(R82, RES_K(10))
+ RES(R83, RES_K(4.7))
+ RES(R84, RES_K(1))
+ RES(R85, RES_K(3))
+ RES(R86, RES_K(1))
+ RES(R87, RES_K(2))
+ //RES(R88, RES_K(82))
+ RES(R89, RES_K(22))
+ RES(R90, RES_K(22))
+ RES(R91, RES_M(1))
+ //RES(R, RES_K())
+
+ CAP(C7, CAP_U(0.1))
+ CAP(C9, CAP_U(0.1))
+ CAP(C10, CAP_U(0.1))
+ CAP(C11, CAP_U(0.1))
+ CAP(C12, CAP_U(0.01))
+ CAP(C13, CAP_U(1.0))
+ CAP(C14, CAP_U(0.1))
+ CAP(C15, CAP_U(0.01))
+ CAP(C18, CAP_U(1.0))
+ CAP(C20, CAP_U(1.0))
+ CAP(C21, CAP_U(0.1))
+ CAP(C22, CAP_U(0.1))
+ CAP(C23, CAP_U(0.1))
+ CAP(C25, CAP_U(1.0))
+ CAP(C26, CAP_U(0.1))
+ CAP(C27, CAP_U(1.0))
+ CAP(C29, CAP_U(0.1))
+ CAP(C32, CAP_U(1.0))
+ CAP(C34, CAP_U(1.0))
+ CAP(C38, CAP_U(0.1))
+ CAP(C39, CAP_U(0.01))
+ CAP(C45, CAP_U(4.7))
+ //CAP(C, CAP_U())
+
+ DIODE(D3, "1N914")
+
+ TTL_7406_GATE(IC_6C_A)
+ TTL_7406_GATE(IC_6C_B)
+ TTL_7406_GATE(IC_6C_C)
+ TTL_7406_GATE(IC_6C_D)
+ TTL_7406_GATE(IC_6C_E)
+ TTL_7406_GATE(IC_6C_F)
+ NET_C(VCC, IC_6C_A.VCC, IC_6C_B.VCC, IC_6C_C.VCC, IC_6C_D.VCC, IC_6C_E.VCC, IC_6C_F.VCC)
+ NET_C(GND, IC_6C_A.GND, IC_6C_B.GND, IC_6C_C.GND, IC_6C_D.GND, IC_6C_E.GND, IC_6C_F.GND)
+
+ CD4070_GATE(IC_7E_A)
+ CD4070_GATE(IC_7E_B)
+ CD4070_GATE(IC_7E_C)
+ CD4070_GATE(IC_7E_D)
+ NET_C(V12, IC_7E_A.VDD, IC_7E_B.VDD, IC_7E_C.VDD, IC_7E_D.VDD)
+ NET_C(GND, IC_7E_A.VSS, IC_7E_B.VSS, IC_7E_C.VSS, IC_7E_D.VSS)
+
+ NE555(IC_5B_A)
+ NE555(IC_6E_A)
+ NET_C(V5, IC_5B_A.VCC)
+ NET_C(V12, IC_6E_A.VCC)
+ NET_C(GND, IC_5B_A.GND, IC_6E_A.GND)
+
+ SUBMODEL(NE556_DIP, IC_6A)
+ SUBMODEL(NE556_DIP, IC_8F)
+ NET_C(V5, IC_6A.14)
+ NET_C(V12, IC_8F.14)
+ NET_C(GND, IC_6A.7, IC_8F.7)
+
+ CD4006_DIP(IC_8E)
+ NET_C(V12, IC_8E.14)
+ NET_C(GND, IC_8E.7)
+
+ OPAMP(IC_6D_A, "LM324_12V")
+ OPAMP(IC_6D_B, "LM324_12V")
+ OPAMP(IC_6D_C, "LM324_12V")
+ OPAMP(IC_6D_D, "LM324_12V")
+ OPAMP(IC_8D_A, "LM324_12V")
+ OPAMP(IC_8D_B, "LM324_12V")
+ OPAMP(IC_8D_C, "LM324_12V")
+ OPAMP(IC_8D_D, "LM324_12V")
+ NET_C(V12, IC_6D_A.VCC, IC_6D_B.VCC, IC_6D_C.VCC, IC_6D_D.VCC, IC_8D_A.VCC, IC_8D_B.VCC, IC_8D_C.VCC, IC_8D_D.VCC)
+ NET_C(VM12, IC_6D_A.GND, IC_6D_B.GND, IC_6D_C.GND, IC_6D_D.GND, IC_8D_A.GND, IC_8D_B.GND, IC_8D_C.GND, IC_8D_D.GND)
+
+ OPAMP(IC_7C_A, "LM324_5V")
+ OPAMP(IC_7C_B, "LM324_5V")
+ OPAMP(IC_7C_C, "LM324_5V")
+ OPAMP(IC_7C_D, "LM324_5V")
+ NET_C(V5, IC_7C_A.VCC, IC_7C_B.VCC, IC_7C_C.VCC, IC_7C_D.VCC)
+ NET_C(VM5, IC_7C_A.GND, IC_7C_B.GND, IC_7C_C.GND, IC_7C_D.GND)
+
+ MC3340_DIP(IC_7D)
+ MC3340_DIP(IC_6B)
+ NET_C(V12, IC_6B.8, IC_7D.8)
+ NET_C(GND, IC_6B.3, IC_7D.3)
+
+ SUBMODEL(ICL8038_DIP, IC_6F)
+ NET_C(V12, IC_6F.6)
+ NET_C(VM12, IC_6F.11)
+
+ CD4016_DIP(IC_7B)
+ NET_C(V5, IC_7B.14)
+ NET_C(VM5, IC_7B.7)
+
+ QBJT_EB(Q1, "2N3702")
+ QBJT_EB(Q2, "2N3702")
+
+ // Tie Weapon
+ NET_C(STIE.Q, IC_6C_E.A)
+ NET_C(IC_6C_E.Y, R39.1, IC_7E_C.A)
+ NET_C(V1_2, IC_7C_C.MINUS) // HACK: +12V is actually fed into this pin per the schematic, but it relies on LM324 abuse.
+ NET_C(V12, R39.2, IC_7E_C.B, R83.1, R91.1, R86.1, IC_7E_A.A, IC_8F.10)
+ NET_C(IC_7E_C.Q, IC_8F.4, IC_8F.6)
+ NET_C(IC_8F.1, C45.1, Q2.C, IC_8D_D.PLUS)
+ NET_C(GND, C38.2, C45.2, R82.2, R57.1, R61.2, R84.2, IC_8D_A.PLUS)
+ NET_C(R83.2, R82.1, Q2.B)
+ NET_C(R91.2, Q2.E)
+ NET_C(IC_8F.5, R85.1)
+ NET_C(R85.2, R84.1, IC_7C_C.PLUS)
+ ALIAS(TIE_ON, IC_7C_C.OUT)
+ ALIAS(TIEON1, R84.1)
+ NET_C(R58.2, VM12)
+ NET_C(R58.1, R57.2, R59.1, IC_8D_D.MINUS)
+ NET_C(R59.2, IC_8D_D.OUT, R60.1, IC_8F.11)
+ NET_C(R60.2, R61.1, IC_8F.2)
+ NET_C(R86.2, R87.1, IC_8F.13)
+ NET_C(R87.2, IC_8F.8, IC_8F.12, C38.1)
+ NET_C(IC_8F.9, IC_8E.3)
+ NET_C(IC_8E.13, IC_7E_A.B)
+ NET_C(IC_7E_A.Q, IC_8E.5)
+ NET_C(IC_8E.1, IC_8E.12, IC_7E_B.B)
+ NET_C(IC_8E.8, IC_7E_B.A)
+ NET_C(IC_7E_B.Q, IC_8E.4)
+ NET_C(IC_8E.10, IC_8E.6, R73.1)
+ NET_C(SIZE.Q, IC_6C_F.A)
+ NET_C(IC_6C_F.Y, R56.1)
+ NET_C(R56.2, R73.2, C29.1)
+ NET_C(C29.2, R74.1)
+ NET_C(R74.2, R75.1, IC_8D_A.MINUS)
+ NET_C(R75.2, IC_8D_A.OUT)
+ ALIAS(NOISE, IC_8D_A.OUT)
+
+ // Explosion
+ NET_C(NOISE, R53.1)
+ NET_C(R53.2, C23.1, R52.1)
+ NET_C(R52.2, C22.1, IC_6D_C.PLUS)
+ NET_C(R50.2, R49.1, IC_6D_C.MINUS)
+ NET_C(C23.2, R50.1, R51.1, R54.1, IC_6D_C.OUT)
+ NET_C(R51.2, C21.1)
+ ALIAS(RUMBLE_2, C21.1)
+ NET_C(C21.2, C22.2, R49.2, C27.2, R55.2, C26.2, GND)
+ NET_C(R54.2, R55.1, C34.1)
+ NET_C(C34.2, IC_7D.1)
+ NET_C(SEXPLO.Q, IC_6C_C.A)
+ NET_C(IC_6C_C.Y, R40.1)
+ NET_C(R40.2, C27.1, R63.1)
+ NET_C(R63.2, R62.2, IC_8D_C.PLUS)
+ NET_C(R62.1, V5)
+ NET_C(IC_8D_C.MINUS, IC_8D_C.OUT, IC_7D.2)
+ NET_C(IC_7D.6, C26.1)
+ NET_C(IC_7D.7, C25.1)
+ ALIAS(EXPLO, C25.2)
+
+ // Tracking Computer
+ NET_C(SCANNER.Q, IC_5B_A.RESET)
+ NET_C(V5, R24.1, R70.1, R13.1, R27.1)
+ NET_C(GND, C15.2, R26.2, C20.2, C11.2, C7.2, C12.2, R29.2)
+ NET_C(R24.2, R23.1, R12.1, IC_6A.5, IC_5B_A.DISCH)
+ NET_C(R23.2, C15.1, IC_5B_A.THRESH, IC_5B_A.TRIG)
+ NET_C(OHEAT.Q, IC_6C_B.A)
+ NET_C(IC_6C_B.Y, R38.1)
+ NET_C(R38.2, C20.1, R69.1)
+ NET_C(R69.2, R70.2, IC_6D_A.PLUS)
+ NET_C(IC_6D_A.MINUS, IC_6D_A.OUT, IC_6B.2)
+ NET_C(IC_5B_A.OUT, R25.1)
+ NET_C(R25.2, C9.1, R26.1)
+ NET_C(C9.2, IC_6B.1)
+ NET_C(IC_6B.6, C11.1)
+ NET_C(IC_6B.7, C10.1)
+ ALIAS(LOH, C10.2)
+ NET_C(R13.2, R14.1, IC_6A.1)
+ NET_C(R14.2, C7.1, IC_6A.2, IC_6A.6)
+ NET_C(LOCK.Q, IC_6A.4)
+ NET_C(R12.2, IC_6A.11)
+ NET_C(R27.2, R28.1, IC_6A.13)
+ NET_C(R28.2, C12.1, IC_6A.12, IC_6A.8)
+ NET_C(TRACK.Q, IC_6A.10)
+ NET_C(IC_6A.9, C13.1)
+ NET_C(C13.2, R30.1)
+ NET_C(R30.2, R29.1)
+ ALIAS(COMPUTER, R30.2)
+
+ // Laser
+ NET_C(SIZE.Q, IC_6C_D.A)
+ NET_C(IC_6C_D.Y, R41.1)
+ NET_C(R41.2, R78.2, R79.1, Q1.B)
+ NET_C(V1_2, IC_7C_B.MINUS) // HACK: +12V is actually fed into this pin per the schematic, but it relies on LM324 abuse.
+ NET_C(V12, R78.1, R77.1, R37.1, IC_7E_D.B, R89.1, R90.1)
+ NET_C(GND, R79.2, C32.2, R48.2, R81.2, R67.2, IC_6D_B.PLUS)
+ NET_C(R77.2, Q1.E)
+ NET_C(Q1.C, C32.1, IC_6E_A.DISCH, IC_6D_D.PLUS)
+ NET_C(SLASER.Q, IC_6C_A.A)
+ NET_C(IC_6C_A.Y, R37.2, IC_7E_D.A)
+ NET_C(IC_7E_D.Q, IC_6E_A.TRIG, IC_6E_A.RESET)
+ NET_C(IC_6E_A.OUT, R80.1)
+ NET_C(R80.2, R81.1, IC_7C_B.PLUS)
+ ALIAS(LASERON1, R80.2)
+ ALIAS(LASER_ON, IC_7C_B.OUT)
+ NET_C(R48.1, R47.1, R46.1, IC_6D_D.MINUS)
+ NET_C(VM12, R47.2, C39.2)
+ NET_C(R46.2, IC_6D_D.OUT, R68.1, IC_6F.8)
+ NET_C(R68.2, R67.1, IC_6E_A.THRESH)
+ NET_C(C39.1, IC_6F.10)
+ NET_C(R89.2, IC_6F.4)
+ NET_C(R90.2, IC_6F.5)
+ NET_C(IC_6F.3, R72.1)
+ NET_C(R72.2, R71.1, IC_6D_B.MINUS)
+ NET_C(R71.2, IC_6D_B.OUT)
+ ALIAS(LASER, R71.2)
+
+ // Mixer
+ NET_C(V5, R45.1, R42.2)
+ NET_C(R45.2, R44.1, IC_7C_A.MINUS, IC_7C_D.MINUS)
+ NET_C(GND, R44.2, C18.2, R43.2)
+ NET_C(SIZE.Q, R42.1, D3.A)
+ NET_C(D3.K, C18.1, R43.1, IC_7C_D.PLUS)
+
+ NET_C(TRACK.Q, IC_7C_A.PLUS)
+ NET_C(IC_7C_A.OUT, IC_7B.13)
+ NET_C(COMPUTER, IC_7B.1)
+ NET_C(IC_7B.2, R16.1, R16.2)
+
+ NET_C(LASER, IC_7B.11)
+ NET_C(LASER_ON, IC_7B.12)
+ NET_C(IC_7B.10, R18.1, R18.2)
+
+ NET_C(NOISE, IC_7B.4)
+ NET_C(TIE_ON, IC_7B.5)
+ NET_C(IC_7B.3, R17.1, R17.2)
+
+ NET_C(RUMBLE_2, IC_7B.8)
+ NET_C(IC_7C_D.OUT, IC_7B.6)
+ NET_C(IC_7B.9, R19.1, R19.2)
+
+ NET_C(EXPLO, R20.1, R20.2)
+
+ NET_C(LOH, R15.1, R15.2)
+
+ NET_C(R16.3, R18.3, R17.3, R19.3, R20.3, R15.3, R64.1, IC_8D_B.MINUS)
+ NET_C(GND, IC_8D_B.PLUS)
+ NET_C(R64.2, R21.3, IC_8D_B.OUT)
+ NET_C(R21.1, R31.2, GND)
+ NET_C(R21.2, C14.1)
+ NET_C(C14.2, R31.1)
+ ALIAS(OUTPUT, R31.1)
+NETLIST_END()
diff --git a/src/mame/audio/nl_starfire.h b/src/mame/audio/nl_starfire.h
new file mode 100644
index 00000000000..19835d3b974
--- /dev/null
+++ b/src/mame/audio/nl_starfire.h
@@ -0,0 +1,10 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_AUDIO_NL_STARFIRE_H
+#define MAME_AUDIO_NL_STARFIRE_H
+
+#pragma once
+
+NETLIST_EXTERNAL(starfire)
+
+#endif // MAME_AUDIO_NL_STARFIRE_H