mirror of
https://github.com/holub/mame
synced 2025-06-06 21:03:47 +03:00
sspeedr: new netlist audio implementation (#7081)
* sspeedr: new netlist audio implementation Netlist-based audio implementation for sspeedr (Super Speed Race, 1979) derived from Midway audio schematics, and based on that used for 280zzzap (280-ZZZAP) and lagunar (Laguna Racer) in the mw8080bw driver. The Super Speed Race audio circuits are clearly derived from those games; the biggest difference is the use of a linear feedback shift register for noise generation. * Updated netlist static solvers with recent netlist changes.
This commit is contained in:
parent
d9024aef70
commit
f7d786d3d0
@ -2845,6 +2845,8 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/seattle.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/sspeedr.cpp",
|
||||
MAME_DIR .. "src/mame/includes/sspeedr.h",
|
||||
MAME_DIR .. "src/mame/audio/nl_sspeedr.cpp",
|
||||
MAME_DIR .. "src/mame/audio/nl_sspeedr.h",
|
||||
MAME_DIR .. "src/mame/video/sspeedr.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/starrider.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/tmaster.cpp",
|
||||
|
@ -212,6 +212,13 @@ files{
|
||||
MAME_DIR .. "src/mame/audio/nl_280zzzap.cpp",
|
||||
MAME_DIR .. "src/mame/audio/nl_280zzzap.h",
|
||||
|
||||
MAME_DIR .. "src/mame/drivers/sspeedr.cpp",
|
||||
MAME_DIR .. "src/mame/includes/sspeedr.h",
|
||||
MAME_DIR .. "src/mame/video/sspeedr.cpp",
|
||||
|
||||
MAME_DIR .. "src/mame/audio/nl_sspeedr.cpp",
|
||||
MAME_DIR .. "src/mame/audio/nl_sspeedr.h",
|
||||
|
||||
MAME_DIR .. "src/mame/audio/cheekyms.cpp",
|
||||
MAME_DIR .. "src/mame/audio/cheekyms.h",
|
||||
MAME_DIR .. "src/mame/audio/nl_cheekyms.cpp",
|
||||
|
File diff suppressed because it is too large
Load Diff
651
src/mame/audio/nl_sspeedr.cpp
Normal file
651
src/mame/audio/nl_sspeedr.cpp
Normal file
@ -0,0 +1,651 @@
|
||||
// license:CC0
|
||||
// copyright-holders:Colin Douglas Howell
|
||||
|
||||
#include "netlist/devices/net_lib.h"
|
||||
|
||||
|
||||
// This is a netlist description for the sound circuits of Midway's Super
|
||||
// Speed Race, based on the schematics in _Midway's Super Speed Race Parts and
|
||||
// Operating Manual_. These circuits are generally quite similar to those in
|
||||
// Midway's earlier games 280-ZZZAP and Laguna Racer (see nl_280zzzap.cpp),
|
||||
// but the Super Speed Race circuits have some significant changes, and their
|
||||
// board layout is different.
|
||||
|
||||
// The components are all labeled as they are on the Super Speed Race
|
||||
// schematics, except that since the noise generator discrete components are
|
||||
// on the main motherboard and thus may have the same labels as components on
|
||||
// the audio board, a prefix "NOISE_" has been added to their labels. Each
|
||||
// LM3900 IC contains 4 op-amps, so I have labeled these op-amps as _1 to _4,
|
||||
// the same scheme used in the LM3900 datasheet, using the pin numbers on the
|
||||
// schematic to identify the specific op-amp. Likewise, each CD4016 IC
|
||||
// contains 4 switches, so I identify a specific switch from its pin numbers
|
||||
// on the schematic; these are labeled _A through _D in the CD4016 datasheet,
|
||||
// so I use that scheme.
|
||||
|
||||
// The sound circuitry can be divided into three sections: engine sound
|
||||
// generation and control, generation of noise-based sound effects (skidding
|
||||
// and crashes), and the final mix and amplification of all sounds.
|
||||
|
||||
// For detailed descriptions of these circuits, see the 280-ZZZAP/Laguna Racer
|
||||
// netlist, nl_280zzzap.cpp. I do not repeat those descriptions here.
|
||||
|
||||
|
||||
// Include special frontiers within engine sound oscillators whose purpose is
|
||||
// to improve solution convergence by reducing the oscillators' inherent
|
||||
// numeric instability. Also adjusts values of resistors associated with these
|
||||
// oscillators to maintain their frequency and voltage levels.
|
||||
|
||||
#define CONVERGENCE_FRONTIERS 1
|
||||
|
||||
// Enable a voltage limiter on the output of the op-amp which generates the
|
||||
// post-crash sound. This removes voltage glitches from the output which would
|
||||
// otherwise be audible when the netlist is run with a fixed 48 kHz timestep,
|
||||
// as it is in MAME.
|
||||
|
||||
#define REMOVE_POST_CRASH_NOISE_GLITCHES 1
|
||||
|
||||
|
||||
static NETLIST_START(sspeedr_noisegen)
|
||||
|
||||
// See p. 25 of the Super Speed Race manual for the motherboard
|
||||
// schematic, which includes the noise generator.
|
||||
|
||||
// This is a digital noise source of 12-volt amplitude, formed by a
|
||||
// linear-feedback shift register driven by a 4 kHz clock.
|
||||
|
||||
CD4006_DIP(H5_SHFTREG)
|
||||
CD4070_DIP(J5_XORx4)
|
||||
|
||||
NET_C(I_V12.Q, H5_SHFTREG.14, J5_XORx4.14)
|
||||
NET_C(GND, H5_SHFTREG.7, J5_XORx4.7)
|
||||
NET_C(GND, J5_XORx4.8, J5_XORx4.9)
|
||||
|
||||
RES(NOISE_R22, RES_K(680))
|
||||
RES(NOISE_R23, RES_K(56))
|
||||
RES(NOISE_R24, RES_K(27))
|
||||
RES(NOISE_R25, RES_K(220))
|
||||
RES(NOISE_R62, RES_M(1))
|
||||
|
||||
// The following is a very low-valued dummy resistance inserted to
|
||||
// make the noise source's startup circuit voltage behave properly;
|
||||
// without this it just stays at zero from the beginning and the
|
||||
// generator refuses to start:
|
||||
RES(NOISE_RDUMMY, RES_R(1))
|
||||
|
||||
CAP(NOISE_C8, CAP_U(0.001))
|
||||
CAP(NOISE_C9, CAP_U(0.1))
|
||||
DIODE(NOISE_CR3, "1N4148")
|
||||
|
||||
NET_C(GND, J5_XORx4.6)
|
||||
NET_C(J5_XORx4.4, J5_XORx4.12, NOISE_C8.1)
|
||||
NET_C(I_V12.Q, J5_XORx4.13)
|
||||
NET_C(J5_XORx4.11, H5_SHFTREG.3, NOISE_R23.1)
|
||||
NET_C(NOISE_R23.2, NOISE_C8.2, NOISE_R22.1)
|
||||
NET_C(NOISE_R22.2, J5_XORx4.5)
|
||||
|
||||
NET_C(H5_SHFTREG.13, H5_SHFTREG.5)
|
||||
NET_C(H5_SHFTREG.12, H5_SHFTREG.1, J5_XORx4.1)
|
||||
NET_C(H5_SHFTREG.8, J5_XORx4.2)
|
||||
NET_C(H5_SHFTREG.10, H5_SHFTREG.6)
|
||||
NET_C(NOISE_R24.2, H5_SHFTREG.4)
|
||||
NET_C(J5_XORx4.3, NOISE_R25.1)
|
||||
NET_C(NOISE_R25.2, NOISE_CR3.K, NOISE_R24.1)
|
||||
NET_C(NOISE_C9.2, NOISE_CR3.A, NOISE_R62.1)
|
||||
NET_C(I_V12.Q, NOISE_RDUMMY.1)
|
||||
NET_C(NOISE_RDUMMY.2, NOISE_C9.1)
|
||||
NET_C(NOISE_R62.2, GND)
|
||||
|
||||
ALIAS(NOISE_OUT, H5_SHFTREG.10)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
|
||||
//
|
||||
// Main netlist
|
||||
//
|
||||
|
||||
|
||||
static NETLIST_START(sspeedr_schematics)
|
||||
|
||||
// **** Conversion of accelerator level to "engine speed" control
|
||||
// **** voltage for engine sound, with capacitor-based "engine
|
||||
// **** inertia" and gear shift changes.
|
||||
|
||||
CD4016_DIP(A2)
|
||||
|
||||
LM3900(C1_3)
|
||||
LM3900(C1_4)
|
||||
|
||||
RES(R42, RES_K(1))
|
||||
RES(R43, RES_K(1))
|
||||
RES(R44, RES_K(1))
|
||||
RES(R45, RES_K(1))
|
||||
RES(R62, RES_K(1))
|
||||
RES(R61, RES_K(1))
|
||||
|
||||
RES(R51, RES_K(470))
|
||||
RES(R46, RES_M(2.2))
|
||||
RES(R47, RES_M(1))
|
||||
RES(R48, RES_K(470))
|
||||
RES(R49, RES_K(240))
|
||||
|
||||
RES(R50, RES_K(100))
|
||||
CAP(C30, CAP_U(1))
|
||||
RES(R53, RES_K(47))
|
||||
RES(R52, RES_K(10))
|
||||
RES(R56, RES_R(270))
|
||||
|
||||
RES(R54, RES_K(560))
|
||||
RES(R55, RES_M(4.7))
|
||||
|
||||
RES(R57, RES_M(2.7))
|
||||
RES(R58, RES_K(560))
|
||||
|
||||
RES(R59, RES_K(560))
|
||||
RES(R60, RES_K(10))
|
||||
|
||||
CAP(C18, CAP_U(22))
|
||||
|
||||
NET_C(C18.2, GND)
|
||||
|
||||
CAP(C19, CAP_U(2.2))
|
||||
|
||||
DIODE(D4, 1N914)
|
||||
DIODE(D5, 1N914)
|
||||
|
||||
NET_C(I_V5.Q, R42.1, R43.1, R44.1, R45.1, R62.1, R61.1, R51.1,
|
||||
R55.1, R57.1)
|
||||
|
||||
NET_C(PEDAL_BIT0, R42.2, R46.1)
|
||||
NET_C(PEDAL_BIT1, R43.2, R47.1)
|
||||
NET_C(PEDAL_BIT2, R44.2, R48.1)
|
||||
NET_C(PEDAL_BIT3, R45.2, R49.1)
|
||||
NET_C(C1_3.PLUS, R46.2, R47.2, R48.2, R49.2, R51.2)
|
||||
NET_C(C1_3.MINUS, R50.2, C30.2)
|
||||
NET_C(C1_3.OUT, R50.1, C30.1, R53.1, D4.K)
|
||||
NET_C(R53.2, R52.1, C18.1, R56.2, R54.1)
|
||||
NET_C(R52.2, D4.A)
|
||||
NET_C(C1_4.PLUS, R54.2, R55.2)
|
||||
NET_C(C1_4.MINUS, R58.2, R57.2, A2.4)
|
||||
// The following are only local connections to C1_4.OUT. It also runs
|
||||
// to all the oscillators; those connections are listed further down.
|
||||
NET_C(C1_4.OUT, D5.A, R59.1)
|
||||
NET_C(D5.K, R58.1)
|
||||
NET_C(C19.1, R59.2, R60.2)
|
||||
|
||||
NET_C(A2.1, GND)
|
||||
NET_C(A2.2, R56.1)
|
||||
NET_C(A2.13, ENGINE_SOUND_OFF)
|
||||
|
||||
NET_C(A2.5, R62.2, HI_SHIFT)
|
||||
|
||||
NET_C(A2.3, A2.8, C19.2)
|
||||
NET_C(A2.9, R60.1)
|
||||
NET_C(A2.6, R61.2, LO_SHIFT)
|
||||
|
||||
|
||||
// **** Engine sound generation, using three triangle-wave oscillators
|
||||
// **** running at frequency and amplitude determined by engine speed
|
||||
// **** control voltage and modulated by MC3340 amplifier/attenuator.
|
||||
|
||||
// These are the remaining connections from C1_4.OUT:
|
||||
NET_C(C1_4.OUT, R36.1, R37.1, R31.1, R32.1, R29.1, R30.1)
|
||||
|
||||
MC3340_DIP(MC3340_F1)
|
||||
|
||||
CD4016_DIP(B1)
|
||||
|
||||
// First oscillator (bottommost in schematics).
|
||||
|
||||
LM3900(C1_2)
|
||||
LM3900(C1_1)
|
||||
|
||||
RES(R36, RES_K(560))
|
||||
RES(R37, RES_K(270))
|
||||
RES(R38, RES_K(100))
|
||||
RES(R41, RES_K(10))
|
||||
NET_C(R41.2, GND)
|
||||
|
||||
#if CONVERGENCE_FRONTIERS
|
||||
// Schmitt trigger resistors changed to compensate for waveform changes
|
||||
// from use of frontier:
|
||||
RES(R39, RES_K(465.0))
|
||||
RES(R40, RES_K(275.0))
|
||||
#else
|
||||
RES(R39, RES_K(470))
|
||||
RES(R40, RES_K(270))
|
||||
#endif
|
||||
|
||||
CAP(C17, CAP_U(0.022))
|
||||
|
||||
DIODE(D3, 1N914)
|
||||
|
||||
NET_C(R37.2, B1.10)
|
||||
NET_C(B1.11, C1_2.PLUS)
|
||||
NET_C(R36.2, C1_2.MINUS, C17.1)
|
||||
NET_C(C1_2.OUT, C17.2, R38.1, D3.A)
|
||||
NET_C(R38.2, C1_1.MINUS)
|
||||
NET_C(C1_1.OUT, R40.1, B1.12)
|
||||
NET_C(I_V5.Q, R39.1)
|
||||
NET_C(C1_1.PLUS, R39.2, R40.2)
|
||||
NET_C(R41.1, D3.K, D2.K, C16.1)
|
||||
|
||||
// Second oscillator (middle in schematics).
|
||||
|
||||
LM3900(A1_3)
|
||||
LM3900(A1_4)
|
||||
|
||||
RES(R31, RES_K(300))
|
||||
RES(R32, RES_K(150))
|
||||
RES(R33, RES_K(100))
|
||||
|
||||
#if CONVERGENCE_FRONTIERS
|
||||
// Schmitt trigger resistors changed to compensate for waveform changes
|
||||
// from use of frontier:
|
||||
RES(R34, RES_K(460))
|
||||
RES(R35, RES_K(281))
|
||||
#else
|
||||
RES(R34, RES_K(470))
|
||||
RES(R35, RES_K(270))
|
||||
#endif
|
||||
|
||||
CAP(C15, CAP_U(0.01))
|
||||
|
||||
CAP(C16, CAP_U(10))
|
||||
|
||||
DIODE(D2, 1N914)
|
||||
|
||||
NET_C(R32.2, B1.4)
|
||||
NET_C(B1.3, A1_3.PLUS)
|
||||
NET_C(R31.2, A1_3.MINUS, C15.1)
|
||||
NET_C(A1_3.OUT, C15.2, R33.1, D2.A)
|
||||
NET_C(R33.2, A1_4.MINUS)
|
||||
NET_C(A1_4.OUT, R35.1, B1.5)
|
||||
NET_C(I_V5.Q, R34.1)
|
||||
NET_C(A1_4.PLUS, R34.2, R35.2)
|
||||
NET_C(C16.2, MC3340_F1.1) // to MC3340 input pin
|
||||
|
||||
// Third oscillator (topmost in schematics).
|
||||
|
||||
LM3900(A1_2)
|
||||
LM3900(A1_1)
|
||||
|
||||
RES(R29, RES_K(220))
|
||||
|
||||
RES(R30, RES_K(100))
|
||||
|
||||
RES(R28, RES_K(100))
|
||||
|
||||
#if CONVERGENCE_FRONTIERS
|
||||
// Schmitt trigger resistors changed to compensate for waveform changes
|
||||
// from use of frontier.
|
||||
RES(R26, RES_K(453))
|
||||
RES(R27, RES_K(286))
|
||||
#else
|
||||
RES(R26, RES_K(470))
|
||||
RES(R27, RES_K(270))
|
||||
#endif
|
||||
|
||||
CAP(C14, CAP_U(0.01))
|
||||
|
||||
RES(R23, RES_K(10))
|
||||
NET_C(R23.1, I_V5.Q)
|
||||
|
||||
RES(R25, RES_K(3.3))
|
||||
NET_C(R25.2, GND)
|
||||
|
||||
CAP(C13, CAP_U(10))
|
||||
|
||||
RES(R22, RES_R(470))
|
||||
|
||||
DIODE(D1, 1N914)
|
||||
|
||||
NET_C(I_V5.Q, R22.1)
|
||||
NET_C(ENGINE_SOUND_OFF, R22.2, D1.A)
|
||||
|
||||
NET_C(R30.2, B1.1)
|
||||
NET_C(B1.2, A1_2.PLUS)
|
||||
NET_C(R29.2, A1_2.MINUS, C14.1)
|
||||
NET_C(A1_2.OUT, C14.2, R28.1, C13.1)
|
||||
NET_C(R28.2, A1_1.MINUS)
|
||||
NET_C(A1_1.OUT, R27.1, B1.13)
|
||||
NET_C(I_V5.Q, R26.1)
|
||||
NET_C(A1_1.PLUS, R26.2, R27.2)
|
||||
NET_C(D1.K, R23.2, C13.2, R25.1, MC3340_F1.2) // to MC3340 ctrl pin
|
||||
|
||||
// The MC3340's output is the complete engine sound, which is sent to
|
||||
// the final mix.
|
||||
|
||||
|
||||
// **** Noise generation and noise-based sound effects: tire skid
|
||||
// **** (NOISE_CR_1), boom from crash (BOOM), post-crash noise
|
||||
// **** (NOISE_CR_2).
|
||||
|
||||
// The noise generator circuit for Super Speed Race is a
|
||||
// linear-feedback shift register on the main motherboard which
|
||||
// generates a digital random noise signal. This digital noise gets
|
||||
// smoothed and filtered into continuous analog form in the same way
|
||||
// as in 280-ZZZAP and Laguna Racer, and the noise-based sound effect
|
||||
// circuits are similar.
|
||||
|
||||
CAP(C1, CAP_U(10))
|
||||
|
||||
LOCAL_SOURCE(sspeedr_noisegen)
|
||||
INCLUDE(sspeedr_noisegen)
|
||||
|
||||
NET_C(NOISE_OUT, C1.1)
|
||||
|
||||
NET_C(C1.2, R1.1)
|
||||
|
||||
// The noise generator is followed by a single-amplifier active
|
||||
// low-pass filter which converts the digital noise waveform into a
|
||||
// smoother analog noise waveform.
|
||||
|
||||
RES(R1, RES_K(680))
|
||||
|
||||
LM3900(H2_1)
|
||||
|
||||
CAP(C2, CAP_P(6800))
|
||||
RES(R2, RES_K(10))
|
||||
RES(R3, RES_K(820))
|
||||
RES(R4, RES_K(270))
|
||||
CAP(C3, CAP_P(220))
|
||||
|
||||
NET_C(R1.2, C2.1, R2.1, R4.1)
|
||||
NET_C(C2.2, GND)
|
||||
NET_C(H2_1.MINUS, R2.2, C3.1)
|
||||
NET_C(I_V5.Q, R3.1)
|
||||
NET_C(H2_1.PLUS, R3.2)
|
||||
NET_C(H2_1.OUT, C3.2, R4.2, R5.1, R17.1, C5.1, C4.1)
|
||||
|
||||
// The smoothed analog noise is passed to three different sound-effect
|
||||
// circuits, each of which is also an active-filter type.
|
||||
|
||||
// First noise circuit: tire skid (NOISE_CR_1), a two-amplifier active
|
||||
// bandpass filter.
|
||||
|
||||
CD4016_DIP(E2)
|
||||
|
||||
LM3900(H2_3)
|
||||
|
||||
RES(R5, RES_K(39))
|
||||
RES(R6, RES_R(62))
|
||||
RES(R7, RES_K(82))
|
||||
RES(R8, RES_K(39))
|
||||
|
||||
CAP(C7, CAP_U(0.1))
|
||||
CAP(C8, CAP_U(0.1))
|
||||
CAP(C25, CAP_U(0.1))
|
||||
|
||||
NET_C(R5.2, R6.1, C7.1, C8.1, R12.1)
|
||||
NET_C(R6.2, GND)
|
||||
NET_C(H2_3.MINUS, C7.2, R8.1)
|
||||
NET_C(I_V5.Q, R7.1)
|
||||
NET_C(H2_3.PLUS, R7.2)
|
||||
NET_C(H2_3.OUT, R8.2, C8.2, E2.10)
|
||||
NET_C(E2.11, C25.1)
|
||||
NET_C(C25.2, R9.1)
|
||||
|
||||
LM3900(J1_2)
|
||||
|
||||
// Unlike the other LM3900s, those on chip J1 get 12-volt power.
|
||||
NET_C(I_V12.Q, J1_2.VCC)
|
||||
NET_C(GND, J1_2.GND)
|
||||
|
||||
RES(R9, RES_K(39))
|
||||
RES(R10, RES_K(240))
|
||||
RES(R11, RES_K(120))
|
||||
RES(R12, RES_K(62))
|
||||
|
||||
NET_C(J1_2.MINUS, R9.2, R11.1)
|
||||
NET_C(I_V5.Q, R10.1)
|
||||
NET_C(J1_2.PLUS, R10.2)
|
||||
NET_C(J1_2.OUT, R11.2, R12.2, E2.4)
|
||||
NET_C(E2.3, R63.1)
|
||||
NET_C(E2.5, E2.12, NOISE_CR_1)
|
||||
|
||||
// Second noise circuit: secondary crash noise (NOISE_CR_2), a
|
||||
// single-amplifier active low-pass filter.
|
||||
|
||||
RES(R17, RES_K(10))
|
||||
|
||||
CAP(C5, CAP_U(10))
|
||||
CAP(C4, CAP_U(0.022))
|
||||
|
||||
LM3900(H2_2)
|
||||
|
||||
RES(R16, RES_K(1.5))
|
||||
RES(R15, RES_K(15))
|
||||
RES(R14, RES_M(2.7))
|
||||
RES(R13, RES_K(150))
|
||||
|
||||
CAP(C6, CAP_U(0.01))
|
||||
CAP(C9, CAP_U(0.001))
|
||||
|
||||
NET_C(C4.2, R16.1)
|
||||
NET_C(R16.2, C6.1, R15.1, R13.1)
|
||||
NET_C(C6.2, GND)
|
||||
NET_C(H2_2.MINUS, R15.2, C9.1)
|
||||
NET_C(I_V5.Q, R14.1)
|
||||
NET_C(H2_2.PLUS, R14.2)
|
||||
#if REMOVE_POST_CRASH_NOISE_GLITCHES
|
||||
// With the static time-stepping used to ensure acceptable performance
|
||||
// with MAME, this part of the netlist will generate extra spikes on
|
||||
// the op-amp output with voltages outside of the real op-amp's output
|
||||
// range. These spikes give the sound an unwanted "grittiness" not in
|
||||
// the original, so I've added a voltage-limiting AFUNC to the op-amp
|
||||
// output beyond its feedback connection. This gives a smoother sound,
|
||||
// closer to the original.
|
||||
|
||||
NET_C(H2_2.OUT, C9.2, R13.2, H2_2_LIM.A0)
|
||||
AFUNC(H2_2_LIM, 1, "max(min(A0, 4.5), 0)")
|
||||
NET_C(H2_2_LIM.Q, E2.8)
|
||||
#else
|
||||
NET_C(H2_2.OUT, C9.2, R13.2, E2.8)
|
||||
#endif
|
||||
NET_C(E2.9, R64.1)
|
||||
NET_C(E2.6, NOISE_CR_2)
|
||||
|
||||
// Third noise circuit: boom from crash (BOOM), a single-amplifier
|
||||
// active bandpass filter.
|
||||
|
||||
LM3900(H2_4)
|
||||
|
||||
RES(R18, RES_K(20))
|
||||
|
||||
RES(R19, RES_K(1))
|
||||
RES(R20, RES_M(3.3))
|
||||
RES(R21, RES_M(1.5))
|
||||
|
||||
CAP(C10, CAP_U(0.1))
|
||||
CAP(C11, CAP_U(0.1))
|
||||
|
||||
NET_C(R17.2, C5.2, E2.1)
|
||||
NET_C(E2.2, R18.1)
|
||||
NET_C(E2.13, BOOM)
|
||||
NET_C(R18.2, R19.1, C10.1, C11.1)
|
||||
NET_C(R19.2, GND)
|
||||
NET_C(H2_4.MINUS, C10.2, R21.1)
|
||||
NET_C(I_V5.Q, R20.1)
|
||||
NET_C(H2_4.PLUS, R20.2)
|
||||
NET_C(H2_4.OUT, R21.2, C11.2, R65.1)
|
||||
|
||||
|
||||
// **** Final mix of sound effects and sound preamplification.
|
||||
|
||||
RES(R63, RES_K(3))
|
||||
RES(R64, RES_K(150))
|
||||
|
||||
RES(R65, RES_K(12))
|
||||
|
||||
RES(R66, RES_K(33))
|
||||
|
||||
CAP(C20, CAP_U(1.0))
|
||||
CAP(C21, CAP_U(10))
|
||||
|
||||
NET_C(R63.2, R64.2, R65.2, C20.1)
|
||||
NET_C(MC3340_F1.7, R66.1) // MC3340 output pin
|
||||
NET_C(R66.2, C21.1)
|
||||
|
||||
LM3900(J1_4)
|
||||
LM3900(J1_1)
|
||||
|
||||
NET_C(I_V12.Q, J1_4.VCC, J1_1.VCC)
|
||||
NET_C(GND, J1_4.GND, J1_1.GND)
|
||||
|
||||
RES(R67, RES_K(2))
|
||||
CAP(C22, CAP_U(10))
|
||||
RES(R68, RES_K(220))
|
||||
RES(R74, RES_K(220))
|
||||
|
||||
NET_C(I_V12.Q, R67.1)
|
||||
NET_C(R67.2, C22.1, R68.1, R74.1)
|
||||
NET_C(C22.2, GND)
|
||||
NET_C(J1_4.PLUS, R68.2)
|
||||
NET_C(J1_1.PLUS, R74.2)
|
||||
|
||||
RES(R69, RES_K(100))
|
||||
POT2(R70, RES_K(50)) // Master volume potentiometer (2 terminals)
|
||||
CAP(C23, CAP_U(10))
|
||||
CAP(C24, CAP_U(0.1))
|
||||
RES(R73, RES_K(100))
|
||||
RES(R75, RES_K(100))
|
||||
|
||||
DIODE(D6, 1N914)
|
||||
DIODE(D7, 1N914)
|
||||
RES(R71, RES_K(10))
|
||||
RES(R72, RES_K(10))
|
||||
|
||||
NET_C(SILENCE, D6.A, D7.A)
|
||||
NET_C(D6.K, R71.1)
|
||||
NET_C(D7.K, R72.1)
|
||||
|
||||
NET_C(R70.2, C23.2)
|
||||
NET_C(J1_4.MINUS, C20.2, C21.2, R69.1, R70.1, R71.2)
|
||||
NET_C(J1_4.OUT, C23.1, R69.2, C24.1)
|
||||
NET_C(C24.2, R73.1)
|
||||
NET_C(J1_1.MINUS, R73.2, R75.1, R72.2)
|
||||
NET_C(J1_1.OUT, R75.2)
|
||||
|
||||
ALIAS(OUTPUT, J1_1.OUT)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
|
||||
NETLIST_START(sspeedr)
|
||||
|
||||
SOLVER(Solver, 48000)
|
||||
|
||||
ANALOG_INPUT(I_V12, 12)
|
||||
ANALOG_INPUT(I_V5, 5)
|
||||
|
||||
LOCAL_SOURCE(sspeedr_schematics)
|
||||
INCLUDE(sspeedr_schematics)
|
||||
|
||||
// The MC3340 gets 5-volt power in Super Speed Race.
|
||||
NET_C(I_V5.Q, MC3340_F1.8)
|
||||
NET_C(GND, MC3340_F1.3)
|
||||
|
||||
// Logic inputs which represent output pins from 74174 latches at C2
|
||||
// and D2
|
||||
LOGIC_INPUT(I_F4_2, 0, "74XX") // BOOM
|
||||
LOGIC_INPUT(I_F4_5, 0, "74XX") // ENGINE SOUND OFF
|
||||
LOGIC_INPUT(I_F4_7, 0, "74XX") // NOISE CR 1
|
||||
LOGIC_INPUT(I_F4_10, 0, "74XX") // NOISE CR 2
|
||||
LOGIC_INPUT(I_F4_12, 0, "74XX") // SILENCE
|
||||
LOGIC_INPUT(I_F5_2, 1, "74XX") // PEDAL_BIT0
|
||||
LOGIC_INPUT(I_F5_5, 1, "74XX") // PEDAL_BIT1
|
||||
LOGIC_INPUT(I_F5_7, 1, "74XX") // PEDAL_BIT2
|
||||
LOGIC_INPUT(I_F5_10, 1, "74XX") // PEDAL_BIT3
|
||||
LOGIC_INPUT(I_F5_12, 0, "74XX") // HI SHIFT
|
||||
LOGIC_INPUT(I_F5_15, 1, "74XX") // LO SHIFT
|
||||
|
||||
ALIAS(I_BOOM, I_F4_2.IN)
|
||||
ALIAS(I_ENGINE_SOUND_OFF, I_F4_5.IN)
|
||||
ALIAS(I_NOISE_CR_1, I_F4_7.IN)
|
||||
ALIAS(I_NOISE_CR_2, I_F4_10.IN)
|
||||
ALIAS(I_SILENCE, I_F4_12.IN)
|
||||
ALIAS(I_PEDAL_BIT0, I_F5_2.IN)
|
||||
ALIAS(I_PEDAL_BIT1, I_F5_5.IN)
|
||||
ALIAS(I_PEDAL_BIT2, I_F5_7.IN)
|
||||
ALIAS(I_PEDAL_BIT3, I_F5_10.IN)
|
||||
ALIAS(I_HI_SHIFT, I_F5_12.IN)
|
||||
ALIAS(I_LO_SHIFT, I_F5_15.IN)
|
||||
|
||||
ALIAS(BOOM, I_F4_2.Q)
|
||||
ALIAS(ENGINE_SOUND_OFF, I_F4_5.Q)
|
||||
ALIAS(NOISE_CR_1, I_F4_7.Q)
|
||||
ALIAS(NOISE_CR_2, I_F4_10.Q)
|
||||
ALIAS(SILENCE, I_F4_12.Q)
|
||||
ALIAS(PEDAL_BIT0, I_F5_2.Q)
|
||||
ALIAS(PEDAL_BIT1, I_F5_5.Q)
|
||||
ALIAS(PEDAL_BIT2, I_F5_7.Q)
|
||||
ALIAS(PEDAL_BIT3, I_F5_10.Q)
|
||||
ALIAS(HI_SHIFT, I_F5_12.Q)
|
||||
ALIAS(LO_SHIFT, I_F5_15.Q)
|
||||
|
||||
// Power pins for logic inputs:
|
||||
NET_C(I_V5.Q,
|
||||
I_F4_2.VCC, I_F4_5.VCC, I_F4_7.VCC, I_F4_10.VCC, I_F4_12.VCC,
|
||||
I_F5_2.VCC, I_F5_5.VCC, I_F5_7.VCC, I_F5_10.VCC, I_F5_12.VCC,
|
||||
I_F5_15.VCC)
|
||||
NET_C(GND,
|
||||
I_F4_2.GND, I_F4_5.GND, I_F4_7.GND, I_F4_10.GND, I_F4_12.GND,
|
||||
I_F5_2.GND, I_F5_5.GND, I_F5_7.GND, I_F5_10.GND, I_F5_12.GND,
|
||||
I_F5_15.GND)
|
||||
|
||||
// 5-volt power for most of the LM3900 op-amps.
|
||||
NET_C(I_V5.Q,
|
||||
H2_1.VCC, H2_3.VCC,
|
||||
H2_4.VCC, H2_2.VCC, C1_3.VCC, C1_4.VCC,
|
||||
A1_1.VCC, A1_2.VCC, A1_3.VCC, A1_4.VCC,
|
||||
C1_1.VCC, C1_2.VCC)
|
||||
NET_C(GND,
|
||||
H2_1.GND, H2_3.GND,
|
||||
H2_4.GND, H2_2.GND, C1_3.GND, C1_4.GND,
|
||||
A1_1.GND, A1_2.GND, A1_3.GND, A1_4.GND,
|
||||
C1_1.GND, C1_2.GND)
|
||||
|
||||
// 5-volt power for the CD4016 switches.
|
||||
NET_C(I_V5.Q, A2.14, B1.14, E2.14)
|
||||
NET_C(GND, A2.7, B1.7, E2.7)
|
||||
// Switches A2_D and B1_C are unused.
|
||||
NET_C(GND, A2.10, A2.11, A2.12, B1.6, B1.8, B1.9)
|
||||
|
||||
// Frontier after output of noise generator.
|
||||
OPTIMIZE_FRONTIER(C1.1, RES_M(1), 50)
|
||||
|
||||
// Frontier before skid screech generator.
|
||||
OPTIMIZE_FRONTIER(R5.1, RES_K(39), 50)
|
||||
|
||||
// Frontiers after NOISE CR 2 and BOOM generators.
|
||||
OPTIMIZE_FRONTIER(R64.1, RES_K(150), 50)
|
||||
OPTIMIZE_FRONTIER(R65.1, RES_K(12), 50)
|
||||
|
||||
// Frontier after engine sound generation.
|
||||
OPTIMIZE_FRONTIER(R66.1, RES_K(33), 50)
|
||||
|
||||
// Frontiers before MC3340 inputs.
|
||||
OPTIMIZE_FRONTIER(C16.1, RES_M(1), 50)
|
||||
OPTIMIZE_FRONTIER(C13.1, RES_M(1), 50)
|
||||
|
||||
// Frontiers before engine sound op-amp oscillators.
|
||||
OPTIMIZE_FRONTIER(R36.1, RES_K(560), 50)
|
||||
OPTIMIZE_FRONTIER(R37.1, RES_K(270), 50)
|
||||
OPTIMIZE_FRONTIER(R31.1, RES_K(300), 50)
|
||||
OPTIMIZE_FRONTIER(R32.1, RES_K(150), 50)
|
||||
OPTIMIZE_FRONTIER(R29.1, RES_K(220), 50)
|
||||
OPTIMIZE_FRONTIER(R30.1, RES_K(100), 50)
|
||||
|
||||
#if CONVERGENCE_FRONTIERS
|
||||
// Frontiers at Schmitt trigger op-amp outputs of engine sound
|
||||
// oscillators, to eliminate numeric instability and speed convergence
|
||||
// rather than to partition matrices. The resistor values given are
|
||||
// the modified ones which compensate for how the frontiers would
|
||||
// otherwise change the oscillator waveforms.
|
||||
OPTIMIZE_FRONTIER(R40.1, RES_K(275), 50)
|
||||
OPTIMIZE_FRONTIER(R35.1, RES_K(281), 50)
|
||||
OPTIMIZE_FRONTIER(R27.1, RES_K(286), 50)
|
||||
#endif
|
||||
|
||||
NETLIST_END()
|
12
src/mame/audio/nl_sspeedr.h
Normal file
12
src/mame/audio/nl_sspeedr.h
Normal file
@ -0,0 +1,12 @@
|
||||
// license:CC0
|
||||
// copyright-holders:Colin Douglas Howell
|
||||
#ifndef MAME_AUDIO_NL_SSPEEDR_H
|
||||
#define MAME_AUDIO_NL_SSPEEDR_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "netlist/nl_setup.h"
|
||||
|
||||
NETLIST_EXTERNAL(sspeedr)
|
||||
|
||||
#endif // MAME_AUDIO_NL_SSPEEDR_H
|
@ -2,12 +2,14 @@
|
||||
// copyright-holders:Stefan Jokisch
|
||||
/***************************************************************************
|
||||
|
||||
Taito Super Speed Race driver
|
||||
Taito / Midway Super Speed Race driver
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "includes/sspeedr.h"
|
||||
#include "audio/nl_sspeedr.h"
|
||||
#include "speaker.h"
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/watchdog.h"
|
||||
@ -71,9 +73,57 @@ void sspeedr_state::sspeedr_score_w(offs_t offset, uint8_t data)
|
||||
}
|
||||
|
||||
|
||||
void sspeedr_state::sspeedr_sound_w(uint8_t data)
|
||||
void sspeedr_state::sspeedr_sound1_w(uint8_t data)
|
||||
{
|
||||
/* not implemented */
|
||||
// **** Output pins from 74174 latch at C2 ****
|
||||
|
||||
// Bits 0-3 (PEDAL_BIT0 to PEDAL_BIT3): accelerator pedal position
|
||||
// Sets the frequency and volume of the engine sound oscillators.
|
||||
m_pedal_bit0->write_line(BIT(data, 0));
|
||||
m_pedal_bit1->write_line(BIT(data, 1));
|
||||
m_pedal_bit2->write_line(BIT(data, 2));
|
||||
m_pedal_bit3->write_line(BIT(data, 3));
|
||||
|
||||
// Bit 4 (HI SHIFT): set when gearshift is in high gear
|
||||
// Modifies the engine sound to be lower pitched at a given speed and
|
||||
// to change more slowly.
|
||||
m_hi_shift->write_line(BIT(data, 4));
|
||||
|
||||
// Bit 5 (LO SHIFT): set when gearshift is in low gear
|
||||
// Modifies the engine sound to be higher pitched at a given speed and
|
||||
// to change faster.
|
||||
m_lo_shift->write_line(BIT(data, 5));
|
||||
|
||||
// Bits 6-7 (D6, D7): not connected.
|
||||
}
|
||||
|
||||
|
||||
void sspeedr_state::sspeedr_sound2_w(uint8_t data)
|
||||
{
|
||||
// **** Output pins from 74174 latch at D2 ****
|
||||
|
||||
// Bit 0 (BOOM): Set to activate boom sound for a crash. Cleared to
|
||||
// terminate boom.
|
||||
m_boom->write_line(BIT(data, 0));
|
||||
|
||||
// Bit 1 (ENGINE SOUND OFF): Set to turn *off* engine sound.
|
||||
// Used in a crash.
|
||||
m_engine_sound_off->write_line(BIT(data, 1));
|
||||
|
||||
// Bit 2 (NOISE CR 1): tire squealing sound
|
||||
// Set to activate "tire squeal" noise from noise generator.
|
||||
m_noise_cr_1->write_line(BIT(data, 2));
|
||||
|
||||
// Bit 3 (NOISE CR 2): secondary crash noise
|
||||
// Set to activate high-pitched screeching hiss that accompanies BOOM
|
||||
// when the the car crashes. In Super Speed Race, the BOOM and NOISE
|
||||
// CR 2 effects play simultaneously.
|
||||
m_noise_cr_2->write_line(BIT(data, 3));
|
||||
|
||||
// Bit 4 (SILENCE): mute all sound when game is not running.
|
||||
m_silence->write_line(BIT(data, 4));
|
||||
|
||||
// Bits 5-7 (D5, D6, D7): not connected.
|
||||
}
|
||||
|
||||
|
||||
@ -89,8 +139,9 @@ void sspeedr_state::sspeedr_io_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map(0x00, 0x00).portr("IN0");
|
||||
map(0x00, 0x00).w(FUNC(sspeedr_state::sspeedr_sound1_w));
|
||||
map(0x01, 0x01).portr("IN1");
|
||||
map(0x00, 0x01).w(FUNC(sspeedr_state::sspeedr_sound_w));
|
||||
map(0x01, 0x01).w(FUNC(sspeedr_state::sspeedr_sound2_w));
|
||||
map(0x02, 0x02).w(FUNC(sspeedr_state::sspeedr_lamp_w));
|
||||
map(0x03, 0x03).portr("DSW");
|
||||
map(0x04, 0x04).portr("IN2");
|
||||
@ -159,6 +210,9 @@ static INPUT_PORTS_START( sspeedr )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Shifter") PORT_TOGGLE
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
|
||||
PORT_START("POT_MASTER_VOL")
|
||||
PORT_ADJUSTER( 50, "Pot: Master Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_master_vol")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -212,6 +266,31 @@ void sspeedr_state::sspeedr(machine_config &config)
|
||||
PALETTE(config, m_palette, FUNC(sspeedr_state::sspeedr_palette), 16);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
NETLIST_SOUND(config, "sound_nl", 48000)
|
||||
.set_source(NETLIST_NAME(sspeedr))
|
||||
.add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:pedal_bit0", "I_PEDAL_BIT0", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:pedal_bit1", "I_PEDAL_BIT1", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:pedal_bit2", "I_PEDAL_BIT2", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:pedal_bit3", "I_PEDAL_BIT3", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:hi_shift", "I_HI_SHIFT", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:lo_shift", "I_LO_SHIFT", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:boom", "I_BOOM", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:engine_sound_off",
|
||||
"I_ENGINE_SOUND_OFF", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:noise_cr_1", "I_NOISE_CR_1", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:noise_cr_2", "I_NOISE_CR_2", 0);
|
||||
NETLIST_LOGIC_INPUT(config, "sound_nl:silence", "I_SILENCE", 0);
|
||||
|
||||
// Audio output is from an LM3900 op-amp whose output has a
|
||||
// peak-to-peak range of about 12 volts, centered on 6 volts.
|
||||
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "OUTPUT").set_mult_offset(32767.0 / 6.0, -32767.0);
|
||||
|
||||
// Netlist volume-potentiometer interface
|
||||
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_master_vol", "R70.DIAL");
|
||||
}
|
||||
|
||||
|
||||
@ -231,4 +310,4 @@ ROM_START( sspeedr )
|
||||
ROM_END
|
||||
|
||||
|
||||
GAMEL( 1979, sspeedr, 0, sspeedr, sspeedr, sspeedr_state, empty_init, ROT270, "Midway", "Super Speed Race", MACHINE_NO_SOUND, layout_sspeedr )
|
||||
GAMEL( 1979, sspeedr, 0, sspeedr, sspeedr, sspeedr_state, empty_init, ROT270, "Midway", "Super Speed Race", 0, layout_sspeedr )
|
||||
|
@ -6,6 +6,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "emupal.h"
|
||||
#include "machine/netlist.h"
|
||||
|
||||
class sspeedr_state : public driver_device
|
||||
{
|
||||
@ -16,6 +17,17 @@ public:
|
||||
, m_gfxdecode(*this, "gfxdecode")
|
||||
, m_palette(*this, "palette")
|
||||
, m_digits(*this, "digit%u", 0U)
|
||||
, m_pedal_bit0(*this, "sound_nl:pedal_bit0")
|
||||
, m_pedal_bit1(*this, "sound_nl:pedal_bit1")
|
||||
, m_pedal_bit2(*this, "sound_nl:pedal_bit2")
|
||||
, m_pedal_bit3(*this, "sound_nl:pedal_bit3")
|
||||
, m_hi_shift(*this, "sound_nl:hi_shift")
|
||||
, m_lo_shift(*this, "sound_nl:lo_shift")
|
||||
, m_boom(*this, "sound_nl:boom")
|
||||
, m_engine_sound_off(*this, "sound_nl:engine_sound_off")
|
||||
, m_noise_cr_1(*this, "sound_nl:noise_cr_1")
|
||||
, m_noise_cr_2(*this, "sound_nl:noise_cr_2")
|
||||
, m_silence(*this, "sound_nl:silence")
|
||||
{ }
|
||||
|
||||
void sspeedr(machine_config &config);
|
||||
@ -25,7 +37,8 @@ private:
|
||||
void sspeedr_lamp_w(uint8_t data);
|
||||
void sspeedr_time_w(offs_t offset, uint8_t data);
|
||||
void sspeedr_score_w(offs_t offset, uint8_t data);
|
||||
void sspeedr_sound_w(uint8_t data);
|
||||
void sspeedr_sound1_w(uint8_t data);
|
||||
void sspeedr_sound2_w(uint8_t data);
|
||||
void sspeedr_driver_horz_w(uint8_t data);
|
||||
void sspeedr_driver_horz_2_w(uint8_t data);
|
||||
void sspeedr_driver_vert_w(uint8_t data);
|
||||
@ -65,6 +78,17 @@ private:
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
output_finder<26> m_digits;
|
||||
required_device<netlist_mame_logic_input_device> m_pedal_bit0;
|
||||
required_device<netlist_mame_logic_input_device> m_pedal_bit1;
|
||||
required_device<netlist_mame_logic_input_device> m_pedal_bit2;
|
||||
required_device<netlist_mame_logic_input_device> m_pedal_bit3;
|
||||
required_device<netlist_mame_logic_input_device> m_hi_shift;
|
||||
required_device<netlist_mame_logic_input_device> m_lo_shift;
|
||||
required_device<netlist_mame_logic_input_device> m_boom;
|
||||
required_device<netlist_mame_logic_input_device> m_engine_sound_off;
|
||||
required_device<netlist_mame_logic_input_device> m_noise_cr_1;
|
||||
required_device<netlist_mame_logic_input_device> m_noise_cr_2;
|
||||
required_device<netlist_mame_logic_input_device> m_silence;
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_SSPEEDR_H
|
||||
|
@ -478,6 +478,9 @@ wrestwar1d //
|
||||
wrestwar2 // (c) 1989 (FD1094)
|
||||
wrestwar2d //
|
||||
|
||||
@source:sspeedr.cpp
|
||||
sspeedr // Midway
|
||||
|
||||
@source:starcrus.cpp
|
||||
starcrus
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user