summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Couriersud <couriersud@users.noreply.github.com>2013-12-17 18:49:46 +0000
committer Couriersud <couriersud@users.noreply.github.com>2013-12-17 18:49:46 +0000
commit29213a99dcb16c165b8a27e23fa3a264c855dd7d (patch)
tree517d5b814c02086b8b678c93786fa67555278d88 /src
parent309af6d61fe0d498cbe53cc6732521b3fa2be88e (diff)
Netlist:
- Hopefully fixed "red lines" - Improved 9316 code - General code maintenance - Started work on netlist audio device support
Diffstat (limited to 'src')
-rw-r--r--src/emu/machine/netlist.h44
-rw-r--r--src/emu/netlist/devices/net_lib.h2
-rw-r--r--src/emu/netlist/devices/nld_7490.c11
-rw-r--r--src/emu/netlist/devices/nld_9316.c44
-rw-r--r--src/emu/netlist/devices/nld_9316.h4
-rw-r--r--src/emu/netlist/devices/nld_legacy.c4
-rw-r--r--src/emu/netlist/devices/nld_legacy.h7
-rw-r--r--src/emu/netlist/devices/nld_ne555.c82
-rw-r--r--src/emu/netlist/devices/nld_ne555.h47
-rw-r--r--src/emu/netlist/devices/nld_twoterm.c16
-rw-r--r--src/emu/netlist/devices/nld_twoterm.h6
-rw-r--r--src/emu/netlist/netlist.mak2
-rw-r--r--src/emu/netlist/nl_base.c122
-rw-r--r--src/emu/netlist/nl_base.h98
-rw-r--r--src/emu/netlist/nl_lists.h1
-rw-r--r--src/emu/netlist/nl_parser.h1
-rw-r--r--src/emu/netlist/nl_setup.c24
-rw-r--r--src/emu/netlist/nl_setup.h7
-rw-r--r--src/emu/netlist/pstring.c30
-rw-r--r--src/emu/netlist/pstring.h27
20 files changed, 407 insertions, 172 deletions
diff --git a/src/emu/machine/netlist.h b/src/emu/machine/netlist.h
index ec27f63273c..9389838beab 100644
--- a/src/emu/machine/netlist.h
+++ b/src/emu/machine/netlist.h
@@ -219,6 +219,50 @@ private:
netlist_analog_output_delegate m_callback;
};
+class NETLIB_NAME(sound) : public netlist_device_t
+{
+public:
+ NETLIB_NAME(sound)()
+ : netlist_device_t() { }
+
+ static const int BUFSIZE = 2048;
+
+ ATTR_COLD void start()
+ {
+ register_input("IN", m_in);
+ m_cur = 0;
+ m_last_pos = 0;
+ m_last_buffer = netlist_time::zero;
+ m_sample = netlist_time::zero; // FIXME: divide by zero
+ }
+
+ ATTR_HOT void sound_update()
+ {
+ netlist_time current = netlist().time();
+ int pos = (current - m_last_buffer) / m_sample;
+ if (pos >= BUFSIZE)
+ netlist().xfatalerror("sound %s: exceeded BUFSIZE\n", name().cstr());
+ while (m_last_pos < pos )
+ {
+ m_buffer[m_last_pos++] = m_cur;
+ }
+ }
+
+ ATTR_HOT void update()
+ {
+ double val = INPANALOG(m_in);
+ sound_update();
+ m_cur = val;
+ }
+
+private:
+ netlist_analog_input_t m_in;
+ netlist_time m_sample;
+ double m_cur;
+ int m_last_pos;
+ netlist_time m_last_buffer;
+ stream_sample_t m_buffer[BUFSIZE];
+};
// ======================> netlist_output_finder
diff --git a/src/emu/netlist/devices/net_lib.h b/src/emu/netlist/devices/net_lib.h
index 61960e269da..da225bc3f1e 100644
--- a/src/emu/netlist/devices/net_lib.h
+++ b/src/emu/netlist/devices/net_lib.h
@@ -70,7 +70,7 @@
#include "nld_7493.h"
#include "nld_9316.h"
-#include "nld_NE555.h"
+#include "nld_ne555.h"
#include "nld_log.h"
diff --git a/src/emu/netlist/devices/nld_7490.c b/src/emu/netlist/devices/nld_7490.c
index 24621931cde..56dddf21d7a 100644
--- a/src/emu/netlist/devices/nld_7490.c
+++ b/src/emu/netlist/devices/nld_7490.c
@@ -41,19 +41,10 @@ NETLIB_UPDATE(7490)
update_outputs();
}
}
-#if 0
-NETLIB_FUNC_VOID(7490, update_outputs)
-{
- OUTLOGIC(m_QA, (m_cnt >> 0) & 1, NLTIME_FROM_NS(18));
- OUTLOGIC(m_QB, (m_cnt >> 1) & 1, NLTIME_FROM_NS(36));
- OUTLOGIC(m_QC, (m_cnt >> 2) & 1, NLTIME_FROM_NS(54));
- OUTLOGIC(m_QD, (m_cnt >> 3) & 1, NLTIME_FROM_NS(72));
-}
-#else
+
NETLIB_FUNC_VOID(7490, update_outputs, (void))
{
const netlist_time delay[4] = { NLTIME_FROM_NS(18), NLTIME_FROM_NS(36), NLTIME_FROM_NS(54), NLTIME_FROM_NS(72) };
for (int i=0; i<4; i++)
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
}
-#endif
diff --git a/src/emu/netlist/devices/nld_9316.c b/src/emu/netlist/devices/nld_9316.c
index eecf72c6048..0406609d902 100644
--- a/src/emu/netlist/devices/nld_9316.c
+++ b/src/emu/netlist/devices/nld_9316.c
@@ -52,17 +52,23 @@ NETLIB_START(9316_sub)
NETLIB_UPDATE(9316_sub)
{
+ UINT8 cnt = m_cnt;
if (m_loadq)
{
- m_cnt = ( m_cnt + 1) & 0x0f;
- update_outputs();
+ cnt = ( cnt + 1) & 0x0f;
+ update_outputs(cnt);
+ if (cnt == 0x0f)
+ OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
+ else if (cnt == 0)
+ OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
}
else
{
- m_cnt = (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
- update_outputs_all();
+ cnt = (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
+ update_outputs_all(cnt);
+ OUTLOGIC(m_RC, m_ent & (cnt == 0x0f), NLTIME_FROM_NS(20));
}
- OUTLOGIC(m_RC, m_ent & (m_cnt == 0x0f), NLTIME_FROM_NS(20));
+ m_cnt = cnt;
}
NETLIB_UPDATE(9316)
@@ -81,7 +87,7 @@ NETLIB_UPDATE(9316)
if (!clrq & (sub.m_cnt>0))
{
sub.m_cnt = 0;
- sub.update_outputs();
+ sub.update_outputs(sub.m_cnt);
OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20));
return;
}
@@ -89,30 +95,32 @@ NETLIB_UPDATE(9316)
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == 0x0f), NLTIME_FROM_NS(20));
}
-NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (void))
+inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt))
{
const netlist_time out_delay = NLTIME_FROM_NS(20);
- OUTLOGIC(m_QA, (m_cnt >> 0) & 1, out_delay);
- OUTLOGIC(m_QB, (m_cnt >> 1) & 1, out_delay);
- OUTLOGIC(m_QC, (m_cnt >> 2) & 1, out_delay);
- OUTLOGIC(m_QD, (m_cnt >> 3) & 1, out_delay);
+ OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
+ OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
+ OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
+ OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
}
-NETLIB_FUNC_VOID(9316_sub, update_outputs, (void))
+inline NETLIB_FUNC_VOID(9316_sub, update_outputs, (const UINT8 cnt))
{
const netlist_time out_delay = NLTIME_FROM_NS(20);
#if 0
- OUTLOGIC(m_QA, (m_cnt >> 0) & 1, out_delay);
- OUTLOGIC(m_QB, (m_cnt >> 1) & 1, out_delay);
- OUTLOGIC(m_QC, (m_cnt >> 2) & 1, out_delay);
- OUTLOGIC(m_QD, (m_cnt >> 3) & 1, out_delay);
+// for (int i=0; i<4; i++)
+// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
+ OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
+ OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
+ OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
+ OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
#else
- if ((m_cnt & 1) == 1)
+ if ((cnt & 1) == 1)
OUTLOGIC(m_QA, 1, out_delay);
else
{
OUTLOGIC(m_QA, 0, out_delay);
- switch (m_cnt)
+ switch (cnt)
{
case 0x00:
OUTLOGIC(m_QB, 0, out_delay);
diff --git a/src/emu/netlist/devices/nld_9316.h b/src/emu/netlist/devices/nld_9316.h
index 78a00a1b081..886ef1c956c 100644
--- a/src/emu/netlist/devices/nld_9316.h
+++ b/src/emu/netlist/devices/nld_9316.h
@@ -64,8 +64,8 @@
NET_CONNECT(_name, D, _D)
NETLIB_SUBDEVICE(9316_sub,
- ATTR_HOT void update_outputs_all();
- ATTR_HOT void update_outputs();
+ ATTR_HOT void update_outputs_all(const UINT8 cnt);
+ ATTR_HOT void update_outputs(const UINT8 cnt);
netlist_ttl_input_t m_clk;
diff --git a/src/emu/netlist/devices/nld_legacy.c b/src/emu/netlist/devices/nld_legacy.c
index f63a8b51ee9..990112ff02a 100644
--- a/src/emu/netlist/devices/nld_legacy.c
+++ b/src/emu/netlist/devices/nld_legacy.c
@@ -21,8 +21,6 @@ NETLIB_START(nicMultiSwitch)
}
register_param("POS", m_POS, 0);
register_output("Q", m_Q);
-
- m_variable_input_count = true;
}
NETLIB_UPDATE(nicMultiSwitch)
@@ -53,8 +51,6 @@ NETLIB_START(nicMixer8)
register_param(sR[i], m_R[i], 1e12);
}
register_output("Q", m_Q);
-
- m_variable_input_count = true;
}
NETLIB_UPDATE(nicMixer8)
diff --git a/src/emu/netlist/devices/nld_legacy.h b/src/emu/netlist/devices/nld_legacy.h
index 6195701ef92..eb94dbfaba0 100644
--- a/src/emu/netlist/devices/nld_legacy.h
+++ b/src/emu/netlist/devices/nld_legacy.h
@@ -18,13 +18,6 @@
// ----------------------------------------------------------------------------------------
// Macros
// ----------------------------------------------------------------------------------------
-#if 0
-
-#define NETDEV_DELAY_RISE(_name, _CLK, _D) \
- NET_REGISTER_DEV(delay_lh, _name) \
- NET_CONNECT(_name, CLK, _CLK) \
- NET_CONNECT(_name, D, _D)
-#endif
#define NETDEV_RSFF(_name, _S, _R) \
NET_REGISTER_DEV(nicRSFF, _name) \
diff --git a/src/emu/netlist/devices/nld_ne555.c b/src/emu/netlist/devices/nld_ne555.c
new file mode 100644
index 00000000000..312c5984f1a
--- /dev/null
+++ b/src/emu/netlist/devices/nld_ne555.c
@@ -0,0 +1,82 @@
+/*
+ * nld_NE555.c
+ *
+ */
+
+#include "nld_ne555.h"
+#include "../nl_setup.h"
+
+#define R_OFF (1E20)
+#define R_ON (1)
+
+inline double NETLIB_NAME(NE555)::clamp(const double v, const double a, const double b)
+{
+ double ret = v;
+ double vcc = TERMANALOG(m_R1.m_P);
+
+ if (ret > vcc - a)
+ ret = vcc - a;
+ if (ret < b)
+ ret = b;
+ return ret;
+}
+
+NETLIB_START(NE555)
+{
+
+ register_sub(m_R1, "R1");
+ register_sub(m_R2, "R2");
+ register_sub(m_R3, "R3");
+ register_sub(m_RDIS, "RDIS");
+
+ register_subalias("GND", m_R3.m_N); // Pin 1
+ register_input("TRIG", m_TRIG); // Pin 2
+ register_output("OUT", m_OUT); // Pin 3
+ register_input("RESET", m_RESET); // Pin 4
+ register_subalias("CONT", m_R1.m_N); // Pin 5
+ register_input("THRESH", m_THRES); // Pin 6
+ register_subalias("DISCH", m_RDIS.m_P); // Pin 7
+ register_subalias("VCC", m_R1.m_P); // Pin 8
+
+ m_R1.set_R(5000);
+ m_R2.set_R(5000);
+ m_R3.set_R(5000);
+ m_RDIS.set_R(R_OFF);
+
+ setup().connect(m_R1.m_N, m_R2.m_P);
+ setup().connect(m_R2.m_N, m_R3.m_P);
+ setup().connect(m_RDIS.m_N, m_R3.m_N);
+
+ m_last_out = false;
+}
+
+NETLIB_UPDATE(NE555)
+{
+ // FIXME: assumes GND is connected to 0V.
+
+ double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4);
+ bool bthresh = (INPANALOG(m_THRES) > vt);
+ bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4));
+ bool out = m_last_out;
+
+ if (!btrig)
+ {
+ out = true;
+ }
+ else if (bthresh)
+ {
+ out = false;
+ }
+
+ if (!m_last_out && out)
+ {
+ OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P), NLTIME_FROM_NS(100));
+ m_RDIS.set_R(R_OFF);
+ }
+ else if (m_last_out && !out)
+ {
+ OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N), NLTIME_FROM_NS(100));
+ m_RDIS.set_R(R_ON);
+ }
+ m_last_out = out;
+}
diff --git a/src/emu/netlist/devices/nld_ne555.h b/src/emu/netlist/devices/nld_ne555.h
new file mode 100644
index 00000000000..a350a684c28
--- /dev/null
+++ b/src/emu/netlist/devices/nld_ne555.h
@@ -0,0 +1,47 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_NE555.h
+ *
+ * NE555: PRECISION TIMERS
+ *
+ * +--------+
+ * GND |1 ++ 8| VCC
+ * TRIG |2 7| DISCH
+ * OUT |3 6| THRES
+ * RESET |4 5| CONT
+ * +--------+
+ *
+ * Naming conventions follow Texas Instruments datasheet
+ *
+ */
+
+#ifndef NLD_NE555_H_
+#define NLD_NE555_H_
+
+#include "../nl_base.h"
+#include "nld_twoterm.h"
+
+#define NETDEV_NE555(_name) \
+ NET_REGISTER_DEV(NE555, _name) \
+
+NETLIB_DEVICE(NE555,
+ NETLIB_NAME(R) m_R1;
+ NETLIB_NAME(R) m_R2;
+ NETLIB_NAME(R) m_R3;
+ NETLIB_NAME(R) m_RDIS;
+
+ netlist_logic_input_t m_RESET;
+ netlist_analog_input_t m_THRES;
+ netlist_analog_input_t m_TRIG;
+ netlist_analog_output_t m_OUT;
+
+ bool m_last_out;
+
+ double clamp(const double v, const double a, const double b);
+
+);
+
+
+
+#endif /* NLD_NE555_H_ */
diff --git a/src/emu/netlist/devices/nld_twoterm.c b/src/emu/netlist/devices/nld_twoterm.c
index 5f8fe211c6f..e471d34ba7d 100644
--- a/src/emu/netlist/devices/nld_twoterm.c
+++ b/src/emu/netlist/devices/nld_twoterm.c
@@ -72,7 +72,7 @@ NETLIB_START(POT)
register_subalias("2", m_R1.m_N);
register_subalias("3", m_R2.m_N);
- setup()->connect(m_R2.m_P, m_R1.m_N);
+ setup().connect(m_R2.m_P, m_R1.m_N);
register_param("R", m_R, 1.0 / NETLIST_GMIN);
register_param("DIAL", m_Dial, 0.5);
@@ -194,9 +194,9 @@ NETLIB_START(QBJT_switch<_type>)
register_subalias("E", m_RB.m_N);
register_subalias("C", m_RC.m_P);
- m_setup->connect(m_RB.m_N, m_RC.m_N);
- m_setup->connect(m_RB.m_P, m_BV);
- m_setup->connect(m_RB.m_N, m_EV);
+ setup().connect(m_RB.m_N, m_RC.m_N);
+ setup().connect(m_RB.m_P, m_BV);
+ setup().connect(m_RB.m_N, m_EV);
}
NETLIB_UPDATE(Q)
@@ -275,8 +275,8 @@ ATTR_COLD void NETLIB_NAME(VCCS)::configure(const double Gfac, const double GI)
m_ON1.set(m_mult, 0.0);
m_ON1.m_otherterm = &m_IN;
- m_setup->connect(m_OP, m_OP1);
- m_setup->connect(m_ON, m_ON1);
+ setup().connect(m_OP, m_OP1);
+ setup().connect(m_ON, m_ON1);
}
NETLIB_UPDATE_PARAM(VCCS)
@@ -309,8 +309,8 @@ NETLIB_START(VCVS)
m_OP2.m_otherterm = &m_ON2;
m_ON2.m_otherterm = &m_OP2;
- setup()->connect(m_OP2, m_OP1);
- setup()->connect(m_ON2, m_ON1);
+ setup().connect(m_OP2, m_OP1);
+ setup().connect(m_ON2, m_ON1);
}
NETLIB_UPDATE_PARAM(VCVS)
diff --git a/src/emu/netlist/devices/nld_twoterm.h b/src/emu/netlist/devices/nld_twoterm.h
index 0c72a46884e..8406a19eb18 100644
--- a/src/emu/netlist/devices/nld_twoterm.h
+++ b/src/emu/netlist/devices/nld_twoterm.h
@@ -164,6 +164,7 @@ protected:
// this one has an accuracy of better than 5%. That's enough for our purpose
// add c3 and it'll be better than 1%
+#if 0
inline double fastexp_h(const double x)
{
static const double ln2r = 1.442695040888963387;
@@ -186,6 +187,7 @@ inline double fastexp(const double x)
else
return fastexp_h(x);
}
+#endif
class NETLIB_NAME(D) : public NETLIB_NAME(twoterm)
{
@@ -211,7 +213,7 @@ public:
{
m_Vd = nVd;
- const double eVDVt = fastexp(m_Vd * m_VtInv);
+ const double eVDVt = exp(m_Vd * m_VtInv);
Id = m_Is * (eVDVt - 1.0);
G = m_Is * m_VtInv * eVDVt;
}
@@ -220,7 +222,7 @@ public:
//m_Vd = m_Vd + log((nVd - m_Vd) * m_VtInv + 1.0) * m_Vt;
m_Vd = m_Vd + log1p((nVd - m_Vd) * m_VtInv) * m_Vt;
- const double eVDVt = fastexp(m_Vd * m_VtInv);
+ const double eVDVt = exp(m_Vd * m_VtInv);
Id = m_Is * (eVDVt - 1.0);
G = m_Is * m_VtInv * eVDVt;
diff --git a/src/emu/netlist/netlist.mak b/src/emu/netlist/netlist.mak
index 302d396fbed..475df4353d8 100644
--- a/src/emu/netlist/netlist.mak
+++ b/src/emu/netlist/netlist.mak
@@ -29,7 +29,7 @@ NETLISTOBJS+= \
$(NETLISTOBJ)/devices/nld_7490.o \
$(NETLISTOBJ)/devices/nld_7493.o \
$(NETLISTOBJ)/devices/nld_9316.o \
- $(NETLISTOBJ)/devices/nld_NE555.o \
+ $(NETLISTOBJ)/devices/nld_ne555.o \
$(NETLISTOBJ)/devices/nld_legacy.o \
$(NETLISTOBJ)/devices/net_lib.o \
$(NETLISTOBJ)/devices/nld_log.o \
diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c
index 699ddc04914..bc5cf019ce5 100644
--- a/src/emu/netlist/nl_base.c
+++ b/src/emu/netlist/nl_base.c
@@ -219,9 +219,9 @@ ATTR_COLD netlist_core_device_t::netlist_core_device_t(const family_t afamily)
{
}
-ATTR_COLD void netlist_core_device_t::init(netlist_setup_t &setup, const pstring &name)
+ATTR_COLD void netlist_core_device_t::init(netlist_base_t &anetlist, const pstring &name)
{
- init_object(setup.netlist(), name);
+ init_object(anetlist, name);
#if USE_DELEGATES
#if USE_PMFDELEGATES
@@ -239,24 +239,33 @@ ATTR_COLD netlist_core_device_t::~netlist_core_device_t()
{
}
+ATTR_HOT ATTR_ALIGN const netlist_sig_t netlist_core_device_t::INPLOGIC_PASSIVE(netlist_logic_input_t &inp)
+{
+ if (inp.state() == netlist_input_t::STATE_INP_PASSIVE)
+ {
+ inp.activate();
+ const netlist_sig_t ret = inp.Q();
+ inp.inactivate();
+ return ret;
+ }
+ else
+ return inp.Q();
+
+}
+
// ----------------------------------------------------------------------------------------
// net_device_t
// ----------------------------------------------------------------------------------------
netlist_device_t::netlist_device_t()
: netlist_core_device_t(),
- m_terminals(20),
- m_setup(NULL),
- m_variable_input_count(false)
+ m_terminals(20)
{
}
netlist_device_t::netlist_device_t(const family_t afamily)
: netlist_core_device_t(afamily),
- m_terminals(20),
- m_setup(NULL),
- m_variable_input_count(false)
-{
+ m_terminals(20){
}
netlist_device_t::~netlist_device_t()
@@ -264,32 +273,21 @@ netlist_device_t::~netlist_device_t()
//NL_VERBOSE_OUT(("~net_device_t\n");
}
-
-ATTR_HOT ATTR_ALIGN const netlist_sig_t netlist_core_device_t::INPLOGIC_PASSIVE(netlist_logic_input_t &inp)
+ATTR_COLD netlist_setup_t &netlist_device_t::setup()
{
- if (inp.state() == netlist_input_t::STATE_INP_PASSIVE)
- {
- inp.activate();
- const netlist_sig_t ret = inp.Q();
- inp.inactivate();
- return ret;
- }
- else
- return inp.Q();
-
+ return netlist().setup();
}
-ATTR_COLD void netlist_device_t::init(netlist_setup_t &setup, const pstring &name)
+ATTR_COLD void netlist_device_t::init(netlist_base_t &anetlist, const pstring &name)
{
- netlist_core_device_t::init(setup, name);
- m_setup = &setup;
+ netlist_core_device_t::init(anetlist, name);
start();
}
ATTR_COLD void netlist_device_t::register_sub(netlist_device_t &dev, const pstring &name)
{
- dev.init(*m_setup, this->name() + "." + name);
+ dev.init(netlist(), this->name() + "." + name);
}
ATTR_COLD void netlist_device_t::register_subalias(const pstring &name, const netlist_core_terminal_t &term)
@@ -298,7 +296,7 @@ ATTR_COLD void netlist_device_t::register_subalias(const pstring &name, const ne
//printf("alias: %s\n", alias.cstr());
- m_setup->register_alias(alias, term.name());
+ setup().register_alias(alias, term.name());
if (term.isType(netlist_terminal_t::INPUT))
m_terminals.add(name);
@@ -306,18 +304,18 @@ ATTR_COLD void netlist_device_t::register_subalias(const pstring &name, const ne
ATTR_COLD void netlist_device_t::register_terminal(const pstring &name, netlist_terminal_t &port)
{
- m_setup->register_object(*this,*this,name, port, netlist_terminal_t::STATE_INP_ACTIVE);
+ setup().register_object(*this,*this,name, port, netlist_terminal_t::STATE_INP_ACTIVE);
}
ATTR_COLD void netlist_device_t::register_output(const pstring &name, netlist_output_t &port)
{
- m_setup->register_object(*this,*this,name, port, netlist_terminal_t::STATE_OUT);
+ setup().register_object(*this,*this,name, port, netlist_terminal_t::STATE_OUT);
}
ATTR_COLD void netlist_device_t::register_input(const pstring &name, netlist_input_t &inp, netlist_input_t::state_e type)
{
m_terminals.add(name);
- m_setup->register_object(*this, *this, name, inp, type);
+ setup().register_object(*this, *this, name, inp, type);
}
static void init_term(netlist_core_device_t &dev, netlist_core_terminal_t &term, netlist_input_t::state_e aState)
@@ -347,7 +345,7 @@ ATTR_COLD void netlist_device_t::register_link_internal(netlist_core_device_t &d
{
init_term(dev, in, aState);
init_term(dev, out, aState);
- m_setup->connect(in, out);
+ setup().connect(in, out);
}
ATTR_COLD void netlist_device_t::register_link_internal(netlist_input_t &in, netlist_output_t &out, const netlist_input_t::state_e aState)
@@ -360,7 +358,7 @@ ATTR_COLD void netlist_device_t::register_param(netlist_core_device_t &dev, cons
{
param.init_object(dev, sname);
param.initial(initialVal);
- m_setup->register_object(*this, *this, sname, param, netlist_terminal_t::STATE_NONEX);
+ setup().register_object(*this, *this, sname, param, netlist_terminal_t::STATE_NONEX);
}
template ATTR_COLD void netlist_device_t::register_param(netlist_core_device_t &dev, const pstring &sname, netlist_param_double_t &param, const double initialVal);
@@ -558,9 +556,71 @@ ATTR_COLD void netlist_logic_output_t::set_levels(const double low, const double
}
// ----------------------------------------------------------------------------------------
+// netlist_ttl_output_t
+// ----------------------------------------------------------------------------------------
+
+ATTR_COLD netlist_ttl_output_t::netlist_ttl_output_t()
+ : netlist_logic_output_t()
+{
+ set_levels(0.3, 3.4);
+}
+
+// ----------------------------------------------------------------------------------------
+// netlist_analog_output_t
+// ----------------------------------------------------------------------------------------
+
+ATTR_COLD netlist_analog_output_t::netlist_analog_output_t()
+ : netlist_output_t(OUTPUT, ANALOG)
+{
+ net().m_cur.Analog = 0.0;
+ net().m_new.Analog = 99.0;
+}
+
+ATTR_COLD void netlist_analog_output_t::initial(const double val)
+{
+ net().m_cur.Analog = val;
+ net().m_new.Analog = 99.0;
+}
+
+// ----------------------------------------------------------------------------------------
// netlist_param_t & friends
// ----------------------------------------------------------------------------------------
+ATTR_COLD netlist_param_t::netlist_param_t(const param_type_t atype)
+ : netlist_owned_object_t(PARAM, ANALOG)
+ , m_param_type(atype)
+{
+}
+
+ATTR_COLD netlist_param_double_t::netlist_param_double_t()
+ : netlist_param_t(DOUBLE)
+ , m_param(0.0)
+{
+}
+
+ATTR_COLD netlist_param_int_t::netlist_param_int_t()
+ : netlist_param_t(INTEGER)
+ , m_param(0)
+{
+}
+
+ATTR_COLD netlist_param_logic_t::netlist_param_logic_t()
+ : netlist_param_int_t()
+{
+}
+
+ATTR_COLD netlist_param_str_t::netlist_param_str_t()
+ : netlist_param_t(STRING)
+ , m_param("")
+{
+}
+
+ATTR_COLD netlist_param_model_t::netlist_param_model_t()
+ : netlist_param_t(MODEL)
+ , m_param("")
+{
+}
+
ATTR_COLD double netlist_param_model_t::dValue(const pstring &entity, const double defval) const
{
pstring tmp = this->Value();
diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h
index f140b1e0f11..9dbf218f2cb 100644
--- a/src/emu/netlist/nl_base.h
+++ b/src/emu/netlist/nl_base.h
@@ -252,6 +252,7 @@ class NETLIB_NAME(mainclock);
class netlist_object_t
{
+ NETLIST_PREVENT_COPYING(netlist_object_t)
public:
enum type_t {
TERMINAL = 0,
@@ -306,6 +307,7 @@ private:
class netlist_owned_object_t : public netlist_object_t
{
+ NETLIST_PREVENT_COPYING(netlist_owned_object_t)
public:
ATTR_COLD netlist_owned_object_t(const type_t atype, const family_t afamily);
@@ -322,6 +324,7 @@ private:
class netlist_core_terminal_t : public netlist_owned_object_t
{
+ NETLIST_PREVENT_COPYING(netlist_core_terminal_t)
public:
/* needed here ... */
@@ -361,6 +364,7 @@ private:
class netlist_terminal_t : public netlist_core_terminal_t
{
+ NETLIST_PREVENT_COPYING(netlist_terminal_t)
public:
ATTR_COLD netlist_terminal_t();
@@ -479,6 +483,7 @@ public:
class netlist_net_t : public netlist_object_t
{
+ NETLIST_PREVENT_COPYING(netlist_net_t)
public:
typedef netlist_list_t<netlist_net_t *> list_t;
@@ -548,6 +553,7 @@ public:
// m_terms is only used by analog subsystem
typedef netlist_list_t<netlist_terminal_t *> terminal_list_t;
+
terminal_list_t m_terms;
netlist_matrix_solver_t *m_solver;
@@ -579,6 +585,7 @@ private:
class netlist_output_t : public netlist_core_terminal_t
{
+ NETLIST_PREVENT_COPYING(netlist_output_t)
public:
ATTR_COLD netlist_output_t(const type_t atype, const family_t afamily);
@@ -597,6 +604,7 @@ private:
class netlist_logic_output_t : public netlist_output_t
{
+ NETLIST_PREVENT_COPYING(netlist_logic_output_t)
public:
ATTR_COLD netlist_logic_output_t();
@@ -621,32 +629,20 @@ class netlist_ttl_output_t : public netlist_logic_output_t
{
public:
- netlist_ttl_output_t()
- : netlist_logic_output_t()
- {
- set_levels(0.3, 3.4);
- }
+ ATTR_COLD netlist_ttl_output_t();
};
class netlist_analog_output_t : public netlist_output_t
{
+ NETLIST_PREVENT_COPYING(netlist_analog_output_t)
public:
- ATTR_COLD netlist_analog_output_t()
- : netlist_output_t(OUTPUT, ANALOG)
- {
- net().m_cur.Analog = 0.0;
- net().m_new.Analog = 99.0;
- }
+ ATTR_COLD netlist_analog_output_t();
- ATTR_COLD void initial(const double val)
- {
- net().m_cur.Analog = val;
- net().m_new.Analog = 99.0;
- }
+ ATTR_COLD void initial(const double val);
- ATTR_HOT inline void set_Q(const double newQ, const netlist_time &delay)
+ ATTR_HOT inline void set_Q(const double newQ, const netlist_time &delay)
{
if (newQ != net().m_new.Analog)
{
@@ -663,6 +659,7 @@ public:
class netlist_param_t : public netlist_owned_object_t
{
+ NETLIST_PREVENT_COPYING(netlist_param_t)
public:
enum param_type_t {
@@ -673,11 +670,7 @@ public:
LOGIC
};
- netlist_param_t(const param_type_t atype)
- : netlist_owned_object_t(PARAM, ANALOG)
- , m_param_type(atype)
- { }
-
+ ATTR_COLD netlist_param_t(const param_type_t atype);
ATTR_HOT inline const param_type_t param_type() const { return m_param_type; }
@@ -687,11 +680,9 @@ private:
class netlist_param_double_t : public netlist_param_t
{
+ NETLIST_PREVENT_COPYING(netlist_param_double_t)
public:
- netlist_param_double_t()
- : netlist_param_t(DOUBLE)
- , m_param(0.0)
- { }
+ ATTR_COLD netlist_param_double_t();
ATTR_HOT inline void setTo(const double param);
ATTR_COLD inline void initial(const double val) { m_param = val; }
@@ -703,11 +694,9 @@ private:
class netlist_param_int_t : public netlist_param_t
{
+ NETLIST_PREVENT_COPYING(netlist_param_int_t)
public:
- netlist_param_int_t()
- : netlist_param_t(INTEGER)
- , m_param(0)
- { }
+ ATTR_COLD netlist_param_int_t();
ATTR_HOT inline void setTo(const int param);
ATTR_COLD inline void initial(const int val) { m_param = val; }
@@ -720,19 +709,16 @@ private:
class netlist_param_logic_t : public netlist_param_int_t
{
+ NETLIST_PREVENT_COPYING(netlist_param_logic_t)
public:
- netlist_param_logic_t()
- : netlist_param_int_t()
- { }
+ ATTR_COLD netlist_param_logic_t();
};
class netlist_param_str_t : public netlist_param_t
{
+ NETLIST_PREVENT_COPYING(netlist_param_str_t)
public:
- netlist_param_str_t()
- : netlist_param_t(STRING)
- , m_param("")
- { }
+ ATTR_COLD netlist_param_str_t();
ATTR_HOT inline void setTo(const pstring &param);
ATTR_COLD inline void initial(const pstring &val) { m_param = val; }
@@ -745,11 +731,9 @@ private:
class netlist_param_model_t : public netlist_param_t
{
+ NETLIST_PREVENT_COPYING(netlist_param_model_t)
public:
- netlist_param_model_t()
- : netlist_param_t(MODEL)
- , m_param("")
- { }
+ ATTR_COLD netlist_param_model_t();
ATTR_COLD inline void initial(const pstring &val) { m_param = val; }
@@ -768,6 +752,7 @@ private:
class netlist_core_device_t : public netlist_object_t
{
+ NETLIST_PREVENT_COPYING(netlist_core_device_t)
public:
typedef netlist_list_t<netlist_core_device_t *> list_t;
@@ -777,7 +762,7 @@ public:
ATTR_COLD virtual ~netlist_core_device_t();
- ATTR_COLD virtual void init(netlist_setup_t &setup, const pstring &name);
+ ATTR_COLD virtual void init(netlist_base_t &anetlist, const pstring &name);
ATTR_HOT virtual void update_param() {}
@@ -855,6 +840,7 @@ private:
class netlist_device_t : public netlist_core_device_t
{
+ NETLIST_PREVENT_COPYING(netlist_device_t)
public:
ATTR_COLD netlist_device_t();
@@ -862,12 +848,9 @@ public:
ATTR_COLD virtual ~netlist_device_t();
- ATTR_COLD virtual void init(netlist_setup_t &setup, const pstring &name);
-
- ATTR_COLD netlist_setup_t *setup() const { return m_setup; }
+ ATTR_COLD virtual void init(netlist_base_t &anetlist, const pstring &name);
- // FIXME: Legacy ... this needs to disappear
- ATTR_COLD bool variable_input_count() const { return m_variable_input_count; }
+ ATTR_COLD netlist_setup_t &setup();
ATTR_COLD void register_sub(netlist_device_t &dev, const pstring &name);
ATTR_COLD void register_subalias(const pstring &name, const netlist_core_terminal_t &term);
@@ -899,9 +882,6 @@ protected:
template <class C, class T>
ATTR_COLD void register_param(netlist_core_device_t &dev, const pstring &sname, C &param, const T initialVal);
- netlist_setup_t *m_setup;
- bool m_variable_input_count;
-
private:
};
@@ -912,6 +892,7 @@ private:
class netlist_base_t
{
+ NETLIST_PREVENT_COPYING(netlist_base_t)
public:
typedef netlist_timed_queue<netlist_net_t, netlist_time, 512> queue_t;
@@ -919,8 +900,6 @@ public:
netlist_base_t();
virtual ~netlist_base_t();
- ATTR_COLD void set_clock_freq(UINT64 clockfreq);
-
ATTR_HOT inline const queue_t &queue() const { return m_queue; }
ATTR_HOT inline queue_t &queue() { return m_queue; }
@@ -938,6 +917,14 @@ public:
ATTR_COLD void set_mainclock_dev(NETLIB_NAME(mainclock) *dev);
ATTR_COLD void set_solver_dev(NETLIB_NAME(solver) *dev);
+ ATTR_COLD void set_clock_freq(UINT64 clockfreq);
+
+ ATTR_COLD netlist_setup_t &setup() { return *m_setup; }
+ ATTR_COLD void set_setup(netlist_setup_t *asetup)
+ {
+ m_setup = asetup;
+ }
+
ATTR_COLD void reset();
ATTR_COLD void xfatalerror(const char *format, ...) const;
@@ -954,6 +941,8 @@ protected:
#endif
private:
+ ATTR_HOT void update_time(const netlist_time t, INT32 &atime);
+
netlist_time m_time_ps;
queue_t m_queue;
UINT32 m_rem;
@@ -962,8 +951,7 @@ private:
NETLIB_NAME(mainclock) * m_mainclock;
NETLIB_NAME(solver) * m_solver;
- ATTR_HOT void update_time(const netlist_time t, INT32 &atime);
-
+ netlist_setup_t *m_setup;
};
// ----------------------------------------------------------------------------------------
@@ -1182,6 +1170,7 @@ ATTR_HOT inline const bool netlist_analog_input_t::is_highz() const
class net_device_t_base_factory
{
+ NETLIST_PREVENT_COPYING(net_device_t_base_factory)
public:
net_device_t_base_factory(const pstring &name, const pstring &classname)
: m_name(name), m_classname(classname)
@@ -1201,6 +1190,7 @@ protected:
template <class C>
class net_device_t_factory : public net_device_t_base_factory
{
+ NETLIST_PREVENT_COPYING(net_device_t_factory)
public:
net_device_t_factory(const pstring &name, const pstring &classname)
: net_device_t_base_factory(name, classname) { }
diff --git a/src/emu/netlist/nl_lists.h b/src/emu/netlist/nl_lists.h
index 4c144ede0c2..c2882248787 100644
--- a/src/emu/netlist/nl_lists.h
+++ b/src/emu/netlist/nl_lists.h
@@ -131,6 +131,7 @@ private:
template <class _Element, class _Time, int _Size>
class netlist_timed_queue
{
+ NETLIST_PREVENT_COPYING(netlist_timed_queue)
public:
struct entry_t
diff --git a/src/emu/netlist/nl_parser.h b/src/emu/netlist/nl_parser.h
index 690a5d03b26..5d23be50652 100644
--- a/src/emu/netlist/nl_parser.h
+++ b/src/emu/netlist/nl_parser.h
@@ -12,6 +12,7 @@
class netlist_parser
{
+ NETLIST_PREVENT_COPYING(netlist_parser)
public:
netlist_parser(netlist_setup_t &setup)
: m_setup(setup) {}
diff --git a/src/emu/netlist/nl_setup.c b/src/emu/netlist/nl_setup.c
index 86c847e7fa0..9e9c2aa5392 100644
--- a/src/emu/netlist/nl_setup.c
+++ b/src/emu/netlist/nl_setup.c
@@ -32,6 +32,7 @@ netlist_setup_t::netlist_setup_t(netlist_base_t &netlist)
: m_netlist(netlist)
, m_proxy_cnt(0)
{
+ netlist.set_setup(this);
m_factory.initialize();
NETLIST_NAME(base)(*this);
}
@@ -56,6 +57,9 @@ netlist_setup_t::~netlist_setup_t()
m_params.reset();
m_terminals.reset();
m_params_temp.reset();
+
+ netlist().set_setup(NULL);
+
pstring::resetmem();
}
@@ -105,16 +109,6 @@ void netlist_setup_t::remove_dev(const pstring &name)
m_devices.remove(name);
}
-#if 0
-void netlist_setup_t::register_callback(const pstring &devname, netlist_output_delegate delegate)
-{
- NETLIB_NAME(analog_callback) *dev = (NETLIB_NAME(analog_callback) *) m_devices.find(devname);
- if (dev == NULL)
- fatalerror("did not find device %s\n", devname.cstr());
- dev->register_callback(delegate);
-}
-#endif
-
void netlist_setup_t::register_model(const pstring &model)
{
m_models.add(model);
@@ -364,7 +358,7 @@ void netlist_setup_t::connect_input_output(netlist_input_t &in, netlist_output_t
pstring x = pstring::sprintf("proxy_ad_%d", m_proxy_cnt);
m_proxy_cnt++;
- proxy->init(*this, x);
+ proxy->init(netlist(), x);
register_dev(proxy, x);
proxy->m_Q.net().register_con(in);
@@ -378,7 +372,7 @@ void netlist_setup_t::connect_input_output(netlist_input_t &in, netlist_output_t
pstring x = pstring::sprintf("proxy_da_%d", m_proxy_cnt);
m_proxy_cnt++;
- proxy->init(*this, x);
+ proxy->init(netlist(), x);
register_dev(proxy, x);
proxy->m_Q.net().register_con(in);
@@ -403,7 +397,7 @@ void netlist_setup_t::connect_terminal_input(netlist_terminal_t &term, netlist_i
pstring x = pstring::sprintf("proxy_da_%d", m_proxy_cnt);
m_proxy_cnt++;
- proxy->init(*this, x);
+ proxy->init(netlist(), x);
register_dev(proxy, x);
connect_terminals(term, proxy->m_I);
@@ -439,7 +433,7 @@ void netlist_setup_t::connect_terminal_output(netlist_terminal_t &in, netlist_ou
pstring x = pstring::sprintf("proxy_da_%d", m_proxy_cnt);
m_proxy_cnt++;
- proxy->init(*this, x);
+ proxy->init(netlist(), x);
register_dev(proxy, x);
out.net().register_con(proxy->m_I);
@@ -594,7 +588,7 @@ void netlist_setup_t::start_devices(void)
for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry))
{
netlist_device_t *dev = entry->object();
- dev->init(*this, entry->tag().cstr());
+ dev->init(netlist(), entry->tag().cstr());
}
}
diff --git a/src/emu/netlist/nl_setup.h b/src/emu/netlist/nl_setup.h
index bdb4324e9a0..ae53542cad5 100644
--- a/src/emu/netlist/nl_setup.h
+++ b/src/emu/netlist/nl_setup.h
@@ -69,6 +69,7 @@ ATTR_COLD void NETLIST_NAME(_name)(netlist_setup_t &netlist) \
class netlist_setup_t
{
+ NETLIST_PREVENT_COPYING(netlist_setup_t)
public:
struct link_t
@@ -122,10 +123,8 @@ public:
netlist_core_terminal_t *find_terminal(const pstring &outname_in, netlist_object_t::type_t atype, bool required = true);
netlist_param_t *find_param(const pstring &param_in, bool required = true);
-#if 0
- void register_callback(const pstring &devname, netlist_output_delegate delegate);
-#endif
- void parse(char *buf);
+
+ void parse(char *buf);
void start_devices(void);
void resolve_inputs(void);
diff --git a/src/emu/netlist/pstring.c b/src/emu/netlist/pstring.c
index 7588fa9a7b6..aa0ea9c4c98 100644
--- a/src/emu/netlist/pstring.c
+++ b/src/emu/netlist/pstring.c
@@ -16,8 +16,28 @@ pblockpool pstring::m_pool;
pstring::str_t *pstring::m_zero = NULL;
-#define IMMEDIATE_MODE (1)
-#define DEBUG_MODE (0)
+/*
+ * Uncomment the following to override defaults
+ */
+
+//#define IMMEDIATE_MODE (1)
+//#define DEBUG_MODE (0)
+
+#ifdef MAME_DEBUG
+ #ifndef IMMEDIATE_MODE
+ #define IMMEDIATE_MODE (0)
+ #endif
+ #ifndef DEBUG_MODE
+ #define DEBUG_MODE (1)
+ #endif
+#else
+ #ifndef IMMEDIATE_MODE
+ #define IMMEDIATE_MODE (1)
+ #endif
+ #ifndef DEBUG_MODE
+ #define DEBUG_MODE (0)
+ #endif
+#endif
pstring::~pstring()
{
@@ -142,11 +162,15 @@ void pstring::resetmem()
pblockpool::pblockpool()
: m_shutdown(false)
, m_first(NULL)
- , m_blocksize((DEBUG_MODE) ? 0 : 16384)
+ , m_blocksize((DEBUG_MODE) ? 16384 : 16384)
, m_align(8)
{
}
+pblockpool::~pblockpool()
+{
+}
+
void *pblockpool::alloc(const std::size_t n)
{
diff --git a/src/emu/netlist/pstring.h b/src/emu/netlist/pstring.h
index 65147f87a31..1934f246ce5 100644
--- a/src/emu/netlist/pstring.h
+++ b/src/emu/netlist/pstring.h
@@ -15,20 +15,12 @@
// ----------------------------------------------------------------------------------------
struct pblockpool {
-
+ NETLIST_PREVENT_COPYING(pblockpool)
+public:
static const int MINDATASIZE = 8;
- struct memblock
- {
- memblock *next;
- int size;
- int allocated;
- int remaining;
- char *cur;
- char data[MINDATASIZE];
- };
-
pblockpool();
+ ~pblockpool();
void resetmem();
@@ -41,8 +33,19 @@ struct pblockpool {
object->~T();
dealloc(object);
}
-
bool m_shutdown;
+
+private:
+ struct memblock
+ {
+ memblock *next;
+ int size;
+ int allocated;
+ int remaining;
+ char *cur;
+ char data[MINDATASIZE];
+ };
+
memblock *m_first;
int m_blocksize;
int m_align;