diff --git a/src/emu/netlist/devices/nld_7437.c b/src/emu/netlist/devices/nld_7437.c index bcbbb5cf575..ba078f81d11 100644 --- a/src/emu/netlist/devices/nld_7437.c +++ b/src/emu/netlist/devices/nld_7437.c @@ -7,6 +7,18 @@ #include "nld_7437.h" +#if (USE_TRUTHTABLE) +nld_7437::truthtable_t nld_7437::m_ttbl; +const char *nld_7437::m_desc[] = { + "A , B | Q ", + "0,X|1|22", + "X,0|1|22", + "1,1|0|15", + "" +}; + +#endif + NETLIB_START(7437_dip) { register_sub("1", m_1); diff --git a/src/emu/netlist/devices/nld_7437.h b/src/emu/netlist/devices/nld_7437.h index e83e8c2a737..03145ee8a8c 100644 --- a/src/emu/netlist/devices/nld_7437.h +++ b/src/emu/netlist/devices/nld_7437.h @@ -42,7 +42,12 @@ NET_CONNECT(_name, A, _A) \ NET_CONNECT(_name, B, _B) +#if (USE_TRUTHTABLE) +#include "nld_truthtable.h" +NETLIB_TRUTHTABLE(7437, 2, 1, 0); +#else NETLIB_SIGNAL(7437, 2, 0, 0); +#endif #define TTL_7437_DIP(_name) \ NET_REGISTER_DEV(7437_dip, _name) diff --git a/src/emu/netlist/devices/nld_7448.c b/src/emu/netlist/devices/nld_7448.c index aea9b2f7620..a761856f59e 100644 --- a/src/emu/netlist/devices/nld_7448.c +++ b/src/emu/netlist/devices/nld_7448.c @@ -7,8 +7,60 @@ #include "nld_7448.h" +#if (0 && USE_TRUTHTABLE) +nld_7448::truthtable_t nld_7448::m_ttbl; +const char *nld_7448::m_desc[] = { + " LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g", + " 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 0, 0 | 0, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 0, 0 | 1, 1, 0, 1, 1, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 0, 0 | 1, 1, 1, 1, 0, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 0, 1, 0 | 0, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 1, 0 | 1, 0, 1, 1, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 1, 0 | 0, 0, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 1, 0 | 1, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100", + " 1, 1, X, 0, 0, 0, 1 | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 0, 1 | 1, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 0, 1 | 0, 0, 0, 1, 1, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 0, 1 | 0, 0, 1, 1, 0, 0, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 0, 1, 1 | 0, 1, 0, 0, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 0, 1, 1 | 1, 0, 0, 1, 0, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100", + " 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", + // BI/RBO is input output. In the next case it is used as an output will go low. + " 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI + + " 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT + + // This condition has precedence + " X, 0, X, X, X, X, X | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // BI + "" +}; + +NETLIB_START(7448_dip) +{ + NETLIB_NAME(7448)::start(); + + register_subalias("1", m_i[4]); // B + register_subalias("2", m_i[5]); // C + register_subalias("3", m_i[0]); // LTQ + register_subalias("4", m_i[1]); // BIQ + register_subalias("5", m_i[2]); // RBIQ + register_subalias("6", m_i[6]); // D + register_subalias("7", m_i[3]); // A + + register_subalias("9", m_Q[4]); // e + register_subalias("10", m_Q[3]); // d + register_subalias("11", m_Q[2]); // c + register_subalias("12", m_Q[1]); // b + register_subalias("13", m_Q[0]); // a + register_subalias("14", m_Q[6]); // g + register_subalias("15", m_Q[5]); // f +} + +#else NETLIB_START(7448) { register_sub("sub", sub); @@ -21,15 +73,17 @@ NETLIB_START(7448) register_input("BIQ", m_BIQ); register_subalias("RBIQ",sub.m_RBIQ); - register_subalias("a", sub.m_a); - register_subalias("b", sub.m_b); - register_subalias("c", sub.m_c); - register_subalias("d", sub.m_d); - register_subalias("e", sub.m_e); - register_subalias("f", sub.m_f); - register_subalias("g", sub.m_g); + register_subalias("a", sub.m_Q[0]); + register_subalias("b", sub.m_Q[1]); + register_subalias("c", sub.m_Q[2]); + register_subalias("d", sub.m_Q[3]); + register_subalias("e", sub.m_Q[4]); + register_subalias("f", sub.m_Q[5]); + register_subalias("g", sub.m_Q[6]); + } + NETLIB_RESET(7448) { sub.do_reset(); @@ -72,20 +126,22 @@ NETLIB_START(7448_sub) register_input("A3", m_D); register_input("RBIQ", m_RBIQ); - register_output("a", m_a); - register_output("b", m_b); - register_output("c", m_c); - register_output("d", m_d); - register_output("e", m_e); - register_output("f", m_f); - register_output("g", m_g); + register_output("a", m_Q[0]); + register_output("b", m_Q[1]); + register_output("c", m_Q[2]); + register_output("d", m_Q[3]); + register_output("e", m_Q[4]); + register_output("f", m_Q[5]); + register_output("g", m_Q[6]); save(NLNAME(m_state)); + save(NLNAME(m_active)); } NETLIB_RESET(7448_sub) { m_state = 0; + m_active = 7; } NETLIB_UPDATE(7448_sub) @@ -98,6 +154,45 @@ NETLIB_UPDATE(7448_sub) update_outputs(v); } +#if 0 +ATTR_HOT void NETLIB_NAME(7448_sub)::inc_active() +{ + const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; + nl_assert(netlist().use_deactivate()); + if (++m_active == 1) + { + m_A.activate(); + m_B.activate(); + m_C.activate(); + m_D.activate(); + m_RBIQ.activate(); + + netlist_time mt = this->m_Q[0].net().time(); + for (int i=1; i<7; i++) + { + if (this->m_Q[i].net().time() > mt) + mt = this->m_Q[i].net().time(); + } + + for (int i=0; i<7; i++) + m_Q[i].net().set_Q_time( tab7448[m_state][i], mt + NLTIME_FROM_NS(100)); + } +} + +ATTR_HOT void NETLIB_NAME(7448_sub)::dec_active() +{ + nl_assert(netlist().use_deactivate()); + if (--m_active == 0) + { + m_A.inactivate(); + m_B.inactivate(); + m_C.inactivate(); + m_D.inactivate(); + m_RBIQ.inactivate(); + } +} +#endif + NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v)) { nl_assert(v<16); @@ -105,13 +200,8 @@ NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v)) { // max transfer time is 100 NS */ - 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)); + for (int i=0; i<7; i++) + OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100)); m_state = v; } } @@ -136,7 +226,6 @@ const UINT8 NETLIB_NAME(7448_sub)::tab7448[16][7] = { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */ }; - NETLIB_START(7448_dip) { NETLIB_NAME(7448)::start(); @@ -149,15 +238,17 @@ NETLIB_START(7448_dip) register_subalias("6", sub.m_D); register_subalias("7", sub.m_A); - register_subalias("9", sub.m_e); - register_subalias("10", sub.m_d); - register_subalias("11", sub.m_c); - register_subalias("12", sub.m_b); - register_subalias("13", sub.m_a); - register_subalias("14", sub.m_g); - register_subalias("15", sub.m_f); + register_subalias("9", sub.m_Q[4]); // e + register_subalias("10", sub.m_Q[3]); // d + register_subalias("11", sub.m_Q[2]); // c + register_subalias("12", sub.m_Q[1]); // b + register_subalias("13", sub.m_Q[0]); // a + register_subalias("14", sub.m_Q[6]); // g + register_subalias("15", sub.m_Q[5]); // f } +#endif + NETLIB_UPDATE(7448_dip) { NETLIB_NAME(7448)::update(); diff --git a/src/emu/netlist/devices/nld_7448.h b/src/emu/netlist/devices/nld_7448.h index 72aed7fa6f1..149b7ad8143 100644 --- a/src/emu/netlist/devices/nld_7448.h +++ b/src/emu/netlist/devices/nld_7448.h @@ -39,6 +39,19 @@ #define TTL_7448_DIP(_name) \ NET_REGISTER_DEV(7448_dip, _name) +/* + * FIXME: Big FIXME + * The truthtable will ignore BIQ for certain states. + * This causes a severe issue in pongf when USE_DEACTIVATE is used. + * For now, just use the old implementation. + * + */ +#if (0 && USE_TRUTHTABLE) +#include "nld_truthtable.h" + +NETLIB_TRUTHTABLE(7448, 7, 7, 0); +#else + NETLIB_SUBDEVICE(7448_sub, ATTR_HOT void update_outputs(UINT8 v); static const UINT8 tab7448[16][7]; @@ -50,14 +63,15 @@ NETLIB_SUBDEVICE(7448_sub, netlist_logic_input_t m_RBIQ; UINT8 m_state; + int m_active; - netlist_logic_output_t m_a; - netlist_logic_output_t m_b; - netlist_logic_output_t m_c; - netlist_logic_output_t m_d; - netlist_logic_output_t m_e; - netlist_logic_output_t m_f; - netlist_logic_output_t m_g; + netlist_logic_output_t m_Q[7]; /* a .. g */ + + // FIXME: doesn't work +#if 0 + ATTR_HOT void inc_active(); + ATTR_HOT void dec_active(); +#endif ); NETLIB_DEVICE(7448, @@ -67,7 +81,7 @@ public: netlist_logic_input_t m_LTQ; netlist_logic_input_t m_BIQ; ); - +#endif NETLIB_DEVICE_DERIVED(7448_dip, 7448, ); diff --git a/src/emu/netlist/devices/nld_7474.c b/src/emu/netlist/devices/nld_7474.c index 8795d83d927..1075a3a6288 100644 --- a/src/emu/netlist/devices/nld_7474.c +++ b/src/emu/netlist/devices/nld_7474.c @@ -10,7 +10,7 @@ ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ) { // 0: High-to-low 40 ns, 1: Low-to-high 25 ns - static const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; + const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; OUTLOGIC(m_Q, stateQ, delay[stateQ]); OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]); } diff --git a/src/emu/netlist/devices/nld_7486.c b/src/emu/netlist/devices/nld_7486.c index b6c32b78287..2abbb5e42ce 100644 --- a/src/emu/netlist/devices/nld_7486.c +++ b/src/emu/netlist/devices/nld_7486.c @@ -12,16 +12,19 @@ NETLIB_START(7486) register_input("A", m_A); register_input("B", m_B); register_output("Q", m_Q); + + save(NLNAME(m_active)); } NETLIB_RESET(7486) { + m_active = 1; } -static const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; - NETLIB_UPDATE(7486) { + const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; + UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B); OUTLOGIC(m_Q, t, delay[t]); } @@ -66,3 +69,31 @@ NETLIB_RESET(7486_dip) m_3.do_reset(); m_4.do_reset(); } + +ATTR_HOT void NETLIB_NAME(7486)::inc_active() +{ + const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; + nl_assert(netlist().use_deactivate()); + if (++m_active == 1) + { + netlist_time mt = this->m_A.net().time(); + if (this->m_B.net().time() > mt) + mt = this->m_B.net().time(); + + m_A.activate(); + m_B.activate(); + + UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B); + m_Q.net().set_Q_time(t, mt + delay[t]); + } +} + +ATTR_HOT void NETLIB_NAME(7486)::dec_active() +{ + nl_assert(netlist().use_deactivate()); + if (--m_active == 0) + { + m_A.inactivate(); + m_B.inactivate(); + } +} diff --git a/src/emu/netlist/devices/nld_7486.h b/src/emu/netlist/devices/nld_7486.h index 6037c46bff1..5febda494f9 100644 --- a/src/emu/netlist/devices/nld_7486.h +++ b/src/emu/netlist/devices/nld_7486.h @@ -44,6 +44,10 @@ public: netlist_logic_input_t m_A; netlist_logic_input_t m_B; netlist_logic_output_t m_Q; + + ATTR_HOT void inc_active(); + ATTR_HOT void dec_active(); + int m_active; ); #define TTL_7486_DIP(_name) \ diff --git a/src/emu/netlist/devices/nld_truthtable.c b/src/emu/netlist/devices/nld_truthtable.c index 54733eb160f..8a90229da37 100644 --- a/src/emu/netlist/devices/nld_truthtable.c +++ b/src/emu/netlist/devices/nld_truthtable.c @@ -86,7 +86,7 @@ ATTR_COLD void truthtable_desc_t::setup(const char **truthtable) truthtable++; for (int j=0; j < m_size; j++) - m_outs[j] = -1; + m_outs[j] = 0; //-1; for (int j=0; j < 16; j++) m_timing_nt[j] = netlist_time::zero; @@ -128,11 +128,11 @@ ATTR_COLD void truthtable_desc_t::setup(const char **truthtable) // determine ignore UINT32 ign[m_size]; - for (int i=0; im_i[i].net().time() > mt) mt = this->m_i[i].net().time(); - } } const UINT32 nstate = state | (has_state ? (m_last_state << m_NI) : 0);