mw8080bw: add lagunar to 280zzzap netlist audio, other tweaks

Added Laguna Racer to the 280-ZZZAP netlist audio driver, with
conditional changes to the netlist for the circuitry differences
between the two games.

Adjust some netlist components that apparently changed from the
280-ZZZAP schematic to production machines.

Removed the driver's private MC3340 netlist, using the equivalent
one in the netlist library instead.
This commit is contained in:
Colin Douglas Howell 2020-08-11 16:20:43 -07:00
parent 1125310173
commit e87939ac9a
8 changed files with 3512 additions and 3462 deletions

File diff suppressed because it is too large Load Diff

View File

@ -574,6 +574,7 @@ DEFINE_DEVICE_TYPE(PHANTOM2_AUDIO, phantom2_audio_device, "phantom2_audio", "Mid
DEFINE_DEVICE_TYPE(INVADERS_AUDIO, invaders_audio_device, "invaders_audio", "Taito Space Invaders Audio")
DEFINE_DEVICE_TYPE(INVAD2CT_AUDIO, invad2ct_audio_device, "invad2ct_audio", "Midway Space Invaders II Audio")
DEFINE_DEVICE_TYPE(ZZZAP_AUDIO, zzzap_audio_device, "zzzap_audio", "Midway 280-ZZZAP Audio")
DEFINE_DEVICE_TYPE(LAGUNAR_AUDIO, lagunar_audio_device, "lagunar_audio", "Midway Laguna Racer Audio")
/*************************************
@ -3653,8 +3654,9 @@ static INPUT_PORTS_START(zzzap_audio)
PORT_ADJUSTER( 50, "Pot: Master Volume" ) NETLIST_ANALOG_PORT_CHANGED("sound_nl", "pot_master_vol")
INPUT_PORTS_END
zzzap_audio_device::zzzap_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) :
device_t(mconfig, ZZZAP_AUDIO, tag, owner, clock),
zzzap_common_audio_device::zzzap_common_audio_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock, void (*netlist)(netlist::nlparse_t &)) :
device_t(mconfig, type, tag, owner, clock),
m_netlist(netlist),
m_pedal_bit0(*this, "sound_nl:pedal_bit0"),
m_pedal_bit1(*this, "sound_nl:pedal_bit1"),
m_pedal_bit2(*this, "sound_nl:pedal_bit2"),
@ -3669,7 +3671,7 @@ zzzap_audio_device::zzzap_audio_device(machine_config const &mconfig, char const
}
void zzzap_audio_device::p1_w(u8 data)
void zzzap_common_audio_device::p1_w(u8 data)
{
// **** Output pins from 74174 latch at F5 ****
@ -3694,7 +3696,7 @@ void zzzap_audio_device::p1_w(u8 data)
}
void zzzap_audio_device::p2_w(u8 data)
void zzzap_common_audio_device::p2_w(u8 data)
{
// **** Output pins from 74174 latch at F4 ****
@ -3724,47 +3726,73 @@ void zzzap_audio_device::p2_w(u8 data)
}
void zzzap_audio_device::device_add_mconfig(machine_config &config)
void zzzap_common_audio_device::device_add_mconfig(machine_config &config)
{
SPEAKER(config, "mono").front_center();
NETLIST_SOUND(config, "sound_nl", 48000)
.set_source(NETLIST_NAME(280zzzap))
.add_route(ALL_OUTPUTS, "mono", 1.0);
if (m_netlist != nullptr) {
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_SOUND(config, "sound_nl", 48000)
.set_source(m_netlist)
.add_route(ALL_OUTPUTS, "mono", 1.0);
// The audio output is taken from an LM3900 op-amp whose output has a
// peak-to-peak range of about 5 volts, centered on 2.5 volts. With
// the master volume potentiometer at its default midpoint setting,
// this range is cut in half, to 2.5 volts peak to peak. In the real
// machine, the audio power amps might clip the highest output peaks,
// but I don't model this. Instead, I take the easy way out: assume
// the output at midpoint volume will just avoid clipping the extreme
// peaks, and scale and offset it so that those peaks will just reach
// the clipping limits for signed 16-bit samples. So turning the
// volume up much higher than the default will give clipped output.
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "OUTPUT").set_mult_offset(32767.0 / 1.25, -(32767.0 / 1.25) * 2.50);
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 volume-potentiometer interface
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_master_vol", "R70.DIAL");
// The audio output is taken from an LM3900 op-amp whose
// output has a peak-to-peak range of about 5 volts, centered
// on 2.5 volts. With the master volume potentiometer at its
// default midpoint setting, this range is cut in half, to 2.5
// volts peak to peak. In the real machine, the audio power
// amps might clip the highest output peaks, but I don't model
// this. Instead, I take the easy way out: assume the output
// at midpoint volume will just avoid clipping the extreme
// peaks, and scale and offset it so that those peaks will
// just reach the clipping limits for signed 16-bit samples.
// So turning the volume up much higher than the default will
// give clipped output.
NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "OUTPUT").set_mult_offset(32767.0 / 1.25, -(32767.0 / 1.25) * 2.50);
// Netlist volume-potentiometer interface
NETLIST_ANALOG_INPUT(config, "sound_nl:pot_master_vol", "R70.DIAL");
}
}
ioport_constructor zzzap_audio_device::device_input_ports() const
ioport_constructor zzzap_common_audio_device::device_input_ports() const
{
return INPUT_PORTS_NAME(zzzap_audio);
}
void zzzap_audio_device::device_start()
void zzzap_common_audio_device::device_start()
{
}
zzzap_audio_device::zzzap_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) :
zzzap_common_audio_device(mconfig, ZZZAP_AUDIO, tag, owner, clock, NETLIST_NAME(280zzzap))
{
}
lagunar_audio_device::lagunar_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) :
zzzap_common_audio_device(mconfig, LAGUNAR_AUDIO, tag, owner, clock, NETLIST_NAME(lagunar))
{
}

View File

@ -301,10 +301,10 @@ private:
};
class zzzap_audio_device : public device_t
class zzzap_common_audio_device : public device_t
{
public:
zzzap_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0);
zzzap_common_audio_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock, void (*netlist)(netlist::nlparse_t &));
void p1_w(u8 data);
void p2_w(u8 data);
@ -315,6 +315,7 @@ protected:
virtual void device_start() override;
private:
void (*m_netlist)(netlist::nlparse_t &) = nullptr;
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;
@ -328,6 +329,20 @@ private:
};
class zzzap_audio_device : public zzzap_common_audio_device
{
public:
zzzap_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0);
};
class lagunar_audio_device : public zzzap_common_audio_device
{
public:
lagunar_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0);
};
DECLARE_DEVICE_TYPE(SEAWOLF_AUDIO, seawolf_audio_device)
DECLARE_DEVICE_TYPE(GUNFIGHT_AUDIO, gunfight_audio_device)
DECLARE_DEVICE_TYPE(BOOTHILL_AUDIO, boothill_audio_device)
@ -342,6 +357,7 @@ DECLARE_DEVICE_TYPE(SPCENCTR_AUDIO, spcenctr_audio_device)
DECLARE_DEVICE_TYPE(PHANTOM2_AUDIO, phantom2_audio_device)
DECLARE_DEVICE_TYPE(INVADERS_AUDIO, invaders_audio_device)
DECLARE_DEVICE_TYPE(INVAD2CT_AUDIO, invad2ct_audio_device)
DECLARE_DEVICE_TYPE(ZZZAP_AUDIO, zzzap_audio_device)
DECLARE_DEVICE_TYPE(ZZZAP_AUDIO, zzzap_audio_device)
DECLARE_DEVICE_TYPE(LAGUNAR_AUDIO, lagunar_audio_device)
#endif // MAME_AUDIO_MW8080BW_H

View File

@ -4,11 +4,15 @@
#include "netlist/devices/net_lib.h"
// This is a netlist description for the sound circuits of Midway's 280-ZZZAP,
// based on Midway's schematic "280 ZZZAP Game Logic P.C. 0610-00907A". It
// should also apply to Midway's Laguna Racer with only very minor changes and
// to Taito/Midway's Super Speed Race with only modest changes, because these
// games use almost identical sound circuits to 280-ZZZAP.
// This is a netlist description for the sound circuits of Midway's 280-ZZZAP
// and Laguna Racer, based on Midway's schematics "280 ZZZAP Game Logic P.C.
// 0610-00907A", "Laguna Racer Game Logic A084-90700-A622", and "Laguna Racer
// Game Logic A084-90700-B622". Midway PCB drawings for Laguna Racer and a
// photo by Andrew Wellburn of a 280-ZZZAP game logic board were also used to
// help determine correct values for certain components. The netlist should
// also apply to Taito/Midway's Super Speed Race with only modest changes,
// because that game uses very similar sound circuits to 280-ZZZAP and Laguna
// Racer.
// (Incidentally, the 280-ZZZAP schematic has some notes on changes made to
// the circuitry during production, a few of which were to audio circuits.
@ -45,6 +49,20 @@
// and crashes), and the final mix and amplification of all sounds.
// When comparing the sound circuitry and components between 280-ZZZAP and
// Laguna Racer, here are some things to note. There are two different
// versions of the Laguna Racer game logic board (where the sound circuits
// reside): A622 and B622. Midway's A622 schematic was clearly copied directly
// from 280-ZZZAP's--even the letter indicators for change notes in
// 280-ZZZAP's circuitry remain, though the actual notes were blanked out.
// B622's schematics show sound circuitry differences from 280-ZZZAP and A622,
// and these differences are consistent with Midway's PCB drawings for *both*
// the A622 and B622 games boards. Some of them are also consistent with
// Wellburn's 280-ZZZAP PCB photo. So it seems that actual 280-ZZZAP boards
// lie somewhere between the 280-ZZZAP schematic and the B622 Laguna Racer
// schematic.
// 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
@ -68,176 +86,48 @@
#define REMOVE_POST_CRASH_NOISE_GLITCHES 1
static NETLIST_START(mc3340)
// Netlists for two different games are defined in this file. These netlists
// are mostly alike but differ in a few key components. I use Aaron Giles'
// scheme for combining the two definitions in one file.
//
// Initial compilation includes this section.
//
// A netlist description of the Motorola MC3340 Electronic Attenuator
// IC, a voltage-controlled amplifier/attenuator. It amplifies or
// attenuates an input signal according to the voltage of a second,
// control signal, with a maximum gain of about 12-13 dB (about a
// factor of 4 in voltage), and higher control voltages giving greater
// attenuation, which scales logarithmically.
#ifndef SOUND_VARIANT
// The netlist here is based on the circuit schematic given in
// Motorola's own data books, especially the most recent ones
// published in the 1990s (e.g. _Motorola Analog/Interface ICs Device
// Data, Vol. II_ (1996), p. 9-67), which are the only schematics that
// include resistor values. However, the 1990s schematics are missing
// one crossover connection which is present in older schematics
// published in the 1970s (e.g. _Motorola Linear Integrated Circuits_
// (1979), p. 5-130). This missing connection is clearly an error
// which has been fixed in this netlist; without it, the circuit won't
// amplify properly, generating only a very weak output signal.
// The 1990s schematics also omit a couple of diodes which are present
// in the 1970s schematics. Both of these diodes have been included
// here. One raises the minimum control voltage at which signal
// attenuation starts, so it makes the netlist's profile of
// attenuation vs. control voltage better match Motorola's charts for
// the device. The other affects the level of the input "midpoint",
// and including it makes the engine sound closer to that on real
// 280-ZZZAP machines.
//
// Now include ourselves twice, once for 280-ZZZAP and once for Laguna Racer.
//
// The Motorola schematics do not label components, so I've created my
// own labeling scheme based on numbering components on the schematics
// from top to bottom, left to right, with resistors also getting
// their value (expressed European-style to avoid decimal points) as
// part of the name. The netlist is also listed following the
// schematics in roughly top-to-bottom, left-to-right order.
#define VARIANT_280ZZZAP 0
#define VARIANT_LAGUNAR 1
// A very simple model is used for the transistors here, based on the
// generic NPN default but with a larger scale current. Again, this
// was chosen to better match the netlist's attenuation vs. control
// voltage profile to that given in Motorola's charts for the device.
#define SOUND_VARIANT (VARIANT_280ZZZAP)
#include "nl_280zzzap.cpp"
// The MC3340 has the same circuit internally as an older Motorola
// device, the MFC6040, which was replaced by the MC3340 in the
// mid-1970s. The two chips differ only in packaging. Older arcade
// games which use the MFC6040 may also benefit from this netlist
// implementation.
#undef SOUND_VARIANT
#define SOUND_VARIANT (VARIANT_LAGUNAR)
#include "nl_280zzzap.cpp"
RES(R1_5K1, RES_K(5.1))
DIODE(D1_MC3340, "D(IS=1e-15 N=1)")
#else
RES(R2_4K7, RES_K(4.7))
NET_MODEL("NPN1 NPN(IS=1E-13 BF=100)")
QBJT_EB(Q1, "NPN1")
RES(R3_750, RES_R(750))
RES(R4_10K, RES_K(10))
QBJT_EB(Q2, "NPN1")
RES(R5_750, RES_R(750))
RES(R6_3K9, RES_K(3.9))
RES(R7_5K1, RES_K(5.1))
RES(R8_20K, RES_K(20))
DIODE(D2_MC3340, "D(IS=1e-15 N=1)")
RES(R9_510, RES_R(510))
QBJT_EB(Q3, "NPN1")
QBJT_EB(Q4, "NPN1")
QBJT_EB(Q5, "NPN1")
RES(R10_1K3, RES_K(1.3))
QBJT_EB(Q6, "NPN1")
RES(R11_5K1, RES_K(5.1))
QBJT_EB(Q7, "NPN1")
QBJT_EB(Q8, "NPN1")
RES(R12_1K5, RES_K(1.5))
RES(R13_6K2, RES_K(6.2))
QBJT_EB(Q9, "NPN1")
RES(R14_5K1, RES_K(5.1))
QBJT_EB(Q10, "NPN1")
RES(R15_5K1, RES_K(5.1))
RES(R16_200, RES_R(200))
RES(R17_5K1, RES_K(5.1))
DIODE(D3_MC3340, "D(IS=1e-15 N=1)")
RES(R18_510, RES_R(510))
ALIAS(MC3340_VCC, R1_5K1.1)
NET_C(R1_5K1.1, Q1.C, Q2.C, R7_5K1.1, Q3.C, Q4.C, Q7.C,
R13_6K2.1, Q10.C, R17_5K1.1)
// Location of first diode present on 1970s schematics but omitted on
// 1990s ones. Including it raises the control voltage threshold for
// attenuation significantly.
NET_C(R1_5K1.2, D1_MC3340.A, Q1.B)
NET_C(D1_MC3340.K, R2_4K7.1)
NET_C(R2_4K7.2, GND)
NET_C(Q1.E, R3_750.1, R5_750.1)
NET_C(R3_750.2, R4_10K.1, Q2.B)
NET_C(R4_10K.2, GND)
NET_C(R5_750.2, R6_3K9.1, Q3.B)
ALIAS(MC3340_CONTROL, R6_3K9.2)
ALIAS(MC3340_INPUT, Q5.B)
NET_C(MC3340_INPUT, R8_20K.1)
// Location of second diode present on 1970s schematics but omitted on
// 1990s ones. Including it is critical to making the tone of the
// output engine sound match that of real 280-ZZZAP machines.
NET_C(R7_5K1.2, R8_20K.2, D2_MC3340.A)
NET_C(D2_MC3340.K, R9_510.1)
NET_C(R9_510.2, GND)
NET_C(Q4.E, Q6.E, Q5.C)
NET_C(Q5.E, R10_1K3.1)
NET_C(R10_1K3.2, GND)
NET_C(Q6.B, Q7.B, Q2.E, R11_5K1.1)
NET_C(R11_5K1.2, GND)
NET_C(Q7.E, Q9.E, Q8.C)
NET_C(Q8.E, R12_1K5.1)
NET_C(R12_1K5.2, GND)
NET_C(Q4.B, Q9.B, Q3.E, R14_5K1.1)
NET_C(R14_5K1.2, GND)
// This is where the cross-connection is erroneously omitted from
// 1990s schematics.
NET_C(Q6.C, R13_6K2.2, Q9.C, Q10.B)
// Connection for external frequency compensation capacitor; unused
// here.
ALIAS(MC3340_ROLLOFF, Q10.B)
NET_C(Q10.E, R16_200.1, R15_5K1.1)
NET_C(R15_5K1.2, GND)
ALIAS(MC3340_OUTPUT, R16_200.2)
NET_C(R17_5K1.2, D3_MC3340.A, Q8.B)
NET_C(D3_MC3340.K, R18_510.1)
NET_C(R18_510.2, GND)
NETLIST_END()
//
// Main netlist
//
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
static NETLIST_START(280zzzap_schematics)
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
static NETLIST_START(lagunar_schematics)
#endif
// **** Conversion of accelerator level to "engine speed" control
// **** voltage for engine sound, with capacitor-based "engine
// **** inertia" and gear shift changes.
@ -300,15 +190,19 @@ static NETLIST_START(280zzzap_schematics)
RES(R62, RES_K(1))
RES(R61, RES_K(1))
// The 480 Kohm resistors listed here are shown as such on the
// 280-ZZZAP schematic and the schematic for the earlier Laguna Racer
// board, but this is a non-standard value. The nearest standard value
// is 470 Kohm, and this may have been used in production. Need to
// check against actual PCBs.
RES(R51, RES_K(480)) // 470 Kohm in later Laguna and Super Speed Race
RES(R46, RES_M(2)) // 2.2 Mohm in later Laguna and Super Speed Race
// For the following resistors R51 and R46-R49, the values given are
// those shown in the Laguna Racer PCB drawings, the Laguna Racer B622
// board schematic, the Super Speed Race schematic, and Andrew
// Wellburn's 280-ZZZAP PCB photo. In the 280-ZZZAP schematic (and the
// Laguna Racer A622 board schematic, a near copy), R51 and R48 are
// 480 Kohms and R46 is 2 Mohms, but these seem to be errors in that
// schematic. 480 Kohm is not even a standard resistor value for any
// tolerance band, so it could not have been used on production
// boards.
RES(R51, RES_K(470))
RES(R46, RES_M(2.2))
RES(R47, RES_M(1))
RES(R48, RES_K(480)) // 470 Kohm in later Laguna and Super Speed Race
RES(R48, RES_K(470))
RES(R49, RES_K(240))
RES(R50, RES_K(100))
@ -326,7 +220,19 @@ static NETLIST_START(280zzzap_schematics)
RES(R59, RES_K(560))
RES(R60, RES_K(10))
CAP(C18, CAP_U(47)) // 22 uF in later Laguna and Super Speed Race
// The size of capacitor C18 varies with the game: 47 uF in 280-ZZZAP,
// 22 uF in Laguna Racer and Super Speed Race:
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
CAP(C18, CAP_U(47))
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
CAP(C18, CAP_U(22))
#endif
NET_C(C18.2, GND)
CAP(C19, CAP_U(2.2))
@ -416,6 +322,8 @@ static NETLIST_START(280zzzap_schematics)
// These are the remaining connections from H5_4.OUT:
NET_C(H5_4.OUT, R36.1, R37.1, R31.1, R32.1, R29.1, R30.1)
MC3340_DIP(MC3340_H2)
CD4016_DIP(J4)
// First oscillator (bottommost in schematics).
@ -503,26 +411,60 @@ static NETLIST_START(280zzzap_schematics)
NET_C(J3_4.OUT, R35.1, J4.5)
NET_C(I_V5.Q, R34.1)
NET_C(J3_4.PLUS, R34.2, R35.2)
NET_C(C16.2, MC3340_INPUT) // to MC3340 H2 pin 1
NET_C(C16.2, MC3340_H2.1) // to MC3340 input pin
// Third oscillator (topmost in schematics).
// This is the amplitude-modulation oscillator.
// Schematic shows frequency of "428 Hz", but when modeled without a
// frontier, the maximum in low gear is 465 Hz.
// With a frontier, uncompensated, this decreases to 442 Hz.
// This is the amplitude-modulation oscillator, whose frequency
// differs slightly between 280-ZZZAP and the later games, Laguna
// Racer and Super Speed Race. This difference distinctly changes the
// tone of the engine sound.
// The 280-ZZZAP and Laguna Racer schematics all show a frequency of
// "428 Hz", but for 280-ZZZAP, when equipped with a 110 Kohm resistor
// and modeled without a frontier, the maximum in low gear is 465 Hz;
// with a frontier, uncompensated, this decreases to 442 Hz.
// For Laguna Racer, when equipped with a 100 Kohm resistor and
// modeled without a frontier, the maximum low gear frequency is 511
// Hz; with a frontier, uncompensated, it's 482 Hz.
LM3900(J3_2)
LM3900(J3_1)
RES(R29, RES_K(220))
RES(R30, RES_K(110)) // 100 Kohm in later Laguna and Super Speed Race
// The value of resistor R30 is what changes the engine sound between
// 280-ZZZAP and the later games. The 280-ZZZAP schematic indicates
// that it is 110 Kohm in that game. This resistor is hidden on Andrew
// Wellburn's 280-ZZZAP PCB photo, but the sound resulting from 110
// Kohm is more consistent with actual 280-ZZZAP machines than that
// from 100 Kohm.
// The resistor is 100 Kohm in the B622 Laguna Racer and Super Speed
// Race schematics and on the PCB drawings for both Laguna Racer board
// versions, so I assume all Laguna Racer versions had this value.
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
RES(R30, RES_K(110))
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
RES(R30, RES_K(100))
#endif
RES(R28, RES_K(100))
#if CONVERGENCE_FRONTIERS
// Schmitt trigger resistors changed to compensate for waveform changes
// from use of frontier:
// from use of frontier.
// Since the different games have different oscillator frequencies,
// the compensated values of these resistors differ slightly as well.
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
RES(R26, RES_K(455))
RES(R27, RES_K(284))
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
RES(R26, RES_K(453))
RES(R27, RES_K(286))
#endif
#else
RES(R26, RES_K(470))
RES(R27, RES_K(270))
@ -553,7 +495,7 @@ static NETLIST_START(280zzzap_schematics)
NET_C(J3_1.OUT, R27.1, J4.13)
NET_C(I_V5.Q, R26.1)
NET_C(J3_1.PLUS, R26.2, R27.2)
NET_C(D1.K, R23.2, C13.2, R25.1, MC3340_CONTROL) // to MC3340 H2 pin 2
NET_C(D1.K, R23.2, C13.2, R25.1, MC3340_H2.2) // to MC3340 ctrl pin
// The MC3340's output is the complete engine sound, which is sent to
// the final mix.
@ -738,10 +680,8 @@ static NETLIST_START(280zzzap_schematics)
// The result is a high-pitched "tire skid" screeching sound.
// The circuit appears to be taken almost verbatim from page 19 of
// National Semiconductor's Application Note 72 about the LM3900, with
// only minor changes in the values of a few components to alter the
// DC bias.
// The circuit appears to be taken practically verbatim from page 19 of
// National Semiconductor's Application Note 72 about the LM3900.
CD4016_DIP(G4)
@ -768,9 +708,17 @@ static NETLIST_START(280zzzap_schematics)
LM3900(H4_4)
// For resistor R11, the value given is that shown in the Laguna Racer
// PCB drawings, the Laguna Racer B622 board schematic, the Super
// Speed Race schematic, and Andrew Wellburn's 280-ZZZAP PCB photo. In
// the 280-ZZZAP schematic and the near-copy Laguna Racer A622 board
// schematic, R11 is 100 Kohms, but this seems to be a schematic
// error. (The original National Semiconductor Application Note 72
// from which this circuit was apparently taken also uses 120 Kohm for
// R11.)
RES(R9, RES_K(39))
RES(R10, RES_K(62)) // 240 Kohm in Super Speed Race
RES(R11, RES_K(100)) // 120 Kohm in later Laguna and Super Speed Race
RES(R11, RES_K(120))
RES(R12, RES_K(62))
NET_C(H4_4.MINUS, R9.2, R11.1)
@ -851,12 +799,16 @@ static NETLIST_START(280zzzap_schematics)
LM3900(H5_1)
// On the 280-ZZZAP game logic board schematic, resistor R18 (which is
// not labeled as such) is a 2.2K resistor, but it has a note "E"
// stating that one of the changes made after the first 325 units was:
// "2.2K resistor at G4 pin 2 was 6.8K." I interpret this to mean that
// the resistor was lowered to 2.2K from 6.8K.
// Resistor R18, part of the BOOM filter, is 2.2 Kohms on the
// 280-ZZZAP schematic as well as in Laguna Racer, but the 280-ZZZAP
// schematic has a note "E" saying that the first 325 machines had a
// 6.8 Kohm resistor here instead. Andrew Wellburn's 280-ZZZAP board
// photo may show such a resistor. With this larger resistor, the
// filter's values are: center frequency 54 Hz, Q 16.9, gain 73.5; so
// the filter is slightly broader, pitched a bit lower, and has only a
// third as much gain. Still, the basic effect is the same.
RES(R18, RES_K(2.2)) // 20 Kohm in Super Speed Race
RES(R19, RES_K(1))
RES(R20, RES_M(3.3))
RES(R21, RES_M(1)) // 1.5 Mohm in Super Speed Race
@ -907,20 +859,27 @@ static NETLIST_START(280zzzap_schematics)
RES(R63, RES_K(12)) // 3 Kohm in Super Speed Race
RES(R64, RES_K(150))
// On the 280-ZZZAP game logic board schematic, resistor R65 (which is
// not labeled as such) is a 12K resistor, but it has a note "F"
// stating that one of the changes made after the first 325 units was:
// "12K resistor in series with 10MF cap and J5 pin 8 was 4.3K." I
// interpret this to mean that the resistor was raised to 12K from
// 4.3K.
// Resistor R65, the mixing resistor for the BOOM effect, is 12 Kohms
// on the 280-ZZZAP schematic and in Laguna Racer and Super Speed
// Race, but the 280-ZZZAP schematic has a note "F" saying that the
// first 325 machines had a 4.3 Kohm resistor here instead. Andrew
// Wellburn's 280-ZZZAP board photo shows such a resistor. The lower
// resistor makes the BOOM effect much louder, countering the reduced
// gain on its generating filter described above. In fact, it makes it
// loud enough to be clipped by the post-mixer op-amps; turning down
// the volume to prevent this clipping makes all other sounds quieter
// by comparison. This may explain why both the mixing resistor and
// the filter resistor were changed in later machines.
RES(R65, RES_K(12))
RES(R66, RES_K(33))
CAP(C20, CAP_U(10))
CAP(C21, CAP_U(10))
NET_C(R63.2, R64.2, R65.2, C20.1)
NET_C(MC3340_OUTPUT, R66.1)
NET_C(MC3340_H2.7, R66.1) // MC3340 output pin
NET_C(R66.2, C21.1)
LM3900(J5_3)
@ -956,8 +915,16 @@ static NETLIST_START(280zzzap_schematics)
NETLIST_END()
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
NETLIST_START(280zzzap)
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
NETLIST_START(lagunar)
#endif
SOLVER(Solver, 48000)
#if !(FAST_HLE_NOISE_GEN)
@ -981,16 +948,23 @@ NETLIST_START(280zzzap)
ANALOG_INPUT(I_V12, 12)
ANALOG_INPUT(I_V5, 5)
LOCAL_SOURCE(mc3340)
INCLUDE(mc3340)
// The MC3340 gets 12-volt power in 280-ZZZAP and Laguna Racer.
// In Super Speed Race it gets 5-volt power.
NET_C(I_V12.Q, MC3340_VCC)
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
LOCAL_SOURCE(280zzzap_schematics)
INCLUDE(280zzzap_schematics)
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
LOCAL_SOURCE(lagunar_schematics)
INCLUDE(lagunar_schematics)
#endif
// The MC3340 gets 12-volt power in 280-ZZZAP and Laguna Racer.
// In Super Speed Race it gets 5-volt power.
NET_C(I_V12.Q, MC3340_H2.8)
NET_C(GND, MC3340_H2.3)
// Logic inputs which represent output pins from 74174 latches at F4
// and F5
LOGIC_INPUT(I_F4_2, 0, "74XX") // BOOM
@ -1092,7 +1066,11 @@ NETLIST_START(280zzzap)
OPTIMIZE_FRONTIER(R31.1, RES_K(300), 50)
OPTIMIZE_FRONTIER(R32.1, RES_K(150), 50)
OPTIMIZE_FRONTIER(R29.1, RES_K(220), 50)
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
OPTIMIZE_FRONTIER(R30.1, RES_K(110), 50)
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
OPTIMIZE_FRONTIER(R30.1, RES_K(100), 50)
#endif
#if CONVERGENCE_FRONTIERS
// Frontiers at Schmitt trigger op-amp outputs of engine sound
@ -1102,7 +1080,14 @@ NETLIST_START(280zzzap)
// otherwise change the oscillator waveforms.
OPTIMIZE_FRONTIER(R40.1, RES_K(275), 50)
OPTIMIZE_FRONTIER(R35.1, RES_K(281), 50)
#if (SOUND_VARIANT == VARIANT_280ZZZAP)
OPTIMIZE_FRONTIER(R27.1, RES_K(284), 50)
#else // (SOUND_VARIANT == VARIANT_LAGUNAR)
OPTIMIZE_FRONTIER(R27.1, RES_K(286), 50)
#endif
#endif
NETLIST_END()
#endif

View File

@ -8,5 +8,6 @@
#include "netlist/nl_setup.h"
NETLIST_EXTERNAL(280zzzap)
NETLIST_EXTERNAL(lagunar)
#endif // MAME_AUDIO_NL_280ZZZAP_H

View File

@ -747,10 +747,10 @@ void zzzap_state::io_map(address_map &map)
map(0x02, 0x02).mirror(0x04).portr("IN2");
map(0x03, 0x03).mirror(0x04).r(m_mb14241, FUNC(mb14241_device::shift_result_r));
map(0x02, 0x02).w("soundboard", FUNC(zzzap_audio_device::p1_w));
map(0x02, 0x02).w("soundboard", FUNC(zzzap_common_audio_device::p1_w));
map(0x03, 0x03).w(m_mb14241, FUNC(mb14241_device::shift_data_w));
map(0x04, 0x04).w(m_mb14241, FUNC(mb14241_device::shift_count_w));
map(0x05, 0x05).w("soundboard", FUNC(zzzap_audio_device::p2_w));
map(0x05, 0x05).w("soundboard", FUNC(zzzap_common_audio_device::p2_w));
map(0x07, 0x07).w(m_watchdog, FUNC(watchdog_timer_device::reset_w));
}
@ -824,7 +824,7 @@ static INPUT_PORTS_START( lagunar )
INPUT_PORTS_END
void zzzap_state::zzzap(machine_config &config)
void zzzap_state::zzzap_common(machine_config &config)
{
mw8080bw_root(config);
@ -836,11 +836,28 @@ void zzzap_state::zzzap(machine_config &config)
/* add shifter */
MB14241(config, m_mb14241);
/* audio hardware handled by specific machine */
}
void zzzap_state::zzzap(machine_config &config)
{
zzzap_common(config);
/* audio hardware */
ZZZAP_AUDIO(config, "soundboard");
}
void zzzap_state::lagunar(machine_config &config)
{
zzzap_common(config);
/* audio hardware */
LAGUNAR_AUDIO(config, "soundboard");
}
/*************************************
*
@ -3094,14 +3111,14 @@ ROM_END
/* 597 */ GAMEL( 1975, gunfighto, gunfight, gunfight, gunfight, gunfight_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Gun Fight (set 2)", MACHINE_SUPPORTS_SAVE, layout_gunfight )
/* 604 Gun Fight (cocktail, dump does not exist) */
/* 605 */ GAME( 1976, tornbase, 0, tornbase, tornbase, mw8080bw_state, empty_init, ROT0, "Dave Nutting Associates / Midway / Taito", "Tornado Baseball / Ball Park", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 610 */ GAMEL( 1976, 280zzzap, 0, zzzap, zzzap, zzzap_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "280-ZZZAP", MACHINE_SUPPORTS_SAVE, layout_280zzzap )
/* 610 */ GAMEL( 1976, 280zzzap, 0, zzzap, zzzap, zzzap_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "280-ZZZAP", MACHINE_SUPPORTS_SAVE, layout_280zzzap )
/* 611 */ GAMEL( 1976, maze, 0, maze, maze, mw8080bw_state, empty_init, ROT0, "Midway", "Amazing Maze", MACHINE_SUPPORTS_SAVE, layout_maze )
/* 612 */ GAME( 1977, boothill, 0, boothill, boothill, boothill_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Boot Hill", MACHINE_SUPPORTS_SAVE )
/* 615 */ GAME( 1977, checkmat, 0, checkmat, checkmat, mw8080bw_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Checkmate", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 618 */ GAME( 1977, desertgu, 0, desertgu, desertgu, desertgu_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Desert Gun", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 618 */ GAME( 1977, roadrunm, desertgu, desertgu, desertgu, desertgu_state, empty_init, ROT0, "Midway", "Road Runner (Midway)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 619 */ GAME( 1977, dplay, 0, dplay, dplay, dplay_state, empty_init, ROT0, "Midway", "Double Play", MACHINE_SUPPORTS_SAVE )
/* 622 */ GAMEL( 1977, lagunar, 0, zzzap, lagunar, zzzap_state, empty_init, ROT90, "Midway", "Laguna Racer", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_lagunar )
/* 622 */ GAMEL( 1977, lagunar, 0, lagunar, lagunar, zzzap_state, empty_init, ROT90, "Midway", "Laguna Racer", MACHINE_SUPPORTS_SAVE, layout_lagunar )
/* 623 */ GAME( 1977, gmissile, 0, gmissile, gmissile, boothill_state, empty_init, ROT0, "Midway", "Guided Missile", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 626 */ GAME( 1977, m4, 0, m4, m4, boothill_state, empty_init, ROT0, "Midway", "M-4", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 630 */ GAMEL( 1978, clowns, 0, clowns, clowns, clowns_state, empty_init, ROT0, "Midway", "Clowns (rev. 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_clowns )

View File

@ -385,6 +385,11 @@ public:
void zzzap(machine_config &config);
void lagunar(machine_config &config);
protected:
void zzzap_common(machine_config &config);
private:
void io_map(address_map &map);
};

View File

@ -318,6 +318,7 @@ masao // bootleg
gunfight // 597 [1975] Dave Nutting Associates / Midway
gunfighto // 597 [1975] Dave Nutting Associates / Midway
280zzzap // 610 [1976] Dave Nutting Associates / Midway
lagunar // 622 [1977] Midway
@source:palestra.cpp
palestra