diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_dm9314.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_dm9314.cpp | 156 |
1 files changed, 74 insertions, 82 deletions
diff --git a/src/lib/netlist/devices/nld_dm9314.cpp b/src/lib/netlist/devices/nld_dm9314.cpp index e193fd08f46..e8241af09de 100644 --- a/src/lib/netlist/devices/nld_dm9314.cpp +++ b/src/lib/netlist/devices/nld_dm9314.cpp @@ -3,24 +3,33 @@ /* * nld_dm9314.cpp * + * DM9314: 4-Bit Latches + * + * +--------------+ + * /E |1 ++ 16| VCC + * /S0 |2 15| Q0 + * D0 |3 14| /S1 + * D1 |4 DM9314 13| Q1 + * /S2 |5 12| Q2 + * D2 |6 11| /S3 + * D3 |7 10| Q3 + * GND |8 9| /MR + * +--------------+ + * */ -#include "nld_dm9314.h" -#include "netlist/nl_base.h" -#include "nlid_system.h" +#include "nl_base.h" + +namespace netlist::devices { -namespace netlist -{ - namespace devices - { NETLIB_OBJECT(9314) { NETLIB_CONSTRUCTOR(9314) - , m_EQ(*this, "EQ") - , m_MRQ(*this, "MRQ") - , m_SQ(*this, {{"S0Q", "S1Q", "S2Q", "S3Q"}}) - , m_D(*this, {{"D0", "D1", "D2", "D3"}}) - , m_Q(*this, {{"Q0", "Q1", "Q2", "Q3"}}) + , m_EQ(*this, "EQ", NETLIB_DELEGATE(inputs)) + , m_MRQ(*this, "MRQ", NETLIB_DELEGATE(inputs)) + , m_SQ(*this, {"S0Q", "S1Q", "S2Q", "S3Q"}, NETLIB_DELEGATE(inputs)) + , m_D(*this, {"D0", "D1", "D2", "D3"}, NETLIB_DELEGATE(inputs)) + , m_Q(*this, {"Q0", "Q1", "Q2", "Q3"}) , m_last_EQ(*this, "m_last_EQ", 0) , m_last_MRQ(*this, "m_last_MRQ", 0) , m_last_SQ(*this, "m_last_SQ", 0) @@ -30,10 +39,59 @@ namespace netlist { } - NETLIB_RESETI(); - NETLIB_UPDATEI(); + private: + + NETLIB_RESETI() + { + m_last_MRQ = 0; + m_last_EQ = 0; + m_last_SQ = 0; + m_last_D = 0; + m_last_Q = 0; + } + + NETLIB_HANDLERI(inputs) + { + netlist_time delay = NLTIME_FROM_NS(24); //FIXME! + if (!m_MRQ()) + { + /* Reset! */ + for (std::size_t i=0; i<4; i++) + m_Q[i].push(0, delay); + } else { + for (std::size_t i=0; i<4; i++) + { + if (m_SQ[i]()) + { + /* R-S Mode */ + // RS mode is just an "extension of regular D mode" + // The way RS mode works is that D and S bar go high (keeps old value) + // S bar going low sets output high + // D going low and S bar high sets output low + // S bar going low AND D going low sets output low (D takes precedence) + if (!m_EQ()) + { + if (!m_D[i]()) // if D low and SQ high we clear the bit + { + m_last_Q &= ~(1 << i); + m_Q[i].push((m_last_Q & (1<<i))>>i, delay); + } + } + } + else + { + /* D Mode */ + if (!m_EQ()) + { + m_Q[i].push(m_D[i](), delay); + m_last_Q &= ~(1 << i); + m_last_Q |= (m_D[i]() << i); + } + } + } + } + } - protected: logic_input_t m_EQ; logic_input_t m_MRQ; object_array_t<logic_input_t, 4> m_SQ; @@ -48,72 +106,6 @@ namespace netlist nld_power_pins m_power_pins; }; - NETLIB_OBJECT_DERIVED(9314_dip, 9314) - { - NETLIB_CONSTRUCTOR_DERIVED(9314_dip, 9314) - { - register_subalias("1", m_EQ); - register_subalias("2", m_SQ[0]); - register_subalias("3", m_D[0]); - register_subalias("4", m_D[1]); - register_subalias("5", m_SQ[2]); - register_subalias("6", m_D[2]); - register_subalias("7", m_D[3]); - register_subalias("8", "GND"); - - register_subalias("9", m_MRQ); - register_subalias("10", m_Q[3]); - register_subalias("11", m_SQ[3]); - register_subalias("12", m_Q[2]); - register_subalias("13", m_Q[1]); - register_subalias("14", m_SQ[1]); - register_subalias("15", m_Q[0]); - register_subalias("16", "VCC"); - - } - }; - - NETLIB_RESET(9314) - { - m_last_MRQ = 0; - m_last_EQ = 0; - m_last_SQ = 0; - m_last_D = 0; - m_last_Q = 0; - } - - NETLIB_UPDATE(9314) - { - netlist_time delay = NLTIME_FROM_NS(24); //FIXME! - if (!m_MRQ()) - { - /* Reset! */ - for (std::size_t i=0; i<4; i++) - m_Q[i].push(0, delay); - } else { - for (std::size_t i=0; i<4; i++) - { - if (m_SQ[i]()) - { - /* R-S Mode */ - // FIXME: R-S mode is not yet implemented! - } - else - { - /* D Mode */ - if (!m_EQ()) - { - m_Q[i].push(m_D[i](), delay); - m_last_Q &= ~(1 << i); - m_last_Q |= (m_D[i]() << i); - } - } - } - } - } - NETLIB_DEVICE_IMPL(9314, "TTL_9314", "+EQ,+MRQ,+S0Q,+S1Q,+S2Q,+S3Q,+D0,+D1,+D2,+D3,@VCC,@GND") - NETLIB_DEVICE_IMPL(9314_dip, "TTL_9314_DIP", "") - } //namespace devices -} // namespace netlist +} // namespace netlist::devices |