summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_9310.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_9310.cpp')
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp237
1 files changed, 237 insertions, 0 deletions
diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp
new file mode 100644
index 00000000000..586f1b47c05
--- /dev/null
+++ b/src/lib/netlist/devices/nld_9310.cpp
@@ -0,0 +1,237 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_9310.c
+ *
+ */
+
+#include "nld_9310.h"
+
+#define MAXCNT 9
+
+NETLIB_NAMESPACE_DEVICES_START()
+
+NETLIB_START(9310)
+{
+ register_sub("subABCD", subABCD);
+ sub.m_ABCD = &subABCD;
+ register_sub("sub", sub);
+
+ register_subalias("CLK", sub.m_CLK);
+
+ register_input("ENP", m_ENP);
+ register_input("ENT", m_ENT);
+ register_input("CLRQ", m_CLRQ);
+ register_input("LOADQ", m_LOADQ);
+
+ register_subalias("A", subABCD.m_A);
+ register_subalias("B", subABCD.m_B);
+ register_subalias("C", subABCD.m_C);
+ register_subalias("D", subABCD.m_D);
+
+ register_subalias("QA", sub.m_QA);
+ register_subalias("QB", sub.m_QB);
+ register_subalias("QC", sub.m_QC);
+ register_subalias("QD", sub.m_QD);
+ register_subalias("RC", sub.m_RC);
+
+}
+
+NETLIB_RESET(9310)
+{
+ sub.do_reset();
+ subABCD.do_reset();
+}
+
+NETLIB_START(9310_subABCD)
+{
+ register_input("A", m_A);
+ register_input("B", m_B);
+ register_input("C", m_C);
+ register_input("D", m_D);
+
+}
+
+NETLIB_RESET(9310_subABCD)
+{
+#if 0
+ m_A.inactivate();
+ m_B.inactivate();
+ m_C.inactivate();
+ m_D.inactivate();
+#endif
+}
+
+NETLIB_UPDATE(9310_subABCD)
+{
+}
+
+NETLIB_START(9310_sub)
+{
+ register_input("CLK", m_CLK);
+
+ register_output("QA", m_QA);
+ register_output("QB", m_QB);
+ register_output("QC", m_QC);
+ register_output("QD", m_QD);
+ register_output("RC", m_RC);
+
+ save(NLNAME(m_cnt));
+ save(NLNAME(m_loadq));
+ save(NLNAME(m_ent));
+}
+
+NETLIB_RESET(9310_sub)
+{
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_cnt = 0;
+ m_loadq = 1;
+ m_ent = 1;
+}
+
+NETLIB_UPDATE(9310_sub)
+{
+ if (m_loadq)
+ {
+#if 0
+ m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0;
+ update_outputs(m_cnt);
+ OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20));
+#else
+ switch (m_cnt)
+ {
+ case MAXCNT - 1:
+ m_cnt = MAXCNT;
+ OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
+ OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
+ break;
+ case MAXCNT:
+ OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+ break;
+ default:
+ m_cnt++;
+ update_outputs(m_cnt);
+ }
+#endif
+ }
+ else
+ {
+ m_cnt = m_ABCD->read_ABCD();
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
+ OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+}
+
+NETLIB_UPDATE(9310)
+{
+ sub.m_loadq = INPLOGIC(m_LOADQ);
+ sub.m_ent = INPLOGIC(m_ENT);
+ const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
+
+ if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
+ {
+ sub.m_CLK.activate_lh();
+ OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+ else
+ {
+ sub.m_CLK.inactivate();
+ if (!clrq && (sub.m_cnt>0))
+ {
+ sub.update_outputs_all(0, NLTIME_FROM_NS(36));
+ sub.m_cnt = 0;
+ //return;
+ }
+ OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+}
+
+inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt, const netlist_time 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);
+}
+
+inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt))
+{
+ /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20);
+#if 0
+// 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 ((cnt & 1) == 1)
+ OUTLOGIC(m_QA, 1, out_delay);
+ else
+ {
+ OUTLOGIC(m_QA, 0, out_delay);
+ switch (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
+}
+
+NETLIB_START(9310_dip)
+{
+ NETLIB_NAME(9310)::start();
+
+ register_subalias("1", m_CLRQ);
+ register_subalias("2", sub.m_CLK);
+ register_subalias("3", subABCD.m_A);
+ register_subalias("4", subABCD.m_B);
+ register_subalias("5", subABCD.m_C);
+ register_subalias("6", subABCD.m_D);
+ register_subalias("7", m_ENP);
+ // register_subalias("8", ); --> GND
+
+ register_subalias("9", m_LOADQ);
+ register_subalias("10", m_ENT);
+ register_subalias("11", sub.m_QD);
+ register_subalias("12", sub.m_QC);
+ register_subalias("13", sub.m_QB);
+ register_subalias("14", sub.m_QA);
+ register_subalias("15", sub.m_RC);
+ // register_subalias("16", ); --> VCC
+}
+
+NETLIB_UPDATE(9310_dip)
+{
+ NETLIB_NAME(9310)::update();
+}
+
+NETLIB_RESET(9310_dip)
+{
+ NETLIB_NAME(9310)::reset();
+}
+
+NETLIB_NAMESPACE_DEVICES_END()