diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index a0ac5045565..fe383c87445 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -107,8 +107,12 @@ project "netlist" 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_7475.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_7475.h", MAME_DIR .. "src/lib/netlist/devices/nld_7483.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_7483.h", + MAME_DIR .. "src/lib/netlist/devices/nld_7485.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_7485.h", MAME_DIR .. "src/lib/netlist/devices/nld_7490.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_7490.h", MAME_DIR .. "src/lib/netlist/devices/nld_7493.cpp", @@ -121,6 +125,8 @@ project "netlist" 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_74165.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_74165.h", MAME_DIR .. "src/lib/netlist/devices/nld_74166.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_74166.h", MAME_DIR .. "src/lib/netlist/devices/nld_74174.cpp", @@ -131,6 +137,8 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_74192.h", MAME_DIR .. "src/lib/netlist/devices/nld_74193.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_74193.h", + MAME_DIR .. "src/lib/netlist/devices/nld_74194.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_74194.h", MAME_DIR .. "src/lib/netlist/devices/nld_74279.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_74279.h", MAME_DIR .. "src/lib/netlist/devices/nld_74365.cpp", @@ -147,6 +155,8 @@ 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_9322.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_9322.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", diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 70aacc15244..71d0d4940ce 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -74,18 +74,22 @@ NLOBJS := \ $(NLOBJ)/devices/nld_7450.o \ $(NLOBJ)/devices/nld_7473.o \ $(NLOBJ)/devices/nld_7474.o \ + $(NLOBJ)/devices/nld_7475.o \ $(NLOBJ)/devices/nld_7483.o \ + $(NLOBJ)/devices/nld_7485.o \ $(NLOBJ)/devices/nld_7490.o \ $(NLOBJ)/devices/nld_7493.o \ $(NLOBJ)/devices/nld_74107.o \ $(NLOBJ)/devices/nld_74123.o \ $(NLOBJ)/devices/nld_74153.o \ $(NLOBJ)/devices/nld_74161.o \ + $(NLOBJ)/devices/nld_74165.o \ $(NLOBJ)/devices/nld_74166.o \ $(NLOBJ)/devices/nld_74174.o \ $(NLOBJ)/devices/nld_74175.o \ $(NLOBJ)/devices/nld_74192.o \ $(NLOBJ)/devices/nld_74193.o \ + $(NLOBJ)/devices/nld_74194.o \ $(NLOBJ)/devices/nld_74279.o \ $(NLOBJ)/devices/nld_74365.o \ $(NLOBJ)/devices/nld_74ls629.o \ @@ -94,6 +98,7 @@ NLOBJS := \ $(NLOBJ)/devices/nld_9310.o \ $(NLOBJ)/devices/nld_9312.o \ $(NLOBJ)/devices/nld_9316.o \ + $(NLOBJ)/devices/nld_9322.o \ $(NLOBJ)/devices/nld_am2847.o \ $(NLOBJ)/devices/nld_dm9334.o \ $(NLOBJ)/devices/nld_mm5837.o \ diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index f235766ebcc..ec402ad5137 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -113,7 +113,10 @@ static void initialize_factory(factory_list_t &factory) 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(7475, TTL_7475, "-") + ENTRYX(7477, TTL_7477, "-") ENTRYX(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0") + ENTRYX(7485, TTL_7485, "-") ENTRYX(7490, TTL_7490, "+A,B,R1,R2,R91,R92") ENTRYX(7493, TTL_7493, "+CLKA,CLKB,R1,R2") ENTRYX(74107, TTL_74107, "+CLK,J,K,CLRQ") @@ -121,11 +124,13 @@ static void initialize_factory(factory_list_t &factory) ENTRYX(74123, TTL_74123, "-") ENTRYX(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G") ENTRYX(74161, TTL_74161, "-") + ENTRYX(74165, TTL_74165, "-") ENTRYX(74166, TTL_74166, "-") ENTRYX(74174, TTL_74174, "-") ENTRYX(74175, TTL_74175, "-") ENTRYX(74192, TTL_74192, "-") ENTRYX(74193, TTL_74193, "-") + ENTRYX(74194, TTL_74194, "-") ENTRYX(74365, TTL_74365, "-") ENTRYX(DM9334, TTL_DM9334, "-") //ENTRY(74279, TTL_74279, "-") // only dip available @@ -135,6 +140,7 @@ static void initialize_factory(factory_list_t &factory) ENTRYX(9310, TTL_9310, "-") ENTRYX(9312, TTL_9312, "-") ENTRYX(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") + ENTRYX(9322, TTL_9322, "-") ENTRYX(AM2847, TTL_AM2847, "-") ENTRYX(CD4020, CD4020, "") ENTRYX(CD4066_GATE, CD4066_GATE, "") @@ -153,18 +159,23 @@ static void initialize_factory(factory_list_t &factory) ENTRYX(7473_dip, TTL_7473_DIP, "-") ENTRYX(7473A_dip, TTL_7473A_DIP, "-") ENTRYX(7474_dip, TTL_7474_DIP, "-") + ENTRYX(7475_dip, TTL_7475_DIP, "-") + ENTRYX(7477_dip, TTL_7477_DIP, "-") ENTRYX(7483_dip, TTL_7483_DIP, "-") + ENTRYX(7485_dip, TTL_7485_DIP, "-") ENTRYX(7490_dip, TTL_7490_DIP, "-") ENTRYX(7493_dip, TTL_7493_DIP, "-") ENTRYX(74107_dip, TTL_74107_DIP, "-") ENTRYX(74123_dip, TTL_74123_DIP, "-") ENTRYX(74153_dip, TTL_74153_DIP, "-") ENTRYX(74161_dip, TTL_74161_DIP, "-") + ENTRYX(74165_dip, TTL_74165_DIP, "-") ENTRYX(74166_dip, TTL_74166_DIP, "-") ENTRYX(74174_dip, TTL_74174_DIP, "-") ENTRYX(74175_dip, TTL_74175_DIP, "-") ENTRYX(74192_dip, TTL_74192_DIP, "-") ENTRYX(74193_dip, TTL_74193_DIP, "-") + ENTRYX(74194_dip, TTL_74194_DIP, "-") ENTRYX(74279_dip, TTL_74279_DIP, "-") ENTRYX(74365_dip, TTL_74365_DIP, "-") ENTRYX(82S16_dip, TTL_82S16_DIP, "-") @@ -173,6 +184,7 @@ 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(9322_dip, TTL_9322_DIP, "-") ENTRYX(AM2847_dip, TTL_AM2847_DIP, "-") ENTRYX(DM9334_dip, TTL_DM9334_DIP, "-") ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2") diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h index 6e9ba446231..178a3020dec 100644 --- a/src/lib/netlist/devices/net_lib.h +++ b/src/lib/netlist/devices/net_lib.h @@ -22,18 +22,22 @@ #include "nld_7450.h" #include "nld_7473.h" #include "nld_7474.h" +#include "nld_7475.h" #include "nld_7483.h" +#include "nld_7485.h" #include "nld_7490.h" #include "nld_7493.h" #include "nld_74107.h" #include "nld_74123.h" #include "nld_74153.h" #include "nld_74161.h" +#include "nld_74165.h" #include "nld_74166.h" #include "nld_74174.h" #include "nld_74175.h" #include "nld_74192.h" #include "nld_74193.h" +#include "nld_74194.h" #include "nld_74279.h" #include "nld_74365.h" #include "nld_74ls629.h" @@ -42,6 +46,7 @@ #include "nld_9310.h" #include "nld_9312.h" #include "nld_9316.h" +#include "nld_9322.h" #include "nld_am2847.h" #include "nld_dm9334.h" diff --git a/src/lib/netlist/devices/nld_74165.cpp b/src/lib/netlist/devices/nld_74165.cpp new file mode 100644 index 00000000000..bb263409bf9 --- /dev/null +++ b/src/lib/netlist/devices/nld_74165.cpp @@ -0,0 +1,107 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_74165.cpp + * + */ + +#include "nld_74165.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(74165) + { + NETLIB_CONSTRUCTOR(74165) + , m_DATA(*this, {{ "H", "G", "F", "E", "D", "C", "B", "A" }}) + , m_SER(*this, "SER") + , m_SH_LDQ(*this, "SH_LDQ") + , m_CLK(*this, "CLK") + , m_CLKINH(*this, "CLKINH") + , m_QH(*this, "QH") + , m_QHQ(*this, "QHQ") + , m_shifter(*this, "m_shifter", 0) + , m_last_CLK(*this, "m_last_CLK", 0) + { + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + object_array_t m_DATA; + logic_input_t m_SER; + logic_input_t m_SH_LDQ; + logic_input_t m_CLK; + logic_input_t m_CLKINH; + logic_output_t m_QH; + logic_output_t m_QHQ; + + state_var m_shifter; + state_var m_last_CLK; + }; + + NETLIB_OBJECT_DERIVED(74165_dip, 74165) + { + NETLIB_CONSTRUCTOR_DERIVED(74165_dip, 74165) + { + register_subalias("1", m_SH_LDQ); + register_subalias("2", m_CLK); + register_subalias("3", m_DATA[4]); + register_subalias("4", m_DATA[5]); + register_subalias("5", m_DATA[6]); + register_subalias("6", m_DATA[7]); + register_subalias("7", m_QHQ); + + register_subalias("9", m_QH); + register_subalias("10", m_SER); + register_subalias("11", m_DATA[0]); + register_subalias("12", m_DATA[1]); + register_subalias("13", m_DATA[2]); + register_subalias("14", m_DATA[3]); + register_subalias("15", m_CLKINH); + + } + }; + + NETLIB_RESET(74165) + { + m_shifter = 0; + m_last_CLK = 0; + } + + // FIXME: Timing + NETLIB_UPDATE(74165) + { + netlist_sig_t old_qh = m_QH.net().Q(); + netlist_sig_t qh = 0; + + if (!m_SH_LDQ()) + { + m_shifter = 0; + for (std::size_t i=0; i<8; i++) + m_shifter |= (m_DATA[i]() << i); + } + else if (!m_CLK() || m_CLKINH()) + { + qh = old_qh; + } + else if (!m_last_CLK) + { + unsigned high_bit = m_SER() ? 0x80 : 0; + m_shifter = high_bit | (m_shifter >> 1); + } + + qh = m_shifter & 1; + + m_last_CLK = m_CLK(); + + m_QH.push(qh, NLTIME_FROM_NS(20)); // FIXME: Timing + } + + NETLIB_DEVICE_IMPL(74165) + NETLIB_DEVICE_IMPL(74165_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74165.h b/src/lib/netlist/devices/nld_74165.h new file mode 100644 index 00000000000..a724cb81da7 --- /dev/null +++ b/src/lib/netlist/devices/nld_74165.h @@ -0,0 +1,50 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_74165.h + * + * 74165: Parallel-Load 8-Bit Shift Register + * + * +--------------+ + * SH/LDQ |1 ++ 16| VCC + * CLK |2 15| CLKINH + * E |3 14| D + * F |4 74165 13| C + * G |5 12| B + * H |6 11| A + * QHQ |7 10| SER + * GND |8 9| QH + * +--------------+ + * + * SH/LDQ: Shift / !Load + * CLKINH: Clock Inhibit + * SER: Serial In + * + * Naming convention attempts to follow NTE Electronics datasheet + * + */ + +#ifndef NLD_74165_H_ +#define NLD_74165_H_ + +#include "nl_setup.h" + +#define TTL_74165(name, cCLK, cCLKINH, cSH_LDQ, cSER, cA, cB, cC, cD, cE, cF, cG, cH) \ + NET_REGISTER_DEV(TTL_74165, name) \ + NET_CONNECT(name, CLK, cCLK) \ + NET_CONNECT(name, CLKINH, cCLKINH) \ + NET_CONNECT(name, SH_LDQ, cSH_LDQ) \ + NET_CONNECT(name, SER, cSER) \ + NET_CONNECT(name, A, cA) \ + NET_CONNECT(name, B, cB) \ + NET_CONNECT(name, C, cC) \ + NET_CONNECT(name, D, cD) \ + NET_CONNECT(name, E, cE) \ + NET_CONNECT(name, F, cF) \ + NET_CONNECT(name, G, cG) \ + NET_CONNECT(name, H, cH) + +#define TTL_74165_DIP(name) \ + NET_REGISTER_DEV(TTL_74165_DIP, name) + +#endif /* NLD_74165_H_ */ diff --git a/src/lib/netlist/devices/nld_74166.cpp b/src/lib/netlist/devices/nld_74166.cpp index 70b41d432e6..5cb7114ee0f 100644 --- a/src/lib/netlist/devices/nld_74166.cpp +++ b/src/lib/netlist/devices/nld_74166.cpp @@ -74,17 +74,6 @@ namespace netlist m_last_CLK = 0; } -#if 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) - }; -#endif - NETLIB_UPDATE(74166) { netlist_sig_t old_qh = m_QH.net().Q(); diff --git a/src/lib/netlist/devices/nld_74166.h b/src/lib/netlist/devices/nld_74166.h index df2d060eef2..0bd3d7eaadd 100644 --- a/src/lib/netlist/devices/nld_74166.h +++ b/src/lib/netlist/devices/nld_74166.h @@ -18,6 +18,7 @@ * * SH/LDQ: Shift / !Load * CLKINH: Clock Inhibit + * SER: Serial In * * Naming convention attempts to follow Texas Instruments datasheet * diff --git a/src/lib/netlist/devices/nld_74194.cpp b/src/lib/netlist/devices/nld_74194.cpp new file mode 100644 index 00000000000..e951e351e93 --- /dev/null +++ b/src/lib/netlist/devices/nld_74194.cpp @@ -0,0 +1,122 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_74194.cpp + * + */ + +#include "nld_74194.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(74194) + { + NETLIB_CONSTRUCTOR(74194) + , m_DATA(*this, {{"D", "C", "B", "A"}}) + , m_SLIN(*this, "SLIN") + , m_SRIN(*this, "SRIN") + , m_CLK(*this, "CLK") + , m_S0(*this, "S0") + , m_S1(*this, "S1") + , m_CLRQ(*this, "CLRQ") + , m_Q(*this, {{"QD", "QC", "QB", "QA"}}) + , m_last_CLK(*this, "m_last_CLK", 0) + , m_last_Q(*this, "m_last_Q", 0) + { + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + protected: + object_array_t m_DATA; + logic_input_t m_SLIN; + logic_input_t m_SRIN; + logic_input_t m_CLK; + logic_input_t m_S0; + logic_input_t m_S1; + logic_input_t m_CLRQ; + object_array_t m_Q; + + state_var m_last_CLK; + state_var m_last_Q; + }; + + NETLIB_OBJECT_DERIVED(74194_dip, 74194) + { + NETLIB_CONSTRUCTOR_DERIVED(74194_dip, 74194) + { + register_subalias("1", m_CLRQ); + register_subalias("2", m_SRIN); + register_subalias("3", m_DATA[3]); + register_subalias("4", m_DATA[2]); + register_subalias("5", m_DATA[1]); + register_subalias("6", m_DATA[0]); + register_subalias("7", m_SLIN); + + register_subalias("9", m_S0); + register_subalias("10", m_S1); + register_subalias("11", m_CLK); + register_subalias("12", m_Q[0]); + register_subalias("13", m_Q[1]); + register_subalias("14", m_Q[2]); + register_subalias("15", m_Q[3]); + + } + }; + + NETLIB_RESET(74194) + { + m_last_CLK = 0; + m_last_Q = 0; + } + + // FIXME: Timing + NETLIB_UPDATE(74194) + { + unsigned q = m_last_Q; + + if (!m_CLRQ()) + { + q = 0; + } + else + { + if (!m_last_CLK && m_CLK()) + { + unsigned s = (m_S1() << 1) | m_S0(); + switch (s) + { + case 0: // LL: Keep old value + break; + case 1: // LH: Shift right + q >>= 1; + q |= m_SRIN() ? 8 : 0; + break; + case 2: + q <<= 1; + q |= m_SLIN() ? 1 : 0; + break; + case 3: + q = 0; + for (std::size_t i=0; i<4; i++) + q |= m_DATA[i]() << i; + break; + } + } + } + + m_last_Q = q; + m_last_CLK = m_CLK(); + + for (std::size_t i=0; i<4; i++) + m_Q[i].push((q >> i) & 1, NLTIME_FROM_NS(26)); // FIXME: Timing + } + + NETLIB_DEVICE_IMPL(74194) + NETLIB_DEVICE_IMPL(74194_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74194.h b/src/lib/netlist/devices/nld_74194.h new file mode 100644 index 00000000000..703cf85a916 --- /dev/null +++ b/src/lib/netlist/devices/nld_74194.h @@ -0,0 +1,47 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_74194.h + * + * 74194: Parallel-Load 8-Bit Shift Register + * + * +--------------+ + * CLRQ |1 ++ 16| VCC + * SRIN |2 15| QA + * A |3 14| QB + * B |4 74194 13| QC + * C |5 12| QD + * D |6 11| CLK + * SLIN |7 10| S1 + * GND |8 9| S0 + * +--------------+ + * + * CLR: Clear + * SRIN: Shift Right Serial Input + * SLIN: Shift Left Serial Input + * CLK: Clock + * + */ + +#ifndef NLD_74194_H_ +#define NLD_74194_H_ + +#include "nl_setup.h" + +#define TTL_74194(name, cCLK, cS0, cS1, cSRIN, cA, cB, cC, cD, cSLIN, cCLRQ) \ + NET_REGISTER_DEV(TTL_74194, name) \ + NET_CONNECT(name, CLK, cCLK) \ + NET_CONNECT(name, S0, cS0) \ + NET_CONNECT(name, S1, cC1) \ + NET_CONNECT(name, SRIN, cSRIN) \ + NET_CONNECT(name, A, cA) \ + NET_CONNECT(name, B, cB) \ + NET_CONNECT(name, C, cC) \ + NET_CONNECT(name, D, cD) \ + NET_CONNECT(name, SLIN, cSLIN) \ + NET_CONNECT(name, CLRQ, cCLRQ) + +#define TTL_74194_DIP(name) \ + NET_REGISTER_DEV(TTL_74194_DIP, name) + +#endif /* NLD_74194_H_ */ diff --git a/src/lib/netlist/devices/nld_7475.cpp b/src/lib/netlist/devices/nld_7475.cpp new file mode 100644 index 00000000000..e788824f940 --- /dev/null +++ b/src/lib/netlist/devices/nld_7475.cpp @@ -0,0 +1,156 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_7475.cpp + * + * TODO: Correct timing for clock-induced state changes, rather than assuming timing is always due to data-induced state changes + */ + +#include "nld_7475.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(7477) + { + NETLIB_CONSTRUCTOR(7477) + , m_C1C2(*this, "C1C2") + , m_C3C4(*this, "C3C4") + , m_last_Q(*this, "m_last_Q", 0) + , m_D(*this, {{"D1", "D2", "D3", "D4"}}) + , m_Q(*this, {{"Q1", "Q2", "Q3", "Q4"}}) + { + register_subalias("Q1", m_Q[0]); + } + + NETLIB_RESETI(); + NETLIB_UPDATEI(); + + void update_outputs(std::size_t start, std::size_t end); + + public: + logic_input_t m_C1C2; + logic_input_t m_C3C4; + state_var m_last_Q; + object_array_t m_D; + object_array_t m_Q; + }; + + NETLIB_OBJECT_DERIVED(7475, 7477) + { + NETLIB_CONSTRUCTOR_DERIVED(7475, 7477) + , m_QQ(*this, {{"QQ1", "QQ2", "QQ3", "QQ4"}}) + { + } + + NETLIB_UPDATEI(); + + public: + object_array_t m_QQ; + }; + + NETLIB_OBJECT_DERIVED(7475_dip, 7475) + { + NETLIB_CONSTRUCTOR_DERIVED(7475_dip, 7475) + { + register_subalias("1", m_QQ[0]); + register_subalias("2", m_D[0]); + register_subalias("3", m_D[1]); + register_subalias("4", m_C3C4); + //register_subalias("5", ); ==> VCC + register_subalias("6", m_D[2]); + register_subalias("7", m_D[3]); + register_subalias("8", m_QQ[3]); + + register_subalias("9", m_Q[3]); + register_subalias("10", m_Q[2]); + register_subalias("11", m_QQ[2]); + //register_subalias("12", ); ==> GND + register_subalias("13", m_C1C2); + register_subalias("14", m_QQ[1]); + register_subalias("15", m_Q[1]); + register_subalias("16", m_Q[0]); + } + }; + + NETLIB_OBJECT_DERIVED(7477_dip, 7477) + { + NETLIB_CONSTRUCTOR_DERIVED(7477_dip, 7477) + { + register_subalias("1", m_D[0]); + register_subalias("2", m_D[1]); + register_subalias("3", m_C3C4); + //register_subalias("4", ); ==> VCC + register_subalias("5", m_D[2]); + register_subalias("6", m_D[3]); + //register_subalias("7", ); ==> NC + + register_subalias("8", m_Q[3]); + register_subalias("9", m_Q[2]); + //register_subalias("10", ); ==> NC + //register_subalias("11", ); ==> GND + register_subalias("12", m_C1C2); + register_subalias("13", m_Q[1]); + register_subalias("14", m_Q[0]); + } + }; + + NETLIB_UPDATE(7475) + { + unsigned start_q = m_last_Q; + + NETLIB_PARENT_UPDATE(7477); + + for (std::size_t i=0; i<4; i++) + { + unsigned last_bit = (m_last_Q >> i) & 1; + unsigned start_bit = (start_q >> i) & 1; + if (last_bit != start_bit) + m_QQ[i].push(last_bit ^ 1, last_bit != 0 ? NLTIME_FROM_NS(15) : NLTIME_FROM_NS(40)); + } + } + + void NETLIB_NAME(7477)::update_outputs(std::size_t start, std::size_t end) + { + for (std::size_t i=start; i> i) & 1)) + m_Q[i].push(d, d != 0 ? NLTIME_FROM_NS(30) : NLTIME_FROM_NS(25)); + m_last_Q &= ~(1 << i); + m_last_Q |= d << i; + } + } + + NETLIB_RESET(7477) + { + m_last_Q = 0; + } + + NETLIB_UPDATE(7477) + { + netlist_sig_t c1c2 = m_C1C2(); + netlist_sig_t c3c4 = m_C3C4(); + if (c1c2 && c3c4) + { + update_outputs(0, 4); + } + else if (c1c2) + { + update_outputs(0, 2); + } + else if (c3c4) + { + update_outputs(2, 4); + } + + } + + NETLIB_DEVICE_IMPL(7475) + NETLIB_DEVICE_IMPL(7475_dip) + NETLIB_DEVICE_IMPL(7477) + NETLIB_DEVICE_IMPL(7477_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7475.h b/src/lib/netlist/devices/nld_7475.h new file mode 100644 index 00000000000..ea7d668acd5 --- /dev/null +++ b/src/lib/netlist/devices/nld_7475.h @@ -0,0 +1,62 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_7475.h + * + * 7475: 4-Bit Bistable Latches with Complementary Outputs + * 7477: 4-Bit Bistable Latches + * + * +----------+ +----------+ + * 1QQ |1 ++ 16| 1Q 1D |1 ++ 14| 1Q + * 1D |2 15| 2Q 2D |2 13| 2Q + * 2D |3 14| 2QQ 3C4C |3 12| 1C2C + * 3C4C |4 7475 13| 1C2C VCC |4 7477 11| GND + * VCC |5 12| GND 3D |5 10| NC + * 3D |6 11| 3QQ 4D |6 9| 3Q + * 4D |7 10| 3Q NC |7 8| 4Q + * 4QQ |8 9| 4Q +----------+ + * +----------+ + * + * + * Function table + * + * +---+---++---+-----+ + * | D | C || Q | QQ | + * +===+===++===+=====+ + * | 0 | 1 || 0 | 1 | + * | 1 | 1 || 1 | 0 | + * | X | 0 || Q0| Q0Q | + * +---+---++---+-----+ + * + * Naming conventions follow Texas instruments datasheet + * + */ + +#ifndef NLD_7475_H_ +#define NLD_7475_H_ + +#include "nl_setup.h" + +#define PARAMS_7475_7477(name, cC1C2, cC3C4, cD1, cD2, cD3, cD4) \ + NET_CONNECT(name, C1C2, cC1C2) \ + NET_CONNECT(name, C3C4, cC3C4) \ + NET_CONNECT(name, D1, cD1) \ + NET_CONNECT(name, D2, cD2) \ + NET_CONNECT(name, D3, cD3) \ + NET_CONNECT(name, D4, cD4) + +#define TTL_7475(name, cC1C2, cC3C4, cD1, cD2, cD3, cD4) \ + NET_REGISTER_DEV(TTL_7475, name) \ + PARAMS_7475_7477(name, cC1C2, cC3C4, cD1, cD2, cD3, cD4) + +#define TTL_7477(name, cC1C2, cC3C4, cD1, cD2, cD3, cD4) \ + NET_REGISTER_DEV(TTL_7477, name) \ + PARAMS_7475_7477(name, cC1C2, cC3C4, cD1, cD2, cD3, cD4) + +#define TTL_7475_DIP(name) \ + NET_REGISTER_DEV(TTL_7475_DIP, name) + +#define TTL_7477_DIP(name) \ + NET_REGISTER_DEV(TTL_7477_DIP, name) + +#endif /* NLD_7475_H_ */ diff --git a/src/lib/netlist/devices/nld_7485.cpp b/src/lib/netlist/devices/nld_7485.cpp new file mode 100644 index 00000000000..631257ecb4e --- /dev/null +++ b/src/lib/netlist/devices/nld_7485.cpp @@ -0,0 +1,107 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_7485.cpp + * + */ + +#include "nld_7485.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(7485) + { + NETLIB_CONSTRUCTOR(7485) + , m_A(*this, {{"A0", "A1", "A2", "A3"}}) + , m_B(*this, {{"B0", "B1", "B2", "B3"}}) + , m_LTIN(*this, "LTIN") + , m_EQIN(*this, "EQIN") + , m_GTIN(*this, "GTIN") + , m_LTOUT(*this, "LTOUT") + , m_EQOUT(*this, "EQOUT") + , m_GTOUT(*this, "GTOUT") + { + } + + NETLIB_UPDATEI(); + + void update_outputs(unsigned gt, unsigned lt, unsigned eq); + + protected: + object_array_t m_A; + object_array_t m_B; + logic_input_t m_LTIN; + logic_input_t m_EQIN; + logic_input_t m_GTIN; + logic_output_t m_LTOUT; + logic_output_t m_EQOUT; + logic_output_t m_GTOUT; + }; + + NETLIB_OBJECT_DERIVED(7485_dip, 7485) + { + NETLIB_CONSTRUCTOR_DERIVED(7485_dip, 7485) + { + register_subalias("1", m_B[3]); + register_subalias("2", m_LTIN); + register_subalias("3", m_EQIN); + register_subalias("4", m_GTIN); + register_subalias("5", m_GTOUT); + register_subalias("6", m_EQOUT); + register_subalias("7", m_LTOUT); + + register_subalias("9", m_B[0]); + register_subalias("10", m_A[0]); + register_subalias("11", m_B[1]); + register_subalias("12", m_A[1]); + register_subalias("13", m_A[2]); + register_subalias("14", m_B[2]); + register_subalias("15", m_A[3]); + + } + }; + + void NETLIB_NAME(7485)::update_outputs(unsigned gt, unsigned lt, unsigned eq) + { + m_GTOUT.push(gt, NLTIME_FROM_NS(23)); + m_LTOUT.push(lt, NLTIME_FROM_NS(23)); + m_EQOUT.push(eq, NLTIME_FROM_NS(23)); + } + + // FIXME: Timing + NETLIB_UPDATE(7485) + { + for (std::int_fast32_t i = 3; i >= 0; i++) + { + if (m_A[i]() > m_B[i]()) + { + update_outputs(1, 0, 0); + return; + } + else if (m_A[i]() < m_B[i]()) + { + update_outputs(0, 1, 0); + return; + } + } + + // must be == if we got here + if (m_EQIN()) + update_outputs(0, 0, 1); + else if (m_GTIN() && m_LTIN()) + update_outputs(0, 0, 0); + else if (m_GTIN()) + update_outputs(1, 0, 0); + else if (m_LTIN()) + update_outputs(0, 1, 0); + else + update_outputs(1, 1, 0); + } + + NETLIB_DEVICE_IMPL(7485) + NETLIB_DEVICE_IMPL(7485_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_7485.h b/src/lib/netlist/devices/nld_7485.h new file mode 100644 index 00000000000..d97a323e416 --- /dev/null +++ b/src/lib/netlist/devices/nld_7485.h @@ -0,0 +1,45 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_7485.h + * + * DM7485: 4-bit Magnitude Comparators + * + * +------------+ + * B3 |1 ++ 16| VCC + * LTIN |2 15| A3 + * EQIN |3 14| B2 + * GTIN |4 7485 13| A2 + * GTOUT |5 12| A1 + * EQOUT |6 11| B1 + * LTOUT |7 10| A0 + * GND |8 9| B0 + * +------------+ + * + * Naming convention attempts to follow Texas Instruments datasheet + * + */ + +#ifndef NLD_7485_H_ +#define NLD_7485_H_ + +#include "nl_setup.h" + +#define TTL_7485(name, cA0, cA1, cA2, cA3, cB0, cB1, cB2, cB3, cLTIN, cEQIN, cGTIN) \ + NET_REGISTER_DEV(TTL_7485, name) \ + NET_CONNECT(name, A0, cA0) \ + NET_CONNECT(name, A1, cA1) \ + NET_CONNECT(name, A2, cA2) \ + NET_CONNECT(name, A3, cA3) \ + NET_CONNECT(name, B0, cB0) \ + NET_CONNECT(name, B1, cB1) \ + NET_CONNECT(name, B2, cB2) \ + NET_CONNECT(name, B3, cB3) \ + NET_CONNECT(name, LTIN, cLTIN) \ + NET_CONNECT(name, EQIN, cEQIN) \ + NET_CONNECT(name, GTIN, cGTIN) + +#define TTL_7485_DIP(name) \ + NET_REGISTER_DEV(TTL_7485_DIP, name) + +#endif /* NLD_7485_H_ */ diff --git a/src/lib/netlist/devices/nld_9322.cpp b/src/lib/netlist/devices/nld_9322.cpp new file mode 100644 index 00000000000..afecca03e63 --- /dev/null +++ b/src/lib/netlist/devices/nld_9322.cpp @@ -0,0 +1,102 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_9322.cpp + * + */ + +#include "nld_9322.h" + +namespace netlist +{ + namespace devices + { + NETLIB_OBJECT(9322_selector) + { + NETLIB_CONSTRUCTOR(9322_selector) + , m_A(*this, "A") + , m_B(*this, "B") + , m_Y(*this, "Y") + { + } + + void update_outputs(const netlist_sig_t strobe, const netlist_sig_t select); + + public: + logic_input_t m_A; + logic_input_t m_B; + logic_output_t m_Y; + }; + + // FIXME: Timing + void NETLIB_NAME(9322_selector)::update_outputs(const netlist_sig_t strobe, const netlist_sig_t select) + { + if (strobe) + m_Y.push(0, NLTIME_FROM_NS(21)); + else if (select) + m_Y.push(m_B(), NLTIME_FROM_NS(14)); + else + m_Y.push(m_A(), NLTIME_FROM_NS(14)); + } + + NETLIB_OBJECT(9322) + { + NETLIB_CONSTRUCTOR(9322) + , m_1(*this, "1") + , m_2(*this, "2") + , m_3(*this, "3") + , m_4(*this, "4") + , m_SELECT(*this, "SELECT") + , m_STROBE(*this, "STROBE") + { + } + + NETLIB_UPDATEI(); + + protected: + NETLIB_SUB(9322_selector) m_1; + NETLIB_SUB(9322_selector) m_2; + NETLIB_SUB(9322_selector) m_3; + NETLIB_SUB(9322_selector) m_4; + + logic_input_t m_SELECT; + logic_input_t m_STROBE; + }; + + NETLIB_OBJECT_DERIVED(9322_dip, 9322) + { + NETLIB_CONSTRUCTOR_DERIVED(9322_dip, 9322) + { + register_subalias("1", m_SELECT); + register_subalias("2", m_1.m_A); + register_subalias("3", m_1.m_B); + register_subalias("4", m_1.m_Y); + register_subalias("5", m_2.m_A); + register_subalias("6", m_2.m_B); + register_subalias("7", m_2.m_Y); + + register_subalias("9", m_3.m_Y); + register_subalias("10", m_3.m_B); + register_subalias("11", m_3.m_A); + register_subalias("12", m_4.m_Y); + register_subalias("13", m_4.m_B); + register_subalias("14", m_4.m_A); + register_subalias("15", m_STROBE); + } + }; + + NETLIB_UPDATE(9322) + { + const netlist_sig_t strobe = m_STROBE(); + const netlist_sig_t select = m_SELECT(); + m_1.update_outputs(strobe, select); + m_2.update_outputs(strobe, select); + m_3.update_outputs(strobe, select); + m_4.update_outputs(strobe, select); + } + + NETLIB_DEVICE_IMPL(9322) + NETLIB_DEVICE_IMPL(9322_dip) + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_9322.h b/src/lib/netlist/devices/nld_9322.h new file mode 100644 index 00000000000..e47bb9eda32 --- /dev/null +++ b/src/lib/netlist/devices/nld_9322.h @@ -0,0 +1,42 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + * nld_9322.h + * + * 9322: Quad 2-Line to 1-Line Data Selectors/Multiplexers + * + * +------------+ + * SELECT |1 ++ 16| VCC + * A1 |2 15| STROBE + * B1 |3 14| A4 + * Y1 |4 9322 13| B4 + * A2 |5 12| Y4 + * B2 |6 11| A3 + * Y2 |7 10| B3 + * GND |8 9| Y3 + * +------------+ + * + */ + +#ifndef NLD_9322_H_ +#define NLD_9322_H_ + +#include "nl_setup.h" + +#define TTL_9322(name, cSELECT, cA1, cB1, cA2, cB2, cA3, cB3, cA4, cB4, cSTROBE) \ + NET_REGISTER_DEV(TTL_9322, name) \ + NET_CONNECT(name, SELECT, cSELECT) \ + NET_CONNECT(name, A1, cA1) \ + NET_CONNECT(name, B1, cB1) \ + NET_CONNECT(name, A2, cA2) \ + NET_CONNECT(name, B2, cB2) \ + NET_CONNECT(name, A3, cA3) \ + NET_CONNECT(name, B3, cB3) \ + NET_CONNECT(name, A4, cA4) \ + NET_CONNECT(name, B4, cB4) \ + NET_CONNECT(name, STROBE, cSTROBE) + +#define TTL_9322_DIP(name) \ + NET_REGISTER_DEV(TTL_9322_DIP, name) + +#endif /* NLD_9322_H_ */ diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 6d4a001f7fd..fe799af4c2c 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -125,6 +125,7 @@ class NETLIB_NAME(name) : public device_t #define NETLIB_SUBXX(chip) std::unique_ptr< nld_ ## chip > #define NETLIB_UPDATE(chip) void NETLIB_NAME(chip) :: update(void) NL_NOEXCEPT +#define NETLIB_PARENT_UPDATE(chip) NETLIB_NAME(chip) :: update(); #define NETLIB_RESET(chip) void NETLIB_NAME(chip) :: reset(void) diff --git a/src/mame/drivers/atarittl.cpp b/src/mame/drivers/atarittl.cpp index 3a07b4cc16e..2f9e10d67eb 100644 --- a/src/mame/drivers/atarittl.cpp +++ b/src/mame/drivers/atarittl.cpp @@ -57,28 +57,14 @@ netlist system per-game: TM-057 (Stunt Cycle) - 4001 Quad 2-Input NOR Gates - 4016 Quad Bilateral Switch 4136 Quad General-Purpose Operational Amplifiers - 7485 4-bit Magnitude Counters - 74165 8-bit Parallel-In/Serial-Out Shift Register - 74194 4-bit Bidirectional Universal Shift Register - 9312 One-of-Eight Line Data Selectors/Multiplexers - 9316 Synchronous 4-bit Counters - 9322 Quad 2-Line to 1-Line Data Selectors/Multiplexers - 9602 Dual Retriggerable, Resettable One Shots TM-055 (Indy 4) 7406 Hex Inverter Buffers/Drivers with O.C. H.V. Outputs (note: Might not be needed, could just clone from 7404) 7414 Hex Schmitt-Trigger Inverters 7417 Hex Buffers/Drivers - 7475 4-bit Bistable Latches - 7485 4-bit Magnitude Comparators 74164 8-bit Serial-In, Parallel-Out Shift Register 9301 1-of-10 Decoder - 9312 One-of-Eight Line Data Selectors/Multiplexers - 9316 Synchronous 4-Bit Counters - 9322 Quad 2-Line to 1-Line Data Selectors/Multiplexers LM339 Quad Comparator ***************************************************************************/