-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]

This commit is contained in:
Ryan Holtz 2020-08-10 22:15:32 +02:00
parent df96c0e944
commit 1c11ecb000
8 changed files with 8825 additions and 6049 deletions

View File

@ -1950,6 +1950,8 @@ files {
MAME_DIR .. "src/mame/video/gtia.h",
MAME_DIR .. "src/mame/audio/nl_fireone.h",
MAME_DIR .. "src/mame/audio/nl_fireone.cpp",
MAME_DIR .. "src/mame/audio/nl_starfire.h",
MAME_DIR .. "src/mame/audio/nl_starfire.cpp",
MAME_DIR .. "src/mame/drivers/starfire.cpp",
MAME_DIR .. "src/mame/includes/starfire.h",
MAME_DIR .. "src/mame/video/starfire.cpp",

View File

@ -296,6 +296,12 @@ files{
MAME_DIR .. "src/mame/machine/nl_tp1985.cpp",
MAME_DIR .. "src/mame/machine/nl_tp1985.h",
MAME_DIR .. "src/mame/audio/nl_starcrus.h",
MAME_DIR .. "src/mame/audio/nl_starcrus.cpp",
MAME_DIR .. "src/mame/drivers/starcrus.cpp",
MAME_DIR .. "src/mame/includes/starcrus.h",
MAME_DIR .. "src/mame/video/starcrus.cpp",
MAME_DIR .. "src/mame/audio/nl_carpolo.h",
MAME_DIR .. "src/mame/audio/nl_carpolo.cpp",
MAME_DIR .. "src/mame/drivers/carpolo.cpp",
@ -305,6 +311,8 @@ files{
MAME_DIR .. "src/mame/audio/nl_fireone.h",
MAME_DIR .. "src/mame/audio/nl_fireone.cpp",
MAME_DIR .. "src/mame/audio/nl_starfire.h",
MAME_DIR .. "src/mame/audio/nl_starfire.cpp",
MAME_DIR .. "src/mame/drivers/starfire.cpp",
MAME_DIR .. "src/mame/includes/starfire.h",
MAME_DIR .. "src/mame/video/starfire.cpp",

File diff suppressed because it is too large Load Diff

View File

@ -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")
LOCAL_SOURCE(_NE556_DIP)
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(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()

View File

@ -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()

View File

@ -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

View File

@ -43,11 +43,8 @@
Notes:
starfira has one less rom in total than starfire but everything passes as
ok in the rom test so its probably just an earlier revision or something
fireone currently lacks the "alert" sound effect due to missing netlist
support for the 8038 function generator IC.
starfira has one less ROM in total than starfire, but everything passes as
OK in the ROM test, so it's probably just an earlier revision.
***************************************************************************/
@ -55,10 +52,8 @@ support for the 8038 function generator IC.
#include "includes/starfire.h"
#include "cpu/z80/z80.h"
#include "sound/samples.h"
#include "speaker.h"
/*************************************
*
* Scratch RAM, mapped into video RAM
@ -74,8 +69,9 @@ void starfire_base_state::scratch_w(offs_t offset, uint8_t data)
{
case 0: m_vidctrl = data; break;
case 1: m_vidctrl1 = data; break;
case 2: sound_w(0, data); break;
case 3: sound_w(1, data); break;
case 2:
case 3: sound_w(offset & 1, data); break;
case 7: music_w((offset >> 10) & 3, data); break;
default: break;
}
}
@ -107,30 +103,15 @@ uint8_t starfire_base_state::scratch_r(offs_t offset)
void starfire_state::sound_w(offs_t offset, uint8_t data)
{
// starfire sound samples (preliminary)
uint8_t rise = data & ~m_prev_sound;
m_prev_sound = data;
// d0: rumble
if (BIT(rise, 0)) m_samples->start(0, 0, true);
if (BIT(~data, 0)) m_samples->stop(0);
// d1: explosion
// d2: tie weapon
// d3: laser
if (BIT(rise, 1)) m_samples->start(1, 1);
if (BIT(rise, 2)) m_samples->start(2, 2);
if (BIT(rise, 3)) m_samples->start(3, 3);
// these are from the same generator (called "computer" in schematics)
// d4: track
// d5: lock
// d6: scanner
// d7: overheat
if (BIT(rise, 7)) m_samples->start(4, 7);
else if (BIT(rise, 6)) m_samples->start(4, 6);
else if (BIT(rise, 5)) m_samples->start(4, 5);
else if (BIT(rise, 4)) m_samples->start(4, 4);
m_sound_size->write(BIT(data, 0));
m_sound_explosion->write(BIT(data, 1));
m_sound_tie->write(BIT(data, 2));
m_sound_laser->write(BIT(data, 3));
m_sound_track->write(BIT(data, 4));
m_sound_lock->write(BIT(data, 5));
m_sound_scanner->write(BIT(data, 6));
m_sound_overheat->write(BIT(data, 7));
synchronize();
}
void fireone_state::sound_w(offs_t offset, uint8_t data)
@ -141,6 +122,11 @@ void fireone_state::sound_w(offs_t offset, uint8_t data)
m_sound_left_partial_hit->write(BIT(data, 1));
m_sound_left_boom->write(BIT(data, 2));
m_player_select = BIT(~data, 3);
m_pit->write_gate0(BIT(data, 4));
m_pit->write_gate1(BIT(data, 5));
m_pit->write_gate2(BIT(data, 6));
m_sound_off_left->write(BIT(data, 7)); // HACK: There's only one SOUND_OFF signal, but it splits into the left and right mixer stages.
m_sound_off_right->write(BIT(data, 7)); // Having the left and right halves split provides a better opportunity for frontier isolation.
}
else
{
@ -149,33 +135,60 @@ void fireone_state::sound_w(offs_t offset, uint8_t data)
m_sound_right_boom->write(BIT(data, 2));
m_sound_torpedo_collision->write(BIT(data, 3));
m_sound_submarine_engine->write(BIT(data, 4));
m_sound_alert->write(BIT(data, 5));
m_sound_sonar_sync->write(BIT(data, 6));
m_sound_sonar_enable->write(BIT(~data, 7));
}
}
void fireone_state::music_w(offs_t offset, uint8_t data)
{
m_pit->write(offset, data);
}
WRITE_LINE_MEMBER(fireone_state::music_a_out_cb)
{
m_music_a->write(state);
}
WRITE_LINE_MEMBER(fireone_state::music_b_out_cb)
{
m_music_b->write(state);
}
WRITE_LINE_MEMBER(fireone_state::music_c_out_cb)
{
m_music_c->write(state);
}
uint8_t starfire_state::input_r(offs_t offset)
{
switch (offset & 15)
{
case 0: return m_dsw->read();
case 1:
{
// d3 and d4 come from the audio circuit, how does it work exactly?
// tie_on sounds ok, but laser_on sounds buggy
const uint8_t tie_on = m_samples->playing(2) ? 0x00 : 0x08;
const uint8_t laser_on = m_samples->playing(3) ? 0x00 : 0x10;
const uint8_t input = m_system->read() & 0xe7;
return input | tie_on | laser_on | 0x10; // disable laser_on for now
}
case 5: return m_stick2->read();
case 1: return (m_system->read() & 0xe7) | m_sound_tie_on | m_sound_laser_on;
case 5: return m_stickz->read();
case 6: return m_stickx->read();
case 7: return m_sticky->read();
default: return 0xff;
}
}
NETDEV_ANALOG_CALLBACK_MEMBER(starfire_state::tieon1_cb)
{
m_sound_tie_on = (data > 2.5) ? 0x00 : 0x08;
}
NETDEV_ANALOG_CALLBACK_MEMBER(starfire_state::laseron1_cb)
{
m_sound_laser_on = (data > 2.5) ? 0x00 : 0x10;
}
NETDEV_ANALOG_CALLBACK_MEMBER(starfire_state::sound_out_cb)
{
m_dac->write(std::round(8192.0 * data));
}
uint8_t fireone_state::input_r(offs_t offset)
{
static const uint8_t s_paddle_map[64] =
@ -275,6 +288,27 @@ static INPUT_PORTS_START( starfire )
PORT_CONFNAME( 0x01, 0x01, "Jumper J6/4G: Enable NMI" )
PORT_CONFSETTING( 0x00, DEF_STR( No ) )
PORT_CONFSETTING( 0x01, DEF_STR( Yes ) )
PORT_START("POT_TRACK")
PORT_ADJUSTER( 50, "Tracking Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "trackvol")
PORT_START("POT_LASER")
PORT_ADJUSTER( 50, "Laser Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "laservol")
PORT_START("POT_TIE")
PORT_ADJUSTER( 50, "Enemy Shot Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "enemyvol")
PORT_START("POT_SIZE")
PORT_ADJUSTER( 50, "'Size' Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "sizevol")
PORT_START("POT_EXPLO")
PORT_ADJUSTER( 50, "Explosion Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "explovol")
PORT_START("POT_LOH")
PORT_ADJUSTER( 50, "Lock/Scan/Overheat Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "lohvol")
PORT_START("POT_MAIN")
PORT_ADJUSTER( 50, "Main Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "mainvol")
INPUT_PORTS_END
@ -337,19 +371,23 @@ INPUT_PORTS_END
void starfire_state::machine_start()
{
/* register for state saving */
save_item(NAME(m_prev_sound));
save_item(NAME(m_sound_tie_on));
save_item(NAME(m_sound_laser_on));
}
void starfire_state::machine_reset()
{
m_prev_sound = 0;
m_sound_tie_on = 0x08;
m_sound_laser_on = 0x10;
}
void fireone_state::machine_start()
{
/* register for state saving */
save_item(NAME(m_player_select));
m_pit->set_clockin(0, STARFIRE_CPU_CLOCK.dvalue());
m_pit->set_clockin(1, STARFIRE_CPU_CLOCK.dvalue());
m_pit->set_clockin(2, STARFIRE_CPU_CLOCK.dvalue());
}
void fireone_state::machine_reset()
@ -357,20 +395,6 @@ void fireone_state::machine_reset()
m_player_select = 0;
}
static const char *const starfire_sample_names[] =
{
"*starfire",
"size",
"explosion",
"tie",
"laser",
"track",
"lock",
"scanner",
"overheat",
nullptr
};
INTERRUPT_GEN_MEMBER(starfire_state::vblank_int)
{
// starfire has a jumper for disabling NMI, used to do a complete RAM test
@ -400,6 +424,11 @@ void fireone_state::fireone(machine_config &config)
base_config(config);
m_maincpu->set_vblank_int("screen", FUNC(fireone_state::vblank_int));
PIT8253(config, m_pit);
m_pit->out_handler<0>().set(FUNC(fireone_state::music_a_out_cb));
m_pit->out_handler<1>().set(FUNC(fireone_state::music_b_out_cb));
m_pit->out_handler<2>().set(FUNC(fireone_state::music_c_out_cb));
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@ -412,7 +441,8 @@ void fireone_state::fireone(machine_config &config)
NETLIST_LOGIC_INPUT(config, "sound_nl:ltorp", "LTORP.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:lshpht", "LSHPHT.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:lboom", "LBOOM.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:sound_off", "SOUND_OFF.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:lsound_off", "SOUND_OFF_L.IN", 0); // HACK: Split the SOUND OFF into left/right halves for better netlist isolation.
NETLIST_LOGIC_INPUT(config, "sound_nl:rsound_off", "SOUND_OFF_R.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:rtorp", "RTORP.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:rshpht", "RSHPHT.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:rboom", "RBOOM.IN", 0);
@ -421,6 +451,9 @@ void fireone_state::fireone(machine_config &config)
NETLIST_LOGIC_INPUT(config, "sound_nl:alert", "ALERT.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:sonar_enable", "SONAR_ENABLE.POS", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:sonar_sync", "SONAR_SYNC.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:music_a", "MUSIC_A.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:music_b", "MUSIC_B.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:music_c", "MUSIC_C.IN", 0);
NETLIST_ANALOG_INPUT(config, "sound_nl:volume_l", "R64.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:volume_r", "R65.DIAL");
@ -436,10 +469,33 @@ void starfire_state::starfire(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
SAMPLES(config, m_samples);
m_samples->set_channels(5);
m_samples->set_samples_names(starfire_sample_names);
m_samples->add_route(ALL_OUTPUTS, "mono", 1.0);
NETLIST_CPU(config, "sound_nl", netlist::config::DEFAULT_CLOCK()).set_source(NETLIST_NAME(starfire));
NETLIST_LOGIC_INPUT(config, "sound_nl:size", "SIZE.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:sexplo", "SEXPLO.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:stie", "STIE.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:slaser", "SLASER.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:track", "TRACK.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:lock", "LOCK.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:scanner", "SCANNER.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:oheat", "OHEAT.IN", 0);
NETLIST_ANALOG_INPUT(config, "sound_nl:trackvol", "R16.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:laservol", "R18.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:enemyvol", "R17.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:sizevol", "R19.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:explovol", "R20.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:lohvol", "R15.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:mainvol", "R21.DIAL");
NETLIST_ANALOG_OUTPUT(config, "sound_nl:tieon1", 0).set_params("TIEON1", FUNC(starfire_state::tieon1_cb));
NETLIST_ANALOG_OUTPUT(config, "sound_nl:laseron1", 0).set_params("LASERON1", FUNC(starfire_state::laseron1_cb));
NETLIST_ANALOG_OUTPUT(config, "sound_nl:output", 0).set_params("OUTPUT", FUNC(starfire_state::sound_out_cb));
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "mono", 0.5); // Not actually a DAC, just here to receive output.
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@ -535,7 +591,7 @@ ROM_END
*
*************************************/
GAME( 1979, starfire, 0, starfire, starfire, starfire_state, empty_init, ROT0, "Exidy", "Star Fire (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, starfirea,starfire, starfire, starfire, starfire_state, empty_init, ROT0, "Exidy", "Star Fire (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, fireone, 0, fireone, fireone, fireone_state, empty_init, ROT0, "Exidy", "Fire One", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, starfir2, 0, starfire, starfire, starfire_state, empty_init, ROT0, "Exidy", "Star Fire 2", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, starfire, 0, starfire, starfire, starfire_state, empty_init, ROT0, "Exidy", "Star Fire (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, starfirea,starfire, starfire, starfire, starfire_state, empty_init, ROT0, "Exidy", "Star Fire (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, fireone, 0, fireone, fireone, fireone_state, empty_init, ROT0, "Exidy", "Fire One", MACHINE_SUPPORTS_SAVE )
GAME( 1979, starfir2, 0, starfire, starfire, starfire_state, empty_init, ROT0, "Exidy", "Star Fire 2", MACHINE_SUPPORTS_SAVE )

View File

@ -11,9 +11,12 @@
#pragma once
#include "machine/netlist.h"
#include "machine/pit8253.h"
#include "netlist/nl_setup.h"
#include "audio/nl_fireone.h"
#include "sound/samples.h"
#include "audio/nl_starfire.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "screen.h"
@ -65,6 +68,7 @@ protected:
virtual uint8_t input_r(offs_t offset) = 0;
virtual void sound_w(offs_t offset, uint8_t data) = 0;
virtual void music_w(offs_t offset, uint8_t data) { };
void scratch_w(offs_t offset, uint8_t data);
uint8_t scratch_r(offs_t offset);
@ -83,11 +87,19 @@ class starfire_state : public starfire_base_state
public:
starfire_state(const machine_config &mconfig, device_type type, const char *tag)
: starfire_base_state(mconfig, type, tag)
, m_samples(*this, "samples")
, m_dac(*this, "dac") // just to have a sound device
, m_nmi(*this, "NMI")
, m_stick2(*this, "STICK2")
, m_stickz(*this, "STICKZ")
, m_stickx(*this, "STICKX")
, m_sticky(*this, "STICKY")
, m_sound_size(*this, "sound_nl:size")
, m_sound_explosion(*this, "sound_nl:sexplo")
, m_sound_tie(*this, "sound_nl:stie")
, m_sound_laser(*this, "sound_nl:slaser")
, m_sound_track(*this, "sound_nl:track")
, m_sound_lock(*this, "sound_nl:lock")
, m_sound_scanner(*this, "sound_nl:scanner")
, m_sound_overheat(*this, "sound_nl:oheat")
{ }
void starfire(machine_config &config);
@ -96,9 +108,10 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
required_device<samples_device> m_samples;
required_device<dac_word_interface> m_dac;
required_ioport m_nmi;
required_ioport m_stick2;
required_ioport m_stickz;
required_ioport m_stickx;
required_ioport m_sticky;
@ -107,7 +120,21 @@ private:
INTERRUPT_GEN_MEMBER(vblank_int);
uint8_t m_prev_sound;
NETDEV_ANALOG_CALLBACK_MEMBER(tieon1_cb);
NETDEV_ANALOG_CALLBACK_MEMBER(laseron1_cb);
NETDEV_ANALOG_CALLBACK_MEMBER(sound_out_cb);
uint8_t m_sound_tie_on;
uint8_t m_sound_laser_on;
required_device<netlist_mame_logic_input_device> m_sound_size;
required_device<netlist_mame_logic_input_device> m_sound_explosion;
required_device<netlist_mame_logic_input_device> m_sound_tie;
required_device<netlist_mame_logic_input_device> m_sound_laser;
required_device<netlist_mame_logic_input_device> m_sound_track;
required_device<netlist_mame_logic_input_device> m_sound_lock;
required_device<netlist_mame_logic_input_device> m_sound_scanner;
required_device<netlist_mame_logic_input_device> m_sound_overheat;
};
class fireone_state : public starfire_base_state
@ -115,6 +142,7 @@ class fireone_state : public starfire_base_state
public:
fireone_state(const machine_config &mconfig, device_type type, const char *tag)
: starfire_base_state(mconfig, type, tag)
, m_pit(*this, "pit")
, m_controls(*this, "P%u", 1U)
, m_sound_left_partial_hit(*this, "sound_nl:lshpht")
, m_sound_right_partial_hit(*this, "sound_nl:rshpht")
@ -124,8 +152,14 @@ public:
, m_sound_right_boom(*this, "sound_nl:rboom")
, m_sound_torpedo_collision(*this, "sound_nl:torpcoll")
, m_sound_submarine_engine(*this, "sound_nl:subeng")
, m_sound_alert(*this, "sound_nl:alert")
, m_sound_sonar_enable(*this, "sound_nl:sonar_enable")
, m_sound_sonar_sync(*this, "sound_nl:sonar_sync")
, m_sound_off_left(*this, "sound_nl:lsound_off")
, m_sound_off_right(*this, "sound_nl:rsound_off")
, m_music_a(*this, "sound_nl:music_a")
, m_music_b(*this, "sound_nl:music_b")
, m_music_c(*this, "sound_nl:music_c")
{ }
void fireone(machine_config &config);
@ -134,10 +168,16 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
required_device<pit8253_device> m_pit;
required_ioport_array<2> m_controls;
DECLARE_WRITE_LINE_MEMBER(music_a_out_cb);
DECLARE_WRITE_LINE_MEMBER(music_b_out_cb);
DECLARE_WRITE_LINE_MEMBER(music_c_out_cb);
virtual uint8_t input_r(offs_t offset) override;
virtual void sound_w(offs_t offset, uint8_t data) override;
virtual void music_w(offs_t offset, uint8_t data) override;
uint8_t m_player_select;
@ -151,8 +191,14 @@ private:
required_device<netlist_mame_logic_input_device> m_sound_right_boom;
required_device<netlist_mame_logic_input_device> m_sound_torpedo_collision;
required_device<netlist_mame_logic_input_device> m_sound_submarine_engine;
required_device<netlist_mame_logic_input_device> m_sound_alert;
required_device<netlist_mame_logic_input_device> m_sound_sonar_enable;
required_device<netlist_mame_logic_input_device> m_sound_sonar_sync;
required_device<netlist_mame_logic_input_device> m_sound_off_left;
required_device<netlist_mame_logic_input_device> m_sound_off_right;
required_device<netlist_mame_logic_input_device> m_music_a;
required_device<netlist_mame_logic_input_device> m_music_b;
required_device<netlist_mame_logic_input_device> m_music_c;
};
#endif // MAME_INCLUDES_STARFIRE_H