mirror of
https://github.com/holub/mame
synced 2025-06-06 21:03:47 +03:00
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:
parent
1c4da1d0a6
commit
f23db5da38
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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]);
|
||||
|
@ -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
@ -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
151
src/mame/audio/cinemat.h
Normal 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
|
682
src/mame/audio/nl_armora.cpp
Normal file
682
src/mame/audio/nl_armora.cpp
Normal 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()
|
10
src/mame/audio/nl_armora.h
Normal file
10
src/mame/audio/nl_armora.h
Normal 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
|
307
src/mame/audio/nl_barrier.cpp
Normal file
307
src/mame/audio/nl_barrier.cpp
Normal 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()
|
10
src/mame/audio/nl_barrier.h
Normal file
10
src/mame/audio/nl_barrier.h
Normal 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
|
1718
src/mame/audio/nl_boxingb.cpp
Normal file
1718
src/mame/audio/nl_boxingb.cpp
Normal file
File diff suppressed because it is too large
Load Diff
10
src/mame/audio/nl_boxingb.h
Normal file
10
src/mame/audio/nl_boxingb.h
Normal 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
|
382
src/mame/audio/nl_cinemat_common.h
Normal file
382
src/mame/audio/nl_cinemat_common.h
Normal 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
|
701
src/mame/audio/nl_ripoff.cpp
Normal file
701
src/mame/audio/nl_ripoff.cpp
Normal 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()
|
10
src/mame/audio/nl_ripoff.h
Normal file
10
src/mame/audio/nl_ripoff.h
Normal 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
1272
src/mame/audio/nl_solarq.cpp
Normal file
File diff suppressed because it is too large
Load Diff
10
src/mame/audio/nl_solarq.h
Normal file
10
src/mame/audio/nl_solarq.h
Normal 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
|
321
src/mame/audio/nl_spacewar.cpp
Normal file
321
src/mame/audio/nl_spacewar.cpp
Normal 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()
|
10
src/mame/audio/nl_spacewar.h
Normal file
10
src/mame/audio/nl_spacewar.h
Normal 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
|
451
src/mame/audio/nl_speedfrk.cpp
Normal file
451
src/mame/audio/nl_speedfrk.cpp
Normal 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()
|
10
src/mame/audio/nl_speedfrk.h
Normal file
10
src/mame/audio/nl_speedfrk.h
Normal 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
|
809
src/mame/audio/nl_starcas.cpp
Normal file
809
src/mame/audio/nl_starcas.cpp
Normal 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
|
11
src/mame/audio/nl_starcas.h
Normal file
11
src/mame/audio/nl_starcas.h
Normal 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
|
640
src/mame/audio/nl_starhawk.cpp
Normal file
640
src/mame/audio/nl_starhawk.cpp
Normal 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()
|
10
src/mame/audio/nl_starhawk.h
Normal file
10
src/mame/audio/nl_starhawk.h
Normal 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
|
483
src/mame/audio/nl_sundance.cpp
Normal file
483
src/mame/audio/nl_sundance.cpp
Normal 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()
|
10
src/mame/audio/nl_sundance.h
Normal file
10
src/mame/audio/nl_sundance.h
Normal 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
698
src/mame/audio/nl_tailg.cpp
Normal 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
10
src/mame/audio/nl_tailg.h
Normal 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
|
490
src/mame/audio/nl_warrior.cpp
Normal file
490
src/mame/audio/nl_warrior.cpp
Normal 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()
|
10
src/mame/audio/nl_warrior.h
Normal file
10
src/mame/audio/nl_warrior.h
Normal 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
|
@ -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 )
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
69
src/mame/layout/warrior.lay
Normal file
69
src/mame/layout/warrior.lay
Normal 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>
|
Loading…
Reference in New Issue
Block a user