-fireone: Netlist sound now works other than the Alert trigger. [Ryan Holtz, Colin Howell, couriersud]

This commit is contained in:
Ryan Holtz 2020-08-06 20:04:00 +02:00
parent 0f6d29e759
commit aa86126fc2
4 changed files with 191 additions and 16 deletions

View File

@ -381,7 +381,7 @@ void netlist_mame_logic_input_device::write(const uint32_t val)
const uint32_t v = (val >> m_shift) & 1;
if (v != (*m_param)())
{
printf("write %s: %d\n", this->tag(), val);
LGODEBUG("write %s\n", this->tag());
synchronize(0, v);
}
}

View File

@ -59,19 +59,20 @@ NETLIST_START(fireone)
TTL_INPUT(RTORP, 0) // active high
TTL_INPUT(RSHPHT, 0) // active high
TTL_INPUT(RBOOM, 0) // active high
TTL_INPUT(TORPCOLL, 0) // active high
TTL_INPUT(SUBENG, 0) // active high
TTL_INPUT(ALERT, 0) // active high
//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, 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, SUBENG.GND, ALERT.GND, SONAR_SYNC.GND)
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)
LOCAL_SOURCE(_NE556_DIP)
TTL_7404_GATE(IC27_A)
TTL_7404_GATE(IC27_C)
TTL_7404_GATE(IC27_D)
TTL_7406_GATE(IC27_A)
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)
@ -121,11 +122,26 @@ NETLIST_START(fireone)
NET_C(IC30.8, V12)
NET_C(IC30.3, GND)
LM3900(IC2_A)
LM3900(IC2_D)
LM3900(IC4_A)
LM3900(IC4_B)
NET_C(V12, IC4_A.VCC, IC4_B.VCC)
NET_C(GND, IC4_A.GND, IC4_B.GND)
LM3900(IC4_D)
LM3900(IC14_A)
LM3900(IC14_B)
LM3900(IC14_C)
LM3900(IC14_D)
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(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(R15, RES_M(5.6))
RES(R16, RES_K(680))
RES(R19, RES_K(150))
RES(R20, RES_K(2))
RES(R21, RES_K(180))
@ -137,12 +153,34 @@ NETLIST_START(fireone)
RES(R27, RES_K(270))
RES(R28, RES_K(10))
RES(R29, RES_K(130))
RES(R31, RES_K(560))
RES(R32, RES_K(220))
RES(R33, RES_M(1.2))
RES(R34, RES_K(12))
RES(R35, RES_K(1))
RES(R36, RES_K(15))
RES(R37, RES_K(15))
RES(R38, RES_K(820))
RES(R39, RES_M(1))
RES(R40, RES_K(220))
RES(R41, RES_K(680))
RES(R42, RES_K(820))
RES(R43, RES_K(12))
RES(R44, RES_K(560))
RES(R45, RES_M(1.2))
RES(R46, RES_K(680))
RES(R47, RES_M(1.2))
RES(R48, RES_K(12))
RES(R49, RES_M(1.2))
RES(R50, RES_K(820))
RES(R51, RES_M(5.6))
RES(R52, RES_K(680))
RES(R53, RES_K(680))
RES(R54, RES_M(2))
RES(R55, RES_K(1))
RES(R56, RES_K(10))
RES(R57, RES_K(680))
RES(R61, RES_K(150))
RES(R62, RES_M(1))
POT(R64, RES_K(10))
POT(R65, RES_K(10))
@ -154,7 +192,11 @@ NETLIST_START(fireone)
RES(R71, RES_K(16))
RES(R72, RES_K(68))
RES(R73, RES_K(47))
RES(R74, RES_K(12))
RES(R75, RES_K(120))
RES(R76, RES_K(33))
RES(R77, RES_K(33))
RES(R78, RES_K(150))
RES(R79, RES_K(130))
RES(R80, RES_K(130))
RES(R82, RES_K(160))
@ -163,6 +205,10 @@ NETLIST_START(fireone)
RES(R85, RES_K(270))
RES(R86, RES_K(16))
RES(R87, RES_K(100))
RES(R94, RES_K(1))
RES(R95, RES_K(1))
RES(R99, RES_K(1))
RES(R100, RES_K(1))
//RES(R101, RES_K(10))
RES(R102, RES_K(3))
RES(R103, RES_K(3))
@ -171,8 +217,10 @@ NETLIST_START(fireone)
RES(R106, RES_K(100))
RES(R107, RES_K(47))
RES(R108, RES_K(20))
RES(R109, RES_K(560))
RES(R110, RES_K(1))
RES(R117, RES_K(20))
RES(R118, RES_K(560))
RES(R120, RES_K(5.6))
RES(R122, RES_K(2.7))
RES(R123, RES_K(100))
@ -180,6 +228,10 @@ NETLIST_START(fireone)
RES(R125, RES_K(3))
RES(R126, RES_K(6.8))
RES(R127, RES_K(8.2))
RES(R132, RES_M(1))
RES(R133, RES_M(1))
RES(R134, RES_M(1))
RES(R135, RES_M(1))
RES(R137, RES_K(5.6))
RES(R138, RES_K(47))
RES(R139, 100)
@ -191,16 +243,33 @@ NETLIST_START(fireone)
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(C11, CAP_U(2.2))
CAP(C12, CAP_U(2.2))
CAP(C13, CAP_U(4.7))
CAP(C14, CAP_U(2.2))
CAP(C15, CAP_U(1.0))
CAP(C16, CAP_U(10))
CAP(C17, CAP_U(0.1))
CAP(C18, CAP_U(0.1))
CAP(C20, CAP_U(10))
CAP(C22, CAP_U(0.033))
CAP(C23, CAP_U(0.33))
CAP(C26, CAP_U(0.022))
CAP(C27, CAP_U(0.022))
CAP(C35, CAP_U(0.0022))
CAP(C37, CAP_U(0.0022))
CAP(C38, CAP_U(0.1))
CAP(C39, CAP_U(0.0022))
CAP(C40, CAP_U(0.033))
CAP(C42, CAP_U(1.0))
CAP(C45, CAP_U(0.1))
CAP(C48, CAP_U(0.1))
CAP(C49, CAP_U(0.0022))
CAP(C50, CAP_U(1.0))
CAP(C51, CAP_U(0.1))
CAP(C52, CAP_U(0.1))
@ -215,6 +284,8 @@ NETLIST_START(fireone)
CAP(C82, CAP_U(0.1))
CAP(C84, CAP_U(0.1))
CAP(C85, CAP_U(2.2))
CAP(C97, CAP_U(0.0022))
CAP(C98, CAP_U(0.0022))
CAP(C100, CAP_U(0.22))
//CAP(C102, CAP_U(0.001))
CAP(C106, CAP_U(0.1))
@ -224,12 +295,19 @@ NETLIST_START(fireone)
CAP(C122, CAP_U(0.001))
//CAP(C, CAP_U())
DIODE(D1, "1N914")
DIODE(D2, "1N914")
DIODE(D3, "1N914")
DIODE(D4, "1N914")
DIODE(D5, "1N914")
DIODE(D6, "1N914")
DIODE(D7, "1N914")
DIODE(D8, "1N914")
DIODE(D9, "1N914")
DIODE(D10, "1N914")
DIODE(D11, "1N914")
DIODE(D12, "1N914")
DIODE(D13, "1N914")
DIODE(D14, "1N914")
QBJT_EB(Q2, "2N3704")
@ -257,7 +335,7 @@ NETLIST_START(fireone)
// Sonar
NET_C(IC27_A.A, SONAR_SYNC.Q)
NET_C(IC27_A.Q, R70.1, IC25.15, IC41_D.B)
NET_C(IC27_A.Y, R70.1, IC25.15, IC41_D.B)
NET_C(R70.2, V12, IC29.RESET)
NET_C(IC29.GND, GND)
NET_C(IC29.VCC, V12)
@ -339,7 +417,7 @@ NETLIST_START(fireone)
NET_C(IC30.6, C81.1)
NET_C(C81.2, GND)
NET_C(LBOOM.Q, IC27_C.A)
NET_C(IC27_C.Q, R103.1)
NET_C(IC27_C.Y, R103.1)
NET_C(R103.2, R104.1, C70.1)
NET_C(C70.2, GND)
NET_C(R104.2, IC17.3, R83.1)
@ -356,7 +434,7 @@ NETLIST_START(fireone)
NET_C(IC28.6, C75.1)
NET_C(C75.2, GND)
NET_C(RBOOM.Q, IC27_D.A)
NET_C(IC27_D.Q, R102.1)
NET_C(IC27_D.Y, R102.1)
NET_C(R102.2, R69.1, C73.1)
NET_C(C73.2, GND)
NET_C(R69.2, IC16.3, R62.1)
@ -364,6 +442,82 @@ NETLIST_START(fireone)
NET_C(IC16.1, IC16.2, IC28.2)
NET_C(R108.2, MIX_R)
// Torpedo (L)
NET_C(LTORP.Q, R100.1, D10.A, D11.A)
NET_C(R100.2, V5)
NET_C(D10.K, C7.1, R46.1)
NET_C(D11.K, C14.1, R53.1)
NET_C(C7.2, C14.2, R132.2, R133.2, GND)
NET_C(R53.2, IC14_C.PLUS)
NET_C(R51.1, V12)
NET_C(R51.2, C42.1, R54.1, IC14_C.MINUS)
NET_C(R54.2, C42.2, IC14_C.OUT, R57.1)
NET_C(R57.2, R46.2, IC14_B.PLUS)
NET_C(NOISE, R42.1)
NET_C(R42.2, R47.1, IC14_B.MINUS)
NET_C(R47.2, C35.1, IC14_B.OUT)
NET_C(C35.2, R132.1, C98.1)
NET_C(C98.2, R133.1, R118.1)
NET_C(R118.2, MIX_L)
// Torpedo (R)
NET_C(RTORP.Q, R55.1, D12.A, D9.A)
NET_C(R55.2, V5)
NET_C(D12.K, C8.1, R52.1)
NET_C(D9.K, C12.1, R16.1)
NET_C(C8.2, C12.2, R134.2, R135.2, GND)
NET_C(R16.2, IC2_A.PLUS)
NET_C(R15.1, V12)
NET_C(R15.2, C3.1, R8.1, IC2_A.MINUS)
NET_C(R8.2, C3.2, IC2_A.OUT, R41.1)
NET_C(R41.2, R52.2, IC14_A.PLUS)
NET_C(NOISE, R50.1)
NET_C(R50.2, R49.1, IC14_A.MINUS)
NET_C(R49.2, C37.1, IC14_A.OUT)
NET_C(C37.2, R134.1, C97.1)
NET_C(C97.2, R135.1, R109.1)
NET_C(R109.2, MIX_R)
// Ship Partial Hit (L)
NET_C(LSHPHT.Q, R94.1, D6.A)
NET_C(R94.2, V5)
NET_C(D6.K, C13.1, R32.1)
NET_C(C13.2, C49.2, C22.2, GND)
NET_C(R32.2, IC4_D.PLUS)
NET_C(NOISE, R31.1)
NET_C(R31.2, R33.1, IC4_D.MINUS)
NET_C(R33.2, R34.1, IC4_D.OUT)
NET_C(R34.2, C49.1, R74.1)
NET_C(R74.2, C22.1, R78.1)
NET_C(R78.2, MIX_L)
// Ship Partial Hit (R)
NET_C(RSHPHT.Q, R99.1, D13.A)
NET_C(R99.2, V5)
NET_C(D13.K, C6.1, R40.1)
NET_C(C6.2, C39.2, C40.2, GND)
NET_C(R40.2, IC14_D.PLUS)
NET_C(NOISE, R44.1)
NET_C(R44.2, R45.1, IC14_D.MINUS)
NET_C(R45.2, R48.1, IC14_D.OUT)
NET_C(R48.2, C39.1, R43.1)
NET_C(R43.2, C40.1, R61.1)
NET_C(R61.2, MIX_L)
// Torpedo Collision
NET_C(TORPCOLL.Q, R95.1, D1.A)
NET_C(R95.2, V5)
NET_C(D1.K, C11.1, R10.1)
NET_C(C11.2, C4.2, C38.2, GND)
NET_C(R10.2, IC2_D.PLUS)
NET_C(NOISE, R11.1)
NET_C(R11.2, R9.1, IC2_D.MINUS)
NET_C(R9.2, R12.1, IC2_D.OUT)
NET_C(R12.2, C4.1, R13.1)
NET_C(R13.2, C38.1, R76.1, R77.1)
NET_C(R77.2, MIX_L)
NET_C(R76.2, MIX_R)
// Mixers (shared)
NET_C(SOUND_OFF.Q, D4.A, D5.A)

View File

@ -1,11 +1,13 @@
// license:BSD-3-Clause
// copyright-holders:Dan Boris, Olivier Galibert, Aaron Giles
// copyright-holders:Dan Boris, Olivier Galibert, Aaron Giles, Ryan Holtz
/***************************************************************************
Star Fire/Fire One system
driver by Daniel Boris, Olivier Galibert, Aaron Giles
netlist audio by Ryan Holtz
****************************************************************************
Memory map
@ -44,6 +46,9 @@ 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.
***************************************************************************/
#include "emu.h"
@ -132,12 +137,17 @@ void fireone_state::sound_w(offs_t offset, uint8_t data)
{
if (offset == 0)
{
m_sound_left_torpedo->write(BIT(data, 0));
m_sound_left_partial_hit->write(BIT(data, 1));
m_sound_left_boom->write(BIT(data, 2));
m_player_select = BIT(~data, 3);
}
else
{
m_sound_right_torpedo->write(BIT(data, 0));
m_sound_right_partial_hit->write(BIT(data, 1));
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_sonar_sync->write(BIT(data, 6));
m_sound_sonar_enable->write(BIT(~data, 7));
@ -397,7 +407,7 @@ void fireone_state::fireone(machine_config &config)
NETLIST_SOUND(config, "sound_nl", 48000)
.set_source(NETLIST_NAME(fireone))
.add_route(0, "lspeaker", 1.0)
.add_route(0, "rspeaker", 1.0);
.add_route(1, "rspeaker", 1.0);
NETLIST_LOGIC_INPUT(config, "sound_nl:ltorp", "LTORP.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:lshpht", "LSHPHT.IN", 0);
@ -406,6 +416,7 @@ void fireone_state::fireone(machine_config &config)
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);
NETLIST_LOGIC_INPUT(config, "sound_nl:torpcoll", "TORPCOLL.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:subeng", "SUBENG.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:alert", "ALERT.IN", 0);
NETLIST_LOGIC_INPUT(config, "sound_nl:sonar_enable", "SONAR_ENABLE.POS", 0);
@ -413,8 +424,8 @@ void fireone_state::fireone(machine_config &config)
NETLIST_ANALOG_INPUT(config, "sound_nl:volume_l", "R64.DIAL");
NETLIST_ANALOG_INPUT(config, "sound_nl:volume_r", "R65.DIAL");
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "OUT_L").set_mult_offset(500000.0, 0.0);
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout1", 1, "OUT_R").set_mult_offset(500000.0, 0.0);
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "OUT_L").set_mult_offset(100000.0, 0.0);
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout1", 1, "OUT_R").set_mult_offset(100000.0, 0.0);
}
void starfire_state::starfire(machine_config &config)
@ -526,5 +537,5 @@ 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_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 )

View File

@ -116,8 +116,13 @@ public:
fireone_state(const machine_config &mconfig, device_type type, const char *tag)
: starfire_base_state(mconfig, type, tag)
, m_controls(*this, "P%u", 1U)
, m_sound_left_partial_hit(*this, "sound_nl:lshpht")
, m_sound_right_partial_hit(*this, "sound_nl:rshpht")
, m_sound_left_torpedo(*this, "sound_nl:ltorp")
, m_sound_right_torpedo(*this, "sound_nl:rtorp")
, m_sound_left_boom(*this, "sound_nl:lboom")
, 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_sonar_enable(*this, "sound_nl:sonar_enable")
, m_sound_sonar_sync(*this, "sound_nl:sonar_sync")
@ -138,8 +143,13 @@ private:
INTERRUPT_GEN_MEMBER(vblank_int);
required_device<netlist_mame_logic_input_device> m_sound_left_partial_hit;
required_device<netlist_mame_logic_input_device> m_sound_right_partial_hit;
required_device<netlist_mame_logic_input_device> m_sound_left_torpedo;
required_device<netlist_mame_logic_input_device> m_sound_right_torpedo;
required_device<netlist_mame_logic_input_device> m_sound_left_boom;
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_sonar_enable;
required_device<netlist_mame_logic_input_device> m_sound_sonar_sync;