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
This commit is contained in:
therealmogminer@gmail.com 2016-12-13 19:09:49 +01:00
parent 3dba2b07a3
commit 72f4f2a20e
14 changed files with 877 additions and 10 deletions

View File

@ -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",

View File

@ -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),

View File

@ -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;

View File

@ -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 \

View File

@ -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, "-")

View File

@ -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"

View File

@ -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<unsigned> m_cnt;
state_var<unsigned> m_last_CLK;
object_array_t<logic_output_t, 4> 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

View File

@ -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_ */

View File

@ -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<netlist_sig_t> 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

View File

@ -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_ */

View File

@ -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<uint_fast32_t[5]> 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<uint_fast32_t> 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

View File

@ -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_ */

View File

@ -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<logic_input_t, 3> m_A;
object_array_t<logic_output_t, 8> m_Q;
state_var<unsigned> m_last_C;
state_var<unsigned> m_last_E;
state_var<unsigned> m_last_D;
state_var<unsigned> m_last_A;
state_var<unsigned> 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

View File

@ -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_ */