mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
Introduced user definable truth tables:
NETLIST_START(lib) TRUTHTABLE_START(TTL_7400A_NAND, 2, 1, 0, "+A,B") TT_HEAD(" A , B | Q ") TT_LINE(" 0 , X | 1 |22") TT_LINE(" X , 0 | 1 |22") TT_LINE(" 1 , 1 | 0 |15") TRUTHTABLE_END() NETLIST_END() This enables the addition of devices without changing the netlist source code and allows the creation of libraries. Used pong.c as a proof of concept for the time being. [Couriersud]
This commit is contained in:
parent
cef370aa13
commit
1d99211b55
@ -5,23 +5,6 @@
|
||||
|
||||
#include "netlist/devices/net_lib.h"
|
||||
|
||||
struct ttd
|
||||
{
|
||||
nl_util::pstring_list a;
|
||||
};
|
||||
|
||||
ttd * nl_register_tt(pstring name, int in, int out);
|
||||
|
||||
|
||||
#define NETLIST_TT(_name, _in, _out) \
|
||||
{ \
|
||||
ttd *a = setup.register_tt(# _name, _in, _out); \
|
||||
|
||||
#define TT_LINE(_x) \
|
||||
a->a.add(_x);
|
||||
|
||||
#define TT_END() }
|
||||
|
||||
NETLIST_START(7400_TTL)
|
||||
NET_REGISTER_DEV(7400, s1)
|
||||
NET_REGISTER_DEV(7400, s2)
|
||||
@ -47,12 +30,12 @@ NETLIST_START(7400_TTL)
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(lib)
|
||||
NETLIST_TT(7400, 2, 1)
|
||||
TT_LINE("A,B | Q ")
|
||||
TT_LINE("0,X|1|22")
|
||||
TT_LINE("X,0|1|22")
|
||||
TT_LINE("1,1|0|15")
|
||||
TT_END()
|
||||
TRUTHTABLE_START(7400A, 2, 1, 0, "+A,B")
|
||||
TT_HEAD(" A , B | Q ")
|
||||
TT_LINE(" 0 , X | 1 |22")
|
||||
TT_LINE(" X , 0 | 1 |22")
|
||||
TT_LINE(" 1 , 1 | 0 |15")
|
||||
TRUTHTABLE_END()
|
||||
NETLIST_END()
|
||||
|
||||
|
||||
|
@ -41,7 +41,7 @@ NETLIST_END()
|
||||
#define ENTRY1(_nic, _name, _defparam) factory.register_device<_nic>( # _name, xstr(_nic), _defparam );
|
||||
#define ENTRY(_nic, _name, _defparam) ENTRY1(NETLIB_NAME(_nic), _name, _defparam)
|
||||
|
||||
void nl_initialize_factory(netlist_factory_t &factory)
|
||||
void nl_initialize_factory(netlist_factory_list_t &factory)
|
||||
{
|
||||
ENTRY(R, RES, "R")
|
||||
ENTRY(POT, POT, "R")
|
||||
|
@ -67,6 +67,6 @@
|
||||
NETLIST_EXTERNAL(diode_models);
|
||||
NETLIST_EXTERNAL(bjt_models);
|
||||
|
||||
void nl_initialize_factory(netlist_factory_t &factory);
|
||||
void nl_initialize_factory(netlist_factory_list_t &factory);
|
||||
|
||||
#endif
|
||||
|
@ -235,3 +235,35 @@ ATTR_COLD void truthtable_desc_t::setup(const pstring_list_t &truthtable, UINT32
|
||||
*m_initialized = true;
|
||||
|
||||
}
|
||||
|
||||
#define ENTRYX(_n,_m,_h) case (_n * 1000 + _m * 10 + _h): \
|
||||
{ typedef netlist_factory_truthtable_t<_n,_m,_h> xtype; \
|
||||
return palloc(xtype,name,classname,def_param); } break
|
||||
|
||||
#define ENTRYY(_n,_m) ENTRYX(_n,_m,0); ENTRYX(_n,_m,1)
|
||||
|
||||
#define ENTRY(_n) ENTRYY(_n, 1); ENTRYY(_n, 2); ENTRYY(_n, 3); ENTRYY(_n, 4); ENTRYY(_n, 5); ENTRYY(_n, 6)
|
||||
|
||||
netlist_base_factory_truthtable_t *nl_tt_factory_create(const unsigned ni, const unsigned no,
|
||||
const unsigned has_state,
|
||||
const pstring &name, const pstring &classname,
|
||||
const pstring &def_param)
|
||||
{
|
||||
switch (ni * 1000 + no * 10 + has_state)
|
||||
{
|
||||
ENTRY(1);
|
||||
ENTRY(2);
|
||||
ENTRY(3);
|
||||
ENTRY(4);
|
||||
ENTRY(5);
|
||||
ENTRY(6);
|
||||
ENTRY(7);
|
||||
ENTRY(8);
|
||||
ENTRY(9);
|
||||
ENTRY(10);
|
||||
default:
|
||||
pstring msg = pstring::sprintf("unable to create truthtable<%d,%d,%d>", ni, no, has_state);
|
||||
nl_assert_always(false, msg.cstr());
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -258,28 +258,28 @@ private:
|
||||
pstring_list_t m_desc;
|
||||
};
|
||||
|
||||
class net_device_t_base_factory_tt : public net_device_t_base_factory
|
||||
class netlist_base_factory_truthtable_t : public netlist_base_factory_t
|
||||
{
|
||||
NETLIST_PREVENT_COPYING(net_device_t_base_factory_tt)
|
||||
NETLIST_PREVENT_COPYING(netlist_base_factory_truthtable_t)
|
||||
public:
|
||||
ATTR_COLD net_device_t_base_factory_tt(const pstring &name, const pstring &classname,
|
||||
ATTR_COLD netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
|
||||
const pstring &def_param)
|
||||
: net_device_t_base_factory(name, classname, def_param)
|
||||
: netlist_base_factory_t(name, classname, def_param)
|
||||
{}
|
||||
pstring_list_t m_desc;
|
||||
};
|
||||
|
||||
|
||||
template<unsigned m_NI, unsigned m_NO, int has_state>
|
||||
class net_device_t_factory_tt : public net_device_t_base_factory_tt
|
||||
class netlist_factory_truthtable_t : public netlist_base_factory_truthtable_t
|
||||
{
|
||||
NETLIST_PREVENT_COPYING(net_device_t_factory_tt)
|
||||
NETLIST_PREVENT_COPYING(netlist_factory_truthtable_t)
|
||||
public:
|
||||
ATTR_COLD net_device_t_factory_tt(const pstring &name, const pstring &classname,
|
||||
ATTR_COLD netlist_factory_truthtable_t(const pstring &name, const pstring &classname,
|
||||
const pstring &def_param)
|
||||
: net_device_t_base_factory(name, classname, def_param) { }
|
||||
: netlist_base_factory_truthtable_t(name, classname, def_param) { }
|
||||
|
||||
ATTR_COLD netlist_device_t *Create() const
|
||||
ATTR_COLD netlist_device_t *Create()
|
||||
{
|
||||
typedef nld_truthtable_t<m_NI, m_NO, has_state> tt_type;
|
||||
netlist_device_t *r = palloc(tt_type, &m_ttbl, m_desc);
|
||||
@ -290,6 +290,25 @@ private:
|
||||
typename nld_truthtable_t<m_NI, m_NO, has_state>::truthtable_t m_ttbl;
|
||||
};
|
||||
|
||||
netlist_base_factory_truthtable_t *nl_tt_factory_create(const unsigned ni, const unsigned no,
|
||||
const unsigned has_state,
|
||||
const pstring &name, const pstring &classname,
|
||||
const pstring &def_param);
|
||||
|
||||
#define TRUTHTABLE_START(_name, _in, _out, _has_state, _def_params) \
|
||||
{ \
|
||||
netlist_base_factory_truthtable_t *ttd = nl_tt_factory_create(_in, _out, _has_state, \
|
||||
# _name, # _name, "+" _def_params);
|
||||
|
||||
#define TT_HEAD(_x) \
|
||||
ttd->m_desc.add(_x);
|
||||
|
||||
#define TT_LINE(_x) \
|
||||
ttd->m_desc.add(_x);
|
||||
|
||||
#define TRUTHTABLE_END() \
|
||||
setup.factory().register_device(ttd); \
|
||||
}
|
||||
|
||||
|
||||
#endif /* NLD_TRUTHTABLE_H_ */
|
||||
|
@ -15,7 +15,7 @@
|
||||
// net_device_t_base_factory
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
ATTR_COLD const pstring_list_t net_device_t_base_factory::term_param_list()
|
||||
ATTR_COLD const pstring_list_t netlist_base_factory_t::term_param_list()
|
||||
{
|
||||
if (m_def_param.startsWith("+"))
|
||||
return pstring_list_t(m_def_param.substr(1), ",");
|
||||
@ -23,7 +23,7 @@ ATTR_COLD const pstring_list_t net_device_t_base_factory::term_param_list()
|
||||
return pstring_list_t();
|
||||
}
|
||||
|
||||
ATTR_COLD const pstring_list_t net_device_t_base_factory::def_params()
|
||||
ATTR_COLD const pstring_list_t netlist_base_factory_t::def_params()
|
||||
{
|
||||
if (m_def_param.startsWith("+") || m_def_param.equals("-"))
|
||||
return pstring_list_t();
|
||||
@ -32,25 +32,25 @@ ATTR_COLD const pstring_list_t net_device_t_base_factory::def_params()
|
||||
}
|
||||
|
||||
|
||||
netlist_factory_t::netlist_factory_t()
|
||||
netlist_factory_list_t::netlist_factory_list_t()
|
||||
{
|
||||
}
|
||||
|
||||
netlist_factory_t::~netlist_factory_t()
|
||||
netlist_factory_list_t::~netlist_factory_list_t()
|
||||
{
|
||||
for (std::size_t i=0; i < m_list.size(); i++)
|
||||
{
|
||||
net_device_t_base_factory *p = m_list[i];
|
||||
netlist_base_factory_t *p = m_list[i];
|
||||
pfree(p);
|
||||
}
|
||||
m_list.clear();
|
||||
}
|
||||
|
||||
netlist_device_t *netlist_factory_t::new_device_by_classname(const pstring &classname) const
|
||||
netlist_device_t *netlist_factory_list_t::new_device_by_classname(const pstring &classname) const
|
||||
{
|
||||
for (std::size_t i=0; i < m_list.size(); i++)
|
||||
{
|
||||
net_device_t_base_factory *p = m_list[i];
|
||||
netlist_base_factory_t *p = m_list[i];
|
||||
if (p->classname() == classname)
|
||||
{
|
||||
netlist_device_t *ret = p->Create();
|
||||
@ -61,17 +61,17 @@ netlist_device_t *netlist_factory_t::new_device_by_classname(const pstring &clas
|
||||
return NULL; // appease code analysis
|
||||
}
|
||||
|
||||
netlist_device_t *netlist_factory_t::new_device_by_name(const pstring &name, netlist_setup_t &setup) const
|
||||
netlist_device_t *netlist_factory_list_t::new_device_by_name(const pstring &name, netlist_setup_t &setup) const
|
||||
{
|
||||
net_device_t_base_factory *f = factory_by_name(name, setup);
|
||||
netlist_base_factory_t *f = factory_by_name(name, setup);
|
||||
return f->Create();
|
||||
}
|
||||
|
||||
net_device_t_base_factory * netlist_factory_t::factory_by_name(const pstring &name, netlist_setup_t &setup) const
|
||||
netlist_base_factory_t * netlist_factory_list_t::factory_by_name(const pstring &name, netlist_setup_t &setup) const
|
||||
{
|
||||
for (std::size_t i=0; i < m_list.size(); i++)
|
||||
{
|
||||
net_device_t_base_factory *p = m_list[i];
|
||||
netlist_base_factory_t *p = m_list[i];
|
||||
if (p->name() == name)
|
||||
{
|
||||
return p;
|
||||
|
@ -18,18 +18,18 @@
|
||||
// net_dev class factory
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
class net_device_t_base_factory
|
||||
class netlist_base_factory_t
|
||||
{
|
||||
NETLIST_PREVENT_COPYING(net_device_t_base_factory)
|
||||
NETLIST_PREVENT_COPYING(netlist_base_factory_t)
|
||||
public:
|
||||
ATTR_COLD net_device_t_base_factory(const pstring &name, const pstring &classname,
|
||||
ATTR_COLD netlist_base_factory_t(const pstring &name, const pstring &classname,
|
||||
const pstring &def_param)
|
||||
: m_name(name), m_classname(classname), m_def_param(def_param)
|
||||
{}
|
||||
|
||||
/* ATTR_COLD */ virtual ~net_device_t_base_factory() {}
|
||||
/* ATTR_COLD */ virtual ~netlist_base_factory_t() {}
|
||||
|
||||
/* ATTR_COLD */ virtual netlist_device_t *Create() const = 0;
|
||||
/* ATTR_COLD */ virtual netlist_device_t *Create() = 0;
|
||||
|
||||
ATTR_COLD const pstring &name() const { return m_name; }
|
||||
ATTR_COLD const pstring &classname() const { return m_classname; }
|
||||
@ -44,15 +44,15 @@ protected:
|
||||
};
|
||||
|
||||
template <class C>
|
||||
class net_device_t_factory : public net_device_t_base_factory
|
||||
class net_list_factory_t : public netlist_base_factory_t
|
||||
{
|
||||
NETLIST_PREVENT_COPYING(net_device_t_factory)
|
||||
NETLIST_PREVENT_COPYING(net_list_factory_t)
|
||||
public:
|
||||
ATTR_COLD net_device_t_factory(const pstring &name, const pstring &classname,
|
||||
ATTR_COLD net_list_factory_t(const pstring &name, const pstring &classname,
|
||||
const pstring &def_param)
|
||||
: net_device_t_base_factory(name, classname, def_param) { }
|
||||
: netlist_base_factory_t(name, classname, def_param) { }
|
||||
|
||||
ATTR_COLD netlist_device_t *Create() const
|
||||
ATTR_COLD netlist_device_t *Create()
|
||||
{
|
||||
netlist_device_t *r = palloc(C);
|
||||
//r->init(setup, name);
|
||||
@ -60,29 +60,29 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class netlist_factory_t
|
||||
class netlist_factory_list_t
|
||||
{
|
||||
public:
|
||||
typedef plist_t<net_device_t_base_factory *> list_t;
|
||||
typedef plist_t<netlist_base_factory_t *> list_t;
|
||||
|
||||
netlist_factory_t();
|
||||
~netlist_factory_t();
|
||||
netlist_factory_list_t();
|
||||
~netlist_factory_list_t();
|
||||
|
||||
template<class _C>
|
||||
ATTR_COLD void register_device(const pstring &name, const pstring &classname,
|
||||
const pstring &def_param)
|
||||
{
|
||||
m_list.add(palloc(net_device_t_factory< _C >, name, classname, def_param));
|
||||
m_list.add(palloc(net_list_factory_t< _C >, name, classname, def_param));
|
||||
}
|
||||
|
||||
ATTR_COLD void register_device(net_device_t_base_factory *factory)
|
||||
ATTR_COLD void register_device(netlist_base_factory_t *factory)
|
||||
{
|
||||
m_list.add(factory);
|
||||
}
|
||||
|
||||
ATTR_COLD netlist_device_t *new_device_by_classname(const pstring &classname) const;
|
||||
ATTR_COLD netlist_device_t *new_device_by_name(const pstring &name, netlist_setup_t &setup) const;
|
||||
ATTR_COLD net_device_t_base_factory * factory_by_name(const pstring &name, netlist_setup_t &setup) const;
|
||||
ATTR_COLD netlist_base_factory_t * factory_by_name(const pstring &name, netlist_setup_t &setup) const;
|
||||
|
||||
const list_t &list() { return m_list; }
|
||||
|
||||
|
@ -223,7 +223,7 @@ void netlist_parser::netdev_param()
|
||||
void netlist_parser::device(const pstring &dev_type)
|
||||
{
|
||||
pstring devname;
|
||||
net_device_t_base_factory *f = m_setup.factory().factory_by_name(dev_type, m_setup);
|
||||
netlist_base_factory_t *f = m_setup.factory().factory_by_name(dev_type, m_setup);
|
||||
netlist_device_t *dev;
|
||||
pstring_list_t termlist = f->term_param_list();
|
||||
pstring_list_t def_params = f->def_params();
|
||||
|
@ -39,7 +39,7 @@ netlist_setup_t::netlist_setup_t(netlist_base_t &netlist)
|
||||
, m_proxy_cnt(0)
|
||||
{
|
||||
netlist.set_setup(this);
|
||||
m_factory = palloc(netlist_factory_t);
|
||||
m_factory = palloc(netlist_factory_list_t);
|
||||
}
|
||||
|
||||
void netlist_setup_t::init()
|
||||
|
@ -25,6 +25,10 @@
|
||||
#define NET_REGISTER_DEV(_type, _name) \
|
||||
setup.register_dev(NETLIB_NAME_STR(_type), # _name);
|
||||
|
||||
/* to be used to reference new library truthtable devices */
|
||||
#define NET_REGISTER_DEV_X(_type, _name) \
|
||||
setup.register_dev(# _type, # _name);
|
||||
|
||||
#define NET_REMOVE_DEV(_name) \
|
||||
setup.remove_dev(# _name);
|
||||
|
||||
@ -66,7 +70,7 @@ ATTR_COLD void NETLIST_NAME(_name)(netlist_setup_t &setup)
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
// Forward definition so we keep nl_factory.h out of the public
|
||||
class netlist_factory_t;
|
||||
class netlist_factory_list_t;
|
||||
|
||||
class netlist_setup_t
|
||||
{
|
||||
@ -143,8 +147,8 @@ public:
|
||||
void namespace_push(const pstring &aname);
|
||||
void namespace_pop();
|
||||
|
||||
netlist_factory_t &factory() { return *m_factory; }
|
||||
const netlist_factory_t &factory() const { return *m_factory; }
|
||||
netlist_factory_list_t &factory() { return *m_factory; }
|
||||
const netlist_factory_list_t &factory() const { return *m_factory; }
|
||||
|
||||
/* not ideal, but needed for save_state */
|
||||
tagmap_terminal_t m_terminals;
|
||||
@ -162,7 +166,7 @@ private:
|
||||
tagmap_link_t m_links;
|
||||
tagmap_nstring_t m_params_temp;
|
||||
|
||||
netlist_factory_t *m_factory;
|
||||
netlist_factory_list_t *m_factory;
|
||||
|
||||
plist_t<pstring> m_models;
|
||||
|
||||
|
@ -376,7 +376,7 @@ pstring ppreprocessor::process(const pstring &contents)
|
||||
}
|
||||
else if (lti[0].equals("#pragma"))
|
||||
{
|
||||
if (lti.size() > 3 && lti[1].equals("NETLIST"))
|
||||
if (ifflag == 0 && lti.size() > 3 && lti[1].equals("NETLIST"))
|
||||
{
|
||||
if (lti[2].equals("warning"))
|
||||
error("NETLIST: " + catremainder(lti, 3, " "));
|
||||
@ -384,9 +384,12 @@ pstring ppreprocessor::process(const pstring &contents)
|
||||
}
|
||||
else if (lti[0].equals("#define"))
|
||||
{
|
||||
if (lti.size() != 3)
|
||||
error(pstring::sprintf("PREPRO: only simple defines allowed: %s", line.cstr()));
|
||||
m_defines.add(define_t(lti[1], lti[2]));
|
||||
if (ifflag == 0)
|
||||
{
|
||||
if (lti.size() != 3)
|
||||
error(pstring::sprintf("PREPRO: only simple defines allowed: %s", line.cstr()));
|
||||
m_defines.add(define_t(lti[1], lti[2]));
|
||||
}
|
||||
}
|
||||
else
|
||||
error(pstring::sprintf("unknown directive on line %" SIZETFMT ": %s\n", i, line.cstr()));
|
||||
|
@ -11,7 +11,23 @@
|
||||
|
||||
#define FAST_CLOCK (1)
|
||||
|
||||
#define TTL_7400A_NAND(_name, _A, _B) \
|
||||
NET_REGISTER_DEV_X(TTL_7400A_NAND, _name) \
|
||||
NET_CONNECT(_name, A, _A) \
|
||||
NET_CONNECT(_name, B, _B)
|
||||
|
||||
NETLIST_START(lib)
|
||||
TRUTHTABLE_START(TTL_7400A_NAND, 2, 1, 0, "+A,B")
|
||||
TT_HEAD(" A , B | Q ")
|
||||
TT_LINE(" 0 , X | 1 |22")
|
||||
TT_LINE(" X , 0 | 1 |22")
|
||||
TT_LINE(" 1 , 1 | 0 |15")
|
||||
TRUTHTABLE_END()
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(pong_fast)
|
||||
|
||||
INCLUDE(lib)
|
||||
SOLVER(Solver, 48000)
|
||||
PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
|
||||
PARAM(Solver.ACCURACY, 1e-4) // works and is sufficient
|
||||
@ -120,7 +136,7 @@ NETLIST_START(pong_fast)
|
||||
/* hit logic */
|
||||
|
||||
TTL_7404_INVERT(hitQ, hit)
|
||||
TTL_7400_NAND(hit, hit1Q, hit2Q)
|
||||
TTL_7400A_NAND(hit, hit1Q, hit2Q)
|
||||
|
||||
TTL_7402_NOR(attractQ, StopG, runQ)
|
||||
TTL_7404_INVERT(attract, attractQ)
|
||||
@ -128,22 +144,22 @@ NETLIST_START(pong_fast)
|
||||
TTL_7420_NAND(ic_h6a, hvidQ, hvidQ, hvidQ, hvidQ)
|
||||
ALIAS(hvid, ic_h6a.Q)
|
||||
|
||||
TTL_7400_NAND(ic_e6c, hvid, hblank)
|
||||
TTL_7400A_NAND(ic_e6c, hvid, hblank)
|
||||
ALIAS(MissQ, ic_e6c.Q)
|
||||
|
||||
TTL_7404_INVERT(ic_d1e, MissQ)
|
||||
TTL_7400_NAND(ic_e1a, ic_d1e.Q, attractQ)
|
||||
TTL_7400A_NAND(ic_e1a, ic_d1e.Q, attractQ)
|
||||
ALIAS(Missed, ic_e1a.Q)
|
||||
|
||||
TTL_7400_NAND(rstspeed, SRSTQ, MissQ)
|
||||
TTL_7400_NAND(StopG, StopG1Q, StopG2Q)
|
||||
TTL_7400A_NAND(rstspeed, SRSTQ, MissQ)
|
||||
TTL_7400A_NAND(StopG, StopG1Q, StopG2Q)
|
||||
ALIAS(L, ic_h3b.Q)
|
||||
ALIAS(R, ic_h3b.QQ)
|
||||
|
||||
TTL_7400_NAND(hit1Q, pad1, ic_g1b.Q)
|
||||
TTL_7400_NAND(hit2Q, pad2, ic_g1b.Q)
|
||||
TTL_7400A_NAND(hit1Q, pad1, ic_g1b.Q)
|
||||
TTL_7400A_NAND(hit2Q, pad2, ic_g1b.Q)
|
||||
|
||||
TTL_7400_NAND(ic_g3c, 128H, ic_h3a.QQ)
|
||||
TTL_7400A_NAND(ic_g3c, 128H, ic_h3a.QQ)
|
||||
TTL_7427_NOR(ic_g2c, ic_g3c.Q, 256H, vpad1Q)
|
||||
ALIAS(pad1, ic_g2c.Q)
|
||||
TTL_7427_NOR(ic_g2a, ic_g3c.Q, 256HQ, vpad2Q)
|
||||
@ -193,15 +209,15 @@ NETLIST_START(pong_fast)
|
||||
// hblank flip flop
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
TTL_7400_NAND(ic_g5b, 16H, 64H)
|
||||
TTL_7400A_NAND(ic_g5b, 16H, 64H)
|
||||
|
||||
// the time critical one
|
||||
TTL_7400_NAND(ic_h5c, ic_h5b.Q, hresetQ)
|
||||
TTL_7400_NAND(ic_h5b, ic_h5c.Q, ic_g5b.Q)
|
||||
TTL_7400A_NAND(ic_h5c, ic_h5b.Q, hresetQ)
|
||||
TTL_7400A_NAND(ic_h5b, ic_h5c.Q, ic_g5b.Q)
|
||||
|
||||
ALIAS(hblank, ic_h5c.Q)
|
||||
ALIAS(hblankQ, ic_h5b.Q)
|
||||
TTL_7400_NAND(hsyncQ, hblank, 32H)
|
||||
TTL_7400A_NAND(hsyncQ, hblank, 32H)
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// vblank flip flop
|
||||
@ -212,7 +228,7 @@ NETLIST_START(pong_fast)
|
||||
ALIAS(vblank, ic_f5d.Q)
|
||||
ALIAS(vblankQ, ic_f5c.Q)
|
||||
|
||||
TTL_7400_NAND(ic_h5a, 8V, 8V)
|
||||
TTL_7400A_NAND(ic_h5a, 8V, 8V)
|
||||
TTL_7410_NAND(ic_g5a, vblank, 4V, ic_h5a.Q)
|
||||
ALIAS(vsyncQ, ic_g5a.Q)
|
||||
|
||||
@ -220,31 +236,31 @@ NETLIST_START(pong_fast)
|
||||
// move logic
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
TTL_7400_NAND(ic_e1d, hit_sound, ic_e1c.Q)
|
||||
TTL_7400_NAND(ic_e1c, ic_f1.QC, ic_f1.QD)
|
||||
TTL_7400A_NAND(ic_e1d, hit_sound, ic_e1c.Q)
|
||||
TTL_7400A_NAND(ic_e1c, ic_f1.QC, ic_f1.QD)
|
||||
TTL_7493(ic_f1, ic_e1d.Q, ic_f1.QA, rstspeed, rstspeed)
|
||||
|
||||
TTL_7402_NOR(ic_g1d, ic_f1.QC, ic_f1.QD)
|
||||
TTL_7400_NAND(ic_h1a, ic_g1d.Q, ic_g1d.Q)
|
||||
TTL_7400_NAND(ic_h1d, ic_e1c.Q, ic_h1a.Q)
|
||||
TTL_7400A_NAND(ic_h1a, ic_g1d.Q, ic_g1d.Q)
|
||||
TTL_7400A_NAND(ic_h1d, ic_e1c.Q, ic_h1a.Q)
|
||||
|
||||
TTL_7400_NAND(ic_h1c, ic_h1d.Q, vreset)
|
||||
TTL_7400_NAND(ic_h1b, ic_h1a.Q, vreset)
|
||||
TTL_7400A_NAND(ic_h1c, ic_h1d.Q, vreset)
|
||||
TTL_7400A_NAND(ic_h1b, ic_h1a.Q, vreset)
|
||||
TTL_7402_NOR(ic_g1c, 256HQ, vreset)
|
||||
|
||||
TTL_74107(ic_h2a, ic_g1c.Q, ic_h2b.Q, low, ic_h1b.Q)
|
||||
TTL_74107(ic_h2b, ic_g1c.Q, high, move, ic_h1c.Q)
|
||||
|
||||
TTL_7400_NAND(ic_h4a, ic_h2b.Q, ic_h2a.Q)
|
||||
TTL_7400A_NAND(ic_h4a, ic_h2b.Q, ic_h2a.Q)
|
||||
ALIAS(move, ic_h4a.Q)
|
||||
|
||||
TTL_7400_NAND(ic_c1d, SC, attract)
|
||||
TTL_7400A_NAND(ic_c1d, SC, attract)
|
||||
TTL_7404_INVERT(ic_d1a, ic_c1d.Q)
|
||||
TTL_7474(ic_h3b, ic_d1a.Q, ic_h3b.QQ, hit1Q, hit2Q)
|
||||
|
||||
TTL_7400_NAND(ic_h4d, ic_h3b.Q, move)
|
||||
TTL_7400_NAND(ic_h4b, ic_h3b.QQ, move)
|
||||
TTL_7400_NAND(ic_h4c, ic_h4d.Q, ic_h4b.Q)
|
||||
TTL_7400A_NAND(ic_h4d, ic_h3b.Q, move)
|
||||
TTL_7400A_NAND(ic_h4b, ic_h3b.QQ, move)
|
||||
TTL_7400A_NAND(ic_h4c, ic_h4d.Q, ic_h4b.Q)
|
||||
ALIAS(Aa, ic_h4c.Q)
|
||||
ALIAS(Ba, ic_h4b.Q)
|
||||
|
||||
@ -252,7 +268,7 @@ NETLIST_START(pong_fast)
|
||||
// hvid circuit
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
TTL_7400_NAND(hball_resetQ, Serve, attractQ)
|
||||
TTL_7400A_NAND(hball_resetQ, Serve, attractQ)
|
||||
|
||||
TTL_9316(ic_g7, clk, high, hblankQ, hball_resetQ, ic_g5c.Q, Aa, Ba, low, high)
|
||||
TTL_9316(ic_h7, clk, ic_g7.RC, high, hball_resetQ, ic_g5c.Q, low, low, low, high)
|
||||
@ -267,7 +283,7 @@ NETLIST_START(pong_fast)
|
||||
|
||||
TTL_9316(ic_b3, hsyncQ, high, vblankQ, high, ic_b2b.Q, a6, b6, c6, d6)
|
||||
TTL_9316(ic_a3, hsyncQ, ic_b3.RC, high, high, ic_b2b.Q, low, low, low, low)
|
||||
TTL_7400_NAND(ic_b2b, ic_a3.RC, ic_b3.RC)
|
||||
TTL_7400A_NAND(ic_b2b, ic_a3.RC, ic_b3.RC)
|
||||
TTL_7410_NAND(ic_e2b, ic_a3.RC, ic_b3.QC, ic_b3.QD)
|
||||
ALIAS(vvidQ, ic_e2b.Q)
|
||||
TTL_7404_INVERT(vvid, vvidQ) // D2D
|
||||
@ -359,12 +375,12 @@ NETLIST_START(pong_fast)
|
||||
NET_C(GND, ic_g4_C.2)
|
||||
|
||||
ALIAS(hit_sound_en, ic_c2a.QQ)
|
||||
TTL_7400_NAND(hit_sound, hit_sound_en, vpos16)
|
||||
TTL_7400_NAND(score_sound, SC, vpos32)
|
||||
TTL_7400_NAND(topbothitsound, ic_f3_topbot.Q, vpos32)
|
||||
TTL_7400A_NAND(hit_sound, hit_sound_en, vpos16)
|
||||
TTL_7400A_NAND(score_sound, SC, vpos32)
|
||||
TTL_7400A_NAND(topbothitsound, ic_f3_topbot.Q, vpos32)
|
||||
|
||||
TTL_7410_NAND(ic_c4b, topbothitsound, hit_sound, score_sound)
|
||||
TTL_7400_NAND(ic_c1b, ic_c4b.Q, attractQ)
|
||||
TTL_7400A_NAND(ic_c1b, ic_c4b.Q, attractQ)
|
||||
ALIAS(sound, ic_c1b.Q)
|
||||
|
||||
|
||||
@ -398,9 +414,9 @@ NETLIST_START(pong_fast)
|
||||
NET_C(GND, ic_b9_C.2)
|
||||
|
||||
TTL_7404_INVERT(ic_c9b, ic_b9.OUT)
|
||||
TTL_7400_NAND(ic_b7b, ic_a7b.Q, hsyncQ)
|
||||
TTL_7400A_NAND(ic_b7b, ic_a7b.Q, hsyncQ)
|
||||
TTL_7493(ic_b8, ic_b7b.Q, ic_b8.QA, ic_b9.OUT, ic_b9.OUT)
|
||||
TTL_7400_NAND(ic_b7a, ic_c9b.Q, ic_a7b.Q)
|
||||
TTL_7400A_NAND(ic_b7a, ic_c9b.Q, ic_a7b.Q)
|
||||
TTL_7420_NAND(ic_a7b, ic_b8.QA, ic_b8.QB, ic_b8.QC, ic_b8.QD)
|
||||
ALIAS(vpad1Q, ic_b7a.Q)
|
||||
|
||||
@ -438,9 +454,9 @@ NETLIST_START(pong_fast)
|
||||
NET_C(GND, ic_a9_C.2)
|
||||
|
||||
TTL_7404_INVERT(ic_c9a, ic_a9.OUT)
|
||||
TTL_7400_NAND(ic_b7c, ic_a7a.Q, hsyncQ)
|
||||
TTL_7400A_NAND(ic_b7c, ic_a7a.Q, hsyncQ)
|
||||
TTL_7493(ic_a8, ic_b7c.Q, ic_a8.QA, ic_a9.OUT, ic_a9.OUT)
|
||||
TTL_7400_NAND(ic_b7d, ic_c9a.Q, ic_a7a.Q)
|
||||
TTL_7400A_NAND(ic_b7d, ic_c9a.Q, ic_a7a.Q)
|
||||
TTL_7420_NAND(ic_a7a, ic_a8.QA, ic_a8.QB, ic_a8.QC, ic_a8.QD)
|
||||
ALIAS(vpad2Q, ic_b7d.Q)
|
||||
|
||||
@ -520,8 +536,8 @@ NETLIST_START(pong_fast)
|
||||
TTL_7427_NOR(ic_e5c, ic_e4b.Q, 8H, 4H)
|
||||
ALIAS(scoreFE, ic_e5c.Q)
|
||||
|
||||
TTL_7400_NAND(ic_c3d, 8H, 4H)
|
||||
//TTL_7400_NAND(ic_c3d, 4H, 8H)
|
||||
TTL_7400A_NAND(ic_c3d, 8H, 4H)
|
||||
//TTL_7400A_NAND(ic_c3d, 4H, 8H)
|
||||
TTL_7402_NOR(ic_d2b, ic_e4b.Q, ic_c3d.Q)
|
||||
ALIAS(scoreBC, ic_d2b.Q)
|
||||
|
||||
@ -547,7 +563,7 @@ NETLIST_START(pong_fast)
|
||||
|
||||
// net
|
||||
TTL_74107(ic_f3b, clk, 256H, 256HQ, high)
|
||||
TTL_7400_NAND(ic_g3b, ic_f3b.QQ, 256H)
|
||||
TTL_7400A_NAND(ic_g3b, ic_f3b.QQ, 256H)
|
||||
TTL_7427_NOR(ic_g2b, ic_g3b.Q, vblank, 4V)
|
||||
ALIAS(net, ic_g2b.Q)
|
||||
|
||||
|
@ -288,7 +288,7 @@ static void listdevices()
|
||||
{
|
||||
netlist_tool_t nt;
|
||||
nt.init();
|
||||
const netlist_factory_t::list_t &list = nt.setup().factory().list();
|
||||
const netlist_factory_list_t::list_t &list = nt.setup().factory().list();
|
||||
|
||||
netlist_sources_t sources;
|
||||
|
||||
@ -304,7 +304,7 @@ static void listdevices()
|
||||
list[i]->name().cstr() );
|
||||
pstring terms("");
|
||||
|
||||
net_device_t_base_factory *f = list[i];
|
||||
netlist_base_factory_t *f = list[i];
|
||||
netlist_device_t *d = f->Create();
|
||||
d->init(nt, pstring::sprintf("dummy%d", i));
|
||||
d->start_dev();
|
||||
|
Loading…
Reference in New Issue
Block a user