Added netlist-based audio to early Cinematronics vector games (#6979)

* Added netlist simulations for the following games: Space War, Barrier, Star Hawk, Speed Freak, Star Castle, War of the Worlds, Sundance, Tail Gunner, Rip Off, Armor Attack, Warrior, Solar Quest, Boxing Bugs. Removed previous samples-based sound. [Aaron Giles, Couriersud]

* Added built-in minimal artwork for Warrior. [Aaron Giles]

* Changed speaker maximum sample tracking to be based on new compile-time define SPEAKER_TRACK_MAX_SAMPLE instead of MAME_DEBUG. [Aaron Giles]

* Modernized 74164 and 74393 netlist TTL devices. [Aaron Giles]
This commit is contained in:
Aaron Giles 2020-07-22 14:07:34 -07:00 committed by GitHub
parent 1c4da1d0a6
commit f23db5da38
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 28774 additions and 1325 deletions

View File

@ -1568,7 +1568,33 @@ files {
MAME_DIR .. "src/mame/drivers/cinemat.cpp",
MAME_DIR .. "src/mame/includes/cinemat.h",
MAME_DIR .. "src/mame/audio/cinemat.cpp",
MAME_DIR .. "src/mame/audio/cinemat.h",
MAME_DIR .. "src/mame/video/cinemat.cpp",
MAME_DIR .. "src/mame/audio/nl_armora.cpp",
MAME_DIR .. "src/mame/audio/nl_armora.h",
MAME_DIR .. "src/mame/audio/nl_barrier.cpp",
MAME_DIR .. "src/mame/audio/nl_barrier.h",
MAME_DIR .. "src/mame/audio/nl_boxingb.cpp",
MAME_DIR .. "src/mame/audio/nl_boxingb.h",
MAME_DIR .. "src/mame/audio/nl_cinemat_common.h",
MAME_DIR .. "src/mame/audio/nl_ripoff.cpp",
MAME_DIR .. "src/mame/audio/nl_ripoff.h",
MAME_DIR .. "src/mame/audio/nl_solarq.cpp",
MAME_DIR .. "src/mame/audio/nl_solarq.h",
MAME_DIR .. "src/mame/audio/nl_spacewar.cpp",
MAME_DIR .. "src/mame/audio/nl_spacewar.h",
MAME_DIR .. "src/mame/audio/nl_speedfrk.cpp",
MAME_DIR .. "src/mame/audio/nl_speedfrk.h",
MAME_DIR .. "src/mame/audio/nl_starcas.cpp",
MAME_DIR .. "src/mame/audio/nl_starcas.h",
MAME_DIR .. "src/mame/audio/nl_starhawk.cpp",
MAME_DIR .. "src/mame/audio/nl_starhawk.h",
MAME_DIR .. "src/mame/audio/nl_sundance.cpp",
MAME_DIR .. "src/mame/audio/nl_sundance.h",
MAME_DIR .. "src/mame/audio/nl_tailg.cpp",
MAME_DIR .. "src/mame/audio/nl_tailg.h",
MAME_DIR .. "src/mame/audio/nl_warrior.cpp",
MAME_DIR .. "src/mame/audio/nl_warrior.h",
MAME_DIR .. "src/mame/drivers/cchasm.cpp",
MAME_DIR .. "src/mame/includes/cchasm.h",
MAME_DIR .. "src/mame/machine/cchasm.cpp",
@ -4991,7 +5017,7 @@ files {
MAME_DIR .. "src/mame/drivers/sothello.cpp",
MAME_DIR .. "src/mame/drivers/special_gambl.cpp",
MAME_DIR .. "src/mame/audio/special.cpp",
MAME_DIR .. "src/mame/audio/special.h",
MAME_DIR .. "src/mame/audio/special.h",
MAME_DIR .. "src/mame/drivers/spool99.cpp",
MAME_DIR .. "src/mame/drivers/sprcros2.cpp",
MAME_DIR .. "src/mame/drivers/sshot.cpp",

View File

@ -204,6 +204,37 @@ files{
MAME_DIR .. "src/mame/includes/cheekyms.h",
MAME_DIR .. "src/mame/video/cheekyms.cpp",
MAME_DIR .. "src/mame/drivers/cinemat.cpp",
MAME_DIR .. "src/mame/includes/cinemat.h",
MAME_DIR .. "src/mame/audio/cinemat.cpp",
MAME_DIR .. "src/mame/audio/cinemat.h",
MAME_DIR .. "src/mame/video/cinemat.cpp",
MAME_DIR .. "src/mame/audio/nl_armora.cpp",
MAME_DIR .. "src/mame/audio/nl_armora.h",
MAME_DIR .. "src/mame/audio/nl_barrier.cpp",
MAME_DIR .. "src/mame/audio/nl_barrier.h",
MAME_DIR .. "src/mame/audio/nl_boxingb.cpp",
MAME_DIR .. "src/mame/audio/nl_boxingb.h",
MAME_DIR .. "src/mame/audio/nl_cinemat_common.h",
MAME_DIR .. "src/mame/audio/nl_ripoff.cpp",
MAME_DIR .. "src/mame/audio/nl_ripoff.h",
MAME_DIR .. "src/mame/audio/nl_solarq.cpp",
MAME_DIR .. "src/mame/audio/nl_solarq.h",
MAME_DIR .. "src/mame/audio/nl_spacewar.cpp",
MAME_DIR .. "src/mame/audio/nl_spacewar.h",
MAME_DIR .. "src/mame/audio/nl_speedfrk.cpp",
MAME_DIR .. "src/mame/audio/nl_speedfrk.h",
MAME_DIR .. "src/mame/audio/nl_starcas.cpp",
MAME_DIR .. "src/mame/audio/nl_starcas.h",
MAME_DIR .. "src/mame/audio/nl_starhawk.cpp",
MAME_DIR .. "src/mame/audio/nl_starhawk.h",
MAME_DIR .. "src/mame/audio/nl_sundance.cpp",
MAME_DIR .. "src/mame/audio/nl_sundance.h",
MAME_DIR .. "src/mame/audio/nl_tailg.cpp",
MAME_DIR .. "src/mame/audio/nl_tailg.h",
MAME_DIR .. "src/mame/audio/nl_warrior.cpp",
MAME_DIR .. "src/mame/audio/nl_Warrior.h",
MAME_DIR .. "src/mame/drivers/galaxian.cpp",
MAME_DIR .. "src/mame/includes/galaxian.h",
MAME_DIR .. "src/mame/audio/galaxian.cpp",

View File

@ -36,7 +36,7 @@ speaker_device::speaker_device(const machine_config &mconfig, const char *tag, d
, m_x(0.0)
, m_y(0.0)
, m_z(0.0)
#ifdef MAME_DEBUG
#if SPEAKER_TRACK_MAX_SAMPLE
, m_max_sample(0)
, m_clipped_samples(0)
, m_total_samples(0)
@ -51,10 +51,10 @@ speaker_device::speaker_device(const machine_config &mconfig, const char *tag, d
speaker_device::~speaker_device()
{
#ifdef MAME_DEBUG
#if SPEAKER_TRACK_MAX_SAMPLE
// log the maximum sample values for all speakers
if (m_max_sample > 0)
osd_printf_debug("Speaker \"%s\" - max = %d (gain *= %f) - %d%% samples clipped\n", tag(), m_max_sample, 32767.0 / (m_max_sample ? m_max_sample : 1), (int)((double)m_clipped_samples * 100.0 / m_total_samples));
osd_printf_verbose("Speaker \"%s\" - max = %d (gain *= %f) - %d%% samples clipped\n", tag(), m_max_sample, 32767.0 / (m_max_sample ? m_max_sample : 1), (int)((double)m_clipped_samples * 100.0 / m_total_samples));
#endif
}
@ -84,18 +84,23 @@ void speaker_device::mix(s32 *leftmix, s32 *rightmix, int &samples_this_update,
}
assert(samples_this_update == numsamples);
#ifdef MAME_DEBUG
#if SPEAKER_TRACK_MAX_SAMPLE
// debug version: keep track of the maximum sample
for (int sample = 0; sample < samples_this_update; sample++)
{
if (stream_buf[sample] > m_max_sample)
m_max_sample = stream_buf[sample];
else if (-stream_buf[sample] > m_max_sample)
m_max_sample = -stream_buf[sample];
if (stream_buf[sample] > 32767 || stream_buf[sample] < -32768)
m_clipped_samples++;
m_total_samples++;
}
// ignore the first 100k or so samples to avoid biasing in favor
// of initial sound glitches
if (m_total_samples < 100000)
m_total_samples += samples_this_update;
else
for (int sample = 0; sample < samples_this_update; sample++)
{
if (stream_buf[sample] > m_max_sample)
m_max_sample = stream_buf[sample];
else if (-stream_buf[sample] > m_max_sample)
m_max_sample = -stream_buf[sample];
if (stream_buf[sample] > 32767 || stream_buf[sample] < -32768)
m_clipped_samples++;
m_total_samples++;
}
#endif
// mix if sound is enabled

View File

@ -26,6 +26,15 @@
#pragma once
#ifndef SPEAKER_TRACK_MAX_SAMPLE
#ifdef MAME_DEBUG
#define SPEAKER_TRACK_MAX_SAMPLE (1)
#else
#define SPEAKER_TRACK_MAX_SAMPLE (0)
#endif
#endif
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
@ -81,7 +90,7 @@ protected:
double m_z;
// internal state
#ifdef MAME_DEBUG
#if SPEAKER_TRACK_MAX_SAMPLE
s32 m_max_sample; // largest sample value we've seen
s32 m_clipped_samples; // total number of clipped samples
s32 m_total_samples; // total number of samples

View File

@ -311,7 +311,7 @@ clang:
clang-libc:
#clang-11 currently broken
#$(MAKE) CC=clang++-11 LD=clang++-11 OBJ=obj/clang CEXTRAFLAGS="-march=native
#$(MAKE) CC=clang++-11 LD=clang++-11 OBJ=obj/clang CEXTRAFLAGS="-march=native
$(MAKE) CC=clang++-10 LD=clang++-10 OBJ=obj/clang-libc CEXTRAFLAGS="-march=native \
-stdlib=libc++ -mllvm -inline-threshold=2000 \
-Wunknown-warning-option \

View File

@ -20,59 +20,59 @@ namespace netlist
NETLIB_OBJECT(74164)
{
NETLIB_CONSTRUCTOR(74164)
, m_A(*this, "A", NETLIB_DELEGATE(inputs))
, m_B(*this, "B", NETLIB_DELEGATE(inputs))
, m_CLRQ(*this, "CLRQ", NETLIB_DELEGATE(inputs))
, m_CLK(*this, "CLK", NETLIB_DELEGATE(inputs))
, m_AB(*this, {"A", "B"}, NETLIB_DELEGATE(ab))
, m_CLRQ(*this, "CLRQ", NETLIB_DELEGATE(clrq))
, m_CLK(*this, "CLK", NETLIB_DELEGATE(clk))
, m_cnt(*this, "m_cnt", 0)
, m_last_CLK(*this, "m_last_CLK", 0)
, m_ab(*this, "m_ab", 0)
, m_Q(*this, {"QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH"})
, m_power_pins(*this)
{
}
NETLIB_HANDLERI(inputs)
private:
NETLIB_RESETI()
{
if (!m_CLRQ())
{
m_cnt = 0;
}
else if (m_CLK() && !m_last_CLK)
{
m_cnt = (m_cnt << 1) & 0xfe;
if (m_A() && m_B())
{
m_cnt |= 0x01;
}
else
{
m_cnt &= 0xfe;
}
}
m_CLK.set_state(logic_t::STATE_INP_LH);
m_cnt = 0;
}
m_last_CLK = m_CLK();
for (std::size_t i=0; i<8; i++)
NETLIB_HANDLERI(clrq)
{
if (m_CLRQ())
{
m_Q[i].push((m_cnt >> i) & 1, NLTIME_FROM_NS(30));
m_CLK.activate_lh();
}
else
{
m_CLK.inactivate();
if (m_cnt != 0)
{
m_cnt = 0;
m_Q.push(0, NLTIME_FROM_NS(30));
}
}
}
NETLIB_RESETI()
NETLIB_HANDLERI(clk)
{
m_cnt = 0;
m_last_CLK = 0;
m_cnt = (m_cnt << 1) | m_ab;
m_Q.push(m_cnt, NLTIME_FROM_NS(30));
}
NETLIB_HANDLERI(ab)
{
m_ab = static_cast<unsigned>((m_AB() == 3) ? 1 : 0);
}
friend class NETLIB_NAME(74164_dip);
private:
logic_input_t m_A;
logic_input_t m_B;
object_array_t<logic_input_t, 2> m_AB;
logic_input_t m_CLRQ;
logic_input_t m_CLK;
state_var<unsigned> m_cnt;
state_var<unsigned> m_last_CLK;
state_var<unsigned> m_ab;
object_array_t<logic_output_t, 8> m_Q;
nld_power_pins m_power_pins;
@ -83,8 +83,8 @@ namespace netlist
NETLIB_CONSTRUCTOR(74164_dip)
, A(*this, "A")
{
register_subalias("1", A.m_A);
register_subalias("2", A.m_B);
register_subalias("1", A.m_AB[0]);
register_subalias("2", A.m_AB[1]);
register_subalias("3", A.m_Q[0]);
register_subalias("4", A.m_Q[1]);
register_subalias("5", A.m_Q[2]);

View File

@ -17,8 +17,8 @@ namespace netlist
NETLIB_OBJECT(74393)
{
NETLIB_CONSTRUCTOR(74393)
, m_CP(*this, "CP", NETLIB_DELEGATE(inputs))
, m_MR(*this, "MR", NETLIB_DELEGATE(inputs))
, m_CP(*this, "CP", NETLIB_DELEGATE(cp))
, m_MR(*this, "MR", NETLIB_DELEGATE(mr))
, m_Q(*this, {"Q0", "Q1", "Q2", "Q3"})
, m_cnt(*this, "m_cnt", 0)
, m_cp(*this, "m_cp", 0)
@ -30,30 +30,37 @@ namespace netlist
private:
NETLIB_RESETI()
{
m_CP.set_state(logic_t::STATE_INP_HL);
m_cnt = 0;
}
NETLIB_HANDLERI(inputs)
NETLIB_HANDLERI(mr)
{
netlist_sig_t last_cp = m_cp;
netlist_sig_t last_mr = m_mr;
m_cp = m_CP();
m_mr = m_MR();
if (!last_mr && m_mr)
if (!m_MR())
{
m_cnt = 0;
update_outputs_all(0, NLTIME_FROM_NS(24), NLTIME_FROM_NS(24), NLTIME_FROM_NS(24), NLTIME_FROM_NS(24));
m_CP.activate_hl();
}
else if (!m_mr && last_cp && !m_cp)
else
{
auto cnt = (m_cnt + 1) & MAXCNT;
update_outputs_all(cnt, NLTIME_FROM_NS(13), NLTIME_FROM_NS(22), NLTIME_FROM_NS(31), NLTIME_FROM_NS(40));
m_cnt = cnt;
m_CP.inactivate();
if (m_cnt != 0)
{
m_cnt = 0;
m_Q.push(0, NLTIME_FROM_NS(24));
}
}
}
NETLIB_HANDLERI(cp)
{
auto cnt = (m_cnt + 1) & MAXCNT;
m_cnt = cnt;
m_Q[0].push((cnt >> 0) & 1, NLTIME_FROM_NS(13));
m_Q[1].push((cnt >> 1) & 1, NLTIME_FROM_NS(22));
m_Q[2].push((cnt >> 2) & 1, NLTIME_FROM_NS(31));
m_Q[3].push((cnt >> 3) & 1, NLTIME_FROM_NS(40));
}
logic_input_t m_CP;
logic_input_t m_MR;
object_array_t<logic_output_t, 4> m_Q;
@ -63,14 +70,6 @@ namespace netlist
state_var_sig m_mr;
nld_power_pins m_power_pins;
void update_outputs_all(unsigned cnt, netlist_time q0_delay, netlist_time q1_delay, netlist_time q2_delay, netlist_time q3_delay) noexcept
{
m_Q[0].push((cnt >> 0) & 1, q0_delay);
m_Q[1].push((cnt >> 1) & 1, q1_delay);
m_Q[2].push((cnt >> 2) & 1, q2_delay);
m_Q[3].push((cnt >> 3) & 1, q3_delay);
}
};
NETLIB_OBJECT(74393_dip)

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
#!/bin/sh
GENERATED=src/lib/netlist/generated/static_solvers.cpp
FILES=`ls src/mame/machine/nl_*.cpp src/mame/audio/nl_*.cpp | grep -v pongdoubles`
FILES=`ls src/mame/machine/nl_*.cpp src/mame/audio/nl_*.cpp | grep -v pongdoubles`
OUTDIR=/tmp/static_syms
@ -14,9 +14,9 @@ fi
rm -rf ${OUTDIR}
mkdir ${OUTDIR}
if ${NLTOOL} --cmd static --output=${GENERATED}.tmp ${FILES}; then
if ${NLTOOL} --cmd static --output=${GENERATED}.tmp --include=src/mame/audio ${FILES}; then
mv -f ${GENERATED}.tmp ${GENERATED}
echo Created ${GENERATED} file
else
echo Failed to create ${GENERATED}
fi
fi

File diff suppressed because it is too large Load Diff

151
src/mame/audio/cinemat.h Normal file
View File

@ -0,0 +1,151 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_CINEMAT_H
#define MAME_AUDIO_CINEMAT_H
#pragma once
#include "machine/74259.h"
#include "machine/netlist.h"
#include "netlist/nl_setup.h"
// log to cinemat.csv for nltool playback/analysis
#define ENABLE_NETLIST_LOGGING (0)
class cinemat_audio_device : public device_t
{
public:
cinemat_audio_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 inputs_mask, void (*netlist)(netlist::nlparse_t &), double output_scale);
void configure_latch_inputs(ls259_device &latch, u8 mask = 0);
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_start() override;
virtual void device_stop() override;
template<int _Index> DECLARE_WRITE_LINE_MEMBER(sound_w) { input_set(_Index, state); }
void input_set(int bit, int state);
optional_device_array<netlist_mame_logic_input_device, 8> m_out_input;
private:
u8 m_inputs = 0xff;
u8 m_inputs_mask = 0xff;
void (*m_netlist)(netlist::nlparse_t &) = nullptr;
double m_output_scale = 0;
#if ENABLE_NETLIST_LOGGING
FILE *m_logfile = nullptr;
#endif
};
class spacewar_audio_device : public cinemat_audio_device
{
public:
spacewar_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class barrier_audio_device : public cinemat_audio_device
{
public:
barrier_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class speedfrk_audio_device : public cinemat_audio_device
{
public:
speedfrk_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class starhawk_audio_device : public cinemat_audio_device
{
public:
starhawk_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class sundance_audio_device : public cinemat_audio_device
{
public:
sundance_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tailg_audio_device : public cinemat_audio_device
{
public:
tailg_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class warrior_audio_device : public cinemat_audio_device
{
public:
warrior_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class armora_audio_device : public cinemat_audio_device
{
public:
armora_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class ripoff_audio_device : public cinemat_audio_device
{
public:
ripoff_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class starcas_audio_device : public cinemat_audio_device
{
public:
starcas_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class solarq_audio_device : public cinemat_audio_device
{
public:
solarq_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class boxingb_audio_device : public cinemat_audio_device
{
public:
boxingb_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class wotw_audio_device : public cinemat_audio_device
{
public:
wotw_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(SPACE_WARS_AUDIO, spacewar_audio_device)
DECLARE_DEVICE_TYPE(BARRIER_AUDIO, barrier_audio_device)
DECLARE_DEVICE_TYPE(STAR_HAWK_AUDIO, starhawk_audio_device)
DECLARE_DEVICE_TYPE(SUNDANCE_AUDIO, sundance_audio_device)
DECLARE_DEVICE_TYPE(SPEED_FREAK_AUDIO, speedfrk_audio_device)
DECLARE_DEVICE_TYPE(TAIL_GUNNER_AUDIO, tailg_audio_device)
DECLARE_DEVICE_TYPE(WARRIOR_AUDIO, warrior_audio_device)
DECLARE_DEVICE_TYPE(ARMOR_ATTACK_AUDIO, armora_audio_device)
DECLARE_DEVICE_TYPE(RIPOFF_AUDIO, ripoff_audio_device)
DECLARE_DEVICE_TYPE(SOLAR_QUEST_AUDIO, solarq_audio_device)
DECLARE_DEVICE_TYPE(BOXING_BUGS_AUDIO, boxingb_audio_device)
DECLARE_DEVICE_TYPE(STAR_CASTLE_AUDIO, starcas_audio_device)
DECLARE_DEVICE_TYPE(WAR_OF_THE_WORLDS_AUDIO, wotw_audio_device)
#endif // MAME_AUDIO_CINEMAT_H

View File

@ -0,0 +1,682 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Armor Attack
//
// Derived from the schematics in the Armor Attack manual.
//
// Known problems/issues:
//
// * Worked pretty well the first time.
//
// * The squeak on the tank treads is not right, need to
// understand what's going on.
//
// * Entire schematic needs a verification pass.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_armora.h"
//
// Optimizations
//
#define HLE_TANK_VCO (1)
//
// Main netlist
//
NETLIST_START(armora)
#if (HLE_TANK_VCO)
SOLVER(Solver, 1000)
#else
SOLVER(Solver, 4800000)
#endif
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active high
TTL_INPUT(I_OUT_1, 0) // active high
TTL_INPUT(I_OUT_2, 0) // active high
TTL_INPUT(I_OUT_3, 0) // active high
TTL_INPUT(I_OUT_4, 0) // active high
TTL_INPUT(I_OUT_7, 0) // active high
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND, I_OUT_7.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC, I_OUT_7.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_K(1))
RES(R2, RES_K(1.3))
RES(R3, RES_K(1.3))
RES(R4, RES_K(2))
RES(R5, RES_K(2))
RES(R6, RES_K(12))
RES(R7, RES_K(24))
RES(R8, RES_K(1))
RES(R9, RES_K(2))
RES(R10, RES_K(1))
RES(R11, RES_K(3.6))
RES(R12, RES_K(10))
RES(R13, RES_K(1))
RES(R14, RES_K(240))
RES(R15, RES_K(22))
RES(R16, RES_K(22))
RES(R17, RES_K(22))
RES(R18, RES_K(20))
RES(R19, RES_K(430))
RES(R20, RES_M(1.5))
RES(R21, RES_K(390))
RES(R22, RES_M(1.5))
RES(R23, RES_K(51))
// RES(R24, RES_K(390)) -- part of final amp (not emulated)
// RES(R25, RES_K(390)) -- part of final amp (not emulated)
RES(R26, RES_M(1))
RES(R27, RES_K(4.7))
RES(R28, RES_K(2.7))
RES(R29, RES_K(4.7))
RES(R30, RES_K(39))
RES(R31, RES_K(12))
RES(R32, RES_K(1))
RES(R33, RES_K(240))
RES(R34, RES_K(18))
RES(R35, RES_K(16))
RES(R36, RES_K(7.5))
RES(R37, 620)
RES(R38, 620)
RES(R39, RES_K(4.7))
RES(R40, RES_K(2.7))
RES(R41, RES_K(4.7))
RES(R42, RES_K(39))
RES(R43, RES_K(12))
RES(R44, RES_K(1))
RES(R45, RES_K(150))
RES(R46, RES_K(20))
RES(R47, RES_K(22))
RES(R48, RES_K(30))
RES(R49, 680)
RES(R50, 680)
RES(R51, RES_K(4.7))
RES(R52, RES_K(2.7))
RES(R53, RES_K(4.7))
RES(R54, RES_K(39))
RES(R55, RES_K(12))
RES(R56, RES_K(1))
RES(R57, RES_K(220))
RES(R58, RES_K(10))
RES(R59, RES_K(47))
RES(R60, 750)
RES(R61, 750)
RES(R62, RES_K(4.7))
RES(R63, RES_K(2.7))
RES(R64, RES_K(4.7))
RES(R65, RES_K(39))
RES(R66, RES_K(12))
RES(R67, RES_K(1))
RES(R68, RES_K(910))
RES(R69, RES_K(8.2))
RES(R70, RES_K(43))
RES(R71, RES_K(22))
RES(R72, 750)
RES(R73, 750)
RES(R74, RES_K(4.7))
RES(R75, RES_K(2.7))
RES(R76, RES_K(4.7))
RES(R77, RES_K(39))
RES(R78, RES_K(12))
RES(R79, RES_K(1))
RES(R80, RES_K(750))
RES(R81, RES_K(20))
RES(R82, RES_K(8.2))
RES(R83, RES_K(330))
// RES(R84, RES_K(15)) -- part of final amp (not emulated)
// RES(R85, 150) -- part of final amp (not emulated)
// RES(R86, RES_K(22)) -- part of final amp (not emulated)
// RES(R87, 150) -- part of final amp (not emulated)
// RES(R88, 0.51) -- part of final amp (not emulated)
// RES(R89, 0.51) -- part of final amp (not emulated)
RES(R90, RES_K(100))
RES(R91, RES_K(8.2))
RES(R92, RES_K(20))
// POT(R93, RES_K(10)) -- part of final amp (not emulated)
RES(R94, RES_K(30))
RES(R95, RES_K(4.7))
RES(R96, RES_K(2.7))
RES(R97, RES_K(39))
RES(R98, RES_K(12))
RES(R99, RES_K(2.4))
RES(R100, RES_K(4.7))
RES(R101, RES_K(2.7))
RES(R102, RES_K(39))
RES(R103, RES_K(12))
RES(R104, RES_K(2.4))
RES(R105, RES_K(4.7))
RES(R106, RES_K(2.7))
RES(R107, RES_K(39))
RES(R108, RES_K(12))
RES(R109, RES_K(2.4))
RES(R110, RES_K(1))
// CAP(C1, CAP_U(0.1)) -- part of voltage converter (not emulated)
// CAP(C2, CAP_U(22)) -- part of voltage converter (not emulated)
// CAP(C3, CAP_U(0.1)) -- part of voltage converter (not emulated)
// CAP(C4, CAP_U(22)) -- part of voltage converter (not emulated)
// CAP(C5, CAP_U(22)) -- part of voltage converter (not emulated)
// CAP(C6, CAP_U(0.1)) -- part of voltage converter (not emulated)
// CAP(C7, CAP_U(22)) -- part of voltage converter (not emulated)
// CAP(C8, CAP_U(0.1)) -- part of voltage converter (not emulated)
// CAP(C9, CAP_U(22)) -- part of voltage converter (not emulated)
// CAP(C10, CAP_U(0.1)) -- part of voltage converter (not emulated)
CAP(C11, CAP_U(0.047))
CAP(C12, CAP_U(0.01))
CAP(C13, CAP_U(0.047))
CAP(C14, CAP_U(0.47))
CAP(C15, CAP_U(0.001))
CAP(C16, CAP_U(0.1))
CAP(C17, CAP_U(0.0047))
CAP(C18, CAP_U(2.2))
CAP(C19, CAP_U(0.1))
CAP(C20, CAP_U(100))
CAP(C21, CAP_U(0.1))
CAP(C22, CAP_U(2.2))
CAP(C23, CAP_U(0.22))
CAP(C24, CAP_U(0.22))
CAP(C25, CAP_U(3.3))
CAP(C26, CAP_U(0.1))
CAP(C27, CAP_U(0.047))
// CAP(C28, CAP_U()) -- don't see it anywhere
CAP(C29, CAP_U(0.047))
CAP(C30, CAP_U(0.047))
CAP(C31, CAP_U(0.22))
CAP(C32, CAP_U(0.22))
CAP(C33, CAP_U(0.0047))
CAP(C34, CAP_U(1))
CAP(C35, CAP_U(0.1))
CAP(C36, CAP_U(0.1))
CAP(C37, CAP_U(0.01))
// CAP(C38, CAP_U(0.68)) -- part of final amp (not emulated)
// CAP(C39, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C40, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C41, CAP_U(0.005)) -- part of final amp (not emulated)
// CAP(C42, CAP_P(470)) -- part of final amp (not emulated)
CAP(C43, CAP_U(0.33))
// D_1N4003(D1) -- part of voltage converter (not emulated)
// D_1N4003(D2) -- part of voltage converter (not emulated)
// D_1N4003(D3) -- part of voltage converter (not emulated)
// D_1N4003(D4) -- part of voltage converter (not emulated)
D_1N914(D5)
// D_1N4003(D6) -- part of final amp (not emulated)
// D_1N4003(D7) -- part of final amp (not emulated)
D_1N914(D8)
Q_2N3904(Q1) // NPN
Q_2N3906(Q2) // PNP
Q_2N3906(Q3) // PNP
Q_2N3906(Q4) // PNP
Q_2N3906(Q5) // PNP
Q_2N3906(Q6) // PNP
Q_2N3906(Q7) // PNP
Q_2N3906(Q8) // PNP
Q_2N3906(Q9) // PNP
Q_2N3906(Q10) // PNP
Q_2N3906(Q11) // PNP
// Q_2N6292(Q12) // NPN -- part of final amp (not emulated)
// Q_2N6107(Q13) // PNP -- part of final amp (not emulated)
Q_2N3906(Q14) // PNP
Q_2N3904(Q15) // NPN
Q_2N3906(Q16) // PNP
Q_2N3904(Q17) // NPN
Q_2N3906(Q18) // PNP
Q_2N3904(Q19) // NPN
TTL_7414_DIP(IC1) // Hex Inverter
NET_C(IC1.7, GND)
NET_C(IC1.14, I_V5)
TTL_74LS164_DIP(IC2) // 8-bit Shift Reg.
NET_C(IC2.7, GND)
NET_C(IC2.14, I_V5)
TTL_74LS377_DIP(IC3) // Octal D Flip Flop
NET_C(IC3.10, GND)
NET_C(IC3.20, I_V5)
// TTL_7815_DIP(IC4) // +15V Regulator -- part of voltage converter (not emulated)
// TTL_7915_DIP(IC5) // -15V Regulator -- part of voltage converter (not emulated)
LM555_DIP(IC6)
TTL_7406_DIP(IC7) // Hex inverter -- currently using a clone of 7416, no open collector behavior
NET_C(IC7.7, GND)
NET_C(IC7.14, I_V5)
TTL_74LS163_DIP(IC8) // Binary Counter (schems say can sub a 74161)
NET_C(IC8.8, GND)
NET_C(IC8.16, I_V5)
TTL_74LS00_DIP(IC9) // Quad 4-Input NAND Gate
NET_C(IC9.7, GND)
NET_C(IC9.14, I_V5)
TTL_74LS393_DIP(IC10) // Dual 4-Stage Binary Counter
NET_C(IC10.7, GND)
NET_C(IC10.14, I_V5)
TTL_74LS163_DIP(IC11) // Binary Counter (schems say can sub a 74161)
NET_C(IC11.8, GND)
NET_C(IC11.16, I_V5)
// IC12 was deleted from schematics
TTL_74LS393_DIP(IC13) // Dual 4-Stage Binary Counter
NET_C(IC13.7, GND)
NET_C(IC13.14, I_V5)
// IC14 was deleted from schematics
#if (!HLE_TANK_VCO)
LM566_DIP(IC15)
#endif
// IC16 was deleted from schematics
AMI_S2688(IC17) // Noise generator
TL081_DIP(IC18) // Op. Amp.
NET_C(IC18.7, I_V15)
NET_C(IC18.4, I_VM15)
CA3080_DIP(IC19) // Op. Amp.
NET_C(IC19.4, I_VM15)
NET_C(IC19.7, I_V15)
CA3080_DIP(IC20) // Op. Amp.
NET_C(IC20.4, I_VM15)
NET_C(IC20.7, I_V15)
CA3080_DIP(IC21) // Op. Amp.
NET_C(IC21.4, I_VM15)
NET_C(IC21.7, I_V15)
CA3080_DIP(IC22) // Op. Amp.
NET_C(IC22.4, I_VM15)
NET_C(IC22.7, I_V15)
LM555_DIP(IC23)
TL081_DIP(IC24) // Op. Amp.
NET_C(IC24.7, I_V15)
NET_C(IC24.4, I_VM15)
TL081_DIP(IC25) // Op. Amp.
NET_C(IC25.7, I_V15)
NET_C(IC25.4, I_VM15)
TL081_DIP(IC26) // Op. Amp.
NET_C(IC26.7, I_V15)
NET_C(IC26.4, I_VM15)
TTL_7414_DIP(IC27) // Hex Inverter
NET_C(IC27.7, GND)
NET_C(IC27.14, I_V5)
//
// Page 1: inputs and shift register
//
NET_C(I_OUT_1, IC27.13)
ALIAS(TANK_EN, IC27.12)
NET_C(I_OUT_2, IC27.9)
ALIAS(BEEP_EN, IC27.8)
NET_C(I_OUT_3, IC27.3)
ALIAS(CHOPPER_SW, IC27.4)
NET_C(I_V5, R1.1)
NET_C(R1.2, IC2.9, IC2.1)
ALIAS(HI, R1.2)
NET_C(I_OUT_7, IC1.13)
NET_C(IC1.12, IC1.1)
NET_C(IC1.2, IC2.2)
NET_C(I_OUT_4, IC1.11)
NET_C(IC1.10, IC1.5)
NET_C(IC1.6, IC2.8)
NET_C(IC2.3, IC3.3)
NET_C(IC2.4, IC3.4)
NET_C(IC2.5, IC3.7)
NET_C(IC2.6, IC3.8)
NET_C(IC2.10, IC3.13)
NET_C(IC2.11, IC3.14)
NET_C(IC2.12, IC3.17)
NET_C(IC2.13, IC3.18)
NET_C(I_OUT_0, IC27.11)
NET_C(IC27.10, IC27.5)
NET_C(IC27.6, IC3.11)
NET_C(IC3.1, GND)
ALIAS(TANK_FIRE, IC3.2)
ALIAS(HI_EXP, IC3.5)
ALIAS(JEEP_FIRE, IC3.6)
ALIAS(LO_EXP, IC3.9)
NET_C(IC3.12, IC8.6)
NET_C(IC3.15, IC8.5)
NET_C(IC3.16, IC8.4)
NET_C(IC3.19, IC8.3)
//
// Page 1: Tank EN
//
NET_C(I_V5, IC6.8, R2.2)
NET_C(R2.1, IC6.7, R3.2)
NET_C(R3.1, IC6.2, IC6.6, C11.1)
NET_C(C11.2, GND)
NET_C(TANK_EN, IC6.4, IC7.9)
NET_C(IC6.1, GND)
NET_C(IC6.5, C12.1)
NET_C(C12.2, GND)
NET_C(IC6.3, IC1.9)
NET_C(IC1.8, IC8.2)
NET_C(IC8.7, IC8.10, IC8.1, HI)
NET_C(IC8.15, IC9.1, IC9.2, IC11.2, IC10.1)
NET_C(IC8.9, IC9.3)
NET_C(IC10.2, GND)
NET_C(IC10.6, IC9.9, IC13.13)
NET_C(IC11.1, IC11.10, IC11.7, IC11.3, IC11.4, HI)
NET_C(IC11.5, IC11.6, GND)
NET_C(IC11.15, IC1.3)
NET_C(IC1.4, IC11.9)
NET_C(IC11.11, IC9.10)
NET_C(IC9.8, IC10.13)
NET_C(IC10.12, GND)
NET_C(IC10.11, R6.1)
NET_C(R6.2, C13.1, C14.2)
NET_C(C13.2, GND)
NET_C(C14.1, R7.1)
ALIAS(SJ, R7.2)
NET_C(IC7.8, R8.1, IC13.12)
NET_C(R8.2, I_V5)
NET_C(IC13.8, R5.1, IC7.5)
ALIAS(SH2_1, IC13.8)
NET_C(R5.2, I_V5)
NET_C(IC13.9, IC7.11, R9.1, IC7.13)
ALIAS(SH2_3, IC13.9)
NET_C(R9.2, I_V5)
NET_C(IC7.10, IC7.6, R10.1)
ALIAS(SH2_5, R10.1)
NET_C(R10.2, I_V5)
ALIAS(SH2_2, R19.1)
ALIAS(SH2_4, R20.1)
ALIAS(SH2_6, R21.1)
NET_C(R19.2, R20.2, R21.2, R22.2, C18.1, R23.1)
NET_C(R22.1, GND)
NET_C(C18.2, GND)
NET_C(R23.2, I_V15)
#if (HLE_TANK_VCO)
//
// R2 = 0.98110: HP = (0.00000599036*A0) - 0.0000565124
// R2 = 0.99782: HP = (0.00000194885*A0*A0) - (0.0000415989*A0) + 0.000233746
// R2 = 0.99811: HP = (0.000000646112*A0*A0*A0) - (0.0000215063*A0*A0) + (0.000242010*A0) - 0.000908469
// R2 = 0.99589: HP = (0.000000217354*A0*A0*A0*A0) - (0.0000098166*A0*A0*A0) + (0.000167248*A0*A0) - (0.00127054*A0) + 0.00363402
// R2 = 0.92249: HP = (0.00000000630602*A0*A0*A0*A0*A0) - (0.000000220145*A0*A0*A0*A0) + (0.00000210638*A0*A0*A0) + (0.00000707526*A0*A0) - (0.000207037*A0) + 0.000836264
//
VARCLOCK(TANKCLK, 1, "max(0.000001,min(0.1,(0.000000646112*A0*A0*A0) - (0.0000215063*A0*A0) + (0.000242010*A0) - 0.000908469))")
NET_C(TANKCLK.GND, GND)
NET_C(TANKCLK.VCC, I_V5)
NET_C(R19.2, TANKCLK.A0)
NET_C(TANKCLK.Q, IC13.1)
NET_C(GND, R4.1, R4.2, R11.1, R11.2, R12.1, R12.2, R13.1, R13.2, C15.1, C15.2, C16.1, C16.2, C17.1, C17.2, D5.A, D5.K, D8.A, D8.K)
#else
NET_C(IC15.5, R19.2, C15.2)
NET_C(IC15.7, C17.1)
NET_C(C17.2, GND)
NET_C(IC15.1, GND)
NET_C(IC15.6, C15.1, R11.1)
NET_C(R11.2, IC15.8, I_V15)
NET_C(IC15.3, C16.2)
NET_C(C16.1, R12.1, D5.K)
NET_C(D5.A, GND)
NET_C(R12.2, Q1.B)
NET_C(Q1.E, D8.K, R4.2)
NET_C(D8.A, GND)
NET_C(R4.1, I_VM15)
NET_C(Q1.C, IC13.1, R13.1)
NET_C(R13.2, I_V5)
#endif
NET_C(IC7.12, R110.1, IC13.2)
NET_C(R110.2, I_V5)
NET_C(IC13.5, R15.1)
NET_C(IC13.4, R16.1)
NET_C(IC13.3, R17.1)
NET_C(R15.2, R16.2, R17.2, R18.2, C19.2)
NET_C(R18.1, GND)
NET_C(C19.1, R14.1)
NET_C(R14.2, SJ)
//
// Page 2 stuff
//
NET_C(SH2_1, R96.1)
NET_C(R96.2, R95.1, Q14.B)
NET_C(R95.2, I_V5, Q14.E)
NET_C(Q14.C, R97.2, R98.2, R99.1)
NET_C(R97.1, I_VM15)
NET_C(R98.1, GND, Q15.E)
NET_C(R99.2, Q15.B)
NET_C(Q15.C, SH2_2)
NET_C(SH2_3, R101.1)
NET_C(R101.2, R100.1, Q16.B)
NET_C(R100.2, I_V5, Q16.E)
NET_C(Q16.C, R102.2, R103.2, R104.1)
NET_C(R102.1, I_VM15)
NET_C(R103.1, GND, Q17.E)
NET_C(R104.2, Q17.B)
NET_C(Q17.C, SH2_4)
NET_C(SH2_5, R106.1)
NET_C(R106.2, R105.1, Q18.B)
NET_C(R105.2, I_V5, Q18.E)
NET_C(Q18.C, R107.2, R108.2, R109.1)
NET_C(R107.1, I_VM15)
NET_C(R108.1, GND, Q19.E)
NET_C(R109.2, Q19.B)
NET_C(Q19.C, SH2_6)
//
// Page 3
//
NET_C(I_V15, C20.1, IC17.4)
NET_C(C20.2, GND)
NET_C(IC17.2, IC17.1, GND, R26.1)
NET_C(IC17.3, C21.2)
NET_C(C21.1, R26.2, IC18.3)
NET_C(IC18.2, IC18.6)
ALIAS(NOISE, IC18.6)
//
// TANK FIRE
//
NET_C(TANK_FIRE, R27.1, R28.1)
NET_C(R27.2, I_V5, R29.2, Q2.E)
NET_C(R28.2, R29.1, Q2.B)
NET_C(Q2.C, R30.2, R31.2, Q3.E)
NET_C(R30.1, I_VM15)
NET_C(R31.1, GND, R32.1)
NET_C(R32.2, Q3.B)
NET_C(Q3.C, C22.1, R33.1)
NET_C(C22.2, I_VM15)
NET_C(R33.2, IC19.5)
NET_C(NOISE, R34.1)
NET_C(R34.2, C23.1, R35.1)
NET_C(R35.2, C24.1, R36.1)
NET_C(C23.2, C24.2, GND, R37.1, R38.1)
NET_C(R36.2, R37.2, IC19.2)
NET_C(R38.2, IC19.3)
NET_C(IC19.6, IC25.3)
//
// LO EXP
//
NET_C(LO_EXP, R39.1, R40.1)
NET_C(R39.2, I_V5, R41.2, Q4.E)
NET_C(R40.2, R41.1, Q4.B)
NET_C(Q4.C, R42.2, R43.2, Q5.E)
NET_C(R42.1, I_VM15)
NET_C(R43.1, GND, R44.1)
NET_C(R44.2, Q5.B)
NET_C(Q5.C, C25.1, R45.1)
NET_C(C25.2, I_VM15)
NET_C(R45.2, IC20.5)
NET_C(NOISE, R46.1)
NET_C(R46.2, C26.1, R47.1)
NET_C(R47.2, C27.1, R48.1)
NET_C(C26.2, C27.2, GND, R49.1, R50.1)
NET_C(R48.2, R49.2, IC20.2)
NET_C(R50.2, IC20.3)
NET_C(IC20.6, IC25.3)
//
// CHOPPER SW
//
NET_C(CHOPPER_SW, IC7.3)
NET_C(IC7.4, R51.1, R52.1)
NET_C(R51.2, I_V5, R53.2, Q6.E)
NET_C(R52.2, R53.1, Q6.B)
NET_C(Q6.C, R54.2, R55.2, Q7.E)
NET_C(R54.1, I_VM15)
NET_C(R55.1, R56.1, GND)
NET_C(R56.2, Q7.B)
NET_C(Q7.C, R57.1)
NET_C(R57.2, IC21.5)
NET_C(NOISE, R58.1)
NET_C(R58.2, C29.1, R59.1)
NET_C(R59.2, C30.1, R94.1)
NET_C(C29.2, C30.2, GND, R60.1, R61.1)
NET_C(R94.2, R60.2, IC21.2)
NET_C(R61.2, IC21.3)
NET_C(IC21.6, IC25.3)
//
// JEEP FIRE
//
NET_C(JEEP_FIRE, R62.1, R63.1)
NET_C(R62.2, I_V5, R64.2, Q8.E)
NET_C(R63.2, R64.1, Q8.B)
NET_C(Q8.C, R65.2, R66.2, Q9.E)
NET_C(R65.1, I_VM15)
NET_C(R66.1, GND, R67.1)
NET_C(R67.2, Q9.B)
NET_C(Q9.C, C31.1, R68.1)
NET_C(C31.2, I_VM15)
NET_C(R68.2, R80.2, IC22.5)
NET_C(NOISE, R69.1)
NET_C(R69.2, C32.1, R70.1)
NET_C(R70.2, C33.1, R71.1)
NET_C(C32.2, C33.2, GND, R72.1, R73.1)
NET_C(R71.2, R72.2, IC22.2)
NET_C(R73.2, IC22.3)
NET_C(IC22.6, IC25.3)
//
// HI EXP
//
NET_C(HI_EXP, R74.1, R75.1)
NET_C(R74.2, I_V5, R76.2, Q10.E)
NET_C(R75.2, R76.1, Q10.B)
NET_C(Q10.C, R77.2, R78.2, Q11.E)
NET_C(R77.1, I_VM15)
NET_C(R78.1, GND, R79.1)
NET_C(R79.2, Q11.B)
NET_C(Q11.C, C34.1, R80.1)
NET_C(C34.2, I_VM15)
//
// BEEP EN
//
NET_C(BEEP_EN, IC23.4)
NET_C(I_V5, R81.2, IC23.8)
NET_C(R81.1, R82.1, IC23.6, IC23.2, C35.1)
NET_C(R82.2, IC23.7)
NET_C(C35.2, GND)
NET_C(IC23.1, GND)
NET_C(IC23.5, C37.1)
NET_C(C37.2, GND)
NET_C(IC23.3, R83.1)
NET_C(R83.2, C36.1)
NET_C(C36.2, SJ)
//
// Final mix
//
NET_C(R90.2, IC25.3)
NET_C(R90.1, GND)
NET_C(IC25.2, IC25.6, C43.1)
NET_C(C43.2, R91.1)
NET_C(R91.2, IC26.2, SJ, R92.1)
NET_C(IC26.3, GND)
NET_C(IC26.6, R92.2)
ALIAS(OUTPUT, R92.2)
//
// Unconnected inputs
//
NET_C(GND, IC7.1, IC9.4, IC9.5, IC9.12, IC9.13, IC27.1, IC27.2)
NET_C(GND, IC24.2, IC24.3) // part of final amp
//
// Unconnected outputs
//
HINT(IC7.2, NC)
HINT(IC8.11, NC) // QD
HINT(IC8.12, NC) // QC
HINT(IC8.13, NC) // QB
HINT(IC8.14, NC) // QA
HINT(IC9.6, NC)
HINT(IC9.11, NC)
HINT(IC10.3, NC) // QA
HINT(IC10.4, NC) // QB
HINT(IC10.5, NC) // QC
HINT(IC10.8, NC) // QD
HINT(IC10.9, NC) // QC
HINT(IC10.10, NC) // QB
HINT(IC11.12, NC) // QC
HINT(IC11.13, NC) // QB
HINT(IC11.14, NC) // QA
HINT(IC13.6, NC)
HINT(IC13.10, NC)
HINT(IC13.11, NC)
// HINT(IC27.2, NC)
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_ARMORA_H
#define MAME_AUDIO_NL_ARMORA_H
#pragma once
NETLIST_EXTERNAL(armora)
#endif // MAME_AUDIO_NL_ARMORA_H

View File

@ -0,0 +1,307 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Barrier
//
// Derived from the schematics in the Barrier manual. This sound
// board is quite similar to Space Wars.
//
// Known problems/issues:
//
// * The core noise source is supposed to be created via a
// pair of transistors, one with an open base. Because this
// does not model correctly, this part of the circuit is
// replaced with a generic noise device. The characteristics
// of this noise are pretty different compared to recordings
// of the original, and affects all the sounds.
//
// * The schematics show a connection betwee U8.6 and
// R37.2; however, implementing this leads to a direct input
// from the noise source at all times to the summing amp.
// Suspecting this is a typo in the schematics.
//
// * Unsure if Barrier should have the noisy background like
// Space Wars. Space Wars has a hard overall mute to suppress
// it when the game isn't running, but Barrier does not.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_barrier.h"
//
// Optimizations
//
#define HLE_NOISE_GEN (1)
#define ENABLE_FRONTIERS (1)
//
// Main netlist
//
NETLIST_START(barrier)
SOLVER(Solver, 1000)
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active high
TTL_INPUT(I_OUT_1, 0) // active high
TTL_INPUT(I_OUT_2, 0) // active high
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_K(18))
RES(R2, 470)
RES(R3, RES_K(47))
RES(R4, RES_K(220))
RES(R5, 470)
RES(R6, 150)
RES(R7, RES_K(180))
RES(R8, RES_M(10))
RES(R9, RES_K(39))
RES(R10, RES_K(2.2))
RES(R11, 470)
RES(R12, RES_K(30))
RES(R13, RES_K(8.2))
RES(R14, RES_K(33))
RES(R15, RES_K(15))
RES(R16, RES_M(10))
RES(R17, RES_K(10))
RES(R18, RES_K(47))
RES(R19, 820)
// POT(R20, RES_K(10)) -- part of final amp (not emulated)
// RES(R21, 150) -- part of final amp (not emulated), not present on Space Wars
// RES(R22, 2.7) -- part of final amp (not emulated), not present on Space Wars
// RES(R23, 2.7) -- part of final amp (not emulated), not present on Space Wars
RES(R24, RES_K(47))
RES(R25, 150)
RES(R26, RES_K(160))
RES(R27, 750)
// RES(R28, RES_K(150)) -- part of final amp (not emulated), illegible on Space Wars
// POT(R29, RES_K(10)) -- part of final amp (not emulated)
// RES(R30, 470) -- part of final amp (not emulated)
RES(R31, 470)
RES(R32, RES_K(1))
RES(R33, RES_K(39))
RES(R34, RES_K(6.8))
RES(R35, RES_K(560))
RES(R36, RES_M(1))
RES(R37, RES_K(10))
RES(R38, RES_K(10))
CAP(C1, CAP_U(1))
CAP(C2, CAP_U(1))
CAP(C3, CAP_U(0.01))
CAP(C4, CAP_U(0.01))
CAP(C5, CAP_U(0.1))
// CAP(C6, CAP_U(4.7)) // not needed
CAP(C7, CAP_U(0.01))
CAP(C8, CAP_U(1))
CAP(C9, CAP_U(0.1))
CAP(C10, CAP_P(220))
CAP(C11, CAP_U(0.1))
// CAP(C12, CAP_U(0.01)) -- part of final amp (not emulated)
// CAP(C13, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C14, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C15, CAP_U(50)) -- not needed
// CAP(C16, CAP_U(2.2)) -- not needed
CAP(C17, CAP_U(0.01))
CAP(C18, CAP_U(15))
// CAP(C19, CAP_U(50)) -- not needed
// CAP(C20, CAP_U(2.2)) -- not needed
CAP(C21, CAP_U(0.02))
CAP(C22, CAP_U(0.1))
D_1N914(CR1)
D_1N914(CR2)
D_1N914(CR3)
D_1N914(CR4)
D_1N914(CR5)
D_1N914(CR6)
Q_2N3906(Q1) // PNP
Q_2N3904(Q2) // NPN
Q_2N6426(Q3) // NPN Darlington
Q_2N6292(Q4) // NPN
Q_2N6107(Q5) // PNP
Q_2N6426(Q6) // NPN Darlington
Q_2N3904(Q7) // NPN
TL081_DIP(U1) // Op. Amp.
NET_C(U1.4, I_VM15)
NET_C(U1.7, I_V15)
TTL_7406_DIP(U2) // Hex inverter -- currently using a clone of 7416, no open collector behavior
NET_C(U2.7, GND)
NET_C(U2.14, I_V5)
TL081_DIP(U3) // Op. Amp.
NET_C(U3.4, I_VM15)
NET_C(U3.7, I_V15)
// TTL_7815_DIP(U4) // +15V Regulator -- not needed
TL182_DIP(U5) // Analog switch
NET_C(U5.6, I_V15)
NET_C(U5.7, I_V5)
NET_C(U5.8, GND)
NET_C(U5.9, I_VM15)
// TL081_DIP(U6) // Op. Amp. -- part of final amp (not emulated)
// NET_C(U6.4, I_VM15)
// NET_C(U6.7, I_V15)
// TTL_7915_DIP(U7) // -15V Regulator -- not needed
TL081_DIP(U8) // Op. Amp.
NET_C(U8.4, I_VM15)
NET_C(U8.7, I_V15)
TL081_DIP(U9) // Op. Amp.
NET_C(U9.4, I_VM15)
NET_C(U9.7, I_V15)
//
// Top-left until output from U1
//
#if (HLE_NOISE_GEN)
CLOCK(NOISE_CLOCK, 2000)
NET_C(NOISE_CLOCK.GND, GND)
NET_C(NOISE_CLOCK.VCC, I_V5)
SYS_NOISE_MT_U(NOISE, 3)
NET_C(NOISE.I, NOISE_CLOCK.Q)
NET_C(NOISE.1, GND)
NET_C(NOISE.2, C1.1)
NET_C(GND, R1.1, R1.2, R2.1, R2.2, CR1.A, CR1.K, CR2.A, CR2.K)
#else
NET_C(I_V15, CR1.A)
NET_C(CR1.K, CR2.A)
NET_C(CR2.K, R1.2, Q1.B)
NET_C(R1.1, GND)
NET_C(I_V15, R2.2)
NET_C(R2.1, Q1.E)
NET_C(Q2.E, Q1.C, C1.1)
NET_C(Q2.C, GND)
#endif
NET_C(C1.2, R3.2, U1.3)
NET_C(R3.1, GND)
NET_C(U1.2, R5.2, R4.1)
NET_C(R5.1, GND)
NET_C(R4.2, U1.6)
//
// Top-middle, from O1 until output from CR3
//
NET_C(I_OUT_1, U2.13)
NET_C(U2.12, R6.1)
NET_C(R6.2, R7.1, C2.1, Q3.B)
NET_C(R7.2, I_V5)
NET_C(C2.2, GND)
NET_C(Q3.E, R11.2)
NET_C(Q3.C, I_V5)
NET_C(R11.1, CR3.A)
//
// Middle chunk, from C3 until output from R13
//
NET_C(U1.6, C3.1)
NET_C(C3.2, R8.1, U3.2)
NET_C(U3.3, GND)
NET_C(R8.2, U3.6, R9.1)
NET_C(R9.2, CR3.K, C4.1, CR4.A, R10.2)
NET_C(R10.1, CR4.K, GND)
NET_C(C4.2, R12.1)
NET_C(R12.2, C5.2, R13.1)
NET_C(C5.1, GND)
//
// Big middle section, from C8 until output from R15/R41/R37
//
NET_C(U1.6, C8.2)
NET_C(C8.1, R24.1)
NET_C(R24.2, U8.2, C10.1, R16.1)
NET_C(U8.3, GND)
NET_C(U8.6, R16.2, C10.2, R31.1, R38.1)
// NET_C(U8.6, R13.2) // Schems show noise source into summing amp -- wrong??
NET_C(R38.2, U5.14)
NET_C(I_OUT_2, U5.10)
NET_C(U5.13, C7.1)
NET_C(C7.2, R14.1)
NET_C(R37.2, R13.2)
NET_C(R14.2, C9.2, R15.1)
NET_C(C9.1, GND)
NET_C(R15.2, R13.2)
NET_C(I_OUT_0, U2.9)
NET_C(U2.8, R25.1)
NET_C(R25.2, R26.1, C17.1, Q6.B, C18.1)
NET_C(R26.2, C17.2, I_V5)
NET_C(C18.2, GND)
NET_C(Q6.E, R27.2)
NET_C(Q6.C, I_V5)
NET_C(R27.1, CR5.A)
NET_C(CR5.K, R33.2, CR6.A, R34.2, C21.2, C22.1)
NET_C(R31.2, R32.2, R33.1, Q7.E)
NET_C(R32.1, Q7.B)
NET_C(Q7.C, CR6.K, R34.1, C21.1, GND)
NET_C(C22.2, R35.1)
NET_C(R35.2, U9.2, R36.1)
NET_C(U9.3, GND)
NET_C(U9.6, R36.2, R37.1)
//
// Final stage
//
NET_C(R17.2, C11.1, R13.2)
NET_C(R17.1, R18.1, GND)
NET_C(C11.2, R18.2, R19.1)
NET_C(R19.2, GND)
ALIAS(OUTPUT, R18.2)
//
// Unconnected inputs
//
NET_C(GND, U2.3, U2.5, U2.11)
NET_C(GND, U5.1, U5.2, U5.5, U2.1)
//
// Frontier optimizations
//
#if (ENABLE_FRONTIERS)
// Separate each input into the summing network
OPTIMIZE_FRONTIER(R13.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R15.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R37.1, RES_M(1), 50)
// Decouple the Darlington BJTs from the sounds they enable
OPTIMIZE_FRONTIER(R27.2, RES_M(1), 50)
OPTIMIZE_FRONTIER(R11.2, RES_M(1), 50)
// Decouple the noise source from the downstream filters
OPTIMIZE_FRONTIER(C3.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R24.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R38.1, RES_M(1), 50)
#endif
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_BARRIER_H
#define MAME_AUDIO_NL_BARRIER_H
#pragma once
NETLIST_EXTERNAL(barrier)
#endif // MAME_AUDIO_NL_BARRIER_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_BOXINGB_H
#define MAME_AUDIO_NL_BOXINGB_H
#pragma once
NETLIST_EXTERNAL(boxingb)
#endif // MAME_AUDIO_NL_BOXINGB_H

View File

@ -0,0 +1,382 @@
// license:CC0
// copyright-holders:Aaron Giles,Couriersud
#ifndef MAME_AUDIO_NL_CINEMAT_COMMON_H
#define MAME_AUDIO_NL_CINEMAT_COMMON_H
//
// Misc common devices used by Cinematronics games.
//
// Eventually these should be included in the core.
//
// Known problems/issues:
//
// * There are 5 different models of the CA3080 presented here.
// More analysis on the pros/cons of each should be done.
//
// * The TL182 analog switch is cobbled together from a pair of
// CD4066 gates and a pair of inverters on the inputs. This
// seems to work but perhaps should be properly added as a
// system model.
//
// * The 2N6426 Darlington transistors are not properly emulated.
// Currently they are modeled as a pair of 2N3904s. A pspice
// model ported into the netlist schema creates a very poor
// balance with the background noise in Space Wars/Barrier.
//
#include "netlist/devices/net_lib.h"
//
// Direct mappings
//
// AMI S2688 is compatible with MM5837
#define AMI_S2688 MM5837_DIP
// LM555/566 is compatible with NE555/566
#define LM555_DIP NE555_DIP
#define LM566_DIP NE566_DIP
// alias LS devices to real devices
#define TTL_74LS00_DIP TTL_7400_DIP
#define TTL_74LS02_DIP TTL_7402_DIP // Quad 2-input Nor Gate
#define TTL_74S04_DIP TTL_7404_DIP // Hex Inverting Gates
#define TTL_74LS04_DIP TTL_7404_DIP // Hex Inverting Gates
#define TTL_74LS08_DIP TTL_7408_DIP // Quad 2-Input AND Gates
#define TTL_74LS21_DIP TTL_7421_DIP // Dual 4-Input AND Gates
#define TTL_74LS74_DIP TTL_7474_DIP // Dual D Flip Flop
#define TTL_74LS75_DIP TTL_7475_DIP // 4-Bit Bistable Latches with Complementary Outputs
#define TTL_74LS86_DIP TTL_7486_DIP // Quad 2-Input Exclusive-OR Gates
#define TTL_74LS107_DIP TTL_74107_DIP
#define TTL_74S113_DIP TTL_74113_DIP
#define TTL_74S113A_DIP TTL_74113A_DIP
#define TTL_74LS123_DIP TTL_74123_DIP
#define TTL_74LS125_DIP TTL_74125_DIP
#define TTL_74LS157_DIP TTL_74157_DIP
#define TTL_74LS163_DIP TTL_74163_DIP
#define TTL_74LS164_DIP TTL_74164_DIP
#define TTL_74LS191_DIP TTL_74191_DIP
#define TTL_74LS259_DIP TTL_9334_DIP // Seems to be pin-compatible
#define TTL_74LS377_DIP TTL_74377_DIP
#define TTL_74LS393_DIP TTL_74393_DIP
//
// Diode models
//
// models copied from https://www.diodes.com/assets/Spice-Models/Discrete-Prodcut-Groups/Zener-Diodes.txt
#define D_1N914(name) DIODE(name, "1N914")
#define D_1N914B(name) DIODE(name, "1N914")
#define D_1N5236B(name) DIODE(name, "D(BV=7.5 IS=27.5p RS=33.8 N=1.10 CJO=58.2p VJ=0.750 M=0.330 TT=50.1n)")
#define D_1N5240(name) ZDIODE(name, "D(BV=10 IS=14.4p RS=32.0 N=1.10 CJO=24.1p VJ=0.750 M=0.330 TT=50.1n)")
#define D_1N5240B(name) ZDIODE(name, "D(BV=10 IS=14.4p RS=32.0 N=1.10 CJO=24.1p VJ=0.750 M=0.330 TT=50.1n)")
//
// Op-amp models
//
// SPICE model taken directly from Fairchild Semiconductor datasheet
#define Q_2N3904(name) QBJT_EB(name, "NPN(Is=6.734f Xti=3 Eg=1.11 Vaf=74.03 Bf=416.4 Ne=1.259 Ise=6.734 Ikf=66.78m Xtb=1.5 Br=.7371 Nc=2 Isc=0 Ikr=0 Rc=1 Cjc=3.638p Mjc=.3085 Vjc=.75 Fc=.5 Cje=4.493p Mje=.2593 Vje=.75 Tr=239.5n f=301.2p Itf=.4 Vtf=4 Xtf=2 Rb=10)")
// SPICE model taken directly from Fairchild Semiconductor datasheet
#define Q_2N3906(name) QBJT_EB(name, "PNP(Is=1.41f Xti=3 Eg=1.11 Vaf=18.7 Bf=180.7 Ne=1.5 Ise=0 Ikf=80m Xtb=1.5 Br=4.977 Nc=2 Isc=0 Ikr=0 Rc=2.5 Cjc=9.728p Mjc=.5776 Vjc=.75 Fc=.5 Cje=8.063p Mje=.3677 Vje=.75 Tr=33.42n Tf=179.3p Itf=.4 Vtf=4 Xtf=6 Rb=10)")
// SPICE model taken from https://www.onsemi.com/support/design-resources/models?rpn=2N6107
#define Q_2N6107(name) QBJT_EB(name, "PNP(IS=7.62308e-14 BF=6692.56 NF=0.85 VAF=10 IKF=0.032192 ISE=2.07832e-13 NE=2.41828 BR=15.6629 NR=1.5 VAR=1.44572 IKR=0.32192 ISC=4.75e-16 NC=3.9375 RB=7.19824 IRB=0.1 RBM=0.1 RE=0.0001 RC=0.355458 XTB=0.1 XTI=2.97595 EG=1.206 CJE=1.84157e-10 VJE=0.99 MJE=0.347177 TF=6.63757e-09 XTF=1.50003 VTF=1.0001 ITF=1 CJC=1.06717e-10 VJC=0.942679 MJC=0.245405 XCJC=0.8 FC=0.533334 CJS=0 VJS=0.75 MJS=0.5 TR=1.32755e-07 PTF=0 KF=0 AF=1)")
// SPICE model taken from https://www.onsemi.com/support/design-resources/models?rpn=2N6292
#define Q_2N6292(name) QBJT_EB(name, "NPN(IS=9.3092e-13 BF=2021.8 NF=0.85 VAF=63.2399 IKF=1 ISE=1.92869e-13 NE=1.97024 BR=40.0703 NR=1.5 VAR=0.89955 IKR=10 ISC=4.92338e-16 NC=3.9992 RB=6.98677 IRB=0.1 RBM=0.1 RE=0.0001 RC=0.326141 XTB=0.1 XTI=2.86739 EG=1.206 CJE=1.84157e-10 VJE=0.99 MJE=0.347174 TF=6.73756e-09 XTF=1.49917 VTF=0.997395 ITF=0.998426 CJC=1.06717e-10 VJC=0.942694 MJC=0.245406 XCJC=0.8 FC=0.533405 CJS=0 VJS=0.75 MJS=0.5 TR=6.0671e-08 PTF=0 KF=0 AF=1)")
// SPICE model taken from http://ltwiki.org/files/LTspiceIV/Vendor%20List/Fairchild/2N/index.html
#define Q_2N5210(name) QBJT_EB(name, "NPN(Is=5.911f Xti=3 Eg=1.11 Vaf=62.37 Bf=809.9 Ne=1.358 Ise=5.911f Ikf=14.26m Xtb=1.5 Br=1.287 Nc=2 Isc=0 Ikr=0 Rc=1.61 Cjc=4.017p Mjc=.3174 Vjc=.75 Fc=.5 Cje=4.973p Mje=.4146 Vje=.75 Tr=4.68n Tf=820.9p Itf=.35 Vtf=4 Xtf=7 Rb=10)")
//
// 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)
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()
//
// TL182 analog switch
//
#define TL182_DIP(name) SUBMODEL(_TL182_DIP, name)
static NETLIST_START(_TL182_DIP)
CD4066_GATE(A)
CD4066_GATE(B)
NET_C(A.VDD, B.VDD)
NET_C(A.VSS, B.VSS)
PARAM(A.BASER, 270.0)
PARAM(B.BASER, 270.0)
RES(VR, 100)
NC_PIN(NC)
TTL_7406_GATE(AINV)
TTL_7406_GATE(BINV)
NET_C(AINV.VCC, BINV.VCC, A.VDD)
NET_C(AINV.GND, BINV.GND, A.VSS)
NET_C(AINV.Y, A.CTL)
NET_C(BINV.Y, B.CTL)
DIPPINS( /* +--------------+ */
A.R.1, /* 1S |1 ++ 14| 2S */ B.R.1,
A.R.2, /* 1D |2 13| 2D */ B.R.2,
NC.I, /* NC |3 12| NC */ NC.I,
NC.I, /* NC |4 TL182 11| NC */ NC.I,
AINV.A, /* 1A |5 10| 2A */ BINV.A,
VR.1, /* VCC |6 9| VEE */ VR.2,
A.VDD, /* VLL |7 8| VREF */ A.VSS
/* +--------------+ */
)
NETLIST_END()
//
// 2N6426, Darlington transistor
//
#define Q_2N6426(name) SUBMODEL(_Q_2N6426, name)
#if 0
//
// This model causes the background noise level to domainate all other sounds in spacewar?
//
// Model dervied from https://www.onsemi.com/support/design-resources/models?rpn=2N6284
static NETLIST_START(_Q_2N6426)
QBJT_EB(Q1, "NPN(IS=1.73583e-11 BF=831.056 NF=1.05532 VAF=957.147 IKF=0.101183 ISE=1.65383e-10 NE=1.59909 BR=2.763 NR=1.03428 VAR=4.18534 IKR=0.0674174 ISC=1.00007e-13 NC=2.00765 RB=22.2759 IRB=0.208089 RBM=22.2759 RE=0.0002 RC=0.001 XTB=2.12676 XTI=1.82449 EG=1.05 CJE=2.62709e-10 VJE=0.95 MJE=0.23 TF=1e-09 XTF=1 VTF=10 ITF=0.01 CJC=3.59851e-10 VJC=0.845279 MJC=0.23 XCJC=0.9 FC=0.5 TR=1e-07 PTF=0 KF=0 AF=1)")
QBJT_EB(Q2, "NPN(IS=1.73583e-11 BF=831.056 NF=1.05532 VAF=957.147 IKF=0.101183 ISE=1.65383e-10 NE=1.59909 BR=2.763 NR=1.03428 VAR=4.18534 IKR=0.0674174 ISC=1.00007e-13 NC=2.00765 RB=22.2759 IRB=0.208089 RBM=22.2759 RE=0.0002 RC=0.001 XTB=2.12676 XTI=1.82449 EG=1.05 CJE=2.62709e-10 VJE=0.95 MJE=0.23 TF=1e-09 XTF=1 VTF=10 ITF=0.01 CJC=0 VJC=0.845279 MJC=0.23 XCJC=0.9 FC=0.5 TR=1e-07 PTF=0 KF=0 AF=1)") // NPN
DIODE(D1, "D(IS=1e-12 RS=10.8089 N=1.00809 XTI=3.00809 CJO=0 VJ=0.75 M=0.33 FC=0.5)")
RES(R1, RES_K(8))
RES(R2, 50)
ALIAS(B, Q1.B)
ALIAS(C, Q1.C)
ALIAS(E, Q2.E)
NET_C(Q1.C, Q2.C, D1.K)
NET_C(Q1.B, R1.1)
NET_C(Q2.E, D1.A, R2.2)
NET_C(Q1.E, Q2.B, R1.2, R2.1)
NETLIST_END()
#else
// super brain-dead model I threw together from a pair of 2N3904
static NETLIST_START(_Q_2N6426)
QBJT_EB(Q1, "NPN")
QBJT_EB(Q2, "NPN")
ALIAS(B, Q1.B)
ALIAS(C, Q1.C)
ALIAS(E, Q2.E)
NET_C(Q1.C, Q2.C)
NET_C(Q1.E, Q2.B)
NETLIST_END()
#endif
//
// LM3900, quad op-amp
//
#define LM3900_DIP(name) SUBMODEL(_LM3900_DIP, name)
static NETLIST_START(_LM3900_DIP)
LM3900(A)
LM3900(B)
LM3900(C)
LM3900(D)
NET_C(A.VCC, B.VCC, C.VCC, D.VCC)
NET_C(A.GND, B.GND, C.GND, D.GND)
DIPPINS( /* +--------------+ */
A.PLUS, /* 1IN+ |1 ++ 14| VCC */ A.VCC,
B.PLUS, /* 2IN+ |2 13| 3IN+ */ C.PLUS,
B.MINUS, /* 2IN- |3 12| 4IN+ */ D.PLUS,
B.OUT, /* 2OUT |4 LM3900 11| 4IN- */ D.MINUS,
A.OUT, /* 1OUT |5 10| 4OUT */ D.OUT,
A.MINUS, /* 1IN- |6 9| 3OUT */ C.OUT,
A.GND, /* GND |7 8| 3IN- */ C.MINUS
/* +--------------+ */
)
NETLIST_END()
// *************************************************
// EQUIVALENT SUBSTITUTE FOR CA3080 IS NTE996
// (SAME 8-PIN DIP PINOUT)
// *************************************************
//
// CA3080 OPERATIONAL TRANSCONDUCTANCE AMPLIFIER
//
// SPICE (SIMULATION PROGRAM WITH INTEGRATED CIRCUIT EMPHASIS)
// SUBCIRCUIT
//
// CONNECTIONS:
// INVERTING INPUT
// | NON-INVERTING INPUT
// | | NEGATIVE POWER SUPPLY
// | | | I BIAS
// | | | | OUTPUT
// | | | | | POSITIVE POWER SUPPLY
// | | | | | |
//.SUBCKT CA3080 2 3 4 5 6 7
//
// DIP mappings use the submodels below for CA3080
//
#define CA3080_FAST_DIP(name) SUBMODEL(_CA3080_FAST_DIP, name)
#define CA3080_SLOW_DIP(name) SUBMODEL(_CA3080_SLOW_DIP, name)
//
// Default to the fast model unless otherwise directed
//
#ifndef CA3080_DIP
#define CA3080_DIP CA3080_FAST_DIP
#endif
//
// Fast model: works well for most cases in Cinematronics games,
// except when used in a network with multiple CA3080's, due to
// the presence of an AFUNC.
//
static NETLIST_START(_CA3080_FAST_DIP)
ALIAS(2, F.A0) // -
ALIAS(3, F.A1) // +
ALIAS(4, F.A2) // V-
ALIAS(5, RIABC.1) // IB
ALIAS(6, VO.OP) // FIXME
ALIAS(7, F.A4) // V+
RES(RI, 26000)
NET_C(RI.1, F.A0)
NET_C(RI.2, F.A1)
// Delivers I0
AFUNC(F, 5, "max(-0.5e-3, min(0.5e-3, 19.2 * (A3 - A2) * A0))")
RES(RIABC, 1)
NET_C(RIABC.2, F.A2)
NET_C(RIABC.1, F.A3) // IB
VCCS(VO, 1)
ANALOG_INPUT(XGND, 0)
NET_C(XGND, VO.IN, VO.ON) // FIXME: assume symmetric supply
NET_C(F.Q, VO.IP)
NETLIST_END()
//
// Slow model: derived from
// https://github.com/xxv/gedasymbols/blob/master/www/user/john_doty/models/opamp/ca3080.mod
//
// This seems to produce reasonable results as a slow drop-in
// replacement for the fast model above in solarq, but is quite
// slow. One advantage is that it works in a network with multiple
// CA3080's.
//
static NETLIST_START(_CA3080_SLOW_DIP)
//
// These items are common to several models
//
#define CA3080_D(name) DIODE(name, "D(IS=2p RS=5 BV=40 CJO=3p TT=6n)")
#define CA3080_NPN(name) QBJT_EB(name, "NPN(IS=21.48f XTI=3 EG=1.11 VAF=80 BF=550 ISE=50f NE=1.5 IKF=10m XTB=1.5 BR=.1 ISC=10f NC=2 IKR=3m RC=10 CJC=800f MJC=.3333 VJC=.75 FC=.5 CJE=1.3p MJE=.3333 VJE=.75 TR=30n TF=400P ITF=30m XTF=1 VTF=10 CJS=5.8P MJS=.3333 VJS=.75)")
#define CA3080_PNP(name) QBJT_EB(name, "PNP(IS=50f XTI=3 EG=1.11 VAF=80 BF=100 ISE=130f NE=1.5 IKF=1m XTB=1.5 BR=1 ISC=0 NC=2 IKR=0 RC=0 CJC=4p MJC=.3333 VJC=.75 FC=.5 CJE=1.4p MJE=.3333 VJE=.75 TR=500n TF=23n ITF=.1 XTF=1 VTF=10 CJS=5.5P MJS=.3333 VJS=.75)")
CA3080_D(D1)
CA3080_D(D2)
CA3080_NPN(Q1)
CA3080_PNP(Q2)
CA3080_PNP(Q3)
CA3080_NPN(Q4)
CA3080_NPN(Q5)
CA3080_PNP(Q6)
CA3080_PNP(Q7)
CA3080_PNP(Q8)
CA3080_PNP(Q9)
CA3080_NPN(Q10)
CA3080_NPN(Q11)
CA3080_NPN(Q12)
CA3080_NPN(Q13)
CA3080_PNP(Q14)
CA3080_PNP(Q15)
ALIAS(2, Q10.B) // N1
ALIAS(3, Q5.B) // N28
ALIAS(4, Q1.E) // N13
ALIAS(5, Q1.B) // N11
ALIAS(6, Q6.C) // N30
ALIAS(7, Q8.E) // N8
NET_C(Q8.E, Q9.E, Q14.E, Q15.E) // N8
NET_C(Q1.B, Q1.C, Q4.B) // N11
NET_C(Q1.E, Q4.E, Q11.E, Q12.E) // N13
NET_C(Q6.C, Q7.C, Q13.C) // N30
NET_C(Q3.B, Q10.C, Q14.C, D1.A) // N1N13
NET_C(Q2.E, Q14.B, Q15.C, Q15.B) // N1N15
NET_C(Q2.B, Q3.E, D1.K) // N1N17
NET_C(Q2.C, Q3.C, Q11.C, Q13.B) // N1N22
NET_C(Q5.C, Q6.B, Q9.C, D2.A) // N1N32
NET_C(Q6.E, Q7.B, D2.K) // N1N34
NET_C(Q7.E, Q8.C, Q8.B, Q9.B) // N1N36
NET_C(Q4.C, Q5.E, Q10.E) // N1N52
NET_C(Q11.B, Q12.C, Q12.B, Q13.E) // N1N44
NETLIST_END()
//
// List of local models to include to make MAME happy
//
#define CINEMAT_LOCAL_MODELS \
LOCAL_SOURCE(_NE556_DIP) \
LOCAL_SOURCE(_TL182_DIP) \
LOCAL_SOURCE(_Q_2N6426) \
LOCAL_SOURCE(_LM3900_DIP) \
LOCAL_SOURCE(_CA3080_FAST_DIP) \
LOCAL_SOURCE(_CA3080_SLOW_DIP) \
#endif // MAME_AUDIO_NL_CINEMAT_COMMON_H

View File

@ -0,0 +1,701 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Rip Off
//
// Derived from the schematics in the Rip Off manual.
//
// Known problems/issues:
//
// * Voltage triggers for Motor 1 and Beep need a hack to
// work (reducing resistance on one resistor from 4.7K to 100)
// Need to understand why.
//
// * Motor 1 and beep sounds dominate the output. They are
// controlled by the current driven into the CCAs IC12 and
// IC6. Not sure if this overdrive is related to the problem
// with the switch above, but for now a hack is enabled to
// multiply the resistance by 5x going into the CCA, which
// seems to restore the balance to something reasonable.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_ripoff.h"
//
// Optimizations
//
#define HLE_LASER_VCO (1)
#define HLE_TORPEDO_VCO (1)
#define HLE_BACKGROUND_VCOS (1)
#define ENABLE_FRONTIERS (1)
//
// Hacks
//
#define HACK_VOLTAGE_SWITCH (1)
#define HACK_CCA_RESISTANCE (1)
//
// Main netlist
//
NETLIST_START(ripoff)
SOLVER(Solver, 1000)
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active high
TTL_INPUT(I_OUT_1, 0) // active high
TTL_INPUT(I_OUT_2, 0) // active high
TTL_INPUT(I_OUT_3, 0) // active high
TTL_INPUT(I_OUT_4, 0) // active high
TTL_INPUT(I_OUT_7, 0) // active high
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND, I_OUT_7.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC, I_OUT_7.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_K(47))
RES(R2, RES_K(47))
RES(R3, RES_K(330))
RES(R4, RES_K(10))
RES(R5, RES_K(2.7))
RES(R6, RES_K(2.7))
RES(R7, RES_K(1))
RES(R8, RES_K(470))
RES(R9, 330)
RES(R10, RES_K(20))
#if (HACK_VOLTAGE_SWITCH)
RES(R11, 100)
#else
RES(R11, RES_K(4.7))
#endif
RES(R12, 300)
RES(R13, RES_K(4.7))
RES(R14, RES_K(8.2))
RES(R15, RES_K(15))
RES(R16, RES_K(2.7))
RES(R17, RES_K(2.7))
#if (HACK_CCA_RESISTANCE)
RES(R18, RES_K(4100))
#else
RES(R18, RES_K(820))
#endif
RES(R19, RES_K(27))
RES(R20, RES_K(39))
RES(R21, RES_K(10))
RES(R22, 330)
RES(R23, 160)
RES(R24, RES_K(1))
RES(R25, RES_K(1))
RES(R26, RES_K(1))
RES(R27, RES_K(2))
RES(R28, RES_K(2))
RES(R29, RES_K(4.7))
RES(R30, RES_K(3.3))
RES(R31, RES_K(68))
RES(R32, RES_K(30))
RES(R33, RES_K(15))
RES(R34, RES_K(2.7))
RES(R35, RES_K(2.7))
#if (HACK_CCA_RESISTANCE)
RES(R36, RES_M(5))
#else
RES(R36, RES_M(1))
#endif
RES(R37, RES_K(56))
RES(R38, RES_K(24))
RES(R39, RES_K(15))
#if (HACK_VOLTAGE_SWITCH)
RES(R40, 100)
#else
RES(R40, RES_K(4.7))
#endif
RES(R41, 300)
RES(R42, RES_K(39))
RES(R43, RES_K(10))
RES(R44, 330)
RES(R45, RES_K(27))
// RES(R46, RES_K(12)) -- part of final amp (not emulated)
RES(R47, RES_K(1))
RES(R48, RES_K(2.7))
RES(R49, 470)
// POT(R50, RES_K()) -- listed as optional on schematics
// RES(R51, RES_K(1.5)) -- part of final amp (not emulated)
// RES(R52, 150) -- part of final amp (not emulated)
// RES(R53, RES_K(22)) -- part of final amp (not emulated)
// RES(R54, 150) -- part of final amp (not emulated)
// RES(R55, RES_K(39)) -- part of final amp (not emulated)
RES(R56, 150)
RES(R57, RES_K(2.7))
RES(R58, RES_M(1))
RES(R59, RES_K(20))
RES(R60, RES_K(10))
RES(R61, RES_K(1))
RES(R62, RES_K(10))
RES(R63, RES_K(20))
RES(R64, RES_K(39))
RES(R65, RES_K(82))
RES(R66, RES_K(2.7))
RES(R67, RES_K(3.9))
RES(R68, RES_M(1))
RES(R69, RES_K(20))
RES(R70, RES_K(10))
RES(R71, RES_K(1))
RES(R72, RES_K(10))
RES(R73, RES_K(20))
RES(R74, RES_K(39))
RES(R75, RES_K(82))
RES(R76, 470)
RES(R77, RES_M(1.5))
RES(R78, RES_K(20))
RES(R79, RES_M(1))
RES(R80, RES_K(43))
RES(R81, RES_K(20))
RES(R82, RES_M(1))
RES(R83, RES_K(20))
RES(R84, RES_K(10))
RES(R85, RES_K(1))
RES(R86, RES_K(10))
RES(R87, RES_K(20))
RES(R88, RES_K(39))
RES(R89, RES_K(82))
RES(R90, RES_K(1))
RES(R91, RES_K(2.7))
CAP(C1, CAP_U(100))
CAP(C2, CAP_U(0.1))
CAP(C3, CAP_U(0.1))
CAP(C4, CAP_U(0.02))
CAP(C5, CAP_U(0.1))
CAP(C6, CAP_U(0.68))
CAP(C7, CAP_U(0.01))
CAP(C8, CAP_U(4.7))
CAP(C9, CAP_U(0.047))
CAP(C10, CAP_U(0.01))
CAP(C11, CAP_U(0.1))
CAP(C12, CAP_U(0.1))
// CAP(C13, CAP_U()) -- not used according to schematics
CAP(C14, CAP_U(0.22))
CAP(C15, CAP_U(0.01))
CAP(C16, CAP_U(0.1))
CAP(C17, CAP_U(0.1))
CAP(C18, CAP_U(0.01))
CAP(C19, CAP_U(0.1))
// CAP(C20, CAP_U()) -- not used according to schematics
CAP(C21, CAP_U(0.68))
// CAP(C22, CAP_U(0.005)) -- part of final amp (not emulated)
// CAP(C23, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C24, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C25, CAP_P(470)) -- part of final amp (not emulated)
CAP(C26, CAP_U(0.1))
CAP(C27, CAP_U(0.1))
CAP(C28, CAP_U(0.01))
CAP(C29, CAP_U(0.047))
CAP(C30, CAP_U(0.22))
CAP(C31, CAP_U(0.1))
CAP(C32, CAP_U(0.68))
// CAP(C33, CAP_U(0.1)) -- part of voltage converter (not emulated)
// CAP(C34, CAP_U(25)) -- part of voltage converter (not emulated)
// CAP(C35, CAP_U(25)) -- part of voltage converter (not emulated)
// CAP(C36, CAP_U()) -- part of voltage converter (not emulated)
// CAP(C37, CAP_U(0.1)) -- part of voltage converter (not emulated)
// CAP(C38, CAP_U(25)) -- part of voltage converter (not emulated)
// CAP(C39, CAP_U(25)) -- part of voltage converter (not emulated)
// CAP(C40, CAP_U()) -- part of voltage converter (not emulated)
// CAP(C41, CAP_U(25)) -- part of voltage converter (not emulated)
// CAP(C42, CAP_U(0.1)) -- part of voltage converter (not emulated)
D_1N5240(D1)
D_1N914(D2)
D_1N914(D3)
D_1N914(D4)
D_1N914(D5)
D_1N914(D6)
D_1N914(D7)
D_1N914(D8)
D_1N914(D9)
D_1N914(D10)
D_1N914(D11)
D_1N5240(D12)
D_1N5240(D13)
Q_2N3906(Q1) // PNP
Q_2N3906(Q2) // PNP
Q_2N3906(Q3) // PNP
Q_2N3906(Q4) // PNP
Q_2N3906(Q5) // PNP
// Q_2N6292(Q6) // PNP -- part of final amp (not emulated)
// Q_2N6107(Q7) // PNP -- part of final amp (not emulated)
Q_2N3904(Q8) // NPN
Q_2N3904(Q9) // NPN
Q_2N3904(Q10) // NPN
AMI_S2688(IC1) // Noise generator
TL081_DIP(IC2) // Op. Amp.
NET_C(IC2.7, I_V15)
NET_C(IC2.4, I_VM15)
CA3080_DIP(IC3) // Op. Amp.
NET_C(IC3.4, I_VM15)
NET_C(IC3.7, I_V15)
LM555_DIP(IC4)
LM555_DIP(IC5)
CA3080_DIP(IC6) // Op. Amp.
NET_C(IC6.4, I_VM15)
NET_C(IC6.7, I_V15)
TL081_DIP(IC7) // Op. Amp.
NET_C(IC7.7, I_V15)
NET_C(IC7.4, I_VM15)
TTL_74LS164_DIP(IC8) // 8-bit Shift Reg.
NET_C(IC8.7, GND)
NET_C(IC8.14, I_V5)
TTL_74LS377_DIP(IC9) // Octal D Flip Flop
NET_C(IC9.10, GND)
NET_C(IC9.20, I_V5)
TTL_7406_DIP(IC10) // Hex inverter -- currently using a clone of 7416, no open collector behavior
NET_C(IC10.7, GND)
NET_C(IC10.14, I_V5)
LM555_DIP(IC11)
CA3080_DIP(IC12) // Op. Amp.
NET_C(IC12.4, I_VM15)
NET_C(IC12.7, I_V15)
LM555_DIP(IC13)
TL081_DIP(IC14) // Op. Amp.
NET_C(IC14.7, I_V15)
NET_C(IC14.4, I_VM15)
TL081_DIP(IC15) // Op. Amp.
NET_C(IC15.7, I_V15)
NET_C(IC15.4, I_VM15)
TL081_DIP(IC16) // Op. Amp.
NET_C(IC16.7, I_V15)
NET_C(IC16.4, I_VM15)
TL081_DIP(IC17) // Op. Amp.
NET_C(IC17.7, I_V15)
NET_C(IC17.4, I_VM15)
TTL_74LS393_DIP(IC18) // Dual 4 Bit B.C.
NET_C(IC18.7, GND)
NET_C(IC18.14, I_V5)
TL081_DIP(IC19) // Op. Amp.
NET_C(IC19.7, I_V15)
NET_C(IC19.4, I_VM15)
TL081_DIP(IC20) // Op. Amp.
NET_C(IC20.7, I_V15)
NET_C(IC20.4, I_VM15)
TL081_DIP(IC21) // Op. Amp.
NET_C(IC21.7, I_V15)
NET_C(IC21.4, I_VM15)
TTL_74LS393_DIP(IC22) // Dual 4 Bit B.C.
NET_C(IC22.7, GND)
NET_C(IC22.14, I_V5)
// TTL_7915_DIP(IC23) // -15V Regulator -- not emulated
// TTL_7815_DIP(IC24) // +15V Regulator -- not emulated
TTL_7414_DIP(IC25) // Hex Inverter
NET_C(IC25.7, GND)
NET_C(IC25.14, I_V5)
//
// Explosion
//
NET_C(I_OUT_7, R7.1, IC4.2)
NET_C(IC4.8, IC4.4, I_V5) // pin 4 not documented in schematics
NET_C(R7.2, I_V5)
NET_C(R8.2, I_V5)
NET_C(R8.1, IC4.6, IC4.7, C6.1)
NET_C(C6.2, GND)
NET_C(IC4.5, C7.2)
NET_C(C7.1, GND)
NET_C(IC4.1, GND)
NET_C(IC4.3, Q1.E)
NET_C(Q1.B, R9.2)
NET_C(R9.1, GND)
NET_C(Q1.C, C8.1, R10.1)
NET_C(C8.2, I_VM15)
NET_C(R10.2, IC3.5)
NET_C(C1.1, IC1.4, I_V15)
NET_C(C1.2, GND)
NET_C(IC1.1, IC1.2, GND)
NET_C(IC1.3, R1.1)
NET_C(R1.2, C2.2, R2.1)
NET_C(C2.1, GND)
NET_C(R2.2, C3.1)
NET_C(C3.2, IC2.2, C4.1, R3.1)
NET_C(IC2.3, GND)
NET_C(IC2.6, C4.2, R3.2, R4.1)
NET_C(R4.2, C5.1)
NET_C(C5.2, R5.2, IC3.2)
NET_C(R5.1, GND)
NET_C(IC3.3, R6.2)
NET_C(R6.1, GND)
NET_C(IC3.6, IC7.3, R19.2)
NET_C(R19.1, GND)
//
// Shift register
//
NET_C(I_OUT_0, IC25.1)
NET_C(IC25.2, IC25.13)
NET_C(IC25.12, IC8.2)
NET_C(I_OUT_1, IC25.3)
NET_C(IC25.4, IC25.11)
NET_C(IC25.10, IC8.8)
NET_C(R24.1, I_V5)
NET_C(R24.2, IC8.9, IC8.1)
NET_C(I_OUT_2, IC25.5)
NET_C(IC25.6, IC25.9)
NET_C(IC25.8, IC9.11)
NET_C(IC9.1, GND)
NET_C(IC8.3, IC9.3)
NET_C(IC8.4, IC9.4)
NET_C(IC8.5, IC9.7)
NET_C(IC8.6, IC9.8)
NET_C(IC8.10, IC9.13)
NET_C(IC8.11, IC9.14)
//
// Background
//
NET_C(IC9.9, IC22.2)
NET_C(IC9.2, IC10.1)
NET_C(IC10.2, R25.2, R26.1)
NET_C(IC9.5, IC10.3)
NET_C(IC10.4, R27.2, R28.1)
NET_C(IC9.6, IC10.5)
NET_C(IC10.6, R29.2, R30.1)
NET_C(R29.1, R27.1, R25.1, D1.K, R23.1) // also R50.2 if present
NET_C(R23.2, I_V15)
NET_C(D1.A, GND)
NET_C(R26.2, R28.2, R30.2, R76.1, IC19.2) // also R50.1 if present
NET_C(IC19.3, GND)
NET_C(IC19.6, R76.2, D8.A, D6.A)
#if (HLE_BACKGROUND_VCOS)
//
// The two background VCOs are done with diodes and op-amps,
// but end up generating a quite linear voltage-to-period
// mapping. There is a low-frequency VCO and a high-frequency
// one. They are combined and sent to an LS393 counter as a
// clock after going through a voltage converter. Here we
// skip the whole lot.
//
// First VCO, vs IC19.6:
// R2 = 0.99406: HP = (-0.0235033*A0) + 0.0179360
// R2 = 0.99415: HP = (0.000193041*A0*A0) - (0.0227932*A0) + 0.0182436
// R2 = 0.99418: HP = (-0.000106682*A0*A0*A0) - (0.000443621*A0*A0) - (0.0237264*A0) + 0.0180362
// R2 = 0.99419: HP = (0.000069781*A0*A0*A0*A0) + (0.000470159*A0*A0*A0) + (0.00104384*A0*A0) - (0.0224827*A0) + 0.0182202
// R2 = 0.99419: HP = (-0.0000242172*A0*A0*A0*A0*A0) - (0.000186286*A0*A0*A0*A0) - (0.000483269*A0*A0*A0) - (0.000431519*A0*A0) - (0.0233265*A0) + 0.0181209
//
// Second VCO, vs IC19.6:
// R2 = 0.99969: HP = (-0.000308955*A0) + 0.000256399
// R2 = 0.99986: HP = (0.00000356099*A0*A0) - (0.000295774*A0) + 0.000262224
// R2 = 0.99986: HP = (-0.000000646439*A0*A0*A0) - (0.000000309249*A0*A0) - (0.000301475*A0) + 0.000260938
// R2 = 0.99986: HP = (0.0000000315553*A0*A0*A0*A0) - (0.000000385224*A0*A0*A0) + (0.000000365474*A0*A0) - (0.000300909*A0) + 0.000261022
// R2 = 0.99986: HP = (-0.0000000265364*A0*A0*A0*A0*A0) - (0.000000249089*A0*A0*A0*A0) - (0.00000143038*A0*A0*A0) - (0.00000125235*A0*A0) - (0.000301835*A0) + 0.000260913
//
VARCLOCK(BGCLK1, 1, "max(0.000001,min(0.1,(-0.0235033*A0) + 0.0179360))")
NET_C(BGCLK1.GND, GND)
NET_C(BGCLK1.VCC, I_V15)
NET_C(BGCLK1.A0, IC19.6)
NET_C(BGCLK1.Q, BGCOMBINE.A0)
NET_C(GND, R77.1, R77.2, R78.1, R78.2, R79.1, R79.2, C30.1, C30.2, D6.K, D7.A, D7.K, IC20.2, IC20.3)
VARCLOCK(BGCLK2, 1, "max(0.000001,min(0.1,(-0.000308955*A0) + 0.000256399))")
NET_C(BGCLK2.GND, GND)
NET_C(BGCLK2.VCC, I_V15)
NET_C(BGCLK2.A0, IC19.6)
NET_C(BGCLK2.Q, BGCOMBINE.A1)
NET_C(GND, R80.1, R80.2, R81.1, R81.2, R82.1, R82.2, C31.1, C31.2, D8.K, D9.A, D9.K, IC21.2, IC21.3)
AFUNC(BGCOMBINE, 2, "max(A0,A1)")
NET_C(BGCOMBINE.Q, IC22.1)
NET_C(GND, R83.1, R83.2, R84.1, R84.2, R85.1, R85.2, D10.A, D10.K, D11.A, D11.K)
#else
NET_C(D6.K, D7.A, R79.1, IC20.3)
NET_C(D7.K, GND)
NET_C(IC20.2, C30.2, R77.1)
NET_C(C30.1, GND)
NET_C(IC20.6, R77.2, D10.A, R78.1, R79.2)
NET_C(D10.K, R78.2, R83.1, R81.2, D11.K)
NET_C(D11.A, R82.2, IC21.6, R80.2, R81.1)
NET_C(IC21.3, R82.1, D9.A, D8.K)
NET_C(D9.K, GND)
NET_C(IC21.2, C31.2, R80.1)
NET_C(C31.1, GND)
NET_C(R83.2, R84.2, Q10.B)
NET_C(R84.1, GND)
NET_C(Q10.E, GND)
NET_C(Q10.C, R85.1, IC22.1)
NET_C(R85.2, I_V5)
#endif
NET_C(IC22.3, R86.1)
NET_C(IC22.4, R87.1)
NET_C(IC22.5, R88.1)
NET_C(IC22.6, R89.1)
NET_C(R86.2, R87.2, R88.2, R89.2, R90.2, R91.1)
NET_C(R90.1, GND)
NET_C(R91.2, C32.1)
NET_C(C32.2, R49.1)
NET_C(R49.2, R45.1)
//
// Beep
//
NET_C(IC9.12, Q2.B, R11.1)
NET_C(R11.2, R12.2, I_V5)
NET_C(Q2.E, R12.1)
NET_C(Q2.C, R20.2, R21.2, Q3.E)
NET_C(R20.1, I_VM15)
NET_C(R21.1, GND)
NET_C(Q3.B, R22.2)
NET_C(R22.1, GND)
NET_C(Q3.C, R18.1)
NET_C(R18.2, IC6.5)
NET_C(R13.2, IC5.4, IC5.8, I_V5)
NET_C(R13.1, IC5.7, R14.2)
NET_C(R14.1, IC5.6, IC5.2, C9.2)
NET_C(C9.1, GND)
NET_C(IC5.1, GND)
NET_C(IC5.5, C10.2)
NET_C(C10.1, GND)
NET_C(IC5.3, R15.1)
NET_C(R15.2, C11.1)
NET_C(C11.2, R16.2, IC6.2)
NET_C(R16.1, GND)
NET_C(IC6.3, R17.2)
NET_C(R17.1, GND)
NET_C(IC6.6, IC7.3)
NET_C(IC7.6, IC7.2, C12.1)
NET_C(C12.2, R45.2)
ALIAS(OUTPUT, R45.1)
//
// Motor 1
//
NET_C(IC9.15, R40.1, Q4.B)
NET_C(R40.2, R41.1, I_V5)
NET_C(R41.2, Q4.E)
NET_C(Q4.C, R42.2, R43.2, Q5.E)
NET_C(R42.1, I_VM15)
NET_C(R43.1, GND)
NET_C(Q5.B, R44.2)
NET_C(R44.1, GND)
NET_C(Q5.C, R36.1)
NET_C(R36.2, IC12.5)
NET_C(R31.2, IC11.4, IC11.8, I_V5)
NET_C(R31.1, IC11.7, R32.2)
NET_C(R32.1, IC11.6, IC11.2, C14.2)
NET_C(C14.1, GND, IC11.1, C15.1)
NET_C(C15.2, IC11.5)
NET_C(IC11.3, R33.1)
NET_C(R33.2, C16.1)
NET_C(C16.2, R34.2, IC12.2, C19.2)
NET_C(R34.1, GND)
NET_C(IC12.3, R35.2)
NET_C(R35.1, GND)
NET_C(IC12.6, D12.A, IC7.3)
NET_C(D12.K, D13.K)
NET_C(D13.A, GND)
NET_C(R37.2, IC13.4, IC13.8, I_V5)
NET_C(R37.1, IC13.7, R38.2)
NET_C(R38.1, IC13.6, IC13.2, C17.2)
NET_C(C17.1, GND)
NET_C(IC13.1, GND)
NET_C(IC13.5, C18.2)
NET_C(C18.1, GND)
NET_C(IC13.3, R39.1)
NET_C(R39.2, C19.1)
//
// Laser
//
NET_C(I_OUT_4, IC10.13, IC18.12)
NET_C(IC10.12, R56.1)
NET_C(R56.2, C26.2, D2.K)
NET_C(C26.1, GND)
#if (HLE_LASER_VCO)
//
// This is a typical Cinemtraonics VCO, driving a TTL counter.
// Netlist simulation requires a very small step which is not
// realtime performant, so we model it offline with the small
// step count, and then for realtime performance replace it
// with a mapping.
//
// Here is the mapping between 26.2 and the TTL clock IC18.13
// when the circuit is present:
//
// R2 = 0.99566: HP = (0.0000211106*A0) + 0.0000233926
// R2 = 0.99925: HP = (0.000000616538*A0*A0) + (0.0000166899*A0) + 0.0000239800
// R2 = 0.99946: HP = (0.000000065592*A0*A0*A0) - (0.000000207181*A0*A0) + (0.0000190091*A0) + 0.0000237318
// R2 = 0.99946: HP = (0.00000000399629*A0*A0*A0*A0) - (0.00000000517200*A0*A0*A0) + (0.000000172470*A0*A0) + (0.0000184103*A0) + 0.0000237906
// R2 = 0.99946: HP = (0.0000000000207619*A0*A0*A0*A0*A0) + (0.00000000352382*A0*A0*A0*A0) - (0.00000000145304*A0*A0*A0) + (0.000000160778*A0*A0) + (0.0000184225*A0) + 0.0000237894
//
// And here is the mapping when the circuit is removed:
//
// R2 = 0.98806: HP = (0.00245939*A0) - 0.000220173
// R2 = 0.99179: HP = (0.00545522*A0*A0) + (0.00103499*A0) - 0.000132203
// R2 = 0.99913: HP = (-0.102004*A0*A0*A0) + (0.0406935*A0*A0) - (0.00277839*A0) - 0.00000140594
// R2 = 0.99941: HP = (0.651650*A0*A0*A0*A0) - (0.377655*A0*A0*A0) + (0.078834*A0*A0) - (0.00454290*A0) + 0.00000408830
// R2 = 0.99941: HP = (2.264700*A0*A0*A0*A0*A0) - (0.633172*A0*A0*A0*A0) - (0.108936*A0*A0*A0) + (0.0542944*A0*A0) - (0.00371696*A0) + 0.00000401368
//
VARCLOCK(LASERCLK, 1, "max(0.000001,min(0.1,(-0.102004*A0*A0*A0) + (0.0406935*A0*A0) - (0.00277839*A0) - 0.00000140594))")
NET_C(LASERCLK.GND, GND)
NET_C(LASERCLK.VCC, I_V5)
NET_C(LASERCLK.A0, C26.2)
NET_C(LASERCLK.Q, IC18.13)
NET_C(GND, R57.1, R57.2, R58.1, R58.2, R59.1, R59.2, R60.1, R60.2, R61.1, R61.2, C27.1, C27.2, D2.A, D3.A, D3.K, IC16.2, IC16.3)
#else
NET_C(D2.A, IC16.3, D3.K, R58.1)
NET_C(D3.A, GND)
NET_C(IC16.2, R57.1, C27.2)
NET_C(C27.1, GND)
NET_C(IC16.6, R57.2, R58.2, R59.1)
NET_C(R59.2, R60.2, Q8.B)
NET_C(R60.1, GND)
NET_C(Q8.E, GND)
NET_C(Q8.C, R61.1, IC18.13)
NET_C(R61.2, I_V5)
#endif
NET_C(IC18.9, R62.1)
NET_C(IC18.8, R63.1)
NET_C(IC18.10, R64.1)
NET_C(IC18.11, R65.1)
NET_C(R62.2, R63.2, R64.2, R65.2, R47.2, R48.1)
NET_C(R47.1, GND)
NET_C(R48.2, C21.1)
NET_C(C21.2, R49.1)
//
// Torpedo
//
NET_C(I_OUT_3, IC10.11, IC18.2)
NET_C(IC10.10, R66.1)
NET_C(R66.2, C28.2, D4.K)
NET_C(C28.1, GND)
#if (HLE_TORPEDO_VCO)
//
// Another tricky Cinematronics VCO. Here is the mapping between
// C28.2 and the TTL clock IC18.1 when the circuit is present:
//
// R2 = 0.97255: HP = (0.0000327662*A0) + 0.0000149365
// R2 = 0.99171: HP = (0.00000331016*A0*A0) - (0.0000125849*A0) + 0.0000206090
// R2 = 0.99613: HP = (0.000000536978*A0*A0*A0) - (0.0000078207*A0*A0) + (0.0000390037*A0) + 0.0000148210
// R2 = 0.99748: HP = (0.000000092476*A0*A0*A0*A0) - (0.00000204069*A0*A0*A0) + (0.0000139512*A0*A0) - (0.0000143884*A0) + 0.0000205567
// R2 = 0.99798: HP = (0.0000000168890*A0*A0*A0*A0*A0) - (0.000000498868*A0*A0*A0*A0) + (0.00000512183*A0*A0*A0) - (0.0000205655*A0*A0) + (0.0000394849*A0) + 0.0000149619
//
// And here is the mapping when the circuit is removed:
//
// R2 = 0.83356: HP = (0.000387263*A0) - 0.0000161072
// R2 = 0.96482: HP = (-0.000459844*A0*A0) + (0.00110697*A0) - 0.000085961
// R2 = 0.99210: HP = (0.000512521*A0*A0*A0) - (0.00183716*A0*A0) + (0.00202778*A0) - 0.000165571
// R2 = 0.99614: HP = (-0.000450996*A0*A0*A0*A0) + (0.00218565*A0*A0*A0) - (0.00381123*A0*A0) + (0.00280823*A0) - 0.000225737
// R2 = 0.99625: HP = (-0.000161974*A0*A0*A0*A0*A0) + (0.000309626*A0*A0*A0*A0) + (0.000915096*A0*A0*A0) - (0.00291505*A0*A0) + (0.00256587*A0) - 0.000209241
//
VARCLOCK(TORPEDOCLK, 1, "max(0.000001,min(0.1,(0.000512521*A0*A0*A0) - (0.00183716*A0*A0) + (0.00202778*A0) - 0.000165571))")
NET_C(TORPEDOCLK.GND, GND)
NET_C(TORPEDOCLK.VCC, I_V5)
NET_C(TORPEDOCLK.A0, C28.2)
NET_C(TORPEDOCLK.Q, IC18.1)
NET_C(GND, R67.1, R67.2, R68.1, R68.2, R69.1, R69.2, R70.1, R70.2, R71.1, R71.2, C29.1, C29.2, D4.A, D5.A, D5.K, IC17.2, IC17.3)
#else
NET_C(D4.A, IC17.3, D5.K, R68.1)
NET_C(D5.A, GND)
NET_C(IC17.2, C29.2, R67.1)
NET_C(C29.1, GND)
NET_C(IC17.6, R67.2, R68.2, R69.1)
NET_C(R69.2, R70.2, Q9.B)
NET_C(R70.1, GND)
NET_C(Q9.E, GND)
NET_C(Q9.C, R71.1, IC18.1)
NET_C(R71.2, I_V5)
#endif
NET_C(IC18.5, R72.1)
NET_C(IC18.6, R73.1)
NET_C(IC18.4, R74.1)
NET_C(IC18.3, R75.1)
NET_C(R72.2, R73.2, R74.2, R75.2, R48.1)
//
// Unconnected inputs
//
NET_C(GND, IC9.17, IC9.18, IC10.9, IC22.12, IC22.13)
NET_C(GND, IC14.2, IC14.3, IC15.2, IC15.3) // part of final amp
//
// Unconnected outputs
//
HINT(IC9.16, NC) // Q6
HINT(IC9.19, NC) // Q7
HINT(IC10.8, NC) // QD
HINT(IC22.11, NC) // Q0
HINT(IC22.10, NC) // Q1
HINT(IC22.9, NC) // Q2
HINT(IC22.8, NC) // Q3
#if (ENABLE_FRONTIERS)
//
// Split explosion/beep/motor from other sources
//
OPTIMIZE_FRONTIER(R45.2, RES_M(1), 50)
OPTIMIZE_FRONTIER(IC7.3, RES_M(1), 50)
//
// Split noise generator from consumers
//
OPTIMIZE_FRONTIER(R1.1, RES_M(1), 50)
#endif
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_RIPOFF_H
#define MAME_AUDIO_NL_RIPOFF_H
#pragma once
NETLIST_EXTERNAL(ripoff)
#endif // MAME_AUDIO_NL_RIPOFF_H

1272
src/mame/audio/nl_solarq.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_SOLARQ_H
#define MAME_AUDIO_NL_SOLARQ_H
#pragma once
NETLIST_EXTERNAL(solarq)
#endif // MAME_AUDIO_NL_SOLARQ_H

View File

@ -0,0 +1,321 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Space Wars
//
// Derived from the Audio Board Schematic redrawn by William J.
// Boucher at Biltronix.com. Part numbers are not present on the
// schematic, so the equivalent part numbers were taken from the
// Barrier schematics, which are quite similar.
//
// Known problems/issues:
//
// * The core noise source is supposed to be created via a
// pair of transistors, one with an open base. Because this
// does not model correctly, this part of the circuit is
// replaced with a generic noise device. The characteristics
// of this noise are pretty different compared to recordings
// of the original, and affects all the sounds.
//
// * Poor performance when the explosion is triggered.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_spacewar.h"
//
// Optimizations
//
#define HLE_NOISE_GEN (1)
#define ENABLE_FRONTIERS (1)
//
// Main netlist
//
NETLIST_START(spacewar)
SOLVER(Solver, 1000)
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
// PARAM(Solver.MIN_TS_TS, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active high
TTL_INPUT(I_OUT_1, 0) // active high
TTL_INPUT(I_OUT_2, 0) // active high
TTL_INPUT(I_OUT_3, 0) // active high
TTL_INPUT(I_OUT_4, 0) // active high
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_K(18))
RES(R2, 470)
RES(R3, RES_K(47))
RES(R4, RES_K(220))
RES(R5, 470)
RES(R6, 150)
RES(R7, RES_K(180))
RES(R8, RES_M(10))
RES(R9, RES_K(39))
RES(R10, RES_K(2.2))
RES(R11, 470)
// RES(R12, 0) -- not present on Space Wars
RES(R13, RES_K(8.2))
RES(R14, RES_K(120))
RES(R15, RES_K(20))
RES(R16, RES_M(10))
RES(R17, RES_K(10))
RES(R18, RES_K(47))
RES(R19, 820)
// POT(R20, RES_K(10)) -- part of final amp (not emulated)
// RES(R21, 150) -- part of final amp (not emulated), not present on Space Wars
// RES(R22, 2.7) -- part of final amp (not emulated), not present on Space Wars
// RES(R23, 2.7) -- part of final amp (not emulated), not present on Space Wars
RES(R24, RES_K(47))
RES(R25, 150)
RES(R26, RES_K(160))
RES(R27, 750)
// RES(R28, RES_K(68)) -- part of final amp (not emulated), illegible on Space Wars
// POT(R29, RES_K(10)) -- part of final amp (not emulated)
// RES(R30, 750) -- part of final amp (not emulated)
RES(R31, 470)
RES(R32, RES_K(1))
RES(R33, RES_K(39))
RES(R34, RES_K(6.8))
RES(R35, RES_K(560))
RES(R36, RES_M(1))
RES(R37, RES_K(10))
RES(R38, RES_K(10))
// RES(R39, RES_K(120))
RES(R40, RES_K(120))
RES(R41, RES_K(20))
RES(R42, RES_K(1))
RES(R43, RES_K(10))
CAP(C1, CAP_U(1))
CAP(C2, CAP_U(1))
CAP(C3, CAP_U(0.01))
CAP(C4, CAP_U(0.01))
CAP(C5, CAP_U(0.1))
// CAP(C6, CAP_U(4.7)) // not needed
// CAP(C7, 0) // not present
CAP(C8, CAP_U(1))
CAP(C9, CAP_U(0.1))
CAP(C10, CAP_P(220))
CAP(C11, CAP_U(0.1))
// CAP(C12, CAP_U(0.01)) -- part of final amp (not emulated)
// CAP(C13, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C14, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C15, CAP_U(50)) -- not needed
// CAP(C16, CAP_U(2.2)) -- not needed
CAP(C17, CAP_U(0.01))
CAP(C18, CAP_U(33))
// CAP(C19, CAP_U(50)) -- not needed
// CAP(C20, CAP_U(2.2)) -- not needed
CAP(C21, CAP_U(0.02))
CAP(C22, CAP_U(0.1))
CAP(C23, CAP_U(0.1))
CAP(C24, CAP_U(2.2))
D_1N914(CR1)
D_1N914(CR2)
D_1N914(CR3)
D_1N914(CR4)
D_1N914(CR5)
D_1N914(CR6)
Q_2N3906(Q1) // PNP
Q_2N3904(Q2) // NPN
Q_2N6426(Q3) // NPN Darlington
Q_2N6292(Q4) // NPN
Q_2N6107(Q5) // PNP
Q_2N6426(Q6) // NPN Darlington
Q_2N3904(Q7) // NPN
TL081_DIP(U1) // Op. Amp.
NET_C(U1.4, I_VM15)
NET_C(U1.7, I_V15)
TTL_7406_DIP(U2) // Hex inverter -- currently using a clone of 7416, no open collector behavior
NET_C(U2.7, GND)
NET_C(U2.14, I_V5)
TL081_DIP(U3) // Op. Amp.
NET_C(U3.4, I_VM15)
NET_C(U3.7, I_V15)
// TTL_7815_DIP(U4) // +15V Regulator -- not needed
TL182_DIP(U5) // Analog switch
NET_C(U5.6, I_V15)
NET_C(U5.7, I_V5)
NET_C(U5.8, GND)
NET_C(U5.9, I_VM15)
// TL081_DIP(U6) // Op. Amp. -- part of final amp (not emulated)
// NET_C(U6.4, I_VM15)
// NET_C(U6.7, I_V15)
// TTL_7915_DIP(U7) // -15V Regulator -- not needed
TL081_DIP(U8) // Op. Amp.
NET_C(U8.4, I_VM15)
NET_C(U8.7, I_V15)
TL081_DIP(U9) // Op. Amp.
NET_C(U9.4, I_VM15)
NET_C(U9.7, I_V15)
TL182_DIP(U10) // Analog switch
NET_C(U10.6, I_V15)
NET_C(U10.7, I_V5)
NET_C(U10.8, GND)
NET_C(U10.9, I_VM15)
//
// Top-left until output from U1
//
#if (HLE_NOISE_GEN)
CLOCK(NOISE_CLOCK, 2000)
NET_C(NOISE_CLOCK.GND, GND)
NET_C(NOISE_CLOCK.VCC, I_V5)
SYS_NOISE_MT_U(NOISE, 3)
NET_C(NOISE.I, NOISE_CLOCK.Q)
NET_C(NOISE.1, GND)
NET_C(NOISE.2, C1.1)
NET_C(GND, R1.1, R1.2, R2.1, R2.2, CR1.A, CR1.K, CR2.A, CR2.K)
#else
NET_C(I_V15, CR1.A, R2.2)
NET_C(CR1.K, CR2.A)
NET_C(CR2.K, R1.2, Q1.B)
NET_C(R1.1, Q2.C, GND)
NET_C(R2.1, Q1.E)
NET_C(Q2.E, Q1.C, C1.1)
#endif
NET_C(C1.2, R3.2, U1.3)
NET_C(R3.1, GND, R5.1)
NET_C(U1.2, R5.2, R4.1)
NET_C(R4.2, U1.6)
//
// Top-middle, from O1 until output from CR3
//
NET_C(I_OUT_1, U2.13)
NET_C(U2.12, R6.1)
NET_C(R6.2, R7.1, C2.1, Q3.B)
NET_C(R7.2, I_V5, Q3.C)
NET_C(C2.2, GND)
NET_C(Q3.E, R11.2)
NET_C(R11.1, CR3.A)
//
// Middle chunk, from C3 until output from R13
//
NET_C(U1.6, C3.1)
NET_C(C3.2, R8.1, U3.2)
NET_C(U3.3, GND)
NET_C(R8.2, U3.6, R9.1)
NET_C(R9.2, CR3.K, C4.1, CR4.A, R10.2)
NET_C(R10.1, CR4.K, GND, C5.1)
NET_C(C4.2, C5.2, R13.1)
//
// Big middle section, from C8 until output from R15/R41/R37
//
NET_C(U1.6, C8.1)
NET_C(C8.2, C24.2)
NET_C(C24.1, R24.1)
NET_C(R24.2, U8.2, C10.1, R16.1)
NET_C(U8.3, GND)
NET_C(U8.6, R16.2, C10.2, R31.2, R38.2)
NET_C(R38.1, U5.14, U5.1)
NET_C(I_OUT_2, U5.10)
NET_C(U5.13, R14.1)
NET_C(I_OUT_3, U5.5)
NET_C(U5.2, R40.1)
NET_C(R40.2, C23.2, R41.1)
NET_C(R41.2, R13.2)
NET_C(C23.1, GND)
NET_C(R37.2, R13.2)
NET_C(R14.2, C9.2, R15.1)
NET_C(C9.1, GND)
NET_C(R15.2, R13.2)
NET_C(I_OUT_0, U2.9)
NET_C(U2.8, R25.1)
NET_C(R25.2, R26.1, C17.1, Q6.B, C18.1)
NET_C(R26.2, C17.2, I_V5, Q6.C)
NET_C(C18.2, GND)
NET_C(Q6.E, R27.1)
NET_C(R27.2, CR5.A)
NET_C(CR5.K, R33.2, CR6.A, R34.2, C21.2, C22.1)
NET_C(R31.1, R32.2, R33.1, Q7.E)
NET_C(R32.1, Q7.B)
NET_C(Q7.C, CR6.K, R34.1, C21.1, GND)
NET_C(C22.2, R35.1)
NET_C(R35.2, U9.2, R36.1)
NET_C(U9.3, GND)
NET_C(U9.6, R36.2, R37.1)
//
// Final stage
//
NET_C(U10.1, U10.14, R13.2)
NET_C(I_OUT_4, U10.5, U2.1)
NET_C(U2.2, R42.1, U10.10)
NET_C(R42.2, I_V5)
NET_C(U10.2, R17.2, C11.1)
NET_C(U10.13, R43.2)
NET_C(R43.1, GND)
NET_C(R17.1, R18.1, GND)
NET_C(C11.2, R18.2, R19.1)
NET_C(R19.2, GND)
ALIAS(OUTPUT, R18.2)
//
// Unconnected inputs
//
NET_C(GND, U2.3, U2.5, U2.11)
//
// Frontier optimizations
//
#if (ENABLE_FRONTIERS)
// Separate each input into the summing network
OPTIMIZE_FRONTIER(R13.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R15.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R41.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R37.1, RES_M(1), 50)
// Decouple the Darlington BJTs from the sounds they enable
OPTIMIZE_FRONTIER(R27.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R11.2, RES_M(1), 50)
// Decouple the noise source from the downstream filters
OPTIMIZE_FRONTIER(C3.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R24.1, RES_M(1), 50)
OPTIMIZE_FRONTIER(R38.2, RES_M(1), 50)
#endif
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_SPACEWAR_H
#define MAME_AUDIO_NL_SPACEWAR_H
#pragma once
NETLIST_EXTERNAL(spacewar)
#endif // MAME_AUDIO_NL_SPACEWAR_H

View File

@ -0,0 +1,451 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Speed Freak
//
// Derived from the utterly terrible schematics in the Speed Freak
// manual. Newly-drawn schematics are available upon request.
//
// Special thanks to:
// * Frank Palazzolo for helping to verify connections and parts
// * Brian Tarachi for supplying his corrected schematics
//
// Known problems/issues:
//
// * Works pretty well. Needs more detailed comparison with clean
// audio recordings from PCBs, but it's pretty close.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
//
// Optimizations
//
#define HLE_CLOCK_GENERATOR (1)
#define HLE_CLOCK_INPUT (1)
//
// Main netlist
//
NETLIST_START(speedfrk)
SOLVER(Solver, 1000)
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 1) // active low
TTL_INPUT(I_OUT_1, 1) // active low
TTL_INPUT(I_OUT_2, 1) // active low
TTL_INPUT(I_OUT_3, 1) // active low
TTL_INPUT(I_OUT_4, 1) // active low
TTL_INPUT(I_OUT_7, 1) // active low
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND, I_OUT_7.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC, I_OUT_7.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
// RES(R1, 2.7)
// RES(R2, 2.7)
// RES(R3, 2.7)
// RES(R4, 2.7)
// RES(R5, 150) // PCB verified
// RES(R6, 150)
// RES(R7, RES_K(10)) // PCB verified
// RES(R8, RES_K(68)) // PCB verified
// RES(R9, RES_K(2.2)) // PCB verified
// RES(R10, 820) // PCB verified
// RES(R11, RES_K(47)) // PCB verified
// RES(R12, RES_K(1)) ??
RES(R13, 150)
RES(R14, RES_K(2.2)) // PCB verified
RES(R15, RES_K(10)) // PCB verified
RES(R16, RES_K(2.2)) // PCB verified
RES(R17, RES_K(1)) // PCB verified
RES(R18, RES_K(8.2)) // PCB verified
RES(R19, RES_K(3.9)) // PCB verified
RES(R20, RES_K(4.7)) // PCB verified
RES(R21, RES_K(3.3)) // PCB verified
RES(R22, RES_K(10)) // PCB verified
RES(R23, RES_K(4.7)) // PCB verified
RES(R24, RES_K(10))
RES(R25, RES_K(18)) // PCB verified
RES(R26, RES_K(18)) // PCB verified
RES(R27, RES_K(6.8)) // PCB verified
RES(R28, RES_K(10)) // PCB verified
RES(R29, RES_K(2.2)) // PCB verified
RES(R30, 330) // PCB verified
RES(R31, 330) // PCB verified
RES(R32, RES_K(1)) // PCB verified
RES(R33, RES_K(1)) // PCB verified
RES(R34, RES_K(1)) // PCB verified
// RES(R35, 0) // PCB verified: not populated
RES(R36, RES_K(1)) // PCB verified
RES(R37, RES_K(1)) // PCB verified
RES(R38, RES_K(1)) // PCB verified
RES(R39, RES_K(1)) // PCB verified
RES(R40, RES_K(1)) // PCB verified
RES(R41, RES_K(1)) // PCB verified
RES(R42, RES_K(1)) // PCB verified
RES(R43, RES_K(1)) // PCB verified
RES(R44, RES_K(30)) // PCB verified
RES(R45, RES_K(4.7)) // PCB verified
RES(R46, RES_K(10)) // PCB verified
// CAP(C4, CAP_U(4.7))
// CAP(C5, CAP_U(4.7))
CAP(C12, CAP_U(0.001))
CAP(C13, CAP_U(0.001))
CAP(C17, CAP_U(0.02))
CAP(C20, CAP_U(0.1))
CAP(C23, CAP_U(0.1))
// CAP(C1, CAP_U(50))
// CAP(C2, CAP_U(50))
// CAP(C3, CAP_U(4.7))
// CAP(C6, CAP_U(0.002))
// CAP(C7, CAP_U(0.002))
// CAP(C8, CAP_U(0.01))
// CAP(C9, CAP_U(0.1))
// CAP(C10, CAP_U(0.1))
// CAP(C11, CAP_U(0.02))
// D_1N914B(CR1) // OK
// D_1N914B(CR2) // OK
D_1N914B(CR3) // OK
// Q_2N6292(Q1) // NPN
// Q_2N6107(Q2) // PNP
Q_2N3904(Q3) // NPN
// Q_2N3904(Q3) // NPN -- unknown type
TTL_74LS04_DIP(U2) // Hex Inverting Gates
NET_C(U2.7, GND)
NET_C(U2.14, I_V5)
TL081_DIP(U3) // Op. Amp.
NET_C(U3.4, GND)
NET_C(U3.7, I_V5)
TTL_74LS163_DIP(U4) // Synchronous 4-Bit Counters
NET_C(U4.8, GND)
NET_C(U4.16, I_V5)
TTL_74LS107_DIP(U5) // DUAL J-K FLIP-FLOPS WITH CLEAR
NET_C(U5.7, GND)
NET_C(U5.14, I_V5)
TTL_74LS08_DIP(U6) // Quad 2-Input AND Gates
NET_C(U6.7, GND)
NET_C(U6.14, I_V5)
TTL_74LS163_DIP(U7) // Synchronous 4-Bit Counters
NET_C(U7.8, GND)
NET_C(U7.16, I_V5)
TTL_74LS163_DIP(U8) // Synchronous 4-Bit Counters
NET_C(U8.8, GND)
NET_C(U8.16, I_V5)
TTL_74LS163_DIP(U9) // Synchronous 4-Bit Counters
NET_C(U9.8, GND)
NET_C(U9.16, I_V5)
// TTL_7915_DIP(U8) // -15V Regulator -- not needed
// TTL_7815_DIP(U9) // +15V Regulator -- not needed
TTL_74LS04_DIP(U10) // Hex Inverting Gates
NET_C(U10.7, GND)
NET_C(U10.14, I_V5)
TTL_74LS08_DIP(U11) // Quad 2-Input AND Gates
NET_C(U11.7, GND)
NET_C(U11.14, I_V5)
TTL_74LS75_DIP(U12) // 4-Bit Bistable Latches with Complementary Outputs
NET_C(U12.12, GND)
NET_C(U12.5, I_V5)
TTL_74LS164_DIP(U13) // 8-bit parallel-out serial shift registers
NET_C(U13.7, GND)
NET_C(U13.14, I_V5)
TTL_74LS164_DIP(U14) // 8-bit parallel-out serial shift registers
NET_C(U14.7, GND)
NET_C(U14.14, I_V5)
TTL_74LS163_DIP(U15) // Synchronous 4-Bit Counters
NET_C(U15.8, GND)
NET_C(U15.16, I_V5)
TTL_74LS107_DIP(U17) // DUAL J-K FLIP-FLOPS WITH CLEAR
NET_C(U17.7, GND)
NET_C(U17.14, I_V5)
TTL_74LS393_DIP(U18) // Dual 4-Stage Binary Counter
NET_C(U18.7, GND)
NET_C(U18.14, I_V5)
TTL_74LS86_DIP(U19) // Quad 2-Input XOR Gates
NET_C(U19.7, GND)
NET_C(U19.14, I_V5)
TTL_74LS164_DIP(U20) // 8-bit parallel-out serial shift registers
NET_C(U20.7, GND)
NET_C(U20.14, I_V5)
LM555_DIP(U22) // 5-5-5 Timer
TTL_74LS163_DIP(U23) // Dual 4-Stage Binary Counter
NET_C(U23.8, GND)
NET_C(U23.16, I_V5)
TTL_74LS164_DIP(U24) // 8-bit parallel-out serial shift registers
NET_C(U24.7, GND)
NET_C(U24.14, I_V5)
//
// 76kHz coming from the logic PCB
//
CLOCK(J4_2, 76000)
NET_C(J4_2.GND, GND)
NET_C(J4_2.VCC, I_V5)
#if (HLE_CLOCK_GENERATOR)
//
// Skip the clock generator and just do it directly
//
CLOCK(C2MHZ, 2000000)
NET_C(C2MHZ.GND, GND)
NET_C(C2MHZ.VCC, I_V5)
NET_C(GND, R30.1, R30.2, R31.1, R31.2, C12.1, C12.2, C13.1, C13.2, U10.1, U10.3, U10.5)
#else
NET_C(R30.1, U10.1, C13.1)
NET_C(R30.2, U10.2, C12.1)
NET_C(C12.2, U10.3, R31.1)
NET_C(R31.2, U10.4, C13.2, U10.5)
ALIAS(C2MHZ, U10.6)
#endif
#if (HLE_CLOCK_INPUT)
//
// The clock input from the main PCB is run through a voltage
// converter which eats a lot of time and is unnecessary since
// we're just generating a TTL signal already.
//
NET_C(J4_2.Q, U5.12)
NET_C(GND, R27.1, R27.2, R28.1, R28.2, R29.1, R29.2, CR3.A, CR3.K, U3.2, U3.3)
#else
NET_C(J4_2.Q, U3.3)
NET_C(R27.1, GND)
NET_C(R27.2, U3.2, R28.1)
NET_C(R28.2, I_V5)
NET_C(U3.6, R29.1)
NET_C(R29.2, CR3.K, U5.12)
#endif
NET_C(CR3.A, GND)
NET_C(U5.1, R41.1)
NET_C(R41.2, I_V5)
NET_C(U5.4, GND)
NET_C(U5.13, U5.10, U10.9, U4.15)
NET_C(U5.3, U5.8)
NET_C(U5.2, U5.11)
NET_C(U5.6, U4.9)
NET_C(U5.9, U4.2, C2MHZ.Q)
NET_C(U10.8, U4.7)
NET_C(U4.3, U4.1, I_V5)
NET_C(U4.6, R36.1)
NET_C(U4.4, U4.5, GND)
NET_C(U4.14, U18.1, U6.13, U7.2)
NET_C(U4.10, I_V5) // need to verify
NET_C(U18.6, U18.13)
NET_C(U18.2, U18.12, GND)
NET_C(U18.8, U17.12)
NET_C(U18.10, U20.8, U24.8)
NET_C(U18.11, U23.2)
NET_C(I_OUT_0, U2.13)
NET_C(U2.12, U2.1)
ALIAS(STEERING, U2.12)
NET_C(U2.2, U6.4)
NET_C(U6.6, U19.13, U19.5)
NET_C(U19.12, R39.1)
NET_C(R39.2, I_V5)
NET_C(I_OUT_1, U6.9)
NET_C(U6.10, R32.2)
NET_C(R32.1, I_V5)
NET_C(U6.8, U2.5, U6.12, U12.4, U12.13)
NET_C(U2.6, R14.2, U6.5)
NET_C(R14.1, Q3.B)
NET_C(Q3.E, GND)
NET_C(Q3.C, R13.1)
NET_C(R13.2, GND)
ALIAS(LAMP, R13.2)
NET_C(U19.11, U20.1)
NET_C(U20.9, R42.1)
// NET_C(R42.2, I_V5)
NET_C(U20.2, U19.3)
NET_C(U20.12, U19.1)
NET_C(U20.13, U19.4)
NET_C(U19.6, U24.1, U24.2)
NET_C(U24.12, U19.2)
NET_C(U24.9, R43.1)
NET_C(R43.2, I_V5)
NET_C(U24.13, R44.1, U11.12, U11.9, U11.5, U11.2)
NET_C(U23.1, U23.3, U23.5, U23.7, R40.2)
NET_C(U23.10, R40.2) // need to verify
NET_C(R40.1, I_V5)
NET_C(U23.4, U23.6, GND)
NET_C(U23.9, U19.8, U17.9)
NET_C(U23.15, U19.10)
NET_C(U19.9, R39.1)
NET_C(I_OUT_7, U2.9)
NET_C(U2.8, U17.10, U17.13)
NET_C(U17.8, U17.11, U17.1, U17.4, R34.1)
NET_C(R34.2, I_V5)
NET_C(U17.5, R25.1)
NET_C(U17.3, R26.1)
NET_C(R44.2, U22.7, R45.1, R46.2)
NET_C(R45.2, U22.4, U22.8, I_V5)
NET_C(R46.1, U22.6, U22.2, C23.2)
NET_C(C23.1, GND)
NET_C(U22.1, GND)
NET_C(U22.5, C17.2)
NET_C(C17.1, GND)
NET_C(I_OUT_4, U6.2)
NET_C(U22.3, U6.1)
NET_C(U6.3, R15.1)
NET_C(U6.11, U15.2, U9.2, U8.2)
NET_C(U15.1, U15.7, R42.1)
NET_C(R42.2, I_V5)
NET_C(U9.1, U9.7, U8.1, U8.7, R37.1)
NET_C(R37.2, I_V5)
NET_C(U15.15, U10.11, U7.10)
NET_C(U15.6, U14.3)
NET_C(U15.5, U14.4)
NET_C(U15.4, U14.5)
NET_C(U15.3, U14.6)
NET_C(U15.10, U9.15)
NET_C(U15.9, U9.9, U8.9, U10.10)
NET_C(U9.6, U14.10)
NET_C(U9.5, U14.11)
NET_C(U9.4, U14.12)
NET_C(U9.3, U14.13, U13.1, U13.2)
NET_C(U9.10, U8.15)
NET_C(U8.6, U13.3)
NET_C(U8.5, U13.4)
NET_C(U8.4, U13.5)
NET_C(U8.3, U13.6)
NET_C(U8.10, R36.1)
NET_C(R36.2, I_V5)
NET_C(I_OUT_2, U2.11)
NET_C(I_OUT_3, U2.3)
NET_C(U2.10, U14.1, U14.2)
NET_C(U2.4, U14.8, U13.8)
NET_C(U14.9, U13.9, R38.1)
NET_C(R38.2, I_V5)
NET_C(U12.9, U11.13)
NET_C(U12.10, U11.10)
NET_C(U12.15, U11.4)
NET_C(U12.16, U11.1)
NET_C(U12.7, U13.10)
NET_C(U12.6, U13.11)
NET_C(U12.3, U13.12)
NET_C(U12.2, U13.13)
NET_C(U11.11, R17.1)
NET_C(U11.8, R16.1)
NET_C(U11.6, R19.1)
NET_C(U11.3, R18.1)
NET_C(R17.2, R16.2, R19.2, R18.2, R20.1)
NET_C(U7.1, U7.5, R33.2)
NET_C(R33.1, I_V5)
NET_C(U7.7, STEERING)
NET_C(U7.9, U10.12)
NET_C(U7.15, U10.13)
NET_C(U7.3, U7.4, U7.6, GND)
NET_C(U7.11, R22.1)
NET_C(U7.12, R23.1)
NET_C(U7.13, R24.1)
NET_C(R22.2, R23.2, R24.2, C20.2, R21.1)
NET_C(C20.1, GND)
NET_C(R15.2, R25.2, R26.2, R21.2, R20.2)
ALIAS(OUTPUT, R20.2)
//
// Unconnected outputs
//
HINT(U4.11, NC) // Q3
HINT(U4.12, NC) // Q2
HINT(U4.13, NC) // Q1
HINT(U5.5, NC) // Q2
HINT(U7.14, NC) // Q0
HINT(U8.11, NC) // Q3
HINT(U8.12, NC) // Q2
HINT(U8.13, NC) // Q1
HINT(U8.14, NC) // Q0
HINT(U9.11, NC) // Q3
HINT(U9.12, NC) // Q2
HINT(U9.13, NC) // Q1
HINT(U9.14, NC) // Q0
HINT(U10.2, NC) // QQ1 -- part of 2MHz clock gen
HINT(U10.4, NC) // QQ2 -- part of 2MHz clock gen
HINT(U10.6, NC) // QQ3 -- part of 2MHz clock gen
HINT(U12.1, NC) // QQ0
HINT(U12.8, NC) // QQ3
HINT(U12.11, NC) // QQ2
HINT(U12.14, NC) // QQ1
HINT(U15.11, NC) // Q3
HINT(U15.12, NC) // Q2
HINT(U15.13, NC) // Q1
HINT(U15.14, NC) // Q0
HINT(U17.2, NC) // QQ1
HINT(U17.6, NC) // QQ2
HINT(U18.3, NC) // Q0
HINT(U18.4, NC) // Q1
HINT(U18.5, NC) // Q2
HINT(U18.9, NC) // Q2
HINT(U20.3, NC) // Q0
HINT(U20.4, NC) // Q1
HINT(U20.5, NC) // Q2
HINT(U20.6, NC) // Q3
HINT(U20.10, NC) // Q4
HINT(U20.11, NC) // Q5
HINT(U23.11, NC) // Q3
HINT(U23.12, NC) // Q2
HINT(U23.13, NC) // Q1
HINT(U23.14, NC) // Q0
HINT(U24.3, NC) // Q0
HINT(U24.4, NC) // Q1
HINT(U24.5, NC) // Q2
HINT(U24.6, NC) // Q3
HINT(U24.10, NC) // Q4
HINT(U24.11, NC) // Q5
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_SPEEDFRK_H
#define MAME_AUDIO_NL_SPEEDFRK_H
#pragma once
NETLIST_EXTERNAL(speedfrk)
#endif // MAME_AUDIO_NL_SPEEDFRK_H

View File

@ -0,0 +1,809 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//NL_CONTAINS starcas wotw
//
// Netlist for Star Castle/War of the Worlds
//
// Derived from the schematics and parts list in the Star Castle
// manual.
//
// War of the Worlds uses effectively the same sound board, but
// with a swizzled set of inputs.
//
// Special thanks to:
// * Frank Palazzolo for creating a schematic of the War of the
// Worlds signal mapping
//
// Known problems/issues:
//
// * The VCOs require high solver frequencies (100x+) to reach the
// correct pitches. For this reason, HLE'ed versions are
// provided that work correctly even at 48kHz.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_starcas.h"
//
// Optimizations
//
#define HLE_BACKGROUND_VCO (1)
#define HLE_LASER_VCO (1)
#define ENABLE_FRONTIERS (1)
//
// Initial compilation includes this section.
//
#ifndef SOUND_VARIANT
//
// Now include ourselves twice, once for Star Castle and
// once for War of the Worlds
//
#define VARIANT_STARCASTLE 0
#define VARIANT_WOTW 1
#define SOUND_VARIANT (VARIANT_STARCASTLE)
#include "nl_starcas.cpp"
#undef SOUND_VARIANT
#define SOUND_VARIANT (VARIANT_WOTW)
#include "nl_starcas.cpp"
#else
//
// Main netlist
//
#if (SOUND_VARIANT == VARIANT_STARCASTLE)
NETLIST_START(starcas)
#else // (SOUND_VARIANT == VARIANT_WOTW)
NETLIST_START(wotw)
#endif
// 192k is not high enough to make the laser and background pitches high enough
#if (HLE_BACKGROUND_VCO && HLE_LASER_VCO)
SOLVER(Solver, 1000)
#else
SOLVER(Solver, 4800000)
#endif
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active low
TTL_INPUT(I_OUT_1, 1) // active low
TTL_INPUT(I_OUT_2, 1) // active low
TTL_INPUT(I_OUT_3, 1) // active low
TTL_INPUT(I_OUT_4, 0) // active low
TTL_INPUT(I_OUT_7, 0) // active low
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND, I_OUT_7.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC, I_OUT_7.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_K(1))
RES(R2, 160)
RES(R3, RES_K(1))
RES(R4, RES_K(1))
RES(R5, RES_K(2))
RES(R6, RES_K(2))
RES(R7, RES_K(4.7))
RES(R8, RES_K(3.3))
RES(R9, 820)
RES(R10, RES_M(3.3))
RES(R11, RES_M(3.3))
RES(R12, RES_M(5.1))
RES(R13, RES_M(1.6))
RES(R14, RES_K(2))
RES(R15, RES_K(18))
RES(R16, RES_K(10))
RES(R17, RES_K(10))
RES(R18, RES_K(91))
RES(R19, RES_K(10))
RES(R20, RES_K(1))
RES(R21, RES_K(2))
RES(R22, RES_K(1))
RES(R24, RES_K(200))
RES(R25, RES_K(30))
RES(R26, RES_K(200))
RES(R27, RES_K(51))
RES(R28, RES_M(1))
RES(R29, 430)
RES(R30, 560)
RES(R31, RES_K(3.3))
RES(R32, RES_K(2))
RES(R33, RES_K(130))
RES(R34, RES_K(4.7))
RES(R35, RES_K(2.7))
RES(R36, RES_K(1))
RES(R37, RES_K(39))
RES(R38, RES_K(12))
RES(R39, RES_K(51))
RES(R40, RES_K(2.4))
RES(R41, RES_K(270))
RES(R42, RES_M(1))
RES(R43, RES_K(4.3))
RES(R44, RES_K(10))
RES(R45, RES_K(1))
RES(R46, RES_K(2))
RES(R47, RES_K(82))
RES(R48, RES_K(39))
RES(R49, RES_K(20))
RES(R50, RES_K(1))
RES(R51, RES_K(12))
RES(R52, RES_K(4.7))
RES(R53, RES_K(1))
RES(R54, RES_K(39))
RES(R55, RES_K(12))
RES(R56, RES_K(1))
RES(R57, RES_K(100))
RES(R58, RES_K(18))
RES(R59, RES_K(15))
RES(R60, RES_K(7.5))
RES(R61, 430)
RES(R62, 430)
RES(R63, RES_K(4.7))
RES(R64, RES_K(1))
RES(R65, RES_K(39))
RES(R66, RES_K(12))
RES(R67, RES_K(1))
RES(R68, RES_K(100))
RES(R69, RES_K(6.8))
RES(R70, RES_K(18))
RES(R71, RES_K(47))
RES(R72, 390)
RES(R73, 390)
RES(R74, RES_K(4.7))
RES(R75, RES_K(2.7))
RES(R76, RES_K(4.7))
RES(R77, RES_K(39))
RES(R78, RES_K(12))
RES(R79, RES_K(1))
RES(R80, RES_K(200))
RES(R81, RES_K(300))
RES(R82, RES_K(240))
RES(R83, 200)
RES(R84, 200)
RES(R85, RES_K(4.7))
RES(R86, RES_K(2.7))
RES(R87, RES_K(4.7))
RES(R88, RES_K(1))
RES(R89, RES_K(1.8))
RES(R90, RES_K(3.9))
RES(R91, RES_K(39))
RES(R92, RES_K(12))
RES(R93, 620)
RES(R94, RES_K(360))
RES(R95, RES_K(27))
RES(R96, RES_K(33))
RES(R97, 47)
RES(R98, 47)
RES(R99, RES_K(4.7))
RES(R100, RES_K(2.7))
RES(R101, RES_K(4.7))
RES(R102, RES_K(39))
RES(R103, RES_K(12))
RES(R104, RES_K(1))
RES(R105, RES_K(36))
RES(R106, RES_K(36))
RES(R107, RES_K(8.2))
RES(R108, RES_K(47))
RES(R109, RES_K(22))
RES(R110, RES_K(1))
RES(R111, RES_K(1))
RES(R112, RES_K(10))
RES(R113, RES_K(160))
RES(R114, RES_K(39))
RES(R115, RES_K(47))
RES(R116, RES_K(3.9))
RES(R117, RES_K(5.1))
RES(R118, RES_K(820))
RES(R119, RES_K(100))
// RES(R120, RES_K(390)) -- part of final amp (not emulated)
// RES(R121, RES_K(15)) -- part of final amp (not emulated)
// RES(R122, 150) -- part of final amp (not emulated)
// RES(R123, RES_K(22)) -- part of final amp (not emulated)
// RES(R124, 150) -- part of final amp (not emulated)
RES(R125, RES_K(8.2))
RES(R126, RES_K(20))
RES(R127, RES_K(30))
POT(R128, RES_K(10))
PARAM(R128.DIAL, 0.500000)
// CAP(C2, CAP_U(25)) // electrolytic
// CAP(C4, CAP_U(25)) // electrolytic
// CAP(C5, CAP_U(25)) // electrolytic
// CAP(C7, CAP_U(25)) // electrolytic
// CAP(C9, CAP_U(25)) // electrolytic
CAP(C11, CAP_U(0.68)) // film
CAP(C12, CAP_U(0.001)) // disk
CAP(C13, CAP_U(0.0022)) // film
CAP(C14, CAP_U(0.1)) // film
CAP(C15, CAP_U(0.1)) // film
CAP(C16, CAP_U(0.1)) // disk*
CAP(C17, CAP_U(100)) // electrolytic
CAP(C18, CAP_U(0.1)) // film
CAP(C19, CAP_U(0.1)) // disk*
CAP(C20, CAP_U(0.1)) // film
CAP(C21, CAP_U(0.01)) // disk
CAP(C22, CAP_U(0.68)) // film
CAP(C23, CAP_U(0.001)) // disk
CAP(C24, CAP_U(0.0047)) // film
CAP(C25, CAP_U(0.1)) // film
CAP(C26, CAP_U(0.1)) // film
CAP(C27, CAP_U(2.2)) // electrolytic
CAP(C28, CAP_U(0.22)) // film
CAP(C29, CAP_U(0.1)) // film
CAP(C30, CAP_U(4.7)) // electrolytic
CAP(C31, CAP_U(0.1)) // film
CAP(C32, CAP_U(0.01)) // film
CAP(C33, CAP_U(0.68)) // film
CAP(C34, CAP_U(3.3)) // electrolytic
CAP(C35, CAP_U(0.22)) // film
CAP(C36, CAP_U(0.33)) // film
CAP(C37, CAP_U(0.47)) // film
CAP(C38, CAP_U(0.01)) // disk
CAP(C39, CAP_U(0.68)) // film
CAP(C40, CAP_U(0.1)) // film
CAP(C41, CAP_U(0.01)) // disk
CAP(C42, CAP_U(0.1)) // film
// CAP(C43, CAP_U(0.68)) // film -- part of final amp (not emulated)
// CAP(C44, CAP_P(470)) // disk -- part of final amp (not emulated)
// CAP(C45, CAP_P(470)) // disk -- part of final amp (not emulated)
// CAP(C46, CAP_P(470)) // disk -- part of final amp (not emulated)
// CAP(C47, CAP_U(0.005)) // disk -- part of final amp (not emulated)
CAP(C48, CAP_U(0.33)) // film
// D_1N4003(D1) // not needed
// D_1N4003(D2) // not needed
// D_1N4003(D3) // not needed
// D_1N4003(D4) // not needed
D_1N5240B(D5)
D_1N5236B(D6)
D_1N914B(D7)
D_1N914B(D8)
D_1N914B(D9)
D_1N914B(D10)
Q_2N3904(Q1) // NPN
Q_2N3904(Q2) // NPN
Q_2N3906(Q3) // PNP
Q_2N3904(Q4) // NPN
Q_2N3904(Q5) // NPN
Q_2N3906(Q6) // PNP
Q_2N3906(Q7) // PNP
Q_2N3906(Q8) // PNP
Q_2N3906(Q9) // PNP
Q_2N3906(Q10) // PNP
Q_2N3906(Q11) // PNP
Q_2N3906(Q12) // PNP
Q_2N3906(Q13) // PNP
Q_2N3906(Q14) // PNP
Q_2N3906(Q15) // PNP
Q_2N3906(Q16) // PNP
// Q_2N6107(Q17) // PNP -- part of final amp (not emulated)
// Q_2N6292(Q18) // NPN -- part of final amp (not emulated)
TTL_7414_DIP(IC1) // Hex Inverter
NET_C(IC1.7, GND)
NET_C(IC1.14, I_V5)
TTL_74LS164_DIP(IC2) // 8-bit Shift Reg.
NET_C(IC2.7, GND)
NET_C(IC2.14, I_V5)
TTL_74LS377_DIP(IC3) // Octal D Flip Flop
NET_C(IC3.10, GND)
NET_C(IC3.20, I_V5)
// TTL_7815_DIP(IC4) // +15V Regulator -- not needed
// TTL_7915_DIP(IC5) // -15V Regulator -- not needed
TTL_7406_DIP(IC6) // Hex Inverter -- currently using a clone of 7416, no open collector behavior
NET_C(IC6.7, GND)
NET_C(IC6.14, I_V5)
TL081_DIP(IC7) // Op. Amp.
NET_C(IC7.7, I_V15)
NET_C(IC7.4, I_VM15)
TL081_DIP(IC8) // Op. Amp.
NET_C(IC8.7, I_V15)
NET_C(IC8.4, I_VM15)
#if (!HLE_BACKGROUND_VCO)
LM566_DIP(IC9) // 566 VCO
#endif
TTL_74LS163_DIP(IC10) // Binary Counter (schems say can sub a 74161)
NET_C(IC10.8, GND)
NET_C(IC10.16, I_V5)
TTL_74LS163_DIP(IC11) // Binary Counter (schems say can sub a 74161)
NET_C(IC11.8, GND)
NET_C(IC11.16, I_V5)
TTL_74LS393_DIP(IC12) // Dual 4 Bit B.C.
NET_C(IC12.7, GND)
NET_C(IC12.14, I_V5)
TTL_74LS393_DIP(IC13) // Dual 4 Bit B.C.
NET_C(IC13.7, GND)
NET_C(IC13.14, I_V5)
AMI_S2688(IC14) // Noise generator
TL081_DIP(IC15) // Op. Amp.
NET_C(IC15.7, I_V15)
NET_C(IC15.4, I_VM15)
LM555_DIP(IC16) // Timer
#if (!HLE_LASER_VCO)
LM566_DIP(IC17) // 566 VCO
#endif
CA3080_DIP(IC18) // Trnscndt. Op. Amp.
NET_C(IC18.7, I_V15)
NET_C(IC18.4, I_VM15)
CA3080_DIP(IC19) // Trnscndt. Op. Amp.
NET_C(IC19.7, I_V15)
NET_C(IC19.4, I_VM15)
CA3080_DIP(IC20) // Trnscndt. Op. Amp.
NET_C(IC20.7, I_V15)
NET_C(IC20.4, I_VM15)
CA3080_DIP(IC21) // Trnscndt. Op. Amp.
NET_C(IC21.7, I_V15)
NET_C(IC21.4, I_VM15)
CA3080_DIP(IC22) // Trnscndt. Op. Amp.
NET_C(IC22.7, I_V15)
NET_C(IC22.4, I_VM15)
LM555_DIP(IC23) // Timer
LM555_DIP(IC24) // Timer
// TL081_DIP(IC25) // Op. Amp. -- part of final amp (not emulated)
// NET_C(IC25.7, I_V15)
// NET_C(IC25.4, I_VM15)
TL081_DIP(IC26) // Op. Amp.
NET_C(IC26.7, I_V15)
NET_C(IC26.4, I_VM15)
TL081_DIP(IC27) // Op. Amp.
NET_C(IC27.7, I_V15)
NET_C(IC27.4, I_VM15)
TTL_74LS107_DIP(IC28) // Dual J-K Flip Flop
NET_C(IC28.7, GND)
NET_C(IC28.14, I_V5)
//
// Sheet 1, shift register (top left)
//
NET_C(I_V5, R1.1)
ALIAS(HI, R1.2)
NET_C(R1.2, IC2.9, IC2.2)
NET_C(I_OUT_7, IC1.13)
NET_C(IC1.12, IC1.1)
NET_C(IC1.2, IC2.1)
NET_C(I_OUT_4, IC1.9)
NET_C(IC1.8, IC1.5)
NET_C(IC1.6, IC2.8)
NET_C(I_OUT_0, IC1.11)
NET_C(IC1.10, IC1.3)
NET_C(IC1.4, IC3.11)
NET_C(IC2.3, IC3.3)
NET_C(IC2.4, IC3.4)
NET_C(IC2.5, IC3.7)
NET_C(IC2.6, IC3.8)
NET_C(IC2.10, IC3.13)
NET_C(IC2.11, IC3.14)
NET_C(IC2.12, IC3.17)
NET_C(IC2.13, IC3.18)
NET_C(GND, IC3.1)
#if (SOUND_VARIANT == VARIANT_STARCASTLE)
ALIAS(FIREBALL_EN, IC3.2)
ALIAS(SHIELD_EN, IC3.5)
ALIAS(STAR_EN, IC3.6)
ALIAS(THRUST_EN, IC3.9)
ALIAS(BACKGROUND_EN, IC3.12)
ALIAS(BL2, IC3.15)
ALIAS(BL1, IC3.16)
ALIAS(BL0, IC3.19)
#else // (SOUND_VARIANT == VARIANT_WOTW)
ALIAS(BACKGROUND_EN, IC3.2)
ALIAS(BL2, IC3.6)
ALIAS(BL1, IC3.6)
ALIAS(BL0, IC3.6)
ALIAS(SHIELD_EN, IC3.9)
ALIAS(FIREBALL_EN, IC3.12)
RES(REXTRA, RES_K(1))
NET_C(IC3.16, IC6.3)
NET_C(IC6.4, REXTRA.1)
NET_C(REXTRA.2, I_V5)
ALIAS(STAR_EN, IC6.4)
ALIAS(THRUST_EN, IC3.19)
#endif
//
// Sheet 1, BACKGROUND (top portion)
//
NET_C(GND, D5.A, D6.K, R13.1, R16.1, R17.1, IC7.3)
NET_C(I_V15, R2.1)
NET_C(I_VM15, R12.1, R18.1)
NET_C(R2.2, D5.K, R3.1, R5.1, R7.1)
NET_C(BL2, IC6.9)
NET_C(IC6.8, R3.2, R4.1)
NET_C(BL1, IC6.11)
NET_C(IC6.10, R5.2, R6.1)
NET_C(BL0, IC6.13)
NET_C(IC6.12, R7.2, R8.1)
NET_C(R4.2, R6.2, R8.2, IC7.2, R9.1)
NET_C(IC7.6, R9.2, R10.1)
NET_C(R10.2, IC8.2, R11.1, C11.1)
NET_C(R12.2, R13.2, IC8.3)
NET_C(IC8.6, C11.2, R11.2, R14.1)
NET_C(R14.2, D6.A, R15.1)
#if (HLE_BACKGROUND_VCO)
//
// The background clock is a VCO controlled via a 566 timer.
// Getting the frequency high enough to not miss clocking
// the downstream dividers requires increasing the solver
// frequency too much for realtime.
//
// Instead, clip out the circuit from the control voltage
// coming into IC9 (pin 5), through the TTL converter, and
// directly output the clock into IC10 pin 2. The equation
// for the clock frequency is computed from running the
// full emulation at 1000x frequency and fitting a curve
// to the resulting dataset.
//
VARCLOCK(BGCLK, 1, "max(0.000001,min(0.1,(0.00000215073*A0*A0*A0*A0) + (0.0000224782*A0*A0*A0) + (0.000090697*A0*A0) + (0.000175878*A0) + 0.000163685))")
NET_C(BGCLK.GND, GND)
NET_C(BGCLK.VCC, I_V5)
NET_C(R17.2, R15.2, R18.2, BGCLK.A0, C12.2)
NET_C(C12.1, R16.2)
ALIAS(CLK, BGCLK.Q)
NET_C(C13.1, C13.2, C14.1, C14.2, R19.1, R19.2, R20.1, R20.2, R21.1, R21.2, D7.A, D7.K, D8.A, D8.K, GND)
#else
NET_C(GND, IC9.8, D7.A, D8.A)
NET_C(I_V5, R20.1)
NET_C(I_VM15, IC9.1, C13.2, R21.1)
NET_C(R17.2, R15.2, R18.2, IC9.5, C12.2)
NET_C(C13.1, IC9.7)
NET_C(C12.1, IC9.6, R16.2)
NET_C(IC9.3, C14.1)
NET_C(C14.2, D7.K, R19.1)
NET_C(R19.2, Q1.B)
NET_C(Q1.E, R21.2, D8.K)
NET_C(Q1.C, R20.2)
ALIAS(CLK, R20.2)
#endif
//
// Sheet 1, BACKGROUND (bottom portion)
//
NET_C(GND, R27.1, IC10.4, IC10.5, IC10.6, IC11.3, IC11.4, IC12.12, IC13.12, IC28.4)
NET_C(I_V5, R22.1)
NET_C(CLK, IC10.2, IC11.2, IC13.1, IC28.12)
NET_C(BACKGROUND_EN, IC6.1, IC13.2)
NET_C(IC6.2, R22.2, IC10.1, IC11.1)
NET_C(HI, IC10.3, IC10.7, IC10.10, IC11.5, IC11.6, IC11.7)
NET_C(IC10.15, IC11.10)
NET_C(IC11.15, IC28.1, IC28.13)
NET_C(IC28.2, IC11.9, IC10.9, IC12.13)
NET_C(IC12.11, R24.1)
NET_C(R24.2, C15.1, R26.2, R27.2)
NET_C(IC13.6, IC13.13)
NET_C(IC13.9, R26.1)
NET_C(C15.2, R25.1)
ALIAS(SJ, R25.2)
//
// Sheet 2, NOISE GENERATOR
//
NET_C(GND, C16.2, C17.2, R28.1, IC14.1, IC14.2)
NET_C(I_V15, C16.1, C17.1, IC14.4)
NET_C(IC14.3, C18.2)
NET_C(C18.1, R28.2, IC15.3)
NET_C(IC15.6, IC15.2)
ALIAS(NOISE, IC15.6)
//
// Sheet 2, +2.2V
//
NET_C(GND, C19.2, R30.1, R31.1)
NET_C(I_V5, R29.1, Q2.C)
NET_C(R30.2, R29.2, Q2.B)
NET_C(R31.2, Q2.E, C19.1)
ALIAS(V2_2, Q2.E)
//
// Sheet 2, SQUARE WAVE
//
NET_C(GND, C20.2, C21.2, IC16.1)
NET_C(I_V5, R32.1, IC16.4, IC16.8)
NET_C(R32.2, R33.1, IC16.7)
NET_C(R33.2, IC16.6, IC16.2, C20.1)
NET_C(C21.1, IC16.5)
ALIAS(SQUAREWAVE, IC16.3)
//
// Sheet 2, LASER VCO
//
NET_C(GND, C22.2, C24.2, Q4.E, R38.1, R42.1, R50.1)
NET_C(I_V5, R34.1, R36.1, Q3.E)
NET_C(I_V15, R39.1, R43.1)
NET_C(I_VM15, R37.1)
NET_C(I_OUT_3, IC6.5, IC12.2)
NET_C(IC6.6, R36.2, R35.1)
NET_C(R35.2, Q3.B, R34.2)
NET_C(Q3.C, R37.2, R38.2, R40.1)
NET_C(R40.2, Q4.B)
NET_C(R39.2, R41.1, C22.1, R42.2, C23.2)
NET_C(Q4.C, R41.2)
NET_C(C23.1, R43.2)
#if (HLE_LASER_VCO)
//
// The laser VCO is the same story as the background VCO,
// requiring a large multiplier to the solver frequency
// to clock downstream gates. Again, just replace it
// with a VARCLOCK tuned based on output from running
// the full simulation.
//
VARCLOCK(LASERCLK, 1, "max(0.000001,min(0.1,(0.00000385462*A0*A0*A0*A0) - (0.000195567*A0*A0*A0) + (0.00372371*A0*A0) - (0.0315254*A0) + 0.100119))")
NET_C(LASERCLK.GND, GND)
NET_C(LASERCLK.VCC, I_V5)
NET_C(C23.2, LASERCLK.A0)
NET_C(LASERCLK.Q, IC12.1)
NET_C(GND, C24.1, C25.1, C25.2, D9.A, D9.K, D10.A, D10.K, R44.1, R44.2, R45.1, R45.2, R46.1, R46.2)
#else
NET_C(GND, D9.A, D10.A, IC17.1)
NET_C(I_V15, IC17.8)
NET_C(C23.2, IC17.5)
NET_C(C23.1, IC17.6)
NET_C(C24.1, IC17.7)
NET_C(IC17.3, C25.1)
NET_C(C25.2, D9.K, R44.1)
NET_C(R44.2, Q5.B)
NET_C(I_VM15, R46.1)
NET_C(Q5.E, D10.K, R46.2)
NET_C(I_V5, R45.1)
NET_C(Q5.C, R45.2, IC12.1)
#endif
NET_C(IC12.3, R47.1)
NET_C(IC12.4, R48.1)
NET_C(IC12.6, R49.1)
NET_C(R47.2, R48.2, R49.2, R50.2, R51.1)
NET_C(R51.2, C26.1)
NET_C(C26.2, SJ)
//
// Sheet 2, SOFT EXPLOSION
//
NET_C(GND, C28.2, C29.2, R55.1, R56.1, R61.2, R62.1)
NET_C(I_V5, R52.1)
NET_C(I_VM15, C27.2, R54.1)
NET_C(I_OUT_2, R52.2, R53.1)
NET_C(R53.2, Q6.B)
NET_C(Q6.E, V2_2)
NET_C(Q6.C, R54.2, R55.2, Q7.E)
NET_C(R56.2, Q7.B)
NET_C(Q7.C, C27.1, R57.1)
NET_C(R57.2, IC18.5)
NET_C(NOISE, R58.1)
NET_C(R58.2, C28.1, R59.1)
NET_C(R59.2, C29.1, R60.1)
NET_C(R60.2, R61.1, IC18.2)
NET_C(R62.2, IC18.3)
//
// Sheet 2, LOUD EXPLOSION
//
NET_C(GND, C31.2, C32.2, R66.1, R67.1, R72.2, R73.1)
NET_C(I_V5, R63.1)
NET_C(I_VM15, C30.2, R65.1)
NET_C(I_OUT_1, R63.2, R64.1)
NET_C(R64.2, Q8.B)
NET_C(Q8.E, V2_2)
NET_C(Q8.C, R65.2, R66.2, Q9.E)
NET_C(R67.2, Q9.B)
NET_C(Q9.C, C30.1, R68.1)
NET_C(R68.2, IC19.5)
NET_C(NOISE, R69.1)
NET_C(R69.2, C31.1, R70.1)
NET_C(R70.2, C32.1, R71.1)
NET_C(R71.2, R72.1, IC19.2)
NET_C(R73.2, IC19.3)
//
// Sheet 2, FIREBALL
//
NET_C(GND, R78.1, R79.1, R83.1, R84.1)
NET_C(I_V5, Q10.E, R74.1, R76.1)
NET_C(I_VM15, C33.2, R77.1)
NET_C(FIREBALL_EN, R74.2, R75.1)
NET_C(R75.2, R76.2, Q10.B)
NET_C(Q10.C, R77.2, R78.2, Q11.E)
NET_C(R79.2, Q11.B)
NET_C(Q11.C, C33.1, R80.1)
NET_C(R80.2, IC20.5)
NET_C(NOISE, R81.1)
NET_C(SQUAREWAVE, R82.1)
NET_C(R81.2, R82.2, R83.2, IC20.2)
NET_C(R84.2, IC20.3)
//
// Sheet 2, SHIELD
//
NET_C(GND, R92.1, R93.1, R97.1, R98.1)
NET_C(I_V5, R85.1, R87.1, R88.1, Q12.E)
NET_C(I_VM15, R91.1)
NET_C(SHIELD_EN, R85.2, R86.1)
NET_C(R86.2, R87.2, Q12.B)
NET_C(Q12.C, R90.1, Q13.E)
NET_C(SQUAREWAVE, R88.2, R89.1)
NET_C(R89.2, R90.2, Q13.B)
NET_C(Q13.C, R91.2, R92.2, Q14.E)
NET_C(R93.2, Q14.B)
NET_C(Q14.C, R94.1)
NET_C(R94.2, IC21.5)
NET_C(SQUAREWAVE, R96.1)
NET_C(NOISE, R95.1)
NET_C(R96.2, R95.2, R97.2, IC21.2)
NET_C(R98.2, IC21.3)
//
// Sheet 2, THRUST
//
NET_C(GND, R103.1, R104.1, C35.2, C36.2, R110.1, R111.1)
NET_C(I_V5, R99.1, R101.1, Q15.E)
NET_C(I_VM15, C34.2, R102.1)
NET_C(THRUST_EN, R99.2, R100.1)
NET_C(R100.2, R101.2, Q15.B)
NET_C(Q15.C, R102.2, R103.2, Q16.E)
NET_C(R104.2, Q16.B)
NET_C(Q16.C, R105.1)
NET_C(R105.2, C34.1, R106.1)
NET_C(R106.2, IC22.5)
NET_C(NOISE, R107.1)
NET_C(R107.2, C35.1, R108.1)
NET_C(R108.2, C36.1, R109.1)
NET_C(R109.2, R110.2, IC22.2)
NET_C(R111.2, IC22.3)
//
// Sheet 2, STAR SOUND
//
NET_C(GND, C37.1, C38.1, C39.1, C40.1, C41.1, R119.1, IC23.1, IC24.1)
NET_C(I_V5, R112.1, R117.1, IC23.8, IC24.8)
NET_C(STAR_EN, IC23.4, IC24.4)
NET_C(R112.2, IC23.7, R113.1)
NET_C(R113.2, IC23.2, IC23.6, C37.2)
NET_C(C38.2, IC23.5)
NET_C(IC23.3, R114.1)
NET_C(R114.2, C39.2, R115.1)
NET_C(R115.2, C40.2, IC24.6, IC24.2, R116.1)
NET_C(R116.2, IC24.7, R117.2)
NET_C(C41.2, IC24.5)
NET_C(IC24.3, R119.2, R118.1)
NET_C(R118.2, C42.1)
NET_C(C42.2, SJ)
//
// Sheet 2, preamp
//
NET_C(GND, R127.1, IC27.3, R128.1)
NET_C(IC18.6, IC19.6, IC20.6, IC21.6, IC22.6, R127.2, IC26.3)
NET_C(IC26.2, IC26.6, C48.1)
NET_C(C48.2, R125.1)
NET_C(R125.2, SJ, IC27.2, R126.1)
NET_C(R126.2, IC27.6, R128.3)
//
// Sheet 2, final amp
//
ALIAS(OUTPUT, R126.2)
//
// Unconnected inputs
//
NET_C(GND, IC28.8, IC28.9, IC28.10, IC28.11)
#if (SOUND_VARIANT == VARIANT_STARCASTLE)
NET_C(GND, IC6.3)
#endif
//
// Unconnected outputs
//
HINT(IC28.3, NC)
HINT(IC28.5, NC)
HINT(IC28.6, NC)
#if (SOUND_VARIANT == VARIANT_STARCASTLE)
HINT(IC6.4, NC)
#endif
HINT(IC10.11, NC)
HINT(IC10.12, NC)
HINT(IC10.13, NC)
HINT(IC10.14, NC)
HINT(IC11.11, NC)
HINT(IC11.12, NC)
HINT(IC11.13, NC)
HINT(IC11.14, NC)
HINT(IC12.5, NC)
HINT(IC12.8, NC)
HINT(IC12.9, NC)
HINT(IC12.10, NC)
HINT(IC13.3, NC)
HINT(IC13.4, NC)
HINT(IC13.5, NC)
HINT(IC13.8, NC)
HINT(IC13.10, NC)
HINT(IC13.11, NC)
#if (ENABLE_FRONTIERS)
//
// Disconnect noise source from consumers
//
OPTIMIZE_FRONTIER(IC15.3, RES_M(1), 50)
//
// Split noise outputs from output outputs before the mixer
//
OPTIMIZE_FRONTIER(IC26.3, RES_M(1), 50)
#endif
NETLIST_END()
#endif

View File

@ -0,0 +1,11 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_STARCAS_H
#define MAME_AUDIO_NL_STARCAS_H
#pragma once
NETLIST_EXTERNAL(starcas)
NETLIST_EXTERNAL(wotw)
#endif // MAME_AUDIO_NL_STARCAS_H

View File

@ -0,0 +1,640 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Star Hawk
//
// Derived from the schematics in the Star Hawk manual.
//
// Special thanks to:
// * Jay Gallagher for verifying PCB components
//
// Known problems/issues:
//
// * The VCOs require high solver frequencies (100x+) to reach the
// correct pitches. For this reason, HLE'ed versions are
// provided that work correctly even at 48kHz.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
//
// Optimizations
//
#define HLE_SHIP_VCO (1)
#define HLE_LAZER_VCOS (1)
//
// Debugging/test - should be off for release
//
#define SLOW_SHIP_WOBBLE (0)
//
// Main netlist
//
NETLIST_START(starhawk)
#if (HLE_LAZER_VCOS && HLE_SHIP_VCO)
SOLVER(Solver, 1000)
#else
SOLVER(Solver, 48000000)
#endif
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active high
TTL_INPUT(I_OUT_1, 0) // active high
TTL_INPUT(I_OUT_2, 0) // active high
TTL_INPUT(I_OUT_3, 0) // active high
TTL_INPUT(I_OUT_4, 0) // active high
TTL_INPUT(I_OUT_7, 0) // active high
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND, I_OUT_7.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC, I_OUT_7.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_K(10))
RES(R2, RES_K(10))
RES(R3, RES_K(20))
RES(R4, RES_K(10))
RES(R5, RES_K(1))
RES(R6, RES_K(150))
RES(R7, 330)
RES(R8, RES_K(10))
RES(R9, RES_K(47))
RES(R10, RES_K(150))
RES(R11, RES_K(100))
RES(R12, RES_K(47))
RES(R13, RES_K(10))
RES(R14, RES_K(2.7))
RES(R15, RES_K(2.7))
RES(R16, RES_K(30))
RES(R17, RES_K(510))
RES(R18, RES_K(10))
RES(R19, RES_K(33))
// RES(R20, 150) -- part of final amp (not emulated)
// RES(R21, RES_K(22)) -- part of final amp (not emulated)
RES(R22, RES_K(1))
// RES(R23, RES_K(10)) -- part of final amp (not emulated)
// RES(R24, 150) -- part of final amp (not emulated)
// POT(R25, RES_K(100))-- part of final amp (not emulated)
RES(R26, RES_K(1))
RES(R27, RES_K(1))
RES(R28, RES_K(510))
RES(R29, RES_K(10)) // PCB verified
// RES(R30, ???)
RES(R31, RES_K(47)) // PCB verified
RES(R32, RES_M(3.3)) // PCB verified
RES(R33, RES_M(1))
RES(R34, RES_K(47))
RES(R35, RES_M(1))
RES(R36, RES_M(1))
RES(R37, RES_M(1))
RES(R38, RES_M(1))
RES(R39, 150)
RES(R40, RES_K(10))
RES(R41, RES_K(20))
RES(R42, RES_K(1))
RES(R43, RES_M(1))
RES(R44, RES_K(10))
RES(R45, RES_K(10))
RES(R46, 150)
RES(R47, RES_K(20))
RES(R48, RES_M(1))
RES(R49, RES_K(10))
RES(R50, RES_K(1))
RES(R51, RES_K(10))
RES(R52, RES_K(20))
RES(R53, RES_K(39))
RES(R54, RES_K(82))
RES(R55, RES_K(2.2))
RES(R56, RES_K(1))
RES(R57, RES_K(10))
RES(R58, RES_K(20))
RES(R59, RES_K(39))
RES(R60, RES_K(82))
// CAP(C1, CAP_U(2.2))
// CAP(C2, CAP_U(2.2))
// CAP(C3, CAP_U(3.3))
// CAP(C4, CAP_U(3.3))
CAP(C5, CAP_P(100))
CAP(C6, CAP_U(3.3))
CAP(C7, CAP_U(0.01))
CAP(C8, CAP_U(1))
CAP(C9, CAP_U(0.022))
CAP(C10, CAP_U(0.15)) // 15?
CAP(C11, CAP_U(0.15))
CAP(C12, CAP_U(15))
CAP(C13, CAP_U(0.0033))
CAP(C14, CAP_U(0.0047))
CAP(C15, CAP_U(1))
// CAP(C16, CAP_P(470)) -- part of final amp (not emulated)
CAP(C17, CAP_U(22))
// CAP(C18, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C19, CAP_P(470)) -- part of final amp (not emulated)
CAP(C20, CAP_U(1))
#if (SLOW_SHIP_WOBBLE)
CAP(C21, CAP_U(22)) // discovered by accident, makes HLE analysis easier
#else
CAP(C21, CAP_U(0.22)) // PCB verified
#endif
CAP(C22, CAP_U(0.1))
CAP(C23, CAP_U(0.0027))
CAP(C24, CAP_U(0.1))
CAP(C25, CAP_U(0.0027))
CAP(C26, CAP_U(1))
CAP(C27, CAP_U(0.1))
// CAP(C39, CAP_U(1))
// CAP(C40, CAP_U(1))
D_1N914(CR1)
D_1N914(CR2)
D_1N914(CR3)
D_1N914(CR4)
D_1N914(CR5)
D_1N914(CR6)
D_1N914(CR7)
D_1N914(CR8)
D_1N914(CR9)
D_1N914(CR10)
Q_2N3906(Q1) // PNP
// Q_2N6292(Q2) // NPN -- part of final amp (not emulated)
// Q_2N6107(Q3) // PNP -- part of final amp (not emulated)
#if (!HLE_LAZER_VCOS)
Q_2N3904(Q4) // NPN
Q_2N3904(Q5) // NPN
#endif
TL182_DIP(IC3A) // Analog switch
NET_C(IC3A.6, I_V15)
NET_C(IC3A.7, I_V5)
NET_C(IC3A.8, GND)
NET_C(IC3A.9, I_VM15)
// TTL_7815_DIP(IC2D) // +15V Regulator -- not needed
// TTL_7915_DIP(IC2C) // -15V Regulator -- not needed
TL081_DIP(IC4A) // Op. Amp.
NET_C(IC4A.4, I_VM15)
NET_C(IC4A.7, I_V15)
TL081_DIP(IC4B) // Op. Amp.
NET_C(IC4B.4, I_VM15)
NET_C(IC4B.7, I_V15)
// TL081_DIP(IC4C) // Op. Amp. -- part of final amp (not emulated)
// NET_C(IC4C.4, I_VM15)
// NET_C(IC4C.7, I_V15)
TTL_74LS393_DIP(IC4E) // Dual 4-Stage Binary Counter
NET_C(IC4E.7, GND)
NET_C(IC4E.14, I_V5)
TL081_DIP(IC5A) // Op. Amp.
NET_C(IC5A.4, I_VM15)
NET_C(IC5A.7, I_V15)
TL081_DIP(IC5B) // Op. Amp.
NET_C(IC5B.4, I_VM15)
NET_C(IC5B.7, I_V15)
LM556_DIP(IC5D)
PROM_74S287_DIP(IC5E) // 1024-bit PROM -- dump needed
PARAM(IC5E.A.ROM, "2085.5e8e")
NET_C(IC5E.8, GND)
NET_C(IC5E.16, I_V5)
CA3080_DIP(IC6A) // Trnscndt. Op. Amp.
NET_C(IC6A.7, I_V15)
NET_C(IC6A.4, I_VM15)
TL081_DIP(IC6B) // Op. Amp.
NET_C(IC6B.4, I_VM15)
NET_C(IC6B.7, I_V15)
TTL_74LS04_DIP(IC6C) // Hex Inverting Gates
NET_C(IC6C.7, GND)
NET_C(IC6C.14, I_V5)
LM556_DIP(IC6D)
TL081_DIP(IC6E) // Op. Amp.
NET_C(IC6E.4, I_VM15)
NET_C(IC6E.7, I_V15)
TL081_DIP(IC6F) // Op. Amp.
NET_C(IC6F.4, I_VM15)
NET_C(IC6F.7, I_V15)
TTL_7406_DIP(IC7C) // Hex inverter -- currently using a clone of 7416, no open collector behavior
NET_C(IC7C.7, GND)
NET_C(IC7C.14, I_V5)
TTL_74LS393_DIP(IC7E) // Dual 4-Stage Binary Counter
NET_C(IC7E.7, GND)
NET_C(IC7E.14, I_V5)
TTL_74LS164_DIP(IC8C) // 8-bit Shift Reg.
NET_C(IC8C.7, GND)
NET_C(IC8C.14, I_V5)
TTL_74LS164_DIP(IC8D) // 8-bit Shift Reg.
NET_C(IC8D.7, GND)
NET_C(IC8D.14, I_V5)
PROM_74S287_DIP(IC8E) // 1024-bit PROM -- dump needed
PARAM(IC8E.A.ROM, "2085.5e8e")
NET_C(IC8E.8, GND)
NET_C(IC8E.16, I_V5)
TTL_74LS164_DIP(IC9C) // 8-bit Shift Reg.
NET_C(IC9C.7, GND)
NET_C(IC9C.14, I_V5)
TTL_74LS164_DIP(IC9D) // 8-bit Shift Reg.
NET_C(IC9D.7, GND)
NET_C(IC9D.14, I_V5)
TTL_74LS163_DIP(IC9E) // Binary Counter (schems say can sub a 74161)
NET_C(IC9E.8, GND)
NET_C(IC9E.16, I_V5)
TTL_74LS86_DIP(IC10C) // Quad 2-Input XOR Gates
NET_C(IC10C.7, GND)
NET_C(IC10C.14, I_V5)
TTL_74LS21_DIP(IC10D) // Dual 4-Input AND Gates
NET_C(IC10D.7, GND)
NET_C(IC10D.14, I_V5)
TTL_74LS393_DIP(IC10E) // Dual 4-Stage Binary Counter
NET_C(IC10E.7, GND)
NET_C(IC10E.14, I_V5)
//
// Top-left noise generator
//
NET_C(I_V5, R1.2, IC6D.14, IC6D.4, R3.2)
NET_C(R1.1, IC6D.1, R2.2)
NET_C(R2.1, IC6D.2, IC6D.6, C7.2)
NET_C(C7.1, GND)
NET_C(IC6D.7, GND)
NET_C(IC6D.3, C8.1, R3.1, R4.1)
NET_C(C8.2, GND)
NET_C(R4.2, IC8D.4)
NET_C(IC6D.5, IC8D.8, IC9D.8, IC10E.1, IC9E.2)
NET_C(IC9E.9, IC9E.7, IC9E.10, I_V5)
NET_C(IC9E.1, I_V5)
NET_C(IC9E.15, IC10E.13, IC8C.8, IC9C.8)
NET_C(IC10E.2, IC8D.3)
NET_C(IC10E.3, IC10D.1)
NET_C(IC10E.4, IC10D.2)
NET_C(IC10E.5, IC10D.4)
NET_C(IC10E.6, IC10D.5)
NET_C(IC10D.6, IC10C.5)
NET_C(IC10C.4, IC10C.11)
NET_C(IC10C.6, IC8D.1, IC8D.2)
NET_C(IC8D.9, I_V5)
NET_C(IC8D.13, IC9D.1, IC9D.2)
NET_C(IC9D.10, IC10C.13)
NET_C(IC9D.12, IC10C.12)
NET_C(IC9D.13, R8.2)
NET_C(IC9D.9, I_V5)
NET_C(R8.1, C10.2, R9.1)
NET_C(C10.1, GND)
NET_C(R9.2, CR1.K, CR2.A)
NET_C(IC10E.12, IC8C.3)
NET_C(IC10E.8, IC10D.9)
NET_C(IC10E.9, IC10D.10)
NET_C(IC10E.10, IC10D.12)
NET_C(IC10E.11, IC10D.13)
NET_C(IC10D.8, IC10C.1)
NET_C(IC10C.2, IC10C.8)
NET_C(IC10C.3, IC8C.1, IC8C.2)
NET_C(IC8C.9, I_V5)
NET_C(IC8C.13, IC9C.1, IC9C.2)
NET_C(IC9C.10, IC10C.10)
NET_C(IC9C.12, IC10C.9)
NET_C(IC9C.13, R10.1)
NET_C(IC9C.9, I_V5)
NET_C(R10.2, C11.2, R11.1)
NET_C(C11.1, GND)
NET_C(R11.2, CR2.K, CR1.A, C12.1)
NET_C(C12.2, IC6B.2, R12.1, C13.1)
NET_C(IC6B.3, GND)
NET_C(IC6B.6, C13.2, R12.2, R13.1)
NET_C(R13.2, C15.1)
NET_C(C15.2, R14.2, IC6A.2)
NET_C(R14.1, GND)
NET_C(IC6A.3, R15.2)
NET_C(R15.1, GND)
NET_C(IC6A.5, R16.2)
//
// Explosion
//
NET_C(I_OUT_0, IC6C.11)
NET_C(IC6C.10, R5.1)
NET_C(R5.2, C5.2, IC6D.8)
NET_C(C5.1, GND)
NET_C(IC6D.10, R6.2, I_V5)
NET_C(IC6D.12, IC6D.13, R6.1, C6.1)
NET_C(C6.2, GND)
NET_C(IC6D.9, Q1.E)
NET_C(Q1.B, R7.2)
NET_C(R7.1, GND)
NET_C(Q1.C, R17.2, C17.1, R16.1)
NET_C(R17.1, GND)
NET_C(C17.2, I_VM15)
//
// On/off switches
//
NET_C(I_OUT_3, IC3A.5, IC6C.3)
NET_C(I_OUT_4, IC3A.10)
NET_C(IC3A.1, IC4A.2, R18.1, C14.1)
NET_C(IC4A.3, GND)
NET_C(C14.2, R18.2, IC4A.6, R19.1)
NET_C(R19.2, IC3A.14, IC6A.6)
#if (HLE_SHIP_VCO)
//
// This VCO is tricky to simulate, as there is both a frequency aspect
// and an envelope aspect. The frequency is relatively straightforward.
// Pick up the voltage from the anode of CR4 and map to a frequency
// with a polynominal derived from the LLE implementation.
//
// Here is the mapping I get for CR4.A vs. IC3A.5 (using a -0.1-0.1 threshold):
// R2 = 0.99832: HP = (-0.000160539*A0) + 0.0000331984
// R2 = 0.99927: HP = (0.00000397232*A0*A0) - (0.000129210*A0) + 0.000083240
// R2 = 0.99927: HP = (-0.000000185528*A0*A0*A0) + (0.00000154157*A0*A0) - (0.000138889*A0) + 0.000071961
// R2 = 0.99929: HP = (-0.000000215021*A0*A0*A0*A0) - (0.00000393775*A0*A0*A0) - (0.0000213646*A0*A0) - (0.000196307*A0) + 0.0000221998
// R2 = 0.99931: HP = (0.000000153378*A0*A0*A0*A0*A0) + (0.00000317059*A0*A0*A0*A0) + (0.0000244935*A0*A0*A0) + (0.000091436*A0*A0) + (0.0000138241*A0) + 0.000169151
//
VARCLOCK(SHIPCLK, 1, "max(0.000001,min(0.1,(0.00000397232*A0*A0) - (0.000129210*A0) + 0.000083240))")
NET_C(SHIPCLK.GND, GND)
NET_C(SHIPCLK.VCC, I_V5)
NET_C(SHIPCLK.A0, CR4.A)
//
// The envelope is trickier. When the signal is OFF (3A pin 5 is HIGH),
// the envelope tracks the voltage from CR4. When the signal is ON
// (3A pin 5 is LOW), the raw clock from SHIPCLK is clamped to -1..1
// and scaled down by a constant factor with a small additional
// envelope from the CR4 anode voltage.
//
AFUNC(SHIPENV, 3, "if(A2>2.5, -A1, (0.07-(0.005*A1))*if(A0>2.5,1,-1))")
NET_C(SHIPENV.A0, SHIPCLK.Q)
NET_C(SHIPENV.A1, CR4.A)
NET_C(SHIPENV.A2, IC3A.5)
NET_C(SHIPENV.Q, IC3A.2)
NET_C(R34.2, R35.1)
NET_C(R35.2, CR4.K)
NET_C(R36.1, IC5B.6, R38.2, CR4.A)
NET_C(GND, R34.1, R36.2, R37.1, R37.2, C9.1, C9.2, CR5.A, CR5.K, IC4B.2, IC4B.3, IC5A.2, IC5A.3)
#else
NET_C(IC3A.2, C9.2)
NET_C(C9.1, IC4B.2, R34.1)
NET_C(IC4B.6, R34.2, R35.1)
NET_C(IC4B.3, R35.2, CR4.K, CR5.A)
NET_C(R36.1, IC5B.6, R38.2, CR4.A)
NET_C(R36.2, IC5A.2, R37.1)
NET_C(IC5A.3, GND)
NET_C(R37.2, IC5A.6, CR5.K)
#endif
NET_C(IC3A.13, R22.1)
NET_C(R22.2, GND)
ALIAS(OUTPUT, R22.1)
//
// K exit
//
NET_C(I_OUT_7, IC7C.1)
NET_C(IC7C.2, R27.1, CR6.A)
NET_C(R27.2, I_V5)
NET_C(IC6C.4, IC7C.11)
NET_C(IC7C.10, CR3.A, R26.1)
NET_C(R26.2, I_V15, IC5D.14, IC5D.4, R29.2)
NET_C(CR3.K, R28.2)
NET_C(R28.1, CR6.K, C20.1, R33.1)
NET_C(C20.2, GND)
NET_C(R33.2, C27.1, R38.1, IC5B.2)
NET_C(IC5D.1, R29.1, R31.2)
NET_C(IC5D.2, IC5D.6, R31.1, R32.1, C21.1)
NET_C(R32.2, C27.2)
NET_C(C21.2, GND)
NET_C(IC5B.3, GND)
NET_C(IC5D.7, GND)
// pin 5 (OUTPUT) of the 555 timer is not connected;
// use this kludge to simulate that
RES(RDUMMY, RES_K(100))
NET_C(IC5D.5, RDUMMY.1)
NET_C(RDUMMY.2, GND)
//
// Lazer 1
//
NET_C(I_OUT_1, IC6C.5)
NET_C(IC6C.6, IC8E.14, IC7C.9)
NET_C(IC7C.8, R39.1)
NET_C(R39.2, C22.2, CR7.K)
NET_C(C22.1, GND)
#if (HLE_LAZER_VCOS)
//
// This VCO is very difficult to simulate without cranking the speed up
// and killing performance. Even at 1000x frequency, we still get failures
// to converge. Here we clip the circuit at the diode CR7 and substitute
// a VARCLOCK that directly drives the counter at 7E, skipping the analog
// to TTL conversion logic after the VCO.
//
// Here is the mapping I get for C22.2 vs. IC7E.1 half-period:
//
// R2 = 0.97399: HP = (0.00000249069*A0) + 0.00000439991
// R2 = 0.99638: HP = (0.000000142614*A0*A0) + (0.00000104196*A0) + 0.00000471406
// R2 = 0.99932: HP = (0.0000000174880*A0*A0*A0) - (0.000000159311*A0*A0) + (0.00000222025*A0) + 0.00000455815
// R2 = 0.99978: HP = (0.00000000229608*A0*A0*A0*A0) - (0.0000000377974*A0*A0*A0) + (0.000000245492*A0*A0) + (0.00000134883*A0) + 0.00000465357
// R2 = 0.99985: HP = (0.000000000286259*A0*A0*A0*A0*A0) - (0.00000000650969*A0*A0*A0*A0) + (0.0000000560876*A0*A0*A0) - (0.000000154720*A0*A0) + (0.00000190838*A0) + 0.0000045976
//
// One additional wrinkle is that when we clip the circuit, the voltage
// input to the VCO changes from a curve to linear, so to compute the
// mapping below, we had to map the C22.2 value from the clipped circuit
// against the frequency. Fortunately, the relationship still held, and
// in fact became almost linear.
//
// Here is the mapping for the clipped C22.2 vs. the original IC7E.1:
// R2 = 0.99947: HP = (0.000226684*A0) - 0.0000178774
// R2 = 0.99947: HP = (-0.0000111790*A0*A0) + (0.000230333*A0) - 0.0000181329
// R2 = 0.99958: HP = (-0.00124814*A0*A0*A0) + (0.000641071*A0*A0) + (0.000124020*A0) - 0.0000127688
// R2 = 0.99976: HP = (0.0197918*A0*A0*A0*A0) - (0.0148601*A0*A0*A0) + (0.00399181*A0*A0) - (0.000225308*A0) + 0.000000287255
// R2 = 0.99979: HP = (-0.095062*A0*A0*A0*A0*A0) + (0.093556*A0*A0*A0*A0) - (0.0361209*A0*A0*A0) + (0.00677578*A0*A0) - (0.000384926*A0) + 0.00000324102
//
VARCLOCK(LAZER1CLK, 1, "max(0.000001,min(0.1,(0.000226684*A0) - 0.0000178774))")
NET_C(LAZER1CLK.GND, GND)
NET_C(LAZER1CLK.VCC, I_V5)
NET_C(LAZER1CLK.Q, IC7E.1)
NET_C(LAZER1CLK.A0, C22.2)
NET_C(GND, R40.1, R40.2, R41.1, R41.2, R42.1, R42.2, R43.1, R43.2, R44.1, R44.2, C23.1, C23.2, CR7.A, CR8.A, CR8.K, IC6C.9, IC6F.2, IC6F.3)
#else
NET_C(CR7.A, IC6F.3, CR8.K, R43.1)
NET_C(CR8.A, GND)
NET_C(IC6F.2, C23.2, R40.1)
NET_C(C23.1, GND)
NET_C(IC6F.6, R40.2, R43.2, R41.1)
NET_C(R41.2, R44.2, Q4.B)
NET_C(R44.1, GND)
NET_C(Q4.E, GND)
NET_C(Q4.C, R42.1, IC6C.9)
NET_C(R42.2, I_V5)
NET_C(IC6C.8, IC7E.1)
#endif
NET_C(IC7E.2, IC7E.12, GND)
NET_C(IC7E.3, IC8E.7)
NET_C(IC7E.4, IC8E.4)
NET_C(IC7E.5, IC8E.6)
NET_C(IC7E.6, IC8E.5, IC7E.13)
NET_C(IC7E.8, IC8E.15)
NET_C(IC7E.10, IC8E.2)
NET_C(IC7E.11, IC8E.3)
NET_C(IC8E.1, GND)
NET_C(IC8E.13, GND)
NET_C(IC8E.12, R51.1)
NET_C(IC8E.11, R52.1)
NET_C(IC8E.10, R53.1)
NET_C(IC8E.9, R54.1)
NET_C(R51.2, R52.2, R53.2, R54.2, R55.1, R56.2)
NET_C(R56.1, GND)
NET_C(R55.2, C26.1)
NET_C(C26.2, IC6A.6)
//
// Lazer 2
//
NET_C(I_OUT_2, IC6C.1)
NET_C(IC6C.2, IC5E.14, IC7C.13)
NET_C(IC7C.12, R46.1)
NET_C(R46.2, C24.2, CR9.K)
NET_C(C24.1, GND)
#if (HLE_LAZER_VCOS)
//
// This VCO is identical to the one above, just using different components
//
VARCLOCK(LAZER2CLK, 1, "max(0.000001,min(0.1,(0.000226684*A0) - 0.0000178774))")
NET_C(LAZER2CLK.GND, GND)
NET_C(LAZER2CLK.VCC, I_V5)
NET_C(LAZER2CLK.Q, IC4E.1)
NET_C(LAZER2CLK.A0, C24.2)
NET_C(GND, R45.1, R45.2, R47.1, R47.2, R48.1, R48.2, R49.1, R49.2, R50.1, R50.2, C25.1, C25.2, CR9.A, CR10.A, CR10.K, IC6C.13, IC6E.2, IC6E.3)
#else
NET_C(CR9.A, IC6E.3, CR10.K, R48.1)
NET_C(CR10.A, GND)
NET_C(IC6E.2, C25.2, R45.1)
NET_C(C25.1, GND)
NET_C(IC6E.6, R45.2, R48.2, R47.1)
NET_C(R47.2, R49.2, Q5.B)
NET_C(R49.1, GND)
NET_C(Q5.E, GND)
NET_C(Q5.C, R50.1, IC6C.13)
NET_C(R50.2, I_V5)
NET_C(IC6C.12, IC4E.1)
#endif
NET_C(IC4E.2, IC4E.12, GND)
NET_C(IC4E.3, IC5E.7)
NET_C(IC4E.4, IC5E.4)
NET_C(IC4E.5, IC5E.6)
NET_C(IC4E.6, IC5E.5, IC4E.13)
NET_C(IC4E.8, IC5E.15)
NET_C(IC4E.10, IC5E.2)
NET_C(IC4E.11, IC5E.3)
NET_C(IC5E.1, GND)
NET_C(IC5E.13, GND)
NET_C(IC5E.12, R57.1)
NET_C(IC5E.11, R58.1)
NET_C(IC5E.10, R59.1)
NET_C(IC5E.9, R60.1)
NET_C(R57.2, R58.2, R59.2, R60.2, R55.1)
//
// Unconnected inputs
//
NET_C(GND, IC5D.8, IC5D.9, IC5D.10, IC5D.12, IC5D.13, IC7C.3, IC7C.5, IC9E.3, IC9E.4, IC9E.5, IC9E.6)
//
// Unconnected outputs
//
HINT(IC4E.9, NC) // Q3
#if (HLE_LAZER_VCOS)
HINT(IC6C.8, NC) // QD
HINT(IC6C.12, NC) // QF
#endif
HINT(IC7C.4, NC) // QB
HINT(IC7C.6, NC) // QC
HINT(IC7E.9, NC) // Q3
HINT(IC8C.4, NC) // Q1
HINT(IC8C.5, NC) // Q2
HINT(IC8C.6, NC) // Q3
HINT(IC8C.10, NC) // Q4
HINT(IC8C.11, NC) // Q5
HINT(IC8C.12, NC) // Q6
HINT(IC8D.5, NC) // Q2
HINT(IC8D.6, NC) // Q3
HINT(IC8D.10, NC) // Q4
HINT(IC8D.11, NC) // Q5
HINT(IC8D.12, NC) // Q6
HINT(IC9C.3, NC) // Q0
HINT(IC9C.4, NC) // Q1
HINT(IC9C.5, NC) // Q2
HINT(IC9C.6, NC) // Q3
HINT(IC9C.11, NC) // Q5
HINT(IC9D.3, NC) // Q0
HINT(IC9D.4, NC) // Q1
HINT(IC9D.5, NC) // Q2
HINT(IC9D.6, NC) // Q3
HINT(IC9D.11, NC) // Q5
HINT(IC9E.11, NC) // Q3
HINT(IC9E.12, NC) // Q2
HINT(IC9E.13, NC) // Q1
HINT(IC9E.14, NC) // Q0
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_STARHAWK_H
#define MAME_AUDIO_NL_STARHAWK_H
#pragma once
NETLIST_EXTERNAL(starhawk)
#endif // MAME_AUDIO_NL_STARHAWK_H

View File

@ -0,0 +1,483 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Sundance
//
// Derived from the schematics in the Sundance manual.
//
// Known problems/issues:
//
// * The "whoosh" sound is close to correct, though there may
// be some missing harmonics in the HLE.
//
// * The "wideband noise generator" is simulated with a generic
// noise source. This seems to work fine and doesn't sound
// too different from recordings.
//
// * The pitch of the pings and bongs seems a little lower than
// some recordings, though it's hard to say if this is due
// to aging as the frequencies are controlled by 555 timers
// and RC networks.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_sundance.h"
//
// Optimizations
//
#define HLE_NOISE_GEN (1)
#define HLE_WHOOSH_MOD (1)
//
// Main netlist
//
NETLIST_START(sundance)
SOLVER(Solver, 1000)
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 1) // active low
TTL_INPUT(I_OUT_1, 1) // active low
TTL_INPUT(I_OUT_2, 1) // active low
TTL_INPUT(I_OUT_3, 1) // active low
TTL_INPUT(I_OUT_4, 1) // active low
TTL_INPUT(I_OUT_7, 1) // active low
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND, I_OUT_7.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC, I_OUT_7.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_M(1))
RES(R2, 470)
RES(R3, 470)
RES(R4, RES_K(470))
RES(R5, 100)
RES(R6, RES_K(470))
RES(R7, RES_K(10))
RES(R8, RES_M(1))
RES(R9, RES_K(10))
RES(R10, RES_K(47))
RES(R11, RES_K(100))
RES(R12, RES_K(220))
RES(R13, RES_M(3.3))
RES(R14, RES_K(390))
RES(R15, RES_K(56))
RES(R16, RES_M(1))
RES(R17, RES_K(100))
RES(R18, RES_K(10))
RES(R19, RES_K(3.3))
RES(R20, RES_K(100))
RES(R21, RES_K(47))
RES(R22, RES_K(47))
RES(R23, RES_K(750))
RES(R24, 470)
RES(R25, RES_K(220))
RES(R26, 330)
RES(R27, RES_K(10))
RES(R28, RES_K(47))
RES(R29, RES_K(330))
RES(R30, RES_K(30))
RES(R31, RES_K(10))
RES(R32, RES_K(2.7))
RES(R33, RES_K(2.7))
RES(R34, RES_K(100))
RES(R35, RES_K(10))
RES(R36, RES_K(4.7))
RES(R37, RES_K(8.2))
RES(R38, RES_K(120))
RES(R39, RES_M(3.3))
RES(R40, RES_K(39))
RES(R41, RES_K(2.7))
RES(R42, RES_K(2.7))
RES(R43, RES_K(47))
RES(R44, RES_K(8.2))
RES(R45, RES_K(2.7))
RES(R46, RES_K(2.7))
RES(R47, RES_M(10))
RES(R48, RES_M(10))
RES(R49, RES_K(1))
RES(R50, 330)
RES(R51, RES_K(510))
RES(R52, RES_K(15))
RES(R53, RES_K(20))
RES(R54, RES_K(47))
RES(R55, RES_K(2.7))
RES(R56, RES_K(2.7))
RES(R57, 330)
RES(R58, RES_K(390))
RES(R59, RES_K(15))
RES(R60, RES_K(24))
RES(R61, RES_K(56))
RES(R62, RES_K(2.7))
RES(R63, RES_K(2.7))
RES(R64, 470)
// RES(R65, 150) -- part of final amp (not emulated)
// RES(R66, RES_K(22)) -- part of final amp (not emulated)
// RES(R67, 150) -- part of final amp (not emulated)
RES(R68, 330)
RES(R69, RES_K(390))
RES(R70, RES_K(15))
RES(R71, RES_K(30))
RES(R72, RES_K(68))
RES(R73, RES_K(2.7))
RES(R74, RES_K(2.7))
// RES(R75, RES_K(10)) -- part of final amp (not emulated)
// POT(R76, RES_K(100)) -- part of final amp (not emulated)
// PARAM(R76.DIAL, 0.500000) -- part of final amp (not emulated)
RES(R77, 330)
RES(R78, RES_K(220))
CAP(C1, CAP_U(0.1))
CAP(C2, CAP_U(100))
CAP(C3, CAP_U(0.01))
CAP(C4, CAP_U(0.1))
CAP(C5, CAP_U(100))
CAP(C6, CAP_U(1))
CAP(C7, CAP_U(1))
CAP(C8, CAP_U(10))
CAP(C9, CAP_U(0.05))
CAP(C10, CAP_U(0.1))
CAP(C11, CAP_U(0.01))
CAP(C12, CAP_U(0.1))
CAP(C13, CAP_U(0.001))
CAP(C14, CAP_U(0.005))
CAP(C15, CAP_U(10))
// CAP(C16, CAP_U(3.3)) -- not needed
// CAP(C17, CAP_U(3.3)) -- not needed
// CAP(C18, CAP_U(3.3)) -- not needed
// CAP(C19, CAP_U(3.3)) -- not needed
// CAP(C20, CAP_U(3.3)) -- not needed
CAP(C21, CAP_U(0.1))
CAP(C22, CAP_U(0.005))
CAP(C23, CAP_U(0.1))
CAP(C24, CAP_U(0.1))
CAP(C25, CAP_U(0.1))
CAP(C26, CAP_U(0.01))
CAP(C27, CAP_U(0.1))
CAP(C28, CAP_U(0.15))
CAP(C29, CAP_U(0.1))
CAP(C30, CAP_U(0.01))
CAP(C31, CAP_U(0.1))
// CAP(C32, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C33, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C34, CAP_P(470)) -- part of final amp (not emulated)
CAP(C35, CAP_U(0.15))
CAP(C36, CAP_U(0.1))
CAP(C37, CAP_U(0.01))
CAP(C38, CAP_U(0.1))
CAP(C39, CAP_U(1))
D_1N5240(D1)
D_1N914(D2)
D_1N914(D3)
Q_2N3904(Q1) // NPN
Q_2N3904(Q2) // NPN
Q_2N3906(Q3) // PNP
Q_2N3906(Q4) // PNP
Q_2N3906(Q5) // PNP
Q_2N3906(Q6) // PNP
// Q_2N6292(Q7) // NPN -- part of final amp (not emulated)
// Q_2N6107(Q9) // PNP -- part of final amp (not emulated)
Q_2N3906(Q8) // PNP
Q_2N3906(Q10) // PNP
TL081_DIP(IC1) // Op. Amp.
// NET_C(IC1.7, I_V15) // (indirectly via R5)
NET_C(IC1.4, I_VM15)
TL081_DIP(IC2) // Op. Amp.
NET_C(IC2.7, I_V15)
NET_C(IC2.4, I_VM15)
TL081_DIP(IC3) // Op. Amp.
NET_C(IC3.7, I_V15)
NET_C(IC3.4, I_VM15)
LM3900_DIP(IC4)
NET_C(IC4.7, GND)
NET_C(IC4.14, I_V15)
// TTL_7815_DIP(IC5) // +15V Regulator -- not needed
// TTL_7915_DIP(IC6) // -15V Regulator -- not needed
LM555_DIP(IC7)
TL081_DIP(IC8) // Op. Amp.
NET_C(IC8.7, I_V15)
NET_C(IC8.4, I_VM15)
CA3080_DIP(IC9)
NET_C(IC9.7, I_V15)
NET_C(IC9.4, I_VM15)
CA3080_DIP(IC10)
NET_C(IC10.7, I_V15)
NET_C(IC10.4, I_VM15)
LM555_DIP(IC11)
CA3080_DIP(IC12)
NET_C(IC12.7, I_V15)
NET_C(IC12.4, I_VM15)
TTL_74LS125_DIP(IC13) // Quad 3-state buffer
NET_C(IC13.7, GND)
NET_C(IC13.14, I_V5)
LM555_DIP(IC14)
LM555_DIP(IC15)
LM555_DIP(IC16)
CA3080_DIP(IC17)
NET_C(IC17.7, I_V15)
NET_C(IC17.4, I_VM15)
CA3080_DIP(IC18)
NET_C(IC18.7, I_V15)
NET_C(IC18.4, I_VM15)
CA3080_DIP(IC19)
NET_C(IC19.7, I_V15)
NET_C(IC19.4, I_VM15)
TL081_DIP(IC20) // Op. Amp.
NET_C(IC20.7, I_V15)
NET_C(IC20.4, I_VM15)
#if (HLE_NOISE_GEN)
//
// The "wideband noise gen" relies on properties
// of the components to create noise. Not only
// does this simulate poorly, but it would be too
// slow for realtime, so HLE it with some quality
// noise.
//
// Note that Tail Gunner has the exact same
// circuit.
//
CLOCK(NOISE_CLOCK, 10000)
NET_C(NOISE_CLOCK.GND, GND)
NET_C(NOISE_CLOCK.VCC, I_V5)
SYS_NOISE_MT_U(NOISE, 3)
NET_C(NOISE.I, NOISE_CLOCK.Q)
NET_C(NOISE.1, GND)
NET_C(NOISE.2, R27.2, R36.1, R43.1)
NET_C(GND, C1.1, C1.2, C2.1, C2.2, C3.1, C3.2, C4.1, C4.2, C5.1, C5.2)
NET_C(GND, D1.A, D1.K, D2.A, D2.K, D3.A, D3.K)
NET_C(GND, R1.1, R1.2, R3.1, R3.2, R4.1, R4.2, R5.1, R5.2, R6.1, R6.2, R7.1, R7.2, R8.1, R8.2, R9.1, R9.2, R10.1, R10.2)
NET_C(GND, IC1.2, IC1.3, IC1.7, IC2.2, IC2.3, IC3.2, IC3.3)
#else
NET_C(C1.1, C2.2, R1.1, R3.1, C5.2, GND)
NET_C(C1.2, C2.1, D1.K, R5.1, IC1.7)
NET_C(R1.2, C3.1, D1.A)
NET_C(R3.2, R4.1, C4.1)
NET_C(R4.2, C3.2, IC1.3)
NET_C(C4.2, IC1.2, R6.1)
NET_C(R6.2, IC1.6, R7.1)
NET_C(R5.2, C5.1, I_V15)
NET_C(R7.2, IC2.2, R8.1, D3.A, D2.K)
NET_C(IC2.3, GND)
NET_C(IC2.6, R8.2, D3.K, D2.A, R9.1)
NET_C(R9.2, R10.1, IC3.2)
NET_C(IC3.3, GND)
NET_C(IC3.6, R10.2, R43.1, R27.2, R36.1)
#endif
NET_C(I_OUT_1, R2.1, IC11.2)
NET_C(R2.2, I_V5)
NET_C(IC11.8, IC11.4, I_V5) // -- IC11.4 not documented
NET_C(IC11.3, R35.1)
NET_C(IC11.1, GND)
NET_C(R34.1, I_V5)
NET_C(R34.2, IC11.6, IC11.7, C13.2)
NET_C(C13.1, GND)
NET_C(R35.2, R17.1, IC4.13)
NET_C(R11.1, R14.1, R17.2, IC4.9)
NET_C(R11.2, IC4.3)
NET_C(R12.1, IC4.2)
NET_C(R12.2, R16.2, R18.2, Q2.C, R22.2, I_V15)
NET_C(IC4.4, R13.1)
NET_C(R13.2, C6.2, IC4.6)
NET_C(R14.2, IC4.1)
NET_C(IC4.5, C6.1, R15.1, Q1.B)
NET_C(R15.2, R16.1, IC4.8)
NET_C(Q1.C, R18.1, Q2.B)
NET_C(Q1.E, R19.2)
NET_C(R19.1, GND)
NET_C(Q2.E, Q3.B, R20.2)
NET_C(R20.1, I_VM15)
NET_C(Q3.E, R21.1)
NET_C(R21.2, R22.1, R23.2)
NET_C(R23.1, GND)
NET_C(Q3.C, IC12.5)
NET_C(R36.2, C14.1)
NET_C(C14.2, R37.2, R40.2, C15.1)
NET_C(R37.1, GND)
#if (HLE_WHOOSH_MOD)
//
// The "whoosh" sound has a noise modulator that is a steady
// clock ~64.5Hz, generated by an LM3900 and an RC network.
// When run at 48kHz, this network does not clock at the
// correct frequency, so HLE this with a basic clock.
//
CLOCK(WHOOSH_CLK, 64.5)
NET_C(WHOOSH_CLK.GND, GND)
NET_C(WHOOSH_CLK.VCC, I_V15)
NET_C(WHOOSH_CLK.Q, R40.1)
NET_C(GND, C21.1, C21.2, R38.1, R38.2, R39.1, R39.2, R47.1, R47.2, R48.1, R48.2, IC4.11, IC4.12)
#else
NET_C(R40.1, R38.2, IC4.10, R48.2)
NET_C(C21.2, R38.1, R39.2)
NET_C(C21.1, GND)
NET_C(R39.1, IC4.11)
NET_C(I_V15, R47.1)
NET_C(R47.2, IC4.12, R48.1)
#endif
NET_C(C15.2, R41.2, IC12.2)
NET_C(R41.1, R42.1, GND)
NET_C(R42.2, IC12.3)
NET_C(IC12.6, IC10.6, IC9.6, IC17.6, IC18.6, IC19.6, R64.1)
NET_C(I_OUT_2, R24.1, IC7.2)
NET_C(R25.1, IC7.6, IC7.7, C7.1)
NET_C(C7.2, IC7.1, GND)
NET_C(R24.2, I_V5)
NET_C(R25.2, IC7.8, IC7.4, I_V5) // IC7.4 -- not documented
NET_C(IC7.3, Q4.E)
NET_C(Q4.B, R26.2)
NET_C(R26.1, GND)
NET_C(Q4.C, C8.1, R30.1)
NET_C(C8.2, I_VM15)
NET_C(R30.2, IC10.5)
NET_C(R27.1, C9.2, R28.1)
NET_C(C9.1, GND)
NET_C(R28.2, C10.1)
NET_C(C10.2, C11.1, R29.1, IC8.2)
NET_C(IC8.3, GND)
NET_C(IC8.6, C11.2, R29.2, R31.1)
NET_C(R31.2, C12.1)
NET_C(C12.2, R32.2, IC10.2)
NET_C(R32.1, R33.1, GND)
NET_C(R33.2, IC10.3)
NET_C(R43.2, C22.1)
NET_C(C22.2, R44.2, C23.1)
NET_C(R44.1, GND)
NET_C(C23.2, R45.2, IC9.2)
NET_C(R45.1, GND)
NET_C(R46.1, GND)
NET_C(R46.2, IC9.3)
NET_C(I_OUT_7, IC13.1)
NET_C(I_V5, R49.2)
NET_C(R49.1, IC13.2, IC13.5, IC13.9, IC13.12)
NET_C(IC13.3, Q5.E)
NET_C(Q5.B, R50.2)
NET_C(R50.1, GND)
NET_C(Q5.C, C24.2, R51.1)
NET_C(C24.1, I_VM15)
NET_C(R51.2, IC9.5)
NET_C(I_OUT_3, IC13.4)
NET_C(IC13.6, Q6.E)
NET_C(Q6.B, R57.2)
NET_C(R57.1, GND)
NET_C(Q6.C, C28.1, R58.1)
NET_C(C28.2, I_VM15)
NET_C(R58.2, IC17.5)
NET_C(IC14.4, IC14.8, I_V5)
NET_C(IC14.3, R52.1)
NET_C(R52.2, C25.1)
NET_C(C25.2, R55.2, IC17.2)
NET_C(IC14.2, IC14.6, R54.1, R53.2, C27.2)
NET_C(R54.2, I_V5)
NET_C(C27.1, GND)
NET_C(IC14.7, R53.1)
NET_C(IC14.5, C26.2)
NET_C(C26.1, GND)
NET_C(IC14.1, GND)
NET_C(R55.1, GND)
NET_C(R56.1, GND)
NET_C(R56.2, IC17.3)
NET_C(I_OUT_4, IC13.10)
NET_C(IC13.8, Q8.E)
NET_C(Q8.B, R68.2)
NET_C(R68.1, GND)
NET_C(Q8.C, C35.1, R69.1)
NET_C(C35.2, I_VM15)
NET_C(R69.2, IC18.5)
NET_C(IC15.4, IC15.8, I_V5)
NET_C(IC15.3, R59.1)
NET_C(R59.2, C29.1)
NET_C(C29.2, R62.2, IC18.2)
NET_C(IC15.2, IC15.6, R61.1, R60.2, C31.2)
NET_C(R61.2, I_V5)
NET_C(C31.1, GND)
NET_C(IC15.7, R60.1)
NET_C(IC15.5, C30.2)
NET_C(C30.1, GND)
NET_C(IC15.1, GND)
NET_C(R62.1, GND)
NET_C(R63.1, GND)
NET_C(R63.2, IC18.3)
NET_C(I_OUT_0, IC13.13)
NET_C(IC13.11, Q10.E)
NET_C(Q10.B, R77.2)
NET_C(R77.1, GND)
NET_C(Q10.C, C39.1, R78.1)
NET_C(C39.2, I_VM15)
NET_C(R78.2, IC19.5)
NET_C(IC16.4, IC16.8, I_V5)
NET_C(IC16.3, R70.1)
NET_C(R70.2, C36.1)
NET_C(C36.2, R73.2, IC19.2)
NET_C(IC16.2, IC16.6, R72.1, R71.2, C38.2)
NET_C(R72.2, I_V5)
NET_C(C38.1, GND)
NET_C(IC16.7, R71.1)
NET_C(IC16.5, C37.2)
NET_C(C37.1, GND)
NET_C(IC16.1, GND)
NET_C(R73.1, GND)
NET_C(R74.1, GND)
NET_C(R74.2, IC19.3)
ALIAS(OUTPUT, R64.1)
NET_C(R64.2, GND)
//
// Unconnected pins
//
NET_C(GND, IC20.2, IC20.3) // part of final amp
// NET_C(GND, IC6.3, IC28.8, IC28.9, IC28.10, IC28.11)
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_SUNDANCE_H
#define MAME_AUDIO_NL_SUNDANCE_H
#pragma once
NETLIST_EXTERNAL(sundance)
#endif // MAME_AUDIO_NL_SUNDANCE_H

698
src/mame/audio/nl_tailg.cpp Normal file
View File

@ -0,0 +1,698 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Tail Gunner
//
// Derived from the schematics and parts list in the
// Tail Gunner manual.
//
// Known problems/issues:
//
// * The diodes (D8/D9) connected to LS123 Rext/Cext pins
// cause major performance issues. Snipping them out
// seems to have no effect apart from giving back all
// the lost performance.
//
// * The "wideband noise generator" is simulated with a generic
// noise source. This seems to work fine and doesn't sound
// too different from recordings.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_tailg.h"
//
// Optimizations
//
#define HLE_NOISE_GEN (1)
#define HLE_HYPERSPACE_VCO (1)
#define HLE_LASER_VCO (1)
#define REMOVE_LS123_DIODES (1)
#define ADD_LS125_PULLUPS (1)
//
// Main netlist
//
NETLIST_START(tailg)
#if (HLE_HYPERSPACE_VCO && HLE_LASER_VCO)
SOLVER(Solver, 1000)
#else
SOLVER(Solver, 48000000)
#endif
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active high
TTL_INPUT(I_OUT_1, 0) // active high
TTL_INPUT(I_OUT_2, 0) // active high
TTL_INPUT(I_OUT_3, 0) // active high
TTL_INPUT(I_OUT_4, 0) // active high
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_M(1))
RES(R2, RES_K(470))
RES(R3, 470)
RES(R4, RES_K(470))
RES(R5, 100)
RES(R6, RES_K(10))
RES(R7, RES_M(1))
RES(R8, RES_K(10))
RES(R9, RES_K(47))
RES(R10, RES_K(1))
RES(R11, RES_K(330))
RES(R12, RES_K(9.1))
RES(R13, RES_M(1))
RES(R14, RES_K(20))
RES(R15, RES_K(10))
RES(R16, RES_K(1))
RES(R17, RES_K(10))
RES(R18, RES_K(20))
RES(R19, RES_K(39))
RES(R20, RES_K(82))
RES(R21, RES_K(2.7))
RES(R22, RES_K(1))
RES(R23, RES_K(10))
RES(R24, RES_K(47))
RES(R25, RES_K(330))
RES(R26, RES_K(10))
RES(R27, RES_K(2.7))
RES(R28, RES_K(2.7))
RES(R29, 150)
RES(R30, RES_K(10))
RES(R31, RES_M(1))
RES(R32, RES_K(20))
RES(R33, RES_K(10))
RES(R34, RES_K(1))
RES(R35, RES_K(10))
RES(R36, RES_K(20))
RES(R37, RES_K(39))
RES(R38, RES_K(82))
RES(R39, RES_K(100))
RES(R40, RES_K(68))
RES(R41, 330)
RES(R42, 330)
RES(R43, RES_K(560))
RES(R44, RES_K(30))
RES(R45, RES_K(1))
RES(R46, 330)
RES(R47, RES_K(220))
RES(R48, RES_K(2.7))
RES(R49, RES_K(2.7))
RES(R50, RES_K(820))
RES(R51, RES_K(360))
RES(R52, RES_K(330))
RES(R53, RES_K(150))
RES(R54, RES_K(4.7))
RES(R55, RES_K(390))
RES(R56, RES_K(910))
RES(R57, RES_K(4.7))
RES(R58, RES_K(2))
RES(R59, RES_K(10))
RES(R60, RES_K(1))
RES(R61, RES_K(4.7))
RES(R62, RES_K(20))
RES(R63, RES_K(180))
RES(R64, RES_K(10))
RES(R65, RES_K(20))
RES(R66, RES_K(15))
RES(R67, RES_K(10))
RES(R68, RES_K(20))
RES(R69, RES_K(30))
RES(R70, 470)
// RES(R71, 150) -- part of final amp (not emulated)
// RES(R72, RES_K(22)) -- part of final amp (not emulated)
// RES(R73, 150) -- part of final amp (not emulated)
// RES(R74, RES_K(47)) -- part of final amp (not emulated)
// POT(R75, RES_K(100)) -- part of final amp (not emulated)
// PARAM(R75.DIAL, 0.5) -- part of final amp (not emulated)
RES(R76, RES_K(47))
RES(R77, RES_K(47))
RES(R78, RES_K(2.7))
RES(R79, RES_K(2.7))
RES(R80, RES_K(100))
RES(R81, RES_K(1))
RES(R82, RES_K(330))
RES(R83, RES_K(10))
RES(R84, RES_K(91))
CAP(C1, CAP_U(100))
CAP(C2, CAP_U(0.1))
CAP(C3, CAP_U(0.01))
CAP(C4, CAP_U(0.1))
CAP(C5, CAP_U(100))
CAP(C6, CAP_U(0.68))
CAP(C7, CAP_U(0.1))
CAP(C8, CAP_U(1))
CAP(C9, CAP_U(0.1))
CAP(C10, CAP_U(0.1))
CAP(C11, CAP_U(0.005))
CAP(C12, CAP_U(0.1))
CAP(C13, CAP_U(0.1))
CAP(C14, CAP_U(0.05))
CAP(C15, CAP_U(10))
CAP(C16, CAP_U(10))
CAP(C17, CAP_U(0.002))
CAP(C18, CAP_U(0.01))
CAP(C19, CAP_U(0.01))
CAP(C20, CAP_U(0.01))
CAP(C21, CAP_U(0.1))
CAP(C22, CAP_U(0.1))
CAP(C23, CAP_U(0.01))
CAP(C24, CAP_U(15))
CAP(C25, CAP_U(0.22))
CAP(C26, CAP_U(4.7))
CAP(C27, CAP_U(0.1))
CAP(C28, CAP_U(0.47))
CAP(C29, CAP_U(0.47))
CAP(C30, CAP_U(0.01))
CAP(C31, CAP_U(0.05))
CAP(C32, CAP_U(0.1))
CAP(C33, CAP_U(0.1))
// CAP(C34, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C35, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C36, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C37, CAP_U(3.3))
// CAP(C38, CAP_U(3.3))
// CAP(C39, CAP_U(3.3))
// CAP(C40, CAP_U(3.3))
CAP(C41, CAP_U(0.005))
CAP(C42, CAP_U(0.1))
CAP(C43, CAP_U(10))
CAP(C44, CAP_U(2.2))
D_1N5240(D1)
D_1N914(D2)
D_1N914(D3)
D_1N914(D4)
D_1N914(D5)
D_1N914(D6)
D_1N914(D7)
D_1N914(D8)
D_1N914(D9)
Q_2N3904(Q1) // NPN
Q_2N3904(Q2) // NPN
Q_2N3906(Q3) // PNP
Q_2N3906(Q4) // PNP
Q_2N3906(Q5) // PNP
// Q_2N6292(Q6) // NPN -- part of final amp (not emulated)
// Q_2N6107(Q7) // PNP -- part of final amp (not emulated)
Q_2N3906(Q8) // PNP
TL081_DIP(IC1) // Op. Amp.
// NET_C(IC1.7, I_V15) // (indirectly via R5)
NET_C(IC1.4, I_VM15)
TL081_DIP(IC2) // Op. Amp.
NET_C(IC2.4, I_VM15)
NET_C(IC2.7, I_V15)
TL081_DIP(IC3) // Op. Amp.
NET_C(IC3.4, I_VM15)
NET_C(IC3.7, I_V15)
TTL_74LS125_DIP(IC4) // Quad 3-state Buffers
NET_C(IC4.7, GND)
NET_C(IC4.14, I_V5)
TTL_7404_DIP(IC5) // Hex Inverting Gates
NET_C(IC5.7, GND)
NET_C(IC5.14, I_V5)
TTL_7406_DIP(IC6) // Hex inverter -- currently using a clone of 7416, no open collector behavior
NET_C(IC6.7, GND)
NET_C(IC6.14, I_V5)
TL081_DIP(IC7) // Op. Amp.
NET_C(IC7.4, I_VM15)
NET_C(IC7.7, I_V15)
TTL_74LS393_DIP(IC8) // Dual 4-Stage Binary Counter
NET_C(IC8.7, GND)
NET_C(IC8.14, I_V5)
TL081_DIP(IC9) // Op. Amp.
NET_C(IC9.4, I_VM15)
NET_C(IC9.7, I_V15)
CA3080_DIP(IC10) // Op. Amp.
NET_C(IC10.4, I_VM15)
NET_C(IC10.7, I_V15)
TL081_DIP(IC11) // Op. Amp.
NET_C(IC11.4, I_VM15)
NET_C(IC11.7, I_V15)
TTL_74LS123_DIP(IC12) // Retriggerable Monostable Multivibrators
NET_C(IC12.8, GND)
NET_C(IC12.16, I_V5)
CA3080_DIP(IC13) // Op. Amp.
NET_C(IC13.4, I_VM15)
NET_C(IC13.7, I_V15)
LM555_DIP(IC14)
LM555_DIP(IC15)
LM555_DIP(IC16)
LM555_DIP(IC17)
TTL_74LS393_DIP(IC18) // Dual 4-Stage Binary Counter
NET_C(IC18.7, GND)
NET_C(IC18.14, I_V5)
TL081_DIP(IC19) // Op. Amp.
NET_C(IC19.4, I_VM15)
NET_C(IC19.7, I_V15)
// TTL_7915_DIP(IC20) // -15V Regulator -- not needed
// TTL_7815_DIP(IC21) // +15V Regulator -- not needed
CA3080_DIP(IC22) // Op. Amp.
NET_C(IC22.4, I_VM15)
NET_C(IC22.7, I_V15)
TTL_74LS259_DIP(IC23)
NET_C(IC23.8, GND)
NET_C(IC23.16, I_V5)
#if (HLE_NOISE_GEN)
//
// The "wideband noise gen" relies on properties
// of the components to create noise. Not only
// does this simulate poorly, but it would be too
// slow for realtime, so HLE it with some quality
// noise.
//
// Note that Sundance has the exact same circuit.
//
CLOCK(NOISE_CLOCK, 10000)
NET_C(NOISE_CLOCK.GND, GND)
NET_C(NOISE_CLOCK.VCC, I_V5)
SYS_NOISE_MT_U(NOISE, 3)
NET_C(NOISE.I, NOISE_CLOCK.Q)
NET_C(NOISE.1, GND)
NET_C(NOISE.2, R9.2, R23.2, R55.2, R76.1)
NET_C(GND, C1.1, C1.2, C2.1, C2.2, C3.1, C3.2, C4.1, C4.2, C5.1, C5.2)
NET_C(GND, D1.A, D1.K, D2.A, D2.K, D3.A, D3.K)
NET_C(GND, R1.1, R1.2, R2.1, R2.2, R3.1, R3.2, R4.1, R4.2, R5.1, R5.2, R6.1, R6.2, R7.1, R7.2, R8.1, R8.2, R9.1)
NET_C(GND, IC1.2, IC1.3, IC1.7, IC2.2, IC2.3, IC3.2, IC3.3)
#else
NET_C(C1.1, GND)
NET_C(C1.2, C2.2, D1.K, IC1.7, R5.1)
NET_C(C2.1, GND)
NET_C(D1.A, C3.1, R1.2)
NET_C(R1.1, GND)
NET_C(C3.2, R2.2, IC1.2)
NET_C(R3.1, GND)
NET_C(R2.1, C4.1, R3.2)
NET_C(C4.2, IC1.3, R4.1)
NET_C(R4.2, IC1.6, R6.1)
NET_C(R5.2, C5.1, I_V15)
NET_C(C5.2, GND)
NET_C(R6.2, IC2.2, R7.1, D3.A, D2.K)
NET_C(IC2.3, GND)
NET_C(IC2.6, R7.2, D3.K, D2.A, R8.1)
NET_C(R8.2, IC3.2, R9.1)
NET_C(IC3.3, GND)
NET_C(IC3.6, R9.2, R23.2, R55.2, R76.1)
#endif
//
// Input mux
//
NET_C(I_OUT_0, IC23.1)
NET_C(I_OUT_1, IC23.2)
NET_C(I_OUT_2, IC23.3)
NET_C(I_OUT_3, IC23.13)
NET_C(I_OUT_4, IC23.14)
NET_C(IC23.15, I_V5)
NET_C(R23.1, R24.1, C9.2)
NET_C(C9.1, GND)
NET_C(R24.2, C10.1)
NET_C(C10.2, IC9.2, R25.1, C11.1)
NET_C(IC9.3, GND)
NET_C(IC9.6, R25.2, C11.2, R26.1)
NET_C(R26.2, C12.1)
NET_C(C12.2, R27.2, IC10.2)
NET_C(R27.1, GND)
NET_C(IC10.3, R28.2)
NET_C(R28.1, GND)
NET_C(IC10.6, R70.1)
//
// Explosion
//
NET_C(IC23.4, IC12.1)
NET_C(IC12.14, C15.2)
#if (REMOVE_LS123_DIODES)
//
// The diodes connected to the Rext/Cext pins on the
// LS123 (monostable multivibrators) absolutely tank
// performance for reasons yet not understood. Their
// purpose is unclear, and removing them seems to have
// no effect on the sound, while fixing the performance
// so we'll just snip them out for now.
//
NET_C(IC12.15, C15.1, R39.1)
NET_C(GND, D8.A, D8.K)
#else
NET_C(IC12.15, D8.K)
NET_C(D8.A, C15.1, R39.1)
#endif
NET_C(R39.2, IC12.2, IC12.3, I_V5)
NET_C(IC12.13, Q3.E)
NET_C(Q3.B, R42.2)
NET_C(R42.1, GND)
NET_C(Q3.C, R43.2, C16.1, R44.1)
NET_C(C16.2, I_VM15)
NET_C(R44.2, IC10.5)
//
// Rumble
//
NET_C(IC23.5, IC6.5)
NET_C(IC6.6, R40.1, Q4.E)
NET_C(R40.2, I_V5)
NET_C(Q4.B, R41.2)
NET_C(R41.1, GND)
NET_C(Q4.C, R43.1)
//
// Shield
//
NET_C(IC23.7, IC4.13)
NET_C(I_V5, R45.1)
NET_C(R45.2, IC4.12)
NET_C(IC4.11, Q5.E)
NET_C(Q5.B, R46.2)
NET_C(R46.1, GND)
NET_C(Q5.C, R47.1)
NET_C(R47.2, IC13.5)
NET_C(IC13.6, R70.1)
NET_C(I_V15, R54.2, IC16.4, IC16.8)
NET_C(R54.1, IC16.7, R56.2)
NET_C(R56.1, IC16.6, IC16.2, C22.2)
NET_C(C22.1, IC16.1, C23.1, GND)
NET_C(C23.2, IC16.5)
NET_C(IC16.3, R57.1)
NET_C(R57.2, C24.1, R58.1)
NET_C(C24.2, GND)
NET_C(R58.2, C26.1, C25.1)
NET_C(C26.2, GND)
NET_C(C25.2, C27.1, R48.2, IC13.2, C21.1)
NET_C(R48.1, GND)
NET_C(IC13.3, R49.2)
NET_C(R49.1, GND)
NET_C(C27.2, R59.1)
NET_C(R59.2, C28.1, R60.1)
NET_C(C28.2, GND)
NET_C(R60.2, C29.1, R62.1)
NET_C(C29.2, GND)
NET_C(R62.2, IC17.3)
NET_C(IC17.7, R61.2, R63.2)
NET_C(R61.1, IC17.4, IC17.8, I_V15)
NET_C(R63.1, IC17.6, IC17.2, C31.2)
NET_C(C31.1, IC17.1, C30.1, GND)
NET_C(C30.2, IC17.5)
NET_C(C21.2, R55.1)
//
// Hyperspace
//
NET_C(IC23.10, IC4.1)
NET_C(IC4.2, GND)
#if (ADD_LS125_PULLUPS)
//
// The 74LS125 is being abuse here, assuming the tristate
// will pull high instead of low. This is not how it is
// modelled, so add a pullup resistor between the output
// and the TTL source.
//
RES(RTEMP1, RES_K(1))
NET_C(RTEMP1.1, I_V5)
NET_C(IC4.3, RTEMP1.2)
#endif
NET_C(IC4.3, IC5.5, IC8.12)
NET_C(IC5.6, IC6.1)
NET_C(IC6.2, R10.1, R11.1)
NET_C(R10.2, I_V5)
NET_C(R11.2, D4.K, C6.1)
NET_C(C6.2, GND)
#if (HLE_HYPERSPACE_VCO)
//
// The hyperspace VCO is troublesome to emulate without
// cranking up the solver frequency, so model it instead.
// Take the voltage at C6.1 and map it to the TTL
// frequency at IC8.13, then remove the circuit in favor
// of a variable clock.
//
// Here is the mapping I get for C6.1 vs IC8.13 half-period:
// R2 = 0.99919: HP = (0.000070760*A0) + 0.0000496821
// R2 = 0.99991: HP = (0.00000141986*A0*A0) + (0.0000592676*A0) + 0.000067917
// R2 = 0.99995: HP = (0.000000176200*A0*A0*A0) - (0.000000394224*A0*A0) + (0.000064351*A0) + 0.000063955
// R2 = 0.99995: HP = (-0.00000000225454*A0*A0*A0*A0) + (0.000000207009*A0*A0*A0) - (0.000000529599*A0*A0) + (0.000064557*A0) + 0.000063885
// R2 = 0.99995: HP = (0.0000000099503*A0*A0*A0*A0*A0) - (0.000000173841*A0*A0*A0*A0) + (0.00000127300*A0*A0*A0) - (0.00000339043*A0*A0) + (0.000067595*A0) + 0.000063196
//
// However, when we clip the circuit, the C6.1 values change,
// so here is a mapping for the clipped C6.1 vs. the original
// IC8.13 half-period:
//
// R2 = 0.97319: HP = (0.0000572507*A0) + 0.000194746
// R2 = 0.97692: HP = (0.00000283778*A0*A0) + (0.0000473318*A0) + 0.000197383
// R2 = 0.97785: HP = (-0.00000116165*A0*A0*A0) + (0.0000100018*A0*A0) + (0.0000372162*A0) + 0.000199308
// R2 = 0.97830: HP = (-0.000000661779*A0*A0*A0*A0) + (0.00000465155*A0*A0*A0) - (0.00000545641*A0*A0) + (0.0000499499*A0) + 0.000197353
// R2 = 0.97930: HP = (-0.000000814292*A0*A0*A0*A0*A0) + (0.0000086074*A0*A0*A0*A0) - (0.0000317523*A0*A0*A0) + (0.0000522027*A0*A0) + (0.0000173329*A0) + 0.000201604
//
VARCLOCK(HYPERCLK, 1, "max(0.000001,min(0.1,(-0.000000814292*A0*A0*A0*A0*A0) + (0.0000086074*A0*A0*A0*A0) - (0.0000317523*A0*A0*A0) + (0.0000522027*A0*A0) + (0.0000173329*A0) + 0.000201604))")
NET_C(HYPERCLK.GND, GND)
NET_C(HYPERCLK.VCC, I_V5)
NET_C(HYPERCLK.Q, IC8.13)
NET_C(HYPERCLK.A0, C6.1)
NET_C(GND, R12.1, R12.2, R13.1, R13.2, R14.1, R14.2, R15.1, R15.2, R16.1, R16.2, C7.1, C7.2, D4.A, D5.A, D5.K, IC7.2, IC7.3, IC5.1)
HINT(IC5.2, NC)
#else
NET_C(D4.A, IC7.3, D5.K, R13.1)
NET_C(IC7.2, C7.2, R12.1)
NET_C(C7.1, GND)
NET_C(R12.2, IC7.6, R13.2, R14.1)
NET_C(D5.A, GND)
NET_C(R14.2, R15.2, Q1.B)
NET_C(R15.1, GND)
NET_C(Q1.E, GND)
NET_C(Q1.C, R16.1, IC5.1)
NET_C(R16.2, I_V5)
NET_C(IC5.2, IC8.13)
#endif
NET_C(IC8.9, R17.1)
NET_C(IC8.8, R18.1)
NET_C(IC8.10, R19.1)
NET_C(IC8.11, R20.1)
NET_C(R17.2, R18.2, R19.2, R20.2, R22.2, R21.1)
NET_C(R22.1, GND)
NET_C(R21.2, C8.1)
NET_C(C8.2, R70.1)
//
// Laser
//
NET_C(IC23.6, IC4.4)
NET_C(IC4.5, GND)
#if (ADD_LS125_PULLUPS)
//
// see previous comment about why this is necessary
//
RES(RTEMP2, RES_K(1))
NET_C(RTEMP2.1, I_V5)
NET_C(IC4.6, RTEMP2.2)
#endif
NET_C(IC4.6, IC8.2, IC6.3)
NET_C(IC6.4, R29.1)
NET_C(R29.2, D6.K, C13.2)
NET_C(C13.1, GND)
#if (HLE_LASER_VCO)
//
// The laser VCO is almost identical to the hyperspace VCO,
// apart from the component values. The same approach is used
// for HLE.
//
// Here is the mapping I get for C13.2 vs IC8.1 half-period:
// R2 = 0.99489: HP = (0.0000346649*A0) + 0.0000391143
// R2 = 0.99489: HP = (0.0000000539278*A0*A0) + (0.0000345904*A0) + 0.0000391217
// R2 = 0.99491: HP = (0.00000116177*A0*A0*A0) - (0.00000273810*A0*A0) + (0.0000362549*A0) + 0.0000389782
// R2 = 0.99502: HP = (-0.00000728180*A0*A0*A0*A0) + (0.0000256184*A0*A0*A0) - (0.0000288539*A0*A0) + (0.0000456890*A0) + 0.0000382619
// R2 = 0.99526: HP = (0.0000241755*A0*A0*A0*A0*A0) - (0.000110184*A0*A0*A0*A0) + (0.000181339*A0*A0*A0) - (0.000128682*A0*A0) + (0.000070619*A0) + 0.0000366068
//
// And here is the mapping for the clipped C13.2 vs the original
// IC8.1 half-period:
// R2 = 0.10697: HP = (0.000449852*A0) - 0.000000764127
// R2 = 0.99164: HP = (0.0445612*A0*A0) - (0.00441596*A0) + 0.0000386659
// R2 = 0.99165: HP = (0.0576325*A0*A0*A0) + (0.0325274*A0*A0) - (0.00378669*A0) + 0.0000384468
// R2 = 0.99422: HP = (-37.92188*A0*A0*A0*A0) + (11.77137*A0*A0*A0) - (1.173779*A0*A0) + (0.0377702*A0) + 0.0000242577
// R2 = 0.99536: HP = (-1435.864*A0*A0*A0*A0*A0) + (418.8404*A0*A0*A0*A0) - (37.19112*A0*A0*A0) + (0.653446*A0*A0) + (0.0314777*A0) + 0.0000261637
//
VARCLOCK(LASERCLK, 1, "max(0.000001,min(0.1,(0.0576325*A0*A0*A0) + (0.0325274*A0*A0) - (0.00378669*A0) + 0.0000384468))")
NET_C(LASERCLK.GND, GND)
NET_C(LASERCLK.VCC, I_V5)
NET_C(LASERCLK.Q, IC8.1)
NET_C(LASERCLK.A0, C13.2)
NET_C(GND, R30.1, R30.2, R31.1, R31.2, R32.1, R32.2, R33.1, R33.2, R34.1, R34.2, C14.1, C14.2, D6.A, D7.A, D7.K, IC11.2, IC11.3, IC5.3)
HINT(IC5.4, NC)
#else
NET_C(D6.A, IC11.3, D7.K, R31.1)
NET_C(D7.A, GND)
NET_C(IC11.2, C14.2, R30.1)
NET_C(C14.1, GND)
NET_C(IC11.6, R30.2, R31.2, R32.1)
NET_C(R32.2, R33.2, Q2.B)
NET_C(R33.1, GND)
NET_C(Q2.E, GND)
NET_C(Q2.C, R34.1, IC5.3)
NET_C(R34.2, I_V5)
NET_C(IC5.4, IC8.1)
#endif
NET_C(IC8.5, R35.1)
NET_C(IC8.6, R36.1)
NET_C(IC8.4, R37.1)
NET_C(IC8.3, R38.1)
NET_C(R35.2, R36.2, R37.2, R38.2, R21.1)
//
// Shield Bounce
//
NET_C(R50.2, I_V5, IC14.4, IC14.8)
NET_C(R50.1, R51.1, IC14.6, IC14.2, C17.2)
NET_C(R51.2, IC14.7)
NET_C(C17.1, IC14.1, C18.1, GND)
NET_C(C18.2, IC14.5)
NET_C(IC14.3, IC18.1)
NET_C(IC18.2, GND)
NET_C(IC18.4, R64.2)
NET_C(R64.1, R65.1, C32.2)
NET_C(IC18.6, R65.2)
NET_C(C32.1, R66.2)
NET_C(R66.1, R69.1, IC22.2, R78.2, C42.2)
NET_C(R52.2, I_V5, IC15.4, IC15.8)
NET_C(R52.1, R53.1, IC15.6, IC15.2, C19.2)
NET_C(R53.2, IC15.7)
NET_C(C19.1, IC15.1, C20.1, GND)
NET_C(C20.2, IC15.5)
NET_C(IC15.3, IC18.13)
NET_C(IC18.12, GND)
NET_C(IC18.8, R67.2)
NET_C(R67.1, R68.1, C33.2)
NET_C(IC18.11, R68.2)
NET_C(C33.1, R69.2)
NET_C(C42.1, R77.2, C41.2)
NET_C(R77.1, GND)
NET_C(C41.1, R76.2)
NET_C(R78.1, GND)
NET_C(IC22.3, R79.2)
NET_C(R79.1, GND)
NET_C(IC23.9, IC12.9)
NET_C(IC12.6, C43.2)
#if (REMOVE_LS123_DIODES)
//
// A second instance of problematic diode; see above
// comment for an explanation.
//
NET_C(C43.1, R80.1, IC12.7)
NET_C(GND, D9.A, D9.K)
#else
NET_C(C43.1, D9.A, R80.1)
NET_C(D9.K, IC12.7)
#endif
NET_C(R80.2, IC12.10, IC12.11, I_V5)
NET_C(IC12.12, IC4.10)
NET_C(IC4.9, R81.2)
NET_C(R81.1, I_V5)
NET_C(IC4.8, Q8.E)
NET_C(Q8.B, R82.2)
NET_C(R82.1, GND)
NET_C(Q8.C, R83.1)
NET_C(R83.2, C44.1, R84.1)
NET_C(C44.2, I_VM15)
NET_C(R84.2, IC22.5)
NET_C(IC22.6, R70.1)
//
// Final amp
//
//NET_C(R70.1, GND) // temp
ALIAS(OUTPUT, R70.1)
NET_C(R70.2, GND)
//
// Unconnected inputs
//
NET_C(GND, IC19.2, IC19.3) // part of final amp
NET_C(GND, IC5.9, IC5.11, IC5.13, IC6.9, IC6.11, IC6.13)
//
// Unconnected outputs
//
HINT(IC5.8, NC) // QC
HINT(IC5.10, NC) // QD
HINT(IC5.12, NC) // QE
HINT(IC6.8, NC) // QC
HINT(IC6.10, NC) // QD
HINT(IC6.12, NC) // QE
HINT(IC12.4, NC) // /QA
HINT(IC12.5, NC) // QB
HINT(IC18.3, NC) // Q0A
HINT(IC18.5, NC) // Q2A
HINT(IC18.9, NC) // Q2B
HINT(IC18.10, NC) // Q1B
HINT(IC23.11, NC) // Q6
HINT(IC23.12, NC) // Q7
NETLIST_END()

10
src/mame/audio/nl_tailg.h Normal file
View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_TAILG_H
#define MAME_AUDIO_NL_TAILG_H
#pragma once
NETLIST_EXTERNAL(tailg)
#endif // MAME_AUDIO_NL_TAILG_H

View File

@ -0,0 +1,490 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//
// Netlist for Warrior
//
// Derived from the schematics in the Warrior manual.
//
// Known problems/issues:
//
// * Not yet tested.
//
#include "netlist/devices/net_lib.h"
#include "nl_cinemat_common.h"
#include "nl_warrior.h"
//
// Optimizations
//
#define HLE_NOISE_GEN (1)
#define HLE_PITFALL_VCO (1)
//
// Main netlist
//
NETLIST_START(warrior)
#if (HLE_PITFALL_VCO)
SOLVER(Solver, 1000)
#else
SOLVER(Solver, 48000000)
#endif
PARAM(Solver.DYNAMIC_TS, 1)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5)
TTL_INPUT(I_OUT_0, 0) // active high
TTL_INPUT(I_OUT_1, 0) // active high
TTL_INPUT(I_OUT_2, 0) // active high
TTL_INPUT(I_OUT_3, 0) // active high
TTL_INPUT(I_OUT_4, 0) // active high
NET_C(GND, I_OUT_0.GND, I_OUT_1.GND, I_OUT_2.GND, I_OUT_3.GND, I_OUT_4.GND)
NET_C(I_V5, I_OUT_0.VCC, I_OUT_1.VCC, I_OUT_2.VCC, I_OUT_3.VCC, I_OUT_4.VCC)
CINEMAT_LOCAL_MODELS
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_V15, 15)
ANALOG_INPUT(I_VM15, -15)
RES(R1, RES_K(10))
RES(R2, RES_K(47))
RES(R3, RES_K(330))
RES(R4, RES_K(10))
RES(R5, RES_K(2.7))
RES(R6, RES_K(2.7))
RES(R7, RES_K(4.7))
RES(R8, RES_K(8.2))
RES(R9, RES_K(2.7))
RES(R10, RES_K(2.7))
RES(R11, 470)
RES(R12, RES_K(470))
RES(R13, 330)
RES(R14, RES_K(30))
RES(R15, 100)
RES(R16, RES_M(1))
RES(R17, RES_M(1))
RES(R18, RES_K(470))
RES(R19, 470)
RES(R20, RES_K(470))
RES(R21, RES_K(10))
RES(R22, RES_K(10))
RES(R23, RES_K(47))
RES(R24, RES_K(1))
RES(R25, RES_K(510))
RES(R26, 330)
RES(R27, 330)
RES(R28, RES_K(120))
RES(R29, RES_K(82))
RES(R30, 330)
RES(R31, RES_K(4.7))
RES(R32, RES_K(910))
RES(R33, RES_K(4.7))
RES(R34, RES_K(2))
RES(R35, RES_K(390))
RES(R36, RES_K(4.7))
RES(R37, RES_K(180))
RES(R38, RES_K(20))
RES(R39, RES_K(1))
RES(R40, RES_K(10))
RES(R41, RES_K(2.7))
RES(R42, RES_K(2.7))
RES(R43, RES_K(20))
RES(R44, 150)
RES(R45, RES_K(30))
RES(R46, RES_K(360))
RES(R47, RES_K(12))
RES(R48, RES_M(1))
RES(R49, RES_K(30))
RES(R50, RES_K(10))
RES(R51, RES_K(1))
RES(R52, RES_K(4.7))
RES(R53, RES_K(680))
RES(R54, RES_K(30))
RES(R55, RES_K(2.7))
RES(R56, RES_K(2.7))
RES(R57, RES_K(820))
RES(R58, 470)
// RES(R59, 150) -- part of final amp (not emulated)
// RES(R60, RES_K(2.2)) -- part of final amp (not emulated)
// RES(R61, 150) -- part of final amp (not emulated)
// RES(R62, RES_K(47)) -- part of final amp (not emulated)
// POT(R63, RES_K(100)) -- part of final amp (not emulated)
CAP(C1, CAP_U(0.1))
CAP(C2, CAP_U(0.1))
CAP(C3, CAP_U(0.01))
CAP(C4, CAP_U(0.1))
CAP(C5, CAP_U(0.005))
CAP(C6, CAP_U(0.1))
CAP(C7, CAP_U(1))
CAP(C8, CAP_U(15))
CAP(C9, CAP_U(100))
CAP(C10, CAP_U(0.1))
CAP(C11, CAP_U(0.01))
CAP(C12, CAP_U(0.1))
CAP(C13, CAP_U(100))
CAP(C14, CAP_U(0.33))
CAP(C15, CAP_U(0.68))
CAP(C16, CAP_U(0.01))
CAP(C17, CAP_U(15))
CAP(C18, CAP_U(4.7))
CAP(C19, CAP_U(0.22)) // 22?
CAP(C20, CAP_U(0.1))
CAP(C21, CAP_U(0.1))
// CAP(C22, CAP_U(3.3)) -- part of voltage converter (not emulated)
// CAP(C23, CAP_U(3.3)) -- part of voltage converter (not emulated)
// CAP(C24, CAP_U(3.3)) -- part of voltage converter (not emulated)
// CAP(C25, CAP_U(3.3)) -- part of voltage converter (not emulated)
// CAP(C26, CAP_U(3.3)) -- part of voltage converter (not emulated)
CAP(C27, CAP_U(0.047))
CAP(C28, CAP_U(0.01))
CAP(C29, CAP_U(0.47))
CAP(C30, CAP_U(0.47))
CAP(C31, CAP_U(1))
CAP(C32, CAP_U(0.1))
CAP(C33, CAP_U(0.47))
CAP(C34, CAP_U(0.05))
CAP(C35, CAP_U(0.05))
CAP(C36, CAP_U(0.01))
CAP(C37, CAP_U(0.1))
// CAP(C38, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C39, CAP_P(470)) -- part of final amp (not emulated)
// CAP(C40, CAP_P(470)) -- part of final amp (not emulated)
D_1N5240(D1)
D_1N914(D2)
D_1N914(D3)
D_1N914(D4)
D_1N914(D5)
Q_2N3906(Q1) // PNP
Q_2N3906(Q2) // PNP
Q_2N3906(Q3) // PNP
Q_2N3906(Q4) // PNP
Q_2N3904(Q5) // NPN
// Q_2N5878(Q6) // NPN -- part of final amp (not emulated)
// Q_2N5876(Q7) // PNP -- part of final amp (not emulated)
TL081_DIP(IC1) // Op. Amp.
NET_C(IC1.7, I_V15)
NET_C(IC1.4, I_VM15)
CA3080_DIP(IC2) // Op. Amp.
NET_C(IC2.4, I_VM15)
NET_C(IC2.7, I_V15)
CA3080_DIP(IC3) // Op. Amp.
NET_C(IC3.4, I_VM15)
NET_C(IC3.7, I_V15)
LM555_DIP(IC4)
TL081_DIP(IC5) // Op. Amp.
// NET_C(IC5.7, I_V15) // (indirectly via R15)
NET_C(IC5.4, I_VM15)
TL081_DIP(IC6) // Op. Amp.
NET_C(IC6.4, I_VM15)
NET_C(IC6.7, I_V15)
TL081_DIP(IC7) // Op. Amp.
NET_C(IC7.4, I_VM15)
NET_C(IC7.7, I_V15)
TTL_74LS125_DIP(IC8) // Quad 3-state Buffers
NET_C(IC8.7, GND)
NET_C(IC8.14, I_V5)
LM555_DIP(IC9)
// TTL_7815_DIP(IC10) // +15V Regulator -- not emulated
// TTL_7915_DIP(IC11) // -15V Regulator -- not emulated
LM555_DIP(IC12)
CA3080_DIP(IC13) // Op. Amp.
NET_C(IC13.4, I_VM15)
NET_C(IC13.7, I_V15)
TTL_74121_DIP(IC14) // Monostable multivibrators with Schmitt-trigger inputs
NET_C(IC14.7, GND)
NET_C(IC14.14, I_V5)
TTL_7406_DIP(IC15) // Hex inverter -- currently using a clone of 7416, no open collector behavior
NET_C(IC15.7, GND)
NET_C(IC15.14, I_V5)
TL081_DIP(IC16) // Op. Amp.
NET_C(IC16.4, I_VM15)
NET_C(IC16.7, I_V15)
LM555_DIP(IC17)
CA3080_DIP(IC18) // Op. Amp.
NET_C(IC18.4, I_VM15)
NET_C(IC18.7, I_V15)
// TL081_DIP(IC19) // Op. Amp. -- part of final amp (not emulated)
// NET_C(IC19.4, I_VM15)
// NET_C(IC19.7, I_V15)
#if (HLE_NOISE_GEN)
//
// The "wideband noise gen" relies on properties
// of the components to create noise. Not only
// does this simulate poorly, but it would be too
// slow for realtime, so HLE it with some quality
// noise.
//
// Note that Sundance and Tail Gunner have the
// exact same circuit.
//
CLOCK(NOISE_CLOCK, 10000)
NET_C(NOISE_CLOCK.GND, GND)
NET_C(NOISE_CLOCK.VCC, I_V5)
SYS_NOISE_MT_U(NOISE, 3)
NET_C(NOISE.I, NOISE_CLOCK.Q)
NET_C(NOISE.1, GND)
NET_C(NOISE.2, R1.2, R7.1, R35.1)
NET_C(GND, C9.1, C9.2, C10.1, C10.2, C11.1, C11.2, C12.1, C12.2, C13.1, C13.2)
NET_C(GND, D1.A, D1.K, D2.A, D2.K, D3.A, D3.K)
NET_C(GND, R15.1, R15.2, R16.1, R16.2, R17.1, R17.2, R18.1, R18.2, R19.1, R19.2, R20.1, R20.2, R21.1, R21.2, R22.1, R22.2, R23.1, R23.2)
NET_C(GND, IC5.2, IC5.3, IC5.7, IC6.2, IC6.3, IC7.2, IC7.3)
#else
NET_C(C9.2, C10.1, GND)
NET_C(C9.1, C10.2, D1.K, R15.1, IC5.7)
NET_C(R15.2, C13.1, I_V15)
NET_C(C13.2, GND)
NET_C(D1.A, C11.1, R17.2)
NET_C(R17.1, GND)
NET_C(C11.2, R18.2, IC5.3)
NET_C(R18.1, C12.1, R19.2)
NET_C(R19.1, GND)
NET_C(C12.2, IC5.2, R20.1)
NET_C(R20.2, IC5.6, R21.1)
NET_C(R21.2, IC6.2, R16.1, D3.A, D2.K)
NET_C(D2.A, A3.K, R16.2, IC6.6)
NET_C(IC6.3, GND)
NET_C(R22.2, R23.1, IC7.2)
NET_C(IC7.3, GND)
NET_C(R23.2, IC7.6, R1.2, R7.1, R35.1)
#endif
//
// Explosion
//
NET_C(I_OUT_2, R11.1, IC4.2)
NET_C(R11.2, R12.2, IC4.8, IC4.4, I_V5) // IC4.4 not listed
NET_C(R12.1, IC4.6, IC4.7, C7.1)
NET_C(C7.2, GND)
NET_C(IC4.1, GND)
NET_C(IC4.3, Q1.E)
NET_C(Q1.B, R13.2)
NET_C(R13.1, GND)
NET_C(Q1.C, C8.1, R14.1)
NET_C(C8.2, I_VM15)
NET_C(R14.2, IC2.5)
NET_C(C1.1, GND)
NET_C(C1.2, R2.1, R1.1)
NET_C(R2.2, C2.1)
NET_C(C2.2, IC1.2, R3.1, C3.1)
NET_C(IC1.3, GND)
NET_C(C3.2, R3.2, IC1.6, R4.1)
NET_C(R4.2, C4.1)
NET_C(C4.2, R5.2, IC2.2)
NET_C(R5.1, GND)
NET_C(IC2.3, R6.2)
NET_C(R6.1, GND)
NET_C(IC2.6, R58.1)
//
// Reappearance hiss
//
NET_C(I_OUT_4, IC8.13)
NET_C(IC8.12, R24.1)
NET_C(R24.2, I_V5)
NET_C(IC8.11, Q2.E)
NET_C(Q2.B, R26.2)
NET_C(R26.1, GND)
NET_C(Q2.C, C14.1, R25.1)
NET_C(C14.2, I_VM15)
NET_C(R25.2, IC3.5)
NET_C(R7.2, C5.1)
NET_C(C5.2, R8.2, C6.1)
NET_C(R8.1, GND)
NET_C(C6.2, R9.2, IC3.2)
NET_C(R9.1, GND)
NET_C(IC3.3, R10.2)
NET_C(R10.1, GND)
NET_C(IC3.6, R58.1)
//
// Hi level / Normal level sword hum
//
NET_C(I_OUT_1, IC8.4)
NET_C(IC8.5, R24.1)
NET_C(IC8.6, Q3.E)
NET_C(Q3.B, R27.2)
NET_C(R27.1, GND)
NET_C(Q3.C, R28.1, R29.1)
NET_C(R28.2, IC13.5)
NET_C(R29.2, Q4.C)
NET_C(Q4.B, R30.2)
NET_C(R30.1, GND)
NET_C(Q4.E, IC8.3)
NET_C(IC8.2, R24.1)
NET_C(I_OUT_0, IC8.1)
NET_C(R36.2, IC12.4, IC12.8, I_V15)
NET_C(R36.1, IC12.7, R37.2)
NET_C(R37.1, IC12.6, IC12.2, C27.2)
NET_C(C27.1, GND, IC12.1, C28.1)
NET_C(C28.2, IC12.5)
NET_C(IC12.3, R38.1)
NET_C(R38.2, C29.1, R39.1)
NET_C(C29.2, GND)
NET_C(R39.2, C30.1, R40.1)
NET_C(C30.2, GND)
NET_C(R31.2, IC9.4, IC9.8, I_V15)
NET_C(R31.1, IC9.7, R32.2)
NET_C(R32.1, IC9.6, IC9.2, C15.1)
NET_C(C15.2, IC9.1, GND, C16.1)
NET_C(C16.2, IC9.5)
NET_C(IC9.3, R33.1)
NET_C(R33.2, C17.1, R34.1)
NET_C(C17.2, GND)
NET_C(R34.2, C18.1, C19.1)
NET_C(C18.2, GND)
NET_C(C19.2, C20.2, C21.2, R41.2, IC13.2)
NET_C(R41.1, GND)
NET_C(R35.2, C20.1)
NET_C(C21.1, R40.2)
NET_C(IC13.3, R42.2)
NET_C(R42.1, GND)
NET_C(IC13.6, R58.1)
NET_C(R58.2, GND)
ALIAS(OUTPUT, R58.1)
//
// Pit fall
//
NET_C(I_OUT_3, IC8.10, IC14.4)
NET_C(R43.2, I_V5)
NET_C(R43.1, IC14.11, C31.1)
NET_C(C31.2, IC14.10)
NET_C(IC14.5, IC14.3, I_V5)
NET_C(IC14.6, IC15.1)
NET_C(IC15.2, R44.1)
NET_C(R44.2, D4.K, C33.1)
NET_C(C33.2, GND)
NET_C(D4.A, R46.1)
NET_C(R52.2, IC17.4, IC17.8, I_V15)
NET_C(R52.1, IC17.7, R53.2)
NET_C(R53.1, IC17.6, IC17.2, C35.2)
NET_C(C35.1, IC17.1, C36.1, GND)
NET_C(C36.2, IC17.5)
NET_C(IC17.3, C32.2)
NET_C(C32.1, R45.2)
#if (HLE_PITFALL_VCO)
//
// This VCO is very tricky to HLE. There is an rising curve
// controlling the VCO that is modulated by a 555 timer. To
// approximate this, the 555 was disconnected from the ciruit
// and full simulation recorded at 1000x rate to find the
// mapping between the input (taken from R46.2) and the final
// TTL output at IC8.9.
//
// Map from original R46.2 to IC8.9 with 555 timer removed:
// R2 = 0.97609: HP = (0.000065653*A0) - 0.000100931
// R2 = 0.99674: HP = (0.00000448319*A0*A0) - (0.00000588451*A0) + 0.000158263
// R2 = 0.99695: HP = (0.000000153649*A0*A0*A0) + (0.000000894331*A0*A0) + (0.0000204462*A0) + 0.000098055
// R2 = 0.99808: HP = (0.000000086668*A0*A0*A0*A0) - (0.00000223815*A0*A0*A0) + (0.0000235819*A0*A0) - (0.000064560*A0) + 0.000198836
// R2 = 0.99808: HP = (-0.000000000510037*A0*A0*A0*A0*A0) + (0.000000103515*A0*A0*A0*A0) - (0.00000243946*A0*A0*A0) + (0.0000246047*A0*A0) - (0.000066382*A0) + 0.000198653
//
// As usual this mapping changed once the VCO was removed
// from the ciruit, so this is the mapping that is used:
//
// Map from clipped R46.2 to IC8.9 when the 555 timer is removed:
// R2 = 0.99759: HP = (0.00369938*A0) - 0.000165421
// R2 = 0.99774: HP = (-0.00117988*A0*A0) + (0.00409590*A0) - 0.000196405
// R2 = 0.99774: HP = (0.00262450*A0*A0*A0) - (0.00252128*A0*A0) + (0.00431521*A0) - 0.000207837
// R2 = 0.99774: HP = (-0.00269118*A0*A0*A0*A0) + (0.00447056*A0*A0*A0) - (0.00298272*A0*A0) + (0.00436492*A0) - 0.000209783
// R2 = 0.99774: HP = (1.393570*A0*A0*A0*A0*A0) - (1.202353*A0*A0*A0*A0) + (0.408585*A0*A0*A0) - (0.069485*A0*A0) + (0.0097063*A0) - 0.000377210
//
// Then the 555 timer modulation is added back in via an
// AFUNC. This is not 100% perfect, since we are modulating
// the clipped value not the original, but it provides a
// reasonable approximation.
//
AFUNC(PITFALLMOD, 2, "A0 + (A1-7.5)/150")
NET_C(R46.2, PITFALLMOD.A0)
NET_C(R45.1, PITFALLMOD.A1)
VARCLOCK(PITFALLCLK, 1, "max(0.000001,min(0.1,(0.00262450*A0*A0*A0) - (0.00252128*A0*A0) + (0.00431521*A0) - 0.000207837))")
NET_C(PITFALLCLK.GND, GND)
NET_C(PITFALLCLK.VCC, I_V5)
NET_C(PITFALLCLK.Q, IC8.9)
NET_C(PITFALLCLK.A0, PITFALLMOD.Q)
NET_C(GND, R47.1, R47.2, R48.1, R48.2, R49.1, R49.2, R50.1, R50.2, R51.1, R51.2, C34.1, C34.2, D5.A, D5.K, IC16.2, IC16.3)
#else
NET_C(R45.1, D4.K)
NET_C(R46.2, IC16.3, D5.K, R48.1)
NET_C(D5.A, GND)
NET_C(R48.2, IC16.6, R47.2, R49.1)
NET_C(R47.1, IC16.2, C34.2)
NET_C(C34.1, GND)
NET_C(R49.2, R50.2, Q5.B)
NET_C(R50.1, GND)
NET_C(Q5.E, GND)
NET_C(Q5.C, R51.1)
NET_C(Q5.C, IC8.9)
NET_C(R51.2, I_V5)
#endif
NET_C(IC8.8, C37.1)
NET_C(C37.2, R54.1)
NET_C(R54.2, R55.2, IC18.2)
NET_C(R55.1, GND)
NET_C(IC18.3, R56.2)
NET_C(R56.1, GND)
NET_C(R57.2, IC18.5)
NET_C(R57.1, GND)
NET_C(IC18.6, R58.1)
//
// Unconnected inputs
//
NET_C(GND, IC15.3, IC15.5, IC15.9, IC15.11, IC15.13)
//
// Unconnected outputs
//
/*
HINT(IC5.4, NC) // Q1
HINT(IC5.6, NC) // Q2
HINT(IC5.8, NC) // Q3
HINT(IC5.10, NC) // Q4
HINT(IC5.12, NC) // Q5
*/
NETLIST_END()

View File

@ -0,0 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
#ifndef MAME_AUDIO_NL_WARRIOR_H
#define MAME_AUDIO_NL_WARRIOR_H
#pragma once
NETLIST_EXTERNAL(warrior)
#endif // MAME_AUDIO_NL_WARRIOR_H

View File

@ -42,6 +42,7 @@
#include "solarq.lh"
#include "sundance.lh"
#include "tailg.lh"
#include "warrior.lh"
#include "wotw.lh"
#define MASTER_CLOCK XTAL(19'923'000)
@ -1076,92 +1077,97 @@ void cinemat_state::cinemat_jmi_32k(machine_config &config)
void cinemat_state::spacewar(machine_config &config)
{
cinemat_nojmi_4k(config);
spacewar_sound(config);
SPACE_WARS_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
m_screen->set_screen_update(FUNC(cinemat_state::screen_update_spacewar));
}
void cinemat_state::barrier(machine_config &config)
{
cinemat_jmi_4k(config);
barrier_sound(config);
BARRIER_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
WRITE_LINE_MEMBER(cinemat_state::speedfrk_start_led_w)
{
/* start LED is controlled by bit 0x02 */
m_led = !state;
}
void cinemat_state::speedfrk(machine_config &config)
{
cinemat_nojmi_8k(config);
speedfrk_sound(config);
SPEED_FREAK_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
// m_outlatch->q_out_cb<1>().set(FUNC(cinemat_state::speedfrk_start_led_w));
}
void cinemat_state::starhawk(machine_config &config)
{
cinemat_jmi_4k(config);
starhawk_sound(config);
STAR_HAWK_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_16level_state::sundance(machine_config &config)
{
cinemat_jmi_8k(config);
sundance_sound(config);
SUNDANCE_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_state::tailg(machine_config &config)
{
cinemat_nojmi_8k(config);
tailg_sound(config);
TAIL_GUNNER_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
m_outlatch->q_out_cb<7>().set(FUNC(cinemat_state::mux_select_w));
}
void cinemat_state::warrior(machine_config &config)
{
cinemat_jmi_8k(config);
warrior_sound(config);
WARRIOR_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_state::armora(machine_config &config)
{
cinemat_jmi_16k(config);
armora_sound(config);
ARMOR_ATTACK_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_state::ripoff(machine_config &config)
{
cinemat_jmi_8k(config);
ripoff_sound(config);
RIPOFF_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_state::starcas(machine_config &config)
{
cinemat_jmi_8k(config);
starcas_sound(config);
STAR_CASTLE_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_64level_state::solarq(machine_config &config)
{
cinemat_jmi_16k(config);
solarq_sound(config);
SOLAR_QUEST_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_color_state::boxingb(machine_config &config)
{
cinemat_jmi_32k(config);
boxingb_sound(config);
BOXING_BUGS_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
m_screen->set_visarea(0, 1024, 0, 788);
m_outlatch->q_out_cb<7>().set(FUNC(cinemat_state::mux_select_w));
m_outlatch->q_out_cb<7>().append(FUNC(cinemat_state::mux_select_w));
}
void cinemat_state::wotw(machine_config &config)
{
cinemat_jmi_16k(config);
m_screen->set_visarea(0, 1120, 0, 767);
wotw_sound(config);
WAR_OF_THE_WORLDS_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void cinemat_color_state::wotwc(machine_config &config)
{
cinemat_jmi_16k(config);
wotw_sound(config);
WAR_OF_THE_WORLDS_AUDIO(config, "soundboard", 0).configure_latch_inputs(*m_outlatch);
}
void demon_state::demon(machine_config &config)
@ -1254,6 +1260,9 @@ ROM_START( starhawk )
ROM_LOAD16_BYTE( "r7", 0x0001, 0x0800, CRC(bb71144f) SHA1(79591cd3ef8df78ec26e158f7e82ca0dcd72260d) )
CCPU_PROMS
ROM_REGION( 0x100, "soundboard:sound_nl:2085.5e8e", 0 )
ROM_LOAD("2085.5e8e", 0x000, 0x100, CRC(9edbf536) SHA1(036ad8a231284e05f44b1106d38fc0c7e041b6e8) )
ROM_END
@ -1525,11 +1534,7 @@ void qb3_state::init_qb3()
save_item(NAME(m_qb3_lasty));
}
void cinemat_64level_state::init_solarq()
{
save_item(NAME(m_target_volume));
save_item(NAME(m_current_volume));
}
/*************************************
*
@ -1537,28 +1542,28 @@ void cinemat_64level_state::init_solarq()
*
*************************************/
GAME( 1977, spacewar, 0, spacewar, spacewar, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Space Wars", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1978, spaceshp, spacewar, spacewar, spaceshp, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Sega license)", "Space Ship", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAMEL( 1979, barrier, 0, barrier, barrier, cinemat_state, empty_init, ORIENTATION_FLIP_X ^ ROT270, "Cinematronics (Vectorbeam license)", "Barrier", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_barrier ) // developed by Cinematronics, then (when they noticed it wasn't going to be a successful game) sold to Vectorbeam, and ultimately back in the hands of Cinematronics again after they bought the dying company Vectorbeam
GAME( 1979, speedfrk, 0, speedfrk, speedfrk, cinemat_state, init_speedfrk, ORIENTATION_FLIP_Y, "Vectorbeam", "Speed Freak", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, starhawk, 0, starhawk, starhawk, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Hawk", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAMEL( 1979, sundance, 0, sundance, sundance, cinemat_16level_state, init_sundance, ORIENTATION_FLIP_X ^ ROT270, "Cinematronics", "Sundance", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_sundance )
GAMEL( 1979, tailg, 0, tailg, tailg, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Tailgunner", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_tailg )
GAME( 1979, warrior, 0, warrior, warrior, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Vectorbeam", "Warrior", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAMEL( 1980, armora, 0, armora, armora, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Armor Attack", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_armora )
GAMEL( 1980, armorap, armora, armora, armora, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Armor Attack (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_armora )
GAMEL( 1980, armorar, armora, armora, armora, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Rock-Ola license)", "Armor Attack (Rock-Ola)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_armora )
GAME( 1980, ripoff, 0, ripoff, ripoff, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Rip Off", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAMEL( 1980, starcas, 0, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (version 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcas1, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (older)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcasc, starcas, starcas, starcasc, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (cocktail)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcasp, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcase, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Mottoeis license)", "Star Castle (Mottoeis)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, stellcas, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "bootleg (Elettronolo)", "Stellar Castle (Elettronolo)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1981, spaceftr, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Zaccaria license)", "Space Fortress (Zaccaria)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1981, solarq, 0, solarq, solarq, cinemat_64level_state, init_solarq, ORIENTATION_FLIP_Y ^ ORIENTATION_FLIP_X, "Cinematronics", "Solar Quest (rev 10 8 81)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_solarq )
GAME( 1981, boxingb, 0, boxingb, boxingb, cinemat_color_state, init_boxingb, ORIENTATION_FLIP_Y, "Cinematronics", "Boxing Bugs", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAMEL( 1981, wotw, 0, wotw, wotw, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "War of the Worlds", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_wotw )
GAME( 1981, wotwc, wotw, wotwc, wotw, cinemat_color_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "War of the Worlds (color)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1977, spacewar, 0, spacewar, spacewar, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Space Wars", MACHINE_SUPPORTS_SAVE )
GAME( 1978, spaceshp, spacewar, spacewar, spaceshp, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Sega license)", "Space Ship", MACHINE_SUPPORTS_SAVE )
GAMEL( 1979, barrier, 0, barrier, barrier, cinemat_state, empty_init, ORIENTATION_FLIP_X ^ ROT270, "Cinematronics (Vectorbeam license)", "Barrier", MACHINE_SUPPORTS_SAVE, layout_barrier ) // developed by Cinematronics, then (when they noticed it wasn't going to be a successful game) sold to Vectorbeam, and ultimately back in the hands of Cinematronics again after they bought the dying company Vectorbeam
GAME( 1979, speedfrk, 0, speedfrk, speedfrk, cinemat_state, init_speedfrk, ORIENTATION_FLIP_Y, "Vectorbeam", "Speed Freak", MACHINE_SUPPORTS_SAVE )
GAME( 1979, starhawk, 0, starhawk, starhawk, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Hawk", MACHINE_SUPPORTS_SAVE )
GAMEL( 1979, sundance, 0, sundance, sundance, cinemat_16level_state, init_sundance, ORIENTATION_FLIP_X ^ ROT270, "Cinematronics", "Sundance", MACHINE_SUPPORTS_SAVE, layout_sundance )
GAMEL( 1979, tailg, 0, tailg, tailg, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Tailgunner", MACHINE_SUPPORTS_SAVE, layout_tailg )
GAMEL( 1979, warrior, 0, warrior, warrior, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Vectorbeam", "Warrior", MACHINE_SUPPORTS_SAVE, layout_warrior )
GAMEL( 1980, armora, 0, armora, armora, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Armor Attack", MACHINE_SUPPORTS_SAVE, layout_armora )
GAMEL( 1980, armorap, armora, armora, armora, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Armor Attack (prototype)", MACHINE_SUPPORTS_SAVE, layout_armora )
GAMEL( 1980, armorar, armora, armora, armora, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Rock-Ola license)", "Armor Attack (Rock-Ola)", MACHINE_SUPPORTS_SAVE, layout_armora )
GAME( 1980, ripoff, 0, ripoff, ripoff, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Rip Off", MACHINE_SUPPORTS_SAVE )
GAMEL( 1980, starcas, 0, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (version 3)", MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcas1, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (older)", MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcasc, starcas, starcas, starcasc, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (cocktail)", MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcasp, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "Star Castle (prototype)", MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, starcase, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Mottoeis license)", "Star Castle (Mottoeis)", MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1980, stellcas, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "bootleg (Elettronolo)", "Stellar Castle (Elettronolo)", MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1981, spaceftr, starcas, starcas, starcas, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics (Zaccaria license)", "Space Fortress (Zaccaria)", MACHINE_SUPPORTS_SAVE, layout_starcas )
GAMEL( 1981, solarq, 0, solarq, solarq, cinemat_64level_state, empty_init, ORIENTATION_FLIP_Y ^ ORIENTATION_FLIP_X, "Cinematronics", "Solar Quest (rev 10 8 81)", MACHINE_SUPPORTS_SAVE, layout_solarq )
GAME( 1981, boxingb, 0, boxingb, boxingb, cinemat_color_state, init_boxingb, ORIENTATION_FLIP_Y, "Cinematronics", "Boxing Bugs", MACHINE_SUPPORTS_SAVE )
GAMEL( 1981, wotw, 0, wotw, wotw, cinemat_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "War of the Worlds", MACHINE_SUPPORTS_SAVE, layout_wotw )
GAME( 1981, wotwc, wotw, wotwc, wotw, cinemat_color_state, empty_init, ORIENTATION_FLIP_Y, "Cinematronics", "War of the Worlds (color)", MACHINE_SUPPORTS_SAVE )
GAMEL( 1982, demon, 0, demon, demon, demon_state, empty_init, ORIENTATION_FLIP_Y, "Rock-Ola", "Demon", MACHINE_SUPPORTS_SAVE, layout_demon )
GAME( 1982, qb3, 0, qb3, qb3, qb3_state, init_qb3, ORIENTATION_FLIP_Y, "Rock-Ola", "QB-3 (prototype)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )

View File

@ -11,6 +11,7 @@
#pragma once
#include "cpu/ccpu/ccpu.h"
#include "audio/cinemat.h"
#include "machine/74259.h"
#include "sound/ay8910.h"
#include "sound/samples.h"
@ -25,7 +26,6 @@ public:
, m_maincpu(*this, "maincpu")
, m_ay1(*this, "ay1")
, m_outlatch(*this, "outlatch")
, m_samples(*this, "samples")
, m_vector(*this, "vector")
, m_screen(*this, "screen")
, m_rambase(*this, "rambase")
@ -42,7 +42,6 @@ public:
required_device<ccpu_cpu_device> m_maincpu;
optional_device<ay8910_device> m_ay1;
required_device<ls259_device> m_outlatch;
optional_device<samples_device> m_samples;
required_device<vector_device> m_vector;
required_device<screen_device> m_screen;
optional_shared_ptr<uint16_t> m_rambase;
@ -57,11 +56,6 @@ public:
output_finder<> m_led;
output_finder<10> m_pressed;
uint32_t m_current_shift;
uint32_t m_last_shift;
uint32_t m_last_shift2;
uint32_t m_current_pitch;
uint32_t m_last_frame;
uint8_t m_coin_detected;
uint8_t m_coin_last_reset;
uint8_t m_mux_select;
@ -97,52 +91,8 @@ public:
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void sound_start() override;
virtual void sound_reset() override;
DECLARE_WRITE_LINE_MEMBER(spacewar_sound0_w);
DECLARE_WRITE_LINE_MEMBER(spacewar_sound1_w);
DECLARE_WRITE_LINE_MEMBER(spacewar_sound2_w);
DECLARE_WRITE_LINE_MEMBER(spacewar_sound3_w);
DECLARE_WRITE_LINE_MEMBER(spacewar_sound4_w);
DECLARE_WRITE_LINE_MEMBER(barrier_sound0_w);
DECLARE_WRITE_LINE_MEMBER(barrier_sound1_w);
DECLARE_WRITE_LINE_MEMBER(barrier_sound2_w);
DECLARE_WRITE_LINE_MEMBER(speedfrk_start_led_w);
DECLARE_WRITE_LINE_MEMBER(speedfrk_sound3_w);
DECLARE_WRITE_LINE_MEMBER(speedfrk_sound4_w);
DECLARE_WRITE_LINE_MEMBER(starhawk_sound0_w);
DECLARE_WRITE_LINE_MEMBER(starhawk_sound1_w);
DECLARE_WRITE_LINE_MEMBER(starhawk_sound2_w);
DECLARE_WRITE_LINE_MEMBER(starhawk_sound3_w);
DECLARE_WRITE_LINE_MEMBER(starhawk_sound4_w);
DECLARE_WRITE_LINE_MEMBER(starhawk_sound7_w);
DECLARE_WRITE_LINE_MEMBER(tailg_sound_w);
DECLARE_WRITE_LINE_MEMBER(warrior_sound0_w);
DECLARE_WRITE_LINE_MEMBER(warrior_sound1_w);
DECLARE_WRITE_LINE_MEMBER(warrior_sound2_w);
DECLARE_WRITE_LINE_MEMBER(warrior_sound3_w);
DECLARE_WRITE_LINE_MEMBER(warrior_sound4_w);
DECLARE_WRITE_LINE_MEMBER(armora_sound0_w);
DECLARE_WRITE_LINE_MEMBER(armora_sound1_w);
DECLARE_WRITE_LINE_MEMBER(armora_sound2_w);
DECLARE_WRITE_LINE_MEMBER(armora_sound3_w);
DECLARE_WRITE_LINE_MEMBER(armora_sound4_w);
DECLARE_WRITE_LINE_MEMBER(ripoff_sound1_w);
DECLARE_WRITE_LINE_MEMBER(ripoff_sound2_w);
DECLARE_WRITE_LINE_MEMBER(ripoff_sound3_w);
DECLARE_WRITE_LINE_MEMBER(ripoff_sound4_w);
DECLARE_WRITE_LINE_MEMBER(ripoff_sound7_w);
DECLARE_WRITE_LINE_MEMBER(starcas_sound0_w);
DECLARE_WRITE_LINE_MEMBER(starcas_sound1_w);
DECLARE_WRITE_LINE_MEMBER(starcas_sound2_w);
DECLARE_WRITE_LINE_MEMBER(starcas_sound3_w);
DECLARE_WRITE_LINE_MEMBER(starcas_sound4_w);
DECLARE_WRITE_LINE_MEMBER(wotw_sound0_w);
DECLARE_WRITE_LINE_MEMBER(wotw_sound1_w);
DECLARE_WRITE_LINE_MEMBER(wotw_sound2_w);
DECLARE_WRITE_LINE_MEMBER(wotw_sound3_w);
DECLARE_WRITE_LINE_MEMBER(wotw_sound4_w);
void cinemat_nojmi_4k(machine_config &config);
void cinemat_jmi_4k(machine_config &config);
@ -151,17 +101,6 @@ protected:
void cinemat_jmi_16k(machine_config &config);
void cinemat_jmi_32k(machine_config &config);
void spacewar_sound(machine_config &config);
void barrier_sound(machine_config &config);
void speedfrk_sound(machine_config &config);
void starhawk_sound(machine_config &config);
void tailg_sound(machine_config &config);
void warrior_sound(machine_config &config);
void armora_sound(machine_config &config);
void ripoff_sound(machine_config &config);
void starcas_sound(machine_config &config);
void wotw_sound(machine_config &config);
void program_map_4k(address_map &map);
void program_map_8k(address_map &map);
void program_map_16k(address_map &map);
@ -183,14 +122,6 @@ public:
protected:
virtual DECLARE_WRITE_LINE_MEMBER(vector_control_w) override;
uint8_t sundance_inputs_r(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(sundance_sound0_w);
DECLARE_WRITE_LINE_MEMBER(sundance_sound1_w);
DECLARE_WRITE_LINE_MEMBER(sundance_sound2_w);
DECLARE_WRITE_LINE_MEMBER(sundance_sound3_w);
DECLARE_WRITE_LINE_MEMBER(sundance_sound4_w);
DECLARE_WRITE_LINE_MEMBER(sundance_sound7_w);
void sundance_sound(machine_config &config);
};
@ -205,15 +136,6 @@ public:
protected:
virtual DECLARE_WRITE_LINE_MEMBER(vector_control_w) override;
DECLARE_WRITE_LINE_MEMBER(solarq_sound0_w);
DECLARE_WRITE_LINE_MEMBER(solarq_sound1_w);
DECLARE_WRITE_LINE_MEMBER(solarq_sound4_w);
void solarq_sound(machine_config &config);
private:
float m_target_volume;
float m_current_volume;
};
@ -230,13 +152,6 @@ public:
protected:
virtual DECLARE_WRITE_LINE_MEMBER(vector_control_w) override;
uint8_t boxingb_dial_r(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(boxingb_sound0_w);
DECLARE_WRITE_LINE_MEMBER(boxingb_sound1_w);
DECLARE_WRITE_LINE_MEMBER(boxingb_sound2_w);
DECLARE_WRITE_LINE_MEMBER(boxingb_sound3_w);
DECLARE_WRITE_LINE_MEMBER(boxingb_sound4_w);
void boxingb_sound(machine_config &config);
};

View File

@ -0,0 +1,69 @@
<?xml version="1.0"?>
<!--
license:CC0
-->
<mamelayout version="2">
<element name="pit">
<rect>
<bounds x="0" y="0" height="190" width="190" />
<color red="0" green="0" blue="0.50" />
</rect>
<rect>
<bounds x="10" y="10" height="170" width="170" />
<color red="0" green="0" blue="0.40" />
</rect>
<rect>
<bounds x="20" y="20" height="150" width="150" />
<color red="0" green="0" blue="0.30" />
</rect>
<rect>
<bounds x="30" y="30" height="130" width="130" />
<color red="0" green="0" blue="0.20" />
</rect>
<rect>
<bounds x="40" y="40" height="110" width="110" />
<color red="0" green="0" blue="0.10" />
</rect>
<rect>
<bounds x="50" y="50" height="90" width="90" />
<color red="0" green="0" blue="0" />
</rect>
</element>
<element name="p1start">
<disk>
<bounds x="0" y="0" height="130" width="130" />
<color red="0" green="1" blue="0" />
</disk>
</element>
<element name="p2start">
<rect>
<bounds x="0" y="0" height="130" width="130" />
<color red="1" green="0" blue="0" />
</rect>
<rect>
<bounds x="5" y="5" height="120" width="120" />
<color red="0" green="0" blue="0" />
</rect>
</element>
<view name="Color_Overlay">
<backdrop name="pit1" element="pit">
<bounds x="270" y="330" width="190" height="190" />
<color alpha=".8" />
</backdrop>
<backdrop name="pit2" element="pit">
<bounds x="580" y="270" width="190" height="190" />
<color alpha=".8" />
</backdrop>
<backdrop name="p1start" element="p1start">
<bounds x="75" y="75" width="130" height="130" />
<color alpha=".4" />
</backdrop>
<backdrop name="p2start" element="p2start">
<bounds x="825" y="580" width="130" height="130" />
<color alpha=".4" />
</backdrop>
<screen index="0">
<bounds x="0" y="0" width="1024" height="768" />
</screen>
</view>
</mamelayout>