From 72f4f2a20ef91a32a076c680f0e78212408055a1 Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Tue, 13 Dec 2016 19:09:49 +0100 Subject: [PATCH] netlist: Device additions: [Ryan Holtz] * 74161 Synchronous 4-Bit Binary Counter with Clock * 7473 Dual Master-Slave J-K Flip-Flops with Clear and Complementary Outputs * Am2847 Quad 80-bit Static Shift Register * DM9334 8-bit Addressable Latch --- scripts/src/netlist.lua | 8 + src/devices/machine/netlist.cpp | 4 +- src/devices/machine/netlist.h | 26 +++- src/lib/netlist/build/makefile | 4 + src/lib/netlist/devices/net_lib.cpp | 9 ++ src/lib/netlist/devices/net_lib.h | 5 + src/lib/netlist/devices/nld_74161.cpp | 131 ++++++++++++++++ src/lib/netlist/devices/nld_74161.h | 36 +++++ src/lib/netlist/devices/nld_7473.cpp | 198 +++++++++++++++++++++++++ src/lib/netlist/devices/nld_7473.h | 75 ++++++++++ src/lib/netlist/devices/nld_am2847.cpp | 131 ++++++++++++++++ src/lib/netlist/devices/nld_am2847.h | 32 ++++ src/lib/netlist/devices/nld_dm9334.cpp | 152 +++++++++++++++++++ src/lib/netlist/devices/nld_dm9334.h | 76 ++++++++++ 14 files changed, 877 insertions(+), 10 deletions(-) create mode 100644 src/lib/netlist/devices/nld_74161.cpp create mode 100644 src/lib/netlist/devices/nld_74161.h create mode 100644 src/lib/netlist/devices/nld_7473.cpp create mode 100644 src/lib/netlist/devices/nld_7473.h create mode 100644 src/lib/netlist/devices/nld_am2847.cpp create mode 100644 src/lib/netlist/devices/nld_am2847.h create mode 100644 src/lib/netlist/devices/nld_dm9334.cpp create mode 100644 src/lib/netlist/devices/nld_dm9334.h diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index 70feb291aa5..66c336a6dae 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -99,6 +99,8 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_7448.h", MAME_DIR .. "src/lib/netlist/devices/nld_7450.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_7450.h", + MAME_DIR .. "src/lib/netlist/devices/nld_7473.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_7473.h", MAME_DIR .. "src/lib/netlist/devices/nld_7474.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_7474.h", MAME_DIR .. "src/lib/netlist/devices/nld_7483.cpp", @@ -113,6 +115,8 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_74123.h", MAME_DIR .. "src/lib/netlist/devices/nld_74153.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_74153.h", + MAME_DIR .. "src/lib/netlist/devices/nld_74161.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_74161.h", MAME_DIR .. "src/lib/netlist/devices/nld_74175.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_74175.h", MAME_DIR .. "src/lib/netlist/devices/nld_74192.cpp", @@ -131,6 +135,10 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_9312.h", MAME_DIR .. "src/lib/netlist/devices/nld_9316.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_9316.h", + MAME_DIR .. "src/lib/netlist/devices/nld_am2847.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_am2847.h", + MAME_DIR .. "src/lib/netlist/devices/nld_dm9334.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_dm9334.h", MAME_DIR .. "src/lib/netlist/devices/nld_ne555.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_ne555.h", MAME_DIR .. "src/lib/netlist/devices/nld_mm5837.cpp", diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 138a56efe88..b7891d75286 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -84,7 +84,7 @@ void netlist_mame_analog_input_t::device_start() // ---------------------------------------------------------------------------------------- netlist_mame_analog_output_t::netlist_mame_analog_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_ANALOG_INPUT, "Netlist Analog Output", tag, owner, clock, "netlist_analog_output", __FILE__), + : device_t(mconfig, NETLIST_ANALOG_OUTPUT, "Netlist Analog Output", tag, owner, clock, "netlist_analog_output", __FILE__), netlist_mame_sub_interface(*owner), m_in("") { @@ -119,7 +119,7 @@ void netlist_mame_analog_output_t::device_start() // ---------------------------------------------------------------------------------------- netlist_mame_int_input_t::netlist_mame_int_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NETLIST_INT_INPUT, "Netlist Logic Input", tag, owner, clock, "netlist_logic_input", __FILE__), + : device_t(mconfig, NETLIST_INT_INPUT, "Netlist Integer Input", tag, owner, clock, "netlist_logic_input", __FILE__), netlist_mame_sub_interface(*owner), m_param(nullptr), m_mask(0xffffffff), diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index b368389d123..540dc2a8697 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -35,12 +35,12 @@ netlist_analog_output_delegate(& _class :: _member, \ # _class "::" # _member, _class_tag, (_class *)nullptr) ); -#define MCFG_NETLIST_LOGIC_INPUT(_basetag, _tag, _name, _shift) \ - MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_INPUT, 0) \ +#define MCFG_NETLIST_LOGIC_INPUT(_basetag, _tag, _name, _shift) \ + MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_INPUT, 0) \ netlist_mame_logic_input_t::static_set_params(*device, _name, _shift); -#define MCFG_NETLIST_INT_INPUT(_basetag, _tag, _name, _shift, _mask) \ - MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_INT_INPUT, 0) \ +#define MCFG_NETLIST_INT_INPUT(_basetag, _tag, _name, _shift, _mask) \ + MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_INT_INPUT, 0) \ netlist_mame_int_input_t::static_set_params(*device, _name, _mask, _shift); #define MCFG_NETLIST_ROM(_basetag, _tag, _name, _region) \ @@ -55,6 +55,7 @@ MCFG_DEVICE_ADD(_basetag ":cout" # _chan, NETLIST_STREAM_OUTPUT, 0) \ netlist_mame_stream_output_t::static_set_params(*device, _chan, _name); +#define MCFG_NETLIST_ROM_ACCESS( #define NETLIST_LOGIC_PORT_CHANGED(_base, _tag) \ PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_logic_input_t, input_changed, 0) @@ -416,16 +417,22 @@ private: // ---------------------------------------------------------------------------------------- -// netlist_mame_int_input_t +// netlist_mame_rom_t // ---------------------------------------------------------------------------------------- -class netlist_mame_int_input_t : public device_t, - public netlist_mame_sub_interface +class netlist_mame_rom_t : public device_t, + public netlist_mame_sub_interface { public: // construction/destruction - netlist_mame_int_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_rom_t(const machine_config &mconfig, const char *tag, device_t *owner) + : device_t(mconfig, NETLIST_ROM, "Netlist ROM Interface", tag, owner, 0, "netlist_rom", __FILE__), + netlist_mame_sub_interface(*owner), + m_in("") + m_mask(0xffffffff), + m_shift(0), + { } virtual ~netlist_mame_int_input_t() { } static void static_set_params(device_t &device, const char *param_name, const uint32_t mask, const uint32_t shift); @@ -461,6 +468,7 @@ private: pstring m_param_name; }; + // ---------------------------------------------------------------------------------------- // netlist_mame_logic_input_t // ---------------------------------------------------------------------------------------- @@ -798,6 +806,8 @@ extern const device_type NETLIST_INT_INPUT; extern const device_type NETLIST_ROM_REGION; extern const device_type NETLIST_ANALOG_OUTPUT; +//extern const device_type NETLIST_LOGIC_OUTPUT; +extern const device_type NETLIST_INT_OUTPUT; extern const device_type NETLIST_STREAM_INPUT; extern const device_type NETLIST_STREAM_OUTPUT; diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 36bce299de5..bbef3d58b97 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -70,6 +70,7 @@ NLOBJS := \ $(NLOBJ)/devices/nld_4066.o \ $(NLOBJ)/devices/nld_7448.o \ $(NLOBJ)/devices/nld_7450.o \ + $(NLOBJ)/devices/nld_7473.o \ $(NLOBJ)/devices/nld_7474.o \ $(NLOBJ)/devices/nld_7483.o \ $(NLOBJ)/devices/nld_7490.o \ @@ -77,6 +78,7 @@ NLOBJS := \ $(NLOBJ)/devices/nld_74107.o \ $(NLOBJ)/devices/nld_74123.o \ $(NLOBJ)/devices/nld_74153.o \ + $(NLOBJ)/devices/nld_74161.o \ $(NLOBJ)/devices/nld_74175.o \ $(NLOBJ)/devices/nld_74192.o \ $(NLOBJ)/devices/nld_74193.o \ @@ -86,6 +88,8 @@ NLOBJS := \ $(NLOBJ)/devices/nld_9310.o \ $(NLOBJ)/devices/nld_9312.o \ $(NLOBJ)/devices/nld_9316.o \ + $(NLOBJ)/devices/nld_am2847.o \ + $(NLOBJ)/devices/nld_dm9334.o \ $(NLOBJ)/devices/nld_mm5837.o \ $(NLOBJ)/devices/nld_ne555.o \ $(NLOBJ)/devices/nld_r2r_dac.o \ diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index f70e229ddff..a9f087c1002 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -108,6 +108,8 @@ static void initialize_factory(factory_list_t &factory) ENTRYX(nicDelay, NETDEV_DELAY, "-") ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,B,C,D") ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ") + ENTRYX(7473, TTL_7473, "+CLK1,J1,K1,CLRQ1,CLK2,J2,K2,CLRQ2") + ENTRYX(7473A, TTL_7473A, "+CLK1,J1,K1,CLRQ1,CLK2,J2,K2,CLRQ2") ENTRYX(7474, TTL_7474, "+CLK,D,CLRQ,PREQ") ENTRYX(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0") ENTRYX(7490, TTL_7490, "+A,B,R1,R2,R91,R92") @@ -116,15 +118,18 @@ static void initialize_factory(factory_list_t &factory) ENTRYX(74107A, TTL_74107A, "+CLK,J,K,CLRQ") ENTRYX(74123, TTL_74123, "-") ENTRYX(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G") + ENTRYX(74161, TTL_74175, "-") ENTRYX(74175, TTL_74175, "-") ENTRYX(74192, TTL_74192, "-") ENTRYX(74193, TTL_74193, "-") + ENTRYX(DM9334, TTL_DM9334, "-") //ENTRY(74279, TTL_74279, "-") // only dip available ENTRYX(SN74LS629, SN74LS629, "CAP") ENTRYX(82S16, TTL_82S16, "-") ENTRYX(9310, TTL_9310, "-") ENTRYX(9312, TTL_9312, "-") ENTRYX(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") + ENTRYX(AM2847, TTL_AM2847, "-") ENTRYX(CD4020, CD4020, "") ENTRYX(CD4066_GATE, CD4066_GATE, "") /* entries with suffix WI are legacy only */ @@ -135,6 +140,8 @@ static void initialize_factory(factory_list_t &factory) ENTRYX(4538_dip, CD4538_DIP, "-") ENTRYX(7448_dip, TTL_7448_DIP, "-") ENTRYX(7450_dip, TTL_7450_DIP, "-") + ENTRYX(7473_dip, TTL_7473_DIP, "-") + ENTRYX(7473A_dip, TTL_7473A_DIP, "-") ENTRYX(7474_dip, TTL_7474_DIP, "-") ENTRYX(7483_dip, TTL_7483_DIP, "-") ENTRYX(7490_dip, TTL_7490_DIP, "-") @@ -151,6 +158,8 @@ static void initialize_factory(factory_list_t &factory) ENTRYX(9310_dip, TTL_9310_DIP, "-") ENTRYX(9312_dip, TTL_9312_DIP, "-") ENTRYX(9316_dip, TTL_9316_DIP, "-") + ENTRYX(AM2847_dip, TTL_AM2847_DIP, "-") + ENTRYX(DM9334_dip, TTL_DM9334_DIP, "-") ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2") ENTRYX(NE555_dip, NE555_DIP, "-") ENTRYX(MM5837_dip, MM5837_DIP, "-") diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h index b87526bf391..b7248683f0a 100644 --- a/src/lib/netlist/devices/net_lib.h +++ b/src/lib/netlist/devices/net_lib.h @@ -18,6 +18,7 @@ #include "nld_4066.h" #include "nld_7448.h" #include "nld_7450.h" +#include "nld_7473.h" #include "nld_7474.h" #include "nld_7483.h" #include "nld_7490.h" @@ -25,6 +26,7 @@ #include "nld_74107.h" #include "nld_74123.h" #include "nld_74153.h" +#include "nld_74161.h" #include "nld_74175.h" #include "nld_74192.h" #include "nld_74193.h" @@ -35,6 +37,9 @@ #include "nld_9312.h" #include "nld_9316.h" +#include "nld_am2847.h" +#include "nld_dm9334.h" + #include "nld_ne555.h" #include "nld_mm5837.h" diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp new file mode 100644 index 00000000000..b4621daa50f --- /dev/null +++ b/src/lib/netlist/devices/nld_74161.cpp @@ -0,0 +1,131 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_74161.c + * + */ + +#define MAXCNT 15 + +#include "nld_74161.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(74161) + { + NETLIB_CONSTRUCTOR(74161) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") + , m_CLEAR(*this, "CLEAR") + , m_LOAD(*this, "LOAD") + , m_CLK(*this, "CLK") + , m_ENABLEP(*this, "ENABLEP") + , m_ENABLET(*this, "ENABLET") + , m_cnt(*this, "m_cnt", 0) + , m_last_CLK(*this, "m_last_CLK", 0) + , m_Q(*this, {{"QA", "QB", "QC", "QD"}}) + , m_RCO(*this, "RCO") + { + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + logic_input_t m_CLEAR; + logic_input_t m_LOAD; + logic_input_t m_CLK; + logic_input_t m_ENABLEP; + logic_input_t m_ENABLET; + + state_var m_cnt; + state_var m_last_CLK; + + object_array_t m_Q; + logic_output_t m_RCO; + }; + + NETLIB_OBJECT_DERIVED(74161_dip, 74161) + { + NETLIB_CONSTRUCTOR_DERIVED(74161_dip, 74161) + { + register_subalias("1", m_CLEAR); + register_subalias("2", m_CLK); + register_subalias("3", m_A); + register_subalias("4", m_B); + register_subalias("5", m_C); + register_subalias("6", m_D); + register_subalias("7", m_ENABLEP); + + register_subalias("9", m_LOAD); + register_subalias("10", m_ENABLET); + register_subalias("11", m_Q[3]); + register_subalias("12", m_Q[2]); + register_subalias("13", m_Q[1]); + register_subalias("14", m_Q[0]); + register_subalias("15", m_RCO); + + } + }; + + NETLIB_RESET(74161) + { + m_cnt = 0; + m_last_CLK = 0; + } + + // FIXME: Timing + static const netlist_time delay[4] = + { + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40), + NLTIME_FROM_NS(40) + }; + + NETLIB_UPDATE(74161) + { + netlist_sig_t tRippleCarryOut = 0; + if (m_CLEAR()) + { + m_cnt = 0; + } + else if (m_CLK() && !m_last_CLK) + { + if (m_LOAD()) + { + m_cnt = (m_D() << 3) | (m_C() << 2) + | (m_B() << 1) | (m_A() << 0); + } + else if (m_ENABLET() && m_ENABLEP()) + { + m_cnt++; + if (m_cnt > MAXCNT) + m_cnt = 0; + } + } + + if (m_ENABLET() && (m_cnt == MAXCNT)) + tRippleCarryOut = 1; + + m_last_CLK = m_CLK(); + + for (std::size_t i=0; i<4; i++) + m_Q[i].push((m_cnt >> i) & 1, delay[i]); + + m_RCO.push(tRippleCarryOut, NLTIME_FROM_NS(20)); //FIXME + } + + NETLIB_DEVICE_IMPL(74161) + NETLIB_DEVICE_IMPL(74161_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74161.h b/src/lib/netlist/devices/nld_74161.h new file mode 100644 index 00000000000..507bcc5ea6b --- /dev/null +++ b/src/lib/netlist/devices/nld_74161.h @@ -0,0 +1,36 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_74161.h + * + * DM74161: Synchronous 4-Bit Binary Counter with Clock + * + * +--------------+ + * CLEAR |1 ++ 16| VCC + * CLK |2 15| RCO + * A |3 14| QA + * B |4 74161 13| QB + * C |5 12| QC + * D |6 11| QD + * ENABLEP |7 10| ENABLET + * GND |8 9| LOAD + * +--------------+ + * + * RCO: Ripple carry output + * + * Naming convention attempts to follow National Semiconductor datasheet + * + */ + +#ifndef NLD_74161_H_ +#define NLD_74161_H_ + +#include "nl_setup.h" + +#define TTL_74161(name) \ + NET_REGISTER_DEV(TTL_74161, name) + +#define TTL_74161_DIP(name) \ + NET_REGISTER_DEV(TTL_74161_DIP, name) + +#endif /* NLD_74161_H_ */ diff --git a/src/lib/netlist/devices/nld_7473.cpp b/src/lib/netlist/devices/nld_7473.cpp new file mode 100644 index 00000000000..9af4bd89374 --- /dev/null +++ b/src/lib/netlist/devices/nld_7473.cpp @@ -0,0 +1,198 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_74107.c + * + */ + +#include "nld_74107.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(7473_flipflop_base) + { + NETLIB_CONSTRUCTOR(7473_flipflop_base) + , m_CLK(*this, "CLK") + , m_CLR(*this, "CLR") + , m_J(*this, "J") + , m_K(*this, "K") + , m_Q(*this, "Q") + , m_QQ(*this, "QQ") + , m_last_CLK(*this, "m_last_CLK", 0) + { + } + + NETLIB_RESETI(); + + public: + logic_input_t m_CLK; + logic_input_t m_CLR; + logic_input_t m_J; + logic_input_t m_K; + + logic_output_t m_Q; + logic_output_t m_QQ; + + state_var m_last_CLK; + + void tick(); + }; + + NETLIB_RESET(7473_flipflop_base) + { + m_last_CLK = 0; + } + + inline NETLIB_FUNC_VOID(7473_flipflop_base, tick, (void)) + { + const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; + + const netlist_sig_t j = m_J(); + const netlist_sig_t k = m_K(); + const netlist_sig_t old_q = m_Q.net().Q(); + netlist_sig_t q = old_q; + if (j && k) + { + q ^= 1; + } + else if (j) + { + q = 1; + } + else if (k) + { + q = 0; + } + + if (q != old_q) + { + m_Q.push(q, delay[q]); + m_QQ.push(q ^ 1, delay[q ^ 1]); + } + } + + NETLIB_OBJECT_DERIVED(7473_flipflop, 7473_flipflop_base) + { + public: + NETLIB_CONSTRUCTOR_DERIVED(7473_flipflop, 7473_flipflop_base) { } + NETLIB_UPDATEI(); + }; + + NETLIB_UPDATE(7473_flipflop) + { + if (m_CLR()) + { + m_Q.push(0, NLTIME_FROM_NS(40)); + m_QQ.push(1, NLTIME_FROM_NS(25)); + } + else if (m_CLK()) + { + tick(); + } + + m_last_CLK = m_CLK(); + } + + NETLIB_OBJECT_DERIVED(7473A_flipflop, 7473_flipflop_base) + { + public: + NETLIB_CONSTRUCTOR_DERIVED(7473A_flipflop, 7473_flipflop_base) { } + NETLIB_UPDATEI(); + }; + + NETLIB_UPDATE(7473A_flipflop) + { + if (m_CLR()) + { + m_Q.push(0, NLTIME_FROM_NS(40)); + m_QQ.push(1, NLTIME_FROM_NS(25)); + } + else if (!m_CLK() && m_last_CLK) + { + tick(); + } + + m_last_CLK = m_CLK(); + }; + + NETLIB_OBJECT(7473) + { + NETLIB_CONSTRUCTOR(7473) + , m_FF1(*this, "FF1") + , m_FF2(*this, "FF2") + { } + + protected: + NETLIB_SUB(7473_flipflop) m_FF1; + NETLIB_SUB(7473_flipflop) m_FF2; + }; + + NETLIB_OBJECT(7473A) + { + NETLIB_CONSTRUCTOR(7473A) + , m_FF1(*this, "FF1") + , m_FF2(*this, "FF2") + { } + + protected: + NETLIB_SUB(7473A_flipflop) m_FF1; + NETLIB_SUB(7473A_flipflop) m_FF2; + }; + + NETLIB_OBJECT_DERIVED(7473_dip, 7473) + { + NETLIB_CONSTRUCTOR_DERIVED(7473_dip, 7473) + { + register_subalias("1", m_FF1.m_CLK); + register_subalias("2", m_FF1.m_CLR); + register_subalias("3", m_FF1.m_K); + // register_subalias("4", ); ==> VCC + register_subalias("5", m_FF2.m_CLK); + register_subalias("6", m_FF2.m_CLR); + register_subalias("7", m_FF2.m_J); + + register_subalias("8", m_FF2.m_QQ); + register_subalias("9", m_FF2.m_Q); + register_subalias("10", m_FF2.m_K); + // register_subalias("11", ); ==> GND + register_subalias("12", m_FF1.m_Q); + register_subalias("13", m_FF1.m_QQ); + register_subalias("14", m_FF1.m_J); + } + }; + + NETLIB_OBJECT_DERIVED(7473A_dip, 7473A) + { + NETLIB_CONSTRUCTOR_DERIVED(7473A_dip, 7473A) + { + register_subalias("1", m_FF1.m_CLK); + register_subalias("2", m_FF1.m_CLR); + register_subalias("3", m_FF1.m_K); + // register_subalias("4", ); ==> VCC + register_subalias("5", m_FF2.m_CLK); + register_subalias("6", m_FF2.m_CLR); + register_subalias("7", m_FF2.m_J); + + register_subalias("8", m_FF2.m_QQ); + register_subalias("9", m_FF2.m_Q); + register_subalias("10", m_FF2.m_K); + // register_subalias("11", ); ==> GND + register_subalias("12", m_FF1.m_Q); + register_subalias("13", m_FF1.m_QQ); + register_subalias("14", m_FF1.m_J); + } + //NETLIB_RESETI(); + //NETLIB_UPDATEI(); + + private: + }; + + NETLIB_DEVICE_IMPL(7473) + NETLIB_DEVICE_IMPL(7473A) + NETLIB_DEVICE_IMPL(7473_dip) + NETLIB_DEVICE_IMPL(7473A_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7473.h b/src/lib/netlist/devices/nld_7473.h new file mode 100644 index 00000000000..5dbb829fd98 --- /dev/null +++ b/src/lib/netlist/devices/nld_7473.h @@ -0,0 +1,75 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_7473.h + * + * DM7473: Dual Master-Slave J-K Flip-Flops with Clear and Complementary Outputs + * DM7473A: Dual Negative-Edge-Triggered Master-Slave J-K Flip-Flops with Clear and Complementary Outputs + * + * +--------------+ + * CLK1 |1 ++ 14| J1 + * CLR1 |2 13| QQ1 + * K1 |3 12| Q1 + * VCC |4 7473 11| GND + * CLK2 |5 10| K2 + * CLR2 |6 9| Q2 + * J2 |7 8| QQ2 + * +--------------+ + * + * + * Function table 73 + * + * +-----+-----+-----+---++---+-----+ + * | CLR | CLK | J | K || Q | QQ | + * +=====+=====+=====+===++===+=====+ + * | 0 | X | X | X || 0 | 1 | + * | 1 | * | 0 | 0 || Q0| Q0Q | + * | 1 | * | 1 | 0 || 1 | 0 | + * | 1 | * | 0 | 1 || 0 | 1 | + * | 1 | * | 1 | 1 || TOGGLE | + * +-----+-----+-----+---++---+-----+ + * _ + * * = _| |_ + * + * This is positive triggered, J and K + * are latched during clock high and + * transferred when CLK falls. + * + * Function table 73A + * + * +-----+-----+-----+---++---+-----+ + * | CLR | CLK | J | K || Q | QQ | + * +=====+=====+=====+===++===+=====+ + * | 0 | X | X | X || 0 | 1 | + * | 1 | F | 0 | 0 || Q0| Q0Q | + * | 1 | F | 1 | 0 || 1 | 0 | + * | 1 | F | 0 | 1 || 0 | 1 | + * | 1 | F | 1 | 1 || TOGGLE | + * | 1 | 1 | X | X || Q0| Q0Q | + * +-----+-----+-----+---++---+-----+ + * + * THe 73A is negative triggered. + * + * Naming conventions follow Fairchild Semiconductor datasheet + * + */ + +#ifndef NLD_7473_H_ +#define NLD_7473_H_ + +#include "nl_setup.h" + +#define TTL_7473A(name, cCLK, cJ, cK, cCLR) \ + NET_REGISTER_DEV(TTL_7473A, name) \ + NET_CONNECT(name, CLK, cCLK) \ + NET_CONNECT(name, J, cJ) \ + NET_CONNECT(name, K, cK) \ + NET_CONNECT(name, CLRQ, cCLRQ) + +#define TTL_74107(name, cCLK, cJ, cK, cCLRQ) \ + TTL_74107A(name, cCLK, cJ, cK, cCLRQ) + +#define TTL_74107_DIP(name) \ + NET_REGISTER_DEV(TTL_74107_DIP, name) + +#endif /* NLD_74107_H_ */ diff --git a/src/lib/netlist/devices/nld_am2847.cpp b/src/lib/netlist/devices/nld_am2847.cpp new file mode 100644 index 00000000000..c685a7d4c82 --- /dev/null +++ b/src/lib/netlist/devices/nld_am2847.cpp @@ -0,0 +1,131 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_am2847.cpp + * + */ + +#include "nld_am2847.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(Am2847_shifter) + { + NETLIB_CONSTRUCTOR(Am2847_shifter) + , m_RC(*this, "RC") + , m_IN(*this, "IN") + , m_buffer(*this, "m_buffer", 0) + , m_OUT(*this, "OUT") + { + } + + public: + void shift(); + + logic_input_t m_RC; + logic_input_t m_IN; + + state_var m_buffer; + + logic_output_t m_OUT; + }; + + NETLIB_OBJECT(AM2847) + { + NETLIB_CONSTRUCTOR(AM2847) + , m_A(*this, "A") + , m_B(*this, "B") + , m_C(*this, "C") + , m_D(*this, "D") + , m_CP(*this, "CP") + , m_last_CP(*this, "m_last_CP", 0) + { + register_subalias("OUTA", m_A.m_OUT); + register_subalias("OUTB", m_B.m_OUT); + register_subalias("OUTC", m_C.m_OUT); + register_subalias("OUTD", m_D.m_OUT); + register_subalias("INA", m_A.m_IN); + register_subalias("INB", m_B.m_IN); + register_subalias("INC", m_C.m_IN); + register_subalias("IND", m_D.m_IN); + register_subalias("RCA", m_A.m_RC); + register_subalias("RCB", m_B.m_RC); + register_subalias("RCC", m_C.m_RC); + register_subalias("RCD", m_D.m_RC); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(Am2847_shifter) m_A; + NETLIB_SUB(Am2847_shifter) m_B; + NETLIB_SUB(Am2847_shifter) m_C; + NETLIB_SUB(Am2847_shifter) m_D; + logic_input_t m_CP; + + state_var m_last_CP; + }; + + NETLIB_OBJECT_DERIVED(AM2847_dip, AM2847) + { + NETLIB_CONSTRUCTOR_DERIVED(AM2847_dip, AM2847) + { + register_subalias("1", m_A.m_OUT); + register_subalias("2", m_A.m_RC); + register_subalias("3", m_A.m_IN); + register_subalias("4", m_B.m_OUT); + register_subalias("5", m_B.m_RC); + register_subalias("6", m_B.m_IN); + register_subalias("7", m_C.m_OUT); + + register_subalias("9", m_C.m_RC); + register_subalias("10", m_C.m_IN); + register_subalias("11", m_CP); + register_subalias("13", m_D.m_OUT); + register_subalias("14", m_D.m_RC); + register_subalias("15", m_D.m_IN); + + } + }; + + NETLIB_RESET(AM2847) + { + m_last_CP = 0; + } + + NETLIB_UPDATE(AM2847) + { + unsigned cp = m_CP(); + if (cp != m_last_CP && cp != 0) + { + m_A.shift(); + m_B.shift(); + m_C.shift(); + m_D.shift(); + } + + m_last_CP = m_CP(); + } + + inline NETLIB_FUNC_VOID(Am2847_shifter, shift, (void)) + { + unsigned out = m_buffer[0] & 1; + uint_fast32_t in = (m_RC() ? out : m_IN()); + for (std::size_t i=0; i < 5; i++) + { + uint_fast32_t shift_in = (i == 4) ? in : m_buffer[i + 1]; + m_buffer[i] >>= 1; + m_buffer[i] |= shift_in << 31; + } + + m_OUT.push(out, NLTIME_FROM_NS(200)); + } + + NETLIB_DEVICE_IMPL(AM2847) + NETLIB_DEVICE_IMPL(AM2847_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_am2847.h b/src/lib/netlist/devices/nld_am2847.h new file mode 100644 index 00000000000..647d74e8691 --- /dev/null +++ b/src/lib/netlist/devices/nld_am2847.h @@ -0,0 +1,32 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_am2847.h + * + * Am2847: Quad 80-Bit Static Shift Register + * + * +--------------+ + * OUTA |1 ++ 16| VSS + * RCA |2 15| IND + * INA |3 14| RCD + * OUTB |4 Am2847 13| OUTD + * RCB |5 12| VGG + * INB |6 11| CP + * OUTC |7 10| INC + * VDD |8 9| RCC + * +--------------+ + * + */ + +#ifndef NLD_AM2847_H_ +#define NLD_AM2847_H_ + +#include "nl_setup.h" + +#define TTL_AM2847(name) \ + NET_REGISTER_DEV(TTL_AM2847, name) + +#define TTL_AM2847_DIP(name) \ + NET_REGISTER_DEV(TTL_AM2847_DIP, name) + +#endif /* NLD_AM2847_H_ */ diff --git a/src/lib/netlist/devices/nld_dm9334.cpp b/src/lib/netlist/devices/nld_dm9334.cpp new file mode 100644 index 00000000000..028a9485dc2 --- /dev/null +++ b/src/lib/netlist/devices/nld_dm9334.cpp @@ -0,0 +1,152 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_dm9334.cpp + * + */ + +#include "nld_dm9334.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(DM9334) + { + NETLIB_CONSTRUCTOR(DM9334) + , m_C(*this, "C") + , m_E(*this, "E") + , m_D(*this, "D") + , m_A(*this, {{"A0", "A1", "A2"}}) + , m_Q(*this, {{"Q0", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7"}}) + , m_last_C(*this, "m_last_C", 0) + , m_last_E(*this, "m_last_E", 0) + , m_last_D(*this, "m_last_D", 0) + , m_last_A(*this, "m_last_A", 0) + , m_last_Q(*this, "m_last_Q", 0) + { + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + logic_input_t m_C; + logic_input_t m_E; + logic_input_t m_D; + object_array_t m_A; + object_array_t m_Q; + + state_var m_last_C; + state_var m_last_E; + state_var m_last_D; + state_var m_last_A; + state_var m_last_Q; + }; + + NETLIB_OBJECT_DERIVED(DM9334_dip, DM9334) + { + NETLIB_CONSTRUCTOR_DERIVED(DM9334_dip, DM9334) + { + register_subalias("1", m_A[0]); + register_subalias("2", m_A[1]); + register_subalias("3", m_A[2]); + register_subalias("4", m_Q[0]); + register_subalias("5", m_Q[1]); + register_subalias("6", m_Q[2]); + register_subalias("7", m_Q[3]); + + register_subalias("9", m_Q[4]); + register_subalias("10", m_Q[5]); + register_subalias("11", m_Q[6]); + register_subalias("12", m_Q[7]); + register_subalias("13", m_D); + register_subalias("14", m_E); + register_subalias("15", m_C); + + } + }; + + NETLIB_RESET(DM9334) + { + m_last_C = 0; + m_last_E = 0; + m_last_D = 0; + m_last_A = 0; + m_last_Q = 0; + } + + NETLIB_UPDATE(DM9334) + { + uint_fast8_t a = 0; + for (std::size_t i=0; i<3; i++) + { + a |= (m_A[i]() << i); + } + + netlist_time delay = NLTIME_FROM_NS(27); // Clear Low to High Level Output (not documented, making reasonable guess) + + if (a != m_last_A) + { + delay = NLTIME_FROM_NS(35); + } + else if (m_D() != m_last_D) + { + if (m_last_D) + { + delay = NLTIME_FROM_NS(28); + } + else + { + delay = NLTIME_FROM_NS(35); + } + } + else if (m_E() != m_last_E) + { + if (m_last_E) + { + delay = NLTIME_FROM_NS(27); + } + else + { + delay = NLTIME_FROM_NS(28); + } + } + + uint_fast8_t q = m_last_Q; + + if (!m_C()) + { + if (m_E()) + { + q = 0; + } + else + { + q = m_D() << a; + } + } + else if(!m_E()) + { + q &= ~(1 << a); + q |= (m_D() << a); + } + + m_last_C = m_C(); + m_last_E = m_E(); + m_last_D = m_D(); + m_last_A = a; + + if (q != m_last_Q) + { + m_last_Q = q; + for (std::size_t i=0; i<8; i++) + m_Q[i].push((q >> i) & 1, delay); + } + } + + NETLIB_DEVICE_IMPL(DM9334) + NETLIB_DEVICE_IMPL(DM9334_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_dm9334.h b/src/lib/netlist/devices/nld_dm9334.h new file mode 100644 index 00000000000..e024dddebde --- /dev/null +++ b/src/lib/netlist/devices/nld_dm9334.h @@ -0,0 +1,76 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_DM9334.h + * + * DM9334: 8-Bit Addressable Latch + * + * +--------------+ + * A0 |1 ++ 16| VCC + * A1 |2 15| /C + * A2 |3 14| /E + * Q0 |4 DM9334 13| D + * Q1 |5 12| Q7 + * Q2 |6 11| Q6 + * Q3 |7 10| Q5 + * GND |8 9| Q4 + * +--------------+ + * + * +---+---++---++---+---+---++---+---+---+---+---+---+---+---+ + * | C | E || D || A0| A1| A2|| Q0| Q1| Q2| Q3| Q4| Q5| Q6| Q7| + * +===+===++===++===+===+===++===+===+===+===+===+===+===+===+ + * | 1 | 0 || X || X | X | X || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * +---+---++---++---+---+---++---+---+---+---+---+---+---+---+ + * | 1 | 1 || 0 || 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 0 | 0 | 0 || 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 0 || 0 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 0 | 0 | 1 || 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 0 || 0 | 1 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 0 | 1 | 0 || 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 0 || 0 | 1 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 0 | 1 | 1 || 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 0 || 1 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 1 | 0 | 0 || 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | + * | 1 | 1 || 0 || 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + * | 1 | 1 || 0 || 1 | 1 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 1 | 1 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + * | 1 | 1 || 0 || 1 | 1 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + * | 1 | 1 || 1 || 1 | 1 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + * +---+---++---++---+---+---++---+---+---+---+---+---+---+---+ + * | 0 | 0 || X || X | X | X || P | P | P | P | P | P | P | P | + * +---+---++---++---+---+---++---+---+---+---+---+---+---+---+ + * | 0 | 1 || 0 || 0 | 0 | 0 || 0 | P | P | P | P | P | P | P | + * | 0 | 1 || 1 || 0 | 0 | 0 || 1 | P | P | P | P | P | P | P | + * | 0 | 1 || 0 || 0 | 0 | 1 || P | 0 | P | P | P | P | P | P | + * | 0 | 1 || 1 || 0 | 0 | 1 || P | 1 | P | P | P | P | P | P | + * | 0 | 1 || 0 || 0 | 1 | 0 || P | P | 0 | P | P | P | P | P | + * | 0 | 1 || 1 || 0 | 1 | 0 || P | P | 1 | P | P | P | P | P | + * | 0 | 1 || 0 || 0 | 1 | 1 || P | P | P | 0 | P | P | P | P | + * | 0 | 1 || 1 || 0 | 1 | 1 || P | P | P | 1 | P | P | P | P | + * | 0 | 1 || 0 || 1 | 0 | 0 || P | P | P | P | 0 | P | P | P | + * | 0 | 1 || 1 || 1 | 0 | 0 || P | P | P | P | 1 | P | P | P | + * | 0 | 1 || 0 || 1 | 0 | 1 || P | P | P | P | P | 0 | P | P | + * | 0 | 1 || 1 || 1 | 0 | 1 || P | P | P | P | P | 1 | P | P | + * | 0 | 1 || 0 || 1 | 1 | 0 || P | P | P | P | P | P | 0 | P | + * | 0 | 1 || 1 || 1 | 1 | 0 || P | P | P | P | P | P | 1 | P | + * | 0 | 1 || 0 || 1 | 1 | 1 || P | P | P | P | P | P | P | 0 | + * | 0 | 1 || 1 || 1 | 1 | 1 || P | P | P | P | P | P | P | 1 | + * +---+---++---++---+---+---++---+---+---+---+---+---+---+---+ + * + * Naming convention attempts to follow Texas Instruments / National Semiconductor datasheet Literature Number SNOS382A + * + */ + +#ifndef NLD_DM9334_H_ +#define NLD_DM9334_H_ + +#include "nl_setup.h" + +#define TTL_DM9334(name) \ + NET_REGISTER_DEV(TTL_DM9334, name) + +#define TTL_DM9334_DIP(name) \ + NET_REGISTER_DEV(TTL_DM9334_DIP, name) + +#endif /* NLD_DM9334_H_ */