diff --git a/.gitattributes b/.gitattributes index 68aff803ffa..92c7847ea4f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2937,6 +2937,8 @@ src/emu/netlist/analog/nld_twoterm.c svneol=native#text/plain src/emu/netlist/analog/nld_twoterm.h svneol=native#text/plain src/emu/netlist/devices/net_lib.c svneol=native#text/plain src/emu/netlist/devices/net_lib.h svneol=native#text/plain +src/emu/netlist/devices/nld_4020.c svneol=native#text/plain +src/emu/netlist/devices/nld_4020.h svneol=native#text/plain src/emu/netlist/devices/nld_4066.c svneol=native#text/plain src/emu/netlist/devices/nld_4066.h svneol=native#text/plain src/emu/netlist/devices/nld_7400.c svneol=native#text/plain @@ -2987,6 +2989,7 @@ src/emu/netlist/devices/nld_74ls629.c svneol=native#text/plain src/emu/netlist/devices/nld_74ls629.h svneol=native#text/plain src/emu/netlist/devices/nld_9316.c svneol=native#text/plain src/emu/netlist/devices/nld_9316.h svneol=native#text/plain +src/emu/netlist/devices/nld_cmos.h svneol=native#text/plain src/emu/netlist/devices/nld_legacy.c svneol=native#text/plain src/emu/netlist/devices/nld_legacy.h svneol=native#text/plain src/emu/netlist/devices/nld_log.c svneol=native#text/plain diff --git a/src/emu/netlist/devices/net_lib.c b/src/emu/netlist/devices/net_lib.c index b4026a2dfb7..e8d73e05b81 100644 --- a/src/emu/netlist/devices/net_lib.c +++ b/src/emu/netlist/devices/net_lib.c @@ -101,6 +101,8 @@ void netlist_factory_t::initialize() ENTRY(gnd, GND, "-") ENTRY(switch2, SWITCH2, "-") ENTRY(nicRSFF, NETDEV_RSFF, "+S,R") + ENTRY(4020, CD_4020, "+IP,RESET,VDD,VSS") + //ENTRY(4066, CD_4066, "+A,B") ENTRY(7400, TTL_7400_NAND, "+A,B") ENTRY(7402, TTL_7402_NOR, "+A,B") ENTRY(7404, TTL_7404_INVERT, "+A") @@ -127,7 +129,8 @@ void netlist_factory_t::initialize() ENTRY(SN74LS629, SN74LS629, "CAP") ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") ENTRY(NE555, NE555, "-") - ENTRY(4066_dip, CD_4066_DIP, "-") + ENTRY(4020_dip, CD_4020_DIP, "-") + ENTRY(4066_dip, CD_4066_DIP, "-") ENTRY(7400_dip, TTL_7400_DIP, "-") ENTRY(7402_dip, TTL_7402_DIP, "-") ENTRY(7404_dip, TTL_7404_DIP, "-") diff --git a/src/emu/netlist/devices/net_lib.h b/src/emu/netlist/devices/net_lib.h index d1fdb818785..3c563aee1a3 100644 --- a/src/emu/netlist/devices/net_lib.h +++ b/src/emu/netlist/devices/net_lib.h @@ -54,6 +54,7 @@ #include "nld_signal.h" #include "nld_system.h" +#include "nld_4020.h" #include "nld_4066.h" #include "nld_7400.h" #include "nld_7402.h" diff --git a/src/emu/netlist/devices/nld_4020.c b/src/emu/netlist/devices/nld_4020.c new file mode 100644 index 00000000000..5740d7e07c0 --- /dev/null +++ b/src/emu/netlist/devices/nld_4020.c @@ -0,0 +1,137 @@ +/* + * nld_4020.c + * + */ + +#include "nld_4020.h" + +NETLIB_START(4020) +{ + register_sub(sub, "sub"); + + register_input("RESET", m_RESET); + register_subalias("IP", sub.m_IP); + register_subalias("Q1", sub.m_Q[0]); + register_subalias("Q4", sub.m_Q[3]); + register_subalias("Q5", sub.m_Q[4]); + register_subalias("Q6", sub.m_Q[5]); + register_subalias("Q7", sub.m_Q[6]); + register_subalias("Q8", sub.m_Q[7]); + register_subalias("Q9", sub.m_Q[8]); + register_subalias("Q10", sub.m_Q[9]); + register_subalias("Q11", sub.m_Q[10]); + register_subalias("Q12", sub.m_Q[11]); + register_subalias("Q13", sub.m_Q[12]); + register_subalias("Q14", sub.m_Q[13]); + register_subalias("VDD", m_supply.m_vdd); + register_subalias("VSS", m_supply.m_vss); +} + +NETLIB_RESET(4020) +{ + sub.do_reset(); +} + + +NETLIB_START(4020_sub) +{ + register_input("IP", m_IP); + + register_output("Q1", m_Q[0]); + register_output("Q4", m_Q[3]); + register_output("Q5", m_Q[4]); + register_output("Q6", m_Q[5]); + register_output("Q7", m_Q[6]); + register_output("Q8", m_Q[8]); + register_output("Q9", m_Q[8]); + register_output("Q10", m_Q[9]); + register_output("Q11", m_Q[10]); + register_output("Q12", m_Q[11]); + register_output("Q13", m_Q[12]); + register_output("Q14", m_Q[13]); + + save(NAME(m_cnt)); +} + +NETLIB_RESET(4020_sub) +{ + m_IP.set_state(netlist_input_t::STATE_INP_HL); + m_cnt = 0; +} + +NETLIB_UPDATE(4020_sub) +{ + UINT8 cnt = m_cnt; + cnt = ( cnt + 1) & 0x3fff; + update_outputs(cnt); + m_cnt = cnt; +} + +NETLIB_UPDATE(4020) +{ + + if (INPLOGIC(m_RESET)) + { + sub.m_cnt = 0; + static const netlist_time reset_time = netlist_time::from_nsec(140); + OUTLOGIC(sub.m_Q[0], 0, reset_time); + for (int i=3; i<14; i++) + OUTLOGIC(sub.m_Q[i], 0, reset_time); + } + +} + +inline NETLIB_FUNC_VOID(4020_sub, update_outputs, (const UINT16 cnt)) +{ + const netlist_time out_delayQ1 = netlist_time::from_nsec(180); + const netlist_time out_delayQn = netlist_time::from_nsec(100); + + OUTLOGIC(m_Q[0], 0, out_delayQ1); + for (int i=3; i<14; i++) + OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn); +} + +NETLIB_START(4020_dip) +{ + NETLIB_NAME(4020)::start(); + + /* +--------------+ + * Q12 |1 ++ 16| VDD + * Q13 |2 15| Q11 + * Q14 |3 14| Q10 + * Q6 |4 4020 13| Q8 + * Q5 |5 12| Q9 + * Q7 |6 11| RESET + * Q4 |7 10| IP (Input pulses) + * VSS |8 9| Q1 + * +--------------+ + */ + + register_subalias("1", sub.m_Q[11]); + register_subalias("2", sub.m_Q[12]); + register_subalias("3", sub.m_Q[13]); + register_subalias("4", sub.m_Q[5]); + register_subalias("5", sub.m_Q[4]); + register_subalias("6", sub.m_Q[6]); + register_subalias("7", sub.m_Q[3]); + register_subalias("8", m_supply.m_vss); + + register_subalias("9", sub.m_Q[1]); + register_subalias("10", sub.m_IP); + register_subalias("11", m_RESET); + register_subalias("12", sub.m_Q[8]); + register_subalias("13", sub.m_Q[7]); + register_subalias("14", sub.m_Q[9]); + register_subalias("15", sub.m_Q[10]); + register_subalias("16", m_supply.m_vdd); +} + +NETLIB_UPDATE(4020_dip) +{ + NETLIB_NAME(4020)::update(); +} + +NETLIB_RESET(4020_dip) +{ + NETLIB_NAME(4020)::reset(); +} diff --git a/src/emu/netlist/devices/nld_4020.h b/src/emu/netlist/devices/nld_4020.h new file mode 100644 index 00000000000..b68e7cbff17 --- /dev/null +++ b/src/emu/netlist/devices/nld_4020.h @@ -0,0 +1,62 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_4020.h + * + * CD4020: CMOS Ripple-Carry Binary Counters/Dividers + * + * +--------------+ + * Q12 |1 ++ 16| VDD + * Q13 |2 15| Q11 + * Q14 |3 14| Q10 + * Q6 |4 4020 13| Q8 + * Q5 |5 12| Q9 + * Q7 |6 11| RESET + * Q4 |7 10| IP (Input pulses) + * VSS |8 9| Q1 + * +--------------+ + * + * + * Naming conventions follow Texas Instruments datasheet + * + * FIXME: Timing depends on VDD-VSS + * This needs a cmos d-a/a-d proxy implementation. + * + */ + +#ifndef NLD_4020_H_ +#define NLD_4020_H_ + +#include "../nl_base.h" +#include "nld_cmos.h" + +#define CD_4020(_name, _IP, _RESET, _VDD, _VSS) \ + NET_REGISTER_DEV(4020, _name) \ + NET_CONNECT(_name, IP, _IP) \ + NET_CONNECT(_name, RESET, _RESET) \ + NET_CONNECT(_name, VDD, _VDD) \ + NET_CONNECT(_name, VSS, _VSS) + +#define CD_4020_DIP(_name) \ + NET_REGISTER_DEV(4020_dip, _name) + +NETLIB_SUBDEVICE(4020_sub, + ATTR_HOT void update_outputs(const UINT16 cnt); + + netlist_ttl_input_t m_IP; + + netlist_state_t m_cnt; + + netlist_ttl_output_t m_Q[14]; +); + +NETLIB_DEVICE(4020, + NETLIB_NAME(4020_sub) sub; + NETLIB_NAME(vdd_vss) m_supply; + netlist_ttl_input_t m_RESET; +); + +NETLIB_DEVICE_DERIVED(4020_dip, 4020, +); + +#endif /* NLD_4020_H_ */ diff --git a/src/emu/netlist/devices/nld_4066.c b/src/emu/netlist/devices/nld_4066.c index 2368f18c864..527477fc756 100644 --- a/src/emu/netlist/devices/nld_4066.c +++ b/src/emu/netlist/devices/nld_4066.c @@ -5,17 +5,6 @@ #include "nld_4066.h" -NETLIB_START(vdd_vss) -{ -} - -NETLIB_RESET(vdd_vss) -{ -} - -NETLIB_UPDATE(vdd_vss) -{ -} NETLIB_START(4066) { diff --git a/src/emu/netlist/devices/nld_4066.h b/src/emu/netlist/devices/nld_4066.h index 8db2c21be2e..15196c700a4 100644 --- a/src/emu/netlist/devices/nld_4066.h +++ b/src/emu/netlist/devices/nld_4066.h @@ -25,20 +25,11 @@ #define NLD_4066_H_ #include "../nl_base.h" -#include "../analog/nld_twoterm.h" +#include "nld_cmos.h" #define CD_4066_DIP(_name) \ NET_REGISTER_DEV(4066_dip, _name) -NETLIB_SUBDEVICE(vdd_vss, - netlist_analog_input_t m_vdd; - netlist_analog_input_t m_vss; - -public: - ATTR_HOT inline double vdd() { return INPANALOG(m_vdd); } - ATTR_HOT inline double vss() { return INPANALOG(m_vss); } -); - NETLIB_SUBDEVICE(4066, public: diff --git a/src/emu/netlist/devices/nld_cmos.h b/src/emu/netlist/devices/nld_cmos.h new file mode 100644 index 00000000000..b78d9dd090c --- /dev/null +++ b/src/emu/netlist/devices/nld_cmos.h @@ -0,0 +1,32 @@ +/* + * nld_cmos.h + * + */ + +#ifndef NLD_CMOS_H_ +#define NLD_CMOS_H_ + +#include "../nl_base.h" +#include "../analog/nld_twoterm.h" + +class nld_vdd_vss : public netlist_device_t +{ + public: + nld_vdd_vss () + : netlist_device_t() + { } + + netlist_analog_input_t m_vdd; + netlist_analog_input_t m_vss; + + protected: + ATTR_HOT void update() {}; + ATTR_HOT void start() {}; + ATTR_HOT void reset() {}; + +public: + ATTR_HOT inline double vdd() { return INPANALOG(m_vdd); } + ATTR_HOT inline double vss() { return INPANALOG(m_vss); } +}; + +#endif /* NLD_CMOS_H_ */ diff --git a/src/emu/netlist/netlist.mak b/src/emu/netlist/netlist.mak index 1643726b494..b69090a71ce 100644 --- a/src/emu/netlist/netlist.mak +++ b/src/emu/netlist/netlist.mak @@ -33,6 +33,7 @@ NETLISTOBJS+= \ $(NETLISTOBJ)/analog/nld_solver.o \ $(NETLISTOBJ)/analog/nld_switches.o \ $(NETLISTOBJ)/analog/nld_twoterm.o \ + $(NETLISTOBJ)/devices/nld_4020.o \ $(NETLISTOBJ)/devices/nld_4066.o \ $(NETLISTOBJ)/devices/nld_7400.o \ $(NETLISTOBJ)/devices/nld_7402.o \