diff options
author | 2013-11-02 19:31:15 +0000 | |
---|---|---|
committer | 2013-11-02 19:31:15 +0000 | |
commit | dfa26765d29cfdd40b314480b9702cc532138c54 (patch) | |
tree | ca72583909fd5ab4a711794b9bd2227d16c43ea0 /src/emu/machine/net_lib.c | |
parent | 75af87e4aea9101bdace459934bd1fdad8934674 (diff) |
Created folder emu/netlist and moved net_lib.* over. Updated makefiles.
Diffstat (limited to 'src/emu/machine/net_lib.c')
-rw-r--r-- | src/emu/machine/net_lib.c | 1037 |
1 files changed, 0 insertions, 1037 deletions
diff --git a/src/emu/machine/net_lib.c b/src/emu/machine/net_lib.c deleted file mode 100644 index 09015f90907..00000000000 --- a/src/emu/machine/net_lib.c +++ /dev/null @@ -1,1037 +0,0 @@ -/*************************************************************************** - - netlib.c - - Discrete netlist implementation. - -**************************************************************************** - - Couriersud reserves the right to license the code under a less restrictive - license going forward. - - Copyright Nicola Salmoria and the MAME team - All rights reserved. - - Redistribution and use of this code or any derivative works are permitted - provided that the following conditions are met: - - * Redistributions may not be sold, nor may they be used in a commercial - product or activity. - - * Redistributions that are modified from the original source must include the - complete source code, including the source code for all components used by a - binary built from the modified sources. However, as a special exception, the - source code distributed need not include anything that is normally distributed - (in either source or binary form) with the major components (compiler, kernel, - and so on) of the operating system on which the executable runs, unless that - component itself accompanies the executable. - - * Redistributions must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - -****************************************************************************/ - -#include "net_lib.h" - -NETLIB_START(netdev_logic_input) -{ - register_output("Q", m_Q); -} - -NETLIB_UPDATE(netdev_logic_input) -{ -} - -NETLIB_START(netdev_analog_input) -{ - register_output("Q", m_Q); -} - -NETLIB_UPDATE(netdev_analog_input) -{ -} - -NETLIB_START(netdev_log) -{ - register_input("I", m_I); -} - -NETLIB_UPDATE(netdev_log) -{ - printf("%s: %d %d\n", name().cstr(), (UINT32) (netlist()->time().as_raw() / 1000000), INPLOGIC(m_I)); -} - -NETLIB_START(netdev_clock) -{ - register_output("Q", m_Q); - //register_input("FB", m_feedback); - - register_param("FREQ", m_freq, 7159000.0 * 5); - m_inc = netlist_time::from_hz(m_freq.Value()*2); - - register_link_internal(m_feedback, m_Q, net_input_t::INP_STATE_ACTIVE); - -} - -NETLIB_UPDATE_PARAM(netdev_clock) -{ - m_inc = netlist_time::from_hz(m_freq.Value()*2); -} - -NETLIB_UPDATE(netdev_clock) -{ - //m_Q.setToNoCheck(!m_Q.new_Q(), m_inc ); - OUTLOGIC(m_Q, !m_Q.new_Q(), m_inc ); -} - -NETLIB_START(nicMultiSwitch) -{ - static const char *sIN[8] = { "i1", "i2", "i3", "i4", "i5", "i6", "i7", "i8" }; - int i; - - m_position = 0; - m_low.initial(0); - - for (i=0; i<8; i++) - { - register_input(sIN[i], m_I[i]); - //register_link_internal(m_I[i], m_low); - m_I[i].set_output(m_low); - } - register_param("POS", m_POS); - register_output("Q", m_Q); - - m_variable_input_count = true; -} - -NETLIB_UPDATE(nicMultiSwitch) -{ - assert(m_position<8); - OUTANALOG(m_Q, INPANALOG(m_I[m_position]), NLTIME_FROM_NS(1)); -} - -NETLIB_UPDATE_PARAM(nicMultiSwitch) -{ - m_position = m_POS.ValueInt(); - //update(); -} - -NETLIB_START(nicMixer8) -{ - static const char *sI[8] = { "I1", "I2", "I3", "I4", "I5", "I6", "I7", "I8" }; - static const char *sR[8] = { "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8" }; - int i; - - m_low.initial(0); - - for (i=0; i<8; i++) - { - register_input(sI[i], m_I[i]); - m_I[i].set_output(m_low); - register_param(sR[i], m_R[i], 1e12); - } - register_output("Q", m_Q); - - m_variable_input_count = true; -} - -NETLIB_UPDATE(nicMixer8) -{ - int i; - double r = 0; - - for (i=0; i<8; i++) - { - r += m_w[i] * INPANALOG(m_I[i]); - } - OUTANALOG(m_Q, r, NLTIME_IMMEDIATE); -} - -NETLIB_UPDATE_PARAM(nicMixer8) -{ - double t = 0; - int i; - - for (i=0; i<8; i++) - t += 1.0 / m_R[i].Value(); - t = 1.0 / t; - - for (i=0; i<8; i++) - m_w[i] = t / m_R[i].Value(); -} - - - -NETLIB_START(nicRSFF) -{ - register_input("S", m_S); - register_input("R", m_R); - register_output("Q", m_Q); - register_output("QQ", m_QQ); - m_Q.initial(0); - m_QQ.initial(1); -} - -NETLIB_UPDATE(nicRSFF) -{ - if (INPLOGIC(m_S)) - { - OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(10)); - OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(10)); - } - else if (INPLOGIC(m_R)) - { - OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10)); - OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10)); - } -} - - -NETLIB_START(nicNE555N_MSTABLE) -{ - register_input("TRIG", m_trigger); - register_input("CV", m_CV); - - register_output("Q", m_Q); - register_param("R", m_R); - register_param("C", m_C); - register_param("VS", m_VS, 5.0); - register_param("VL", m_VL, 0.0 *5.0); - - m_THRESHOLD_OUT.init_terminal(this); - register_link_internal(m_THRESHOLD, m_THRESHOLD_OUT, net_input_t::INP_STATE_ACTIVE); - - m_Q.initial(5.0 * 0.4); - m_last = false; -} - -INLINE double nicNE555N_cv(nicNE555N_MSTABLE &dev) -{ - return (dev.m_CV.is_highz() ? 0.67 * dev.m_VS.Value() : dev.INPANALOG(dev.m_CV)); -} - -INLINE double nicNE555N_clamp(nicNE555N_MSTABLE &dev, const double v, const double a, const double b) -{ - double ret = v; - if (ret > dev.m_VS.Value() - a) - ret = dev.m_VS.Value() - a; - if (ret < b) - ret = b; - return ret; -} - -NETLIB_UPDATE_PARAM(nicNE555N_MSTABLE) -{ -} - -NETLIB_UPDATE(nicNE555N_MSTABLE) -{ - update_param(); // FIXME : m_CV should be on a sub device ... - - double vt = nicNE555N_clamp(*this, nicNE555N_cv(*this), 0.7, 1.4); - bool bthresh = (INPANALOG(m_THRESHOLD) > vt); - bool btrig = (INPANALOG(m_trigger) > nicNE555N_clamp(*this, nicNE555N_cv(*this) * 0.5, 0.7, 1.4)); - bool out = m_last; - - if (!btrig) - { - out = true; - } - else if (bthresh) - { - out = false; - } - - if (!m_last && out) - { - double vl = m_VL.Value(); - double time; - - // FIXME : m_CV should be on a sub device ... - - // TI datasheet states minimum pulse of 10 us - if (vt<vl) - time = 10; - else - { - time = - log((m_VS.Value()-vt)/(m_VS.Value()-vl)) * m_R.Value() * m_C.Value() * 1.0e6; // in us - if (time < 10.0) - time = 10.0; - } - - OUTANALOG(m_Q, m_VS.Value() * 0.7, NLTIME_FROM_NS(100)); - OUTANALOG(m_THRESHOLD_OUT, m_VS.Value(), NLTIME_FROM_US(time )); - } - else if (m_last && !out) - { - OUTANALOG(m_Q, 0.25, NLTIME_FROM_NS(100)); - OUTANALOG(m_THRESHOLD_OUT, 0.0, NLTIME_FROM_NS(1)); - } - m_last = out; -} - -NETLIB_START(nic7404) -{ - register_input("I1", m_I); - register_output("Q", m_Q); - m_Q.initial(1); -} - -NETLIB_UPDATE(nic7404) -{ - static const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; - UINT8 t = (INPLOGIC(m_I)) ^ 1; - OUTLOGIC(m_Q, t, delay[t]); -} - -NETLIB_START(nic7486) -{ - register_input("I1", m_I0); - register_input("I2", m_I1); - register_output("Q", m_Q); -} - -NETLIB_UPDATE(nic7486) -{ - static const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; - UINT8 t = INPLOGIC(m_I0) ^ INPLOGIC(m_I1); - OUTLOGIC(m_Q, t, delay[t]); -} - -NETLIB_START(nic7448) -{ - register_sub(sub, "sub"); - - sub.m_state = 0; - - register_input(sub, "A0", sub.m_A0); - register_input(sub, "A1", sub.m_A1); - register_input(sub, "A2", sub.m_A2); - register_input(sub, "A3", sub.m_A3); - register_input("LTQ", m_LTQ); - register_input("BIQ", m_BIQ); - register_input(sub, "RBIQ",sub.m_RBIQ); - - register_output(sub, "a", sub.m_a); - register_output(sub, "b", sub.m_b); - register_output(sub, "c", sub.m_c); - register_output(sub, "d", sub.m_d); - register_output(sub, "e", sub.m_e); - register_output(sub, "f", sub.m_f); - register_output(sub, "g", sub.m_g); -} - -NETLIB_UPDATE(nic7448) -{ - - if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)) - { - sub.update_outputs(8); - } - else if (!INPLOGIC(m_BIQ)) - { - sub.update_outputs(15); - } - - if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))) - { - sub.m_A0.inactivate(); - sub.m_A1.inactivate(); - sub.m_A2.inactivate(); - sub.m_A3.inactivate(); - sub.m_RBIQ.inactivate(); - } else { - sub.m_RBIQ.activate(); - sub.m_A3.activate(); - sub.m_A2.activate(); - sub.m_A1.activate(); - sub.m_A0.activate(); - sub.update(); - } - -} - -NETLIB_UPDATE(nic7448_sub) -{ - UINT8 v; - - v = (INPLOGIC(m_A0) << 0) | (INPLOGIC(m_A1) << 1) | (INPLOGIC(m_A2) << 2) | (INPLOGIC(m_A3) << 3); - if ((!INPLOGIC(m_RBIQ) && (v==0))) - v = 15; - update_outputs(v); -} - -NETLIB_FUNC_VOID(nic7448_sub, update_outputs, (UINT8 v)) -{ - assert(v<16); - if (v != m_state) - { - OUTLOGIC(m_a, tab7448[v][0], NLTIME_FROM_NS(100)); - OUTLOGIC(m_b, tab7448[v][1], NLTIME_FROM_NS(100)); - OUTLOGIC(m_c, tab7448[v][2], NLTIME_FROM_NS(100)); - OUTLOGIC(m_d, tab7448[v][3], NLTIME_FROM_NS(100)); - OUTLOGIC(m_e, tab7448[v][4], NLTIME_FROM_NS(100)); - OUTLOGIC(m_f, tab7448[v][5], NLTIME_FROM_NS(100)); - OUTLOGIC(m_g, tab7448[v][6], NLTIME_FROM_NS(100)); - m_state = v; - } -} - -const UINT8 nic7448_sub::tab7448[16][7] = -{ - { 1, 1, 1, 1, 1, 1, 0 }, /* 00 - not blanked ! */ - { 0, 1, 1, 0, 0, 0, 0 }, /* 01 */ - { 1, 1, 0, 1, 1, 0, 1 }, /* 02 */ - { 1, 1, 1, 1, 0, 0, 1 }, /* 03 */ - { 0, 1, 1, 0, 0, 1, 1 }, /* 04 */ - { 1, 0, 1, 1, 0, 1, 1 }, /* 05 */ - { 0, 0, 1, 1, 1, 1, 1 }, /* 06 */ - { 1, 1, 1, 0, 0, 0, 0 }, /* 07 */ - { 1, 1, 1, 1, 1, 1, 1 }, /* 08 */ - { 1, 1, 1, 0, 0, 1, 1 }, /* 09 */ - { 0, 0, 0, 1, 1, 0, 1 }, /* 10 */ - { 0, 0, 1, 1, 0, 0, 1 }, /* 11 */ - { 0, 1, 0, 0, 0, 1, 1 }, /* 12 */ - { 1, 0, 0, 1, 0, 1, 1 }, /* 13 */ - { 0, 0, 0, 1, 1, 1, 1 }, /* 14 */ - { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */ -}; - -NETLIB_START(nic7450) -{ - register_input("I1", m_I0); - register_input("I2", m_I1); - register_input("I3", m_I2); - register_input("I4", m_I3); - register_output("Q", m_Q); -} - -NETLIB_UPDATE(nic7450) -{ - m_I0.activate(); - m_I1.activate(); - m_I2.activate(); - m_I3.activate(); - UINT8 t1 = INPLOGIC(m_I0) & INPLOGIC(m_I1); - UINT8 t2 = INPLOGIC(m_I2) & INPLOGIC(m_I3); -#if 0 - UINT8 t = (t1 | t2) ^ 1; - OUTLOGIC(m_Q, t, t ? NLTIME_FROM_NS(22) : NLTIME_FROM_NS(15)); -#else - const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; - - UINT8 res = 0; - if (t1 ^ 1) - { - if (t2 ^ 1) - { - res = 1; - } - else - { - m_I0.inactivate(); - m_I1.inactivate(); - } - } else { - if (t2 ^ 1) - { - m_I2.inactivate(); - m_I3.inactivate(); - } - } - OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000); - -#endif -} - -ATTR_HOT inline void nic7474sub::newstate(const UINT8 state) -{ - static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) }; - //printf("%s %d %d %d\n", "7474", state, Q.Q(), QQ.Q()); - OUTLOGIC(m_Q, state, delay[state]); - OUTLOGIC(m_QQ, !state, delay[!state]); -} - -NETLIB_UPDATE(nic7474sub) -{ - //if (!INP_LAST(m_clk) & INP(m_clk)) - { - newstate(m_nextD); - m_clk.inactivate(); - } -} - -NETLIB_UPDATE(nic7474) -{ - if (!INPLOGIC(m_preQ)) - { - sub.newstate(1); - sub.m_clk.inactivate(); - m_D.inactivate(); - } - else if (!INPLOGIC(m_clrQ)) - { - sub.newstate(0); - sub.m_clk.inactivate(); - m_D.inactivate(); - } - else - { - m_D.activate(); - sub.m_nextD = INPLOGIC(m_D); - sub.m_clk.activate_lh(); - } -} - -NETLIB_START(nic7474) -{ - - register_sub(sub, "sub"); - register_input(sub, "CLK", sub.m_clk, net_input_t::INP_STATE_LH); - register_input("D", m_D); - register_input("CLRQ", m_clrQ); - register_input("PREQ", m_preQ); - - register_output(sub, "Q", sub.m_Q); - register_output(sub, "QQ", sub.m_QQ); - - sub.m_Q.initial(1); - sub.m_QQ.initial(0); -} - -NETLIB_START(nic7483) -{ - m_lastr = 0; - - register_input("A1", m_A1); - register_input("A2", m_A2); - register_input("A3", m_A3); - register_input("A4", m_A4); - register_input("B1", m_B1); - register_input("B2", m_B2); - register_input("B3", m_B3); - register_input("B4", m_B4); - register_input("CI", m_CI); - - register_output("SA", m_SA); - register_output("SB", m_SB); - register_output("SC", m_SC); - register_output("SD", m_SD); - register_output("CO", m_CO); -} - -NETLIB_UPDATE(nic7483) -{ - UINT8 a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3); - UINT8 b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3); - - UINT8 r = a + b + INPLOGIC(m_CI); - - if (r != m_lastr) - { - m_lastr = r; - OUTLOGIC(m_SA, (r >> 0) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_SB, (r >> 1) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_SC, (r >> 2) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_SD, (r >> 3) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_CO, (r >> 4) & 1, NLTIME_FROM_NS(23)); - } -} - -NETLIB_START(nic7490) -{ - m_cnt = 0; - - register_input("CLK", m_clk); - register_input("R1", m_R1); - register_input("R2", m_R2); - register_input("R91", m_R91); - register_input("R92", m_R92); - - register_output("QA", m_Q[0]); - register_output("QB", m_Q[1]); - register_output("QC", m_Q[2]); - register_output("QD", m_Q[3]); -} - -NETLIB_UPDATE(nic7490) -{ - if (INPLOGIC(m_R91) & INPLOGIC(m_R92)) - { - m_cnt = 9; - update_outputs(); - } - else if (INPLOGIC(m_R1) & INPLOGIC(m_R2)) - { - m_cnt = 0; - update_outputs(); - } - else if (INP_HL(m_clk)) - { - m_cnt++; - if (m_cnt >= 10) - m_cnt = 0; - update_outputs(); - } -} -#if 0 -NETLIB_FUNC_VOID(nic7490, 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(nic7490, 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 -#if !USE_OLD7493 -NETLIB_START(nic7493) -{ - register_sub(A, "A"); - register_sub(B, "B"); - register_sub(C, "C"); - register_sub(D, "D"); - - register_input(A, "CLKA", A.m_I, net_input_t::INP_STATE_HL); - register_input(B, "CLKB", B.m_I, net_input_t::INP_STATE_HL); - register_input("R1", m_R1); - register_input("R2", m_R2); - - register_output(A, "QA", A.m_Q); - register_output(B, "QB", B.m_Q); - register_output(C, "QC", C.m_Q); - register_output(D, "QD", D.m_Q); - - //B.register_link_internal(B.m_I, A.m_Q); - register_link_internal(C, C.m_I, B.m_Q, net_input_t::INP_STATE_HL); - register_link_internal(D, D.m_I, C.m_Q, net_input_t::INP_STATE_HL); - -} - -NETLIB_UPDATE(nic7493ff) -{ - if (m_reset == 0) - OUTLOGIC(m_Q, !m_Q.new_Q(), NLTIME_FROM_NS(18)); -} - -NETLIB_UPDATE(nic7493) -{ - net_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2); - - if (r) - { - //printf("%s reset\n", name()); - A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1; - A.m_I.inactivate(); - B.m_I.inactivate(); - OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40)); - } - else - { - A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0; - A.m_I.activate_hl(); - B.m_I.activate_hl(); - //printf("%s enable\n", name()); - } -} -#else - -NETLIB_START(nic7493) -{ - m_cnt = 0; - - register_input("CLKA", m_CLK, net_input_t::INP_STATE_HL); - register_input("CLKB", m_CLKB, net_input_t::INP_STATE_HL); - register_input("R1", m_R1); - register_input("R2", m_R2); - - register_output("QA", m_QA); - register_output("QB", m_QB); - register_output("QC", m_QC); - register_output("QD", m_QD); -} - -NETLIB_UPDATE(nic7493) -{ - //UINT8 old_clk = m_lastclk; - //m_lastclk = INPLOGIC(m_clk); - - //printf("%s %d %d %d %d %d %d\n", name(), m_cnt, old_clk, m_QA.Q(), m_QB.Q(), m_QC.Q(), m_QD.Q()); - if (INPLOGIC(m_R1) & INPLOGIC(m_R2)) - { - if (m_cnt > 0) - { - m_cnt = 0; - OUTLOGIC(m_QA, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(m_QB, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(m_QC, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(m_QD, 0, NLTIME_FROM_NS(40)); - } - m_CLK.inactivate(); - } - //else if (old_clk & !m_lastclk) - else { - m_CLK.activate_hl(); - if (INP_HL(m_CLK)) - { - m_cnt++; - m_cnt &= 0x0f; - update_outputs(); - } - } -} - -NETLIB_FUNC_VOID(nic7493, update_outputs, (void)) -{ - if (m_cnt & 1) - OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(16)); - else - { - OUTLOGIC(m_QA, 0, NLTIME_FROM_NS(16)); - switch (m_cnt) - { - case 0x00: - OUTLOGIC(m_QD, 0, NLTIME_FROM_NS(70)); - OUTLOGIC(m_QC, 0, NLTIME_FROM_NS(48)); - OUTLOGIC(m_QB, 0, NLTIME_FROM_NS(34)); - break; - case 0x02: - case 0x06: - case 0x0A: - case 0x0E: - OUTLOGIC(m_QB, 1, NLTIME_FROM_NS(34)); - break; - case 0x04: - case 0x0C: - OUTLOGIC(m_QC, 1, NLTIME_FROM_NS(48)); - OUTLOGIC(m_QB, 0, NLTIME_FROM_NS(34)); - break; - case 0x08: - OUTLOGIC(m_QD, 1, NLTIME_FROM_NS(70)); - OUTLOGIC(m_QC, 0, NLTIME_FROM_NS(48)); - OUTLOGIC(m_QB, 0, NLTIME_FROM_NS(34)); - break; - } - } -} -#endif - -NETLIB_START(nic74107A) -{ - register_sub(sub, "sub"); - - register_input(sub, "CLK", sub.m_clk, net_input_t::INP_STATE_HL); - register_input("J", m_J); - register_input("K", m_K); - register_input("CLRQ", m_clrQ); - register_output(sub, "Q", sub.m_Q); - register_output(sub, "QQ", sub.m_QQ); - - sub.m_Q.initial(0); - sub.m_QQ.initial(1); -} - -ATTR_HOT inline void nic74107Asub::newstate(const net_sig_t state) -{ - const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; -#if 1 - OUTLOGIC(m_Q, state, delay[state ^ 1]); - OUTLOGIC(m_QQ, state ^ 1, delay[state]); -#else - if (state != Q.new_Q()) - { - Q.setToNoCheck(state, delay[1-state]); - QQ.setToNoCheck(1-state, delay[state]); - } -#endif -} - -NETLIB_UPDATE(nic74107Asub) -{ - { - net_sig_t t = m_Q.new_Q(); - newstate((!t & m_Q1) | (t & m_Q2) | m_F); - if (!m_Q1) - m_clk.inactivate(); - } -} - -NETLIB_UPDATE(nic74107A) -{ - if (INPLOGIC(m_J) & INPLOGIC(m_K)) - { - sub.m_Q1 = 1; - sub.m_Q2 = 0; - sub.m_F = 0; - } - else if (!INPLOGIC(m_J) & INPLOGIC(m_K)) - { - sub.m_Q1 = 0; - sub.m_Q2 = 0; - sub.m_F = 0; - } - else if (INPLOGIC(m_J) & !INPLOGIC(m_K)) - { - sub.m_Q1 = 0; - sub.m_Q2 = 0; - sub.m_F = 1; - } - else - { - sub.m_Q1 = 0; - sub.m_Q2 = 1; - sub.m_F = 0; - sub.m_clk.inactivate(); - } - if (!INPLOGIC(m_clrQ)) - { - sub.m_clk.inactivate(); - sub.newstate(0); - } - else if (!sub.m_Q2) - sub.m_clk.activate_hl(); - //if (!sub.m_Q2 & INPLOGIC(m_clrQ)) - // sub.m_clk.activate_hl(); -} - -NETLIB_START(nic74153) -{ - register_input("A1", m_I[0]); - register_input("A2", m_I[1]); - register_input("A3", m_I[2]); - register_input("A4", m_I[3]); - register_input("A", m_A); - register_input("B", m_B); - register_input("GA", m_GA); - - register_output("AY", m_AY); -} - -NETLIB_UPDATE(nic74153) -{ - const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; - if (!INPLOGIC(m_GA)) - { - UINT8 chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); - UINT8 t = INPLOGIC(m_I[chan]); - OUTLOGIC(m_AY, t, delay[t] ); /* data to y only, FIXME */ - } - else - { - OUTLOGIC(m_AY, 0, delay[0]); - } -} - -NETLIB_START(nic9316) -{ - register_sub(sub, "sub"); - - sub.m_cnt = 0; - sub.m_loadq = 1; - sub.m_ent = 1; - - register_input(sub, "CLK", sub.m_clk, net_input_t::INP_STATE_LH); - - register_input("ENP", m_ENP); - register_input("ENT", m_ENT); - register_input("CLRQ", m_CLRQ); - register_input("LOADQ", m_LOADQ); - - register_input(sub, "A", sub.m_A, net_input_t::INP_STATE_PASSIVE); - register_input(sub, "B", sub.m_B, net_input_t::INP_STATE_PASSIVE); - register_input(sub, "C", sub.m_C, net_input_t::INP_STATE_PASSIVE); - register_input(sub, "D", sub.m_D, net_input_t::INP_STATE_PASSIVE); - - register_output(sub, "QA", sub.m_QA); - register_output(sub, "QB", sub.m_QB); - register_output(sub, "QC", sub.m_QC); - register_output(sub, "QD", sub.m_QD); - register_output(sub, "RC", sub.m_RC); - -} - -NETLIB_UPDATE(nic9316_sub) -{ - if (m_loadq) - { - m_cnt = ( m_cnt + 1) & 0x0f; - update_outputs(); - } - 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(); - } - OUTLOGIC(m_RC, m_ent & (m_cnt == 0x0f), NLTIME_FROM_NS(20)); -} - -NETLIB_UPDATE(nic9316) -{ - sub.m_loadq = INPLOGIC(m_LOADQ); - sub.m_ent = INPLOGIC(m_ENT); - const net_sig_t clrq = INPLOGIC(m_CLRQ); - - if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) & clrq) - { - sub.m_clk.activate_lh(); - } - else - { - sub.m_clk.inactivate(); - if (!clrq & (sub.m_cnt>0)) - { - sub.m_cnt = 0; - sub.update_outputs(); - OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20)); - return; - } - } - OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == 0x0f), NLTIME_FROM_NS(20)); -} - -NETLIB_FUNC_VOID(nic9316_sub, update_outputs_all, (void)) -{ - 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); -} - -NETLIB_FUNC_VOID(nic9316_sub, update_outputs, (void)) -{ - 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); -#else - if ((m_cnt & 1) == 1) - OUTLOGIC(m_QA, 1, out_delay); - else - { - OUTLOGIC(m_QA, 0, out_delay); - switch (m_cnt) - { - case 0x00: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 0, out_delay); - break; - case 0x02: - case 0x06: - case 0x0A: - case 0x0E: - OUTLOGIC(m_QB, 1, out_delay); - break; - case 0x04: - case 0x0C: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 1, out_delay); - break; - case 0x08: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 1, out_delay); - break; - } - - } -#endif -} - -#define ENTRY(_nic, _name) new net_device_t_factory< _nic >( # _name, # _nic ), - -static const net_device_t_base_factory *netregistry[] = -{ - ENTRY(netdev_ttl_const, NETDEV_TTL_CONST) - ENTRY(netdev_analog_const, NETDEV_ANALOG_CONST) - ENTRY(netdev_logic_input, NETDEV_LOGIC_INPUT) - ENTRY(netdev_analog_input, NETDEV_ANALOG_INPUT) - ENTRY(netdev_log, NETDEV_LOG) - ENTRY(netdev_clock, NETDEV_CLOCK) - ENTRY(netdev_mainclock, NETDEV_MAINCLOCK) - ENTRY(netdev_analog_callback,NETDEV_CALLBACK) - ENTRY(nicMultiSwitch, NETDEV_SWITCH2) - ENTRY(nicRSFF, NETDEV_RSFF) - ENTRY(nicMixer8, NETDEV_MIXER) - ENTRY(nic7400, TTL_7400_NAND) - ENTRY(nic7402, TTL_7402_NOR) - ENTRY(nic7404, TTL_7404_INVERT) - ENTRY(nic7410, TTL_7410_NAND) - ENTRY(nic7420, TTL_7420_NAND) - ENTRY(nic7425, TTL_7425_NOR) - ENTRY(nic7427, TTL_7427_NOR) - ENTRY(nic7430, TTL_7430_NAND) - ENTRY(nic7450, TTL_7450_ANDORINVERT) - ENTRY(nic7486, TTL_7486_XOR) - ENTRY(nic7448, TTL_7448) - ENTRY(nic7474, TTL_7474) - ENTRY(nic7483, TTL_7483) - ENTRY(nic7490, TTL_7490) - ENTRY(nic7493, TTL_7493) - ENTRY(nic74107, TTL_74107) - ENTRY(nic74107A, TTL_74107A) - ENTRY(nic74153, TTL_74153) - ENTRY(nic9316, TTL_9316) - ENTRY(nicNE555N_MSTABLE, NE555N_MSTABLE) - NULL -}; - -net_device_t *net_create_device_by_classname(const astring &classname, netlist_setup_t &setup, const astring &icname) -{ - const net_device_t_base_factory **p = &netregistry[0]; - while (p != NULL) - { - if (strcmp((*p)->classname(), classname) == 0) - { - net_device_t *ret = (*p)->Create(); - ret->init(setup, icname); - return ret; - } - p++; - } - fatalerror("Class %s required for IC %s not found!\n", classname.cstr(), icname.cstr()); - return NULL; // appease code analysis -} - -net_device_t *net_create_device_by_name(const astring &name, netlist_setup_t &setup, const astring &icname) -{ - const net_device_t_base_factory **p = &netregistry[0]; - while (p != NULL) - { - if (strcmp((*p)->name(), name) == 0) - { - net_device_t *ret = (*p)->Create(); - ret->init(setup, icname); - return ret; - } - p++; - } - fatalerror("Class %s required for IC %s not found!\n", name.cstr(), icname.cstr()); - return NULL; // appease code analysis -} |