diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c index 7ccb0218c96..1c912630bc8 100644 --- a/src/emu/netlist/nl_base.c +++ b/src/emu/netlist/nl_base.c @@ -528,6 +528,20 @@ ATTR_COLD void netlist_net_t::init_object(netlist_base_t &nl, const pstring &ana nl.m_nets.add(this); } +ATTR_COLD void netlist_net_t::save_register() +{ + save(NAME(m_last.Analog)); + save(NAME(m_cur.Analog)); + save(NAME(m_new.Analog)); + save(NAME(m_last.Q)); + save(NAME(m_cur.Q)); + save(NAME(m_new.Q)); + save(NAME(m_time)); + save(NAME(m_active)); + save(NAME(m_in_queue)); + netlist_object_t::save_register(); +} + ATTR_COLD void netlist_net_t::register_railterminal(netlist_output_t &mr) { assert(m_railterminal == NULL); @@ -586,12 +600,12 @@ ATTR_HOT ATTR_ALIGN static void update_dev(const netlist_core_terminal_t *inp, c } } -ATTR_HOT ATTR_ALIGN void netlist_net_t::update_devs() +ATTR_HOT /*ATTR_ALIGN*/ inline void netlist_net_t::update_devs() { assert(m_num_cons != 0); assert(this->isRailNet()); - static const UINT32 masks[4] = { 1, 5, 3, 1 }; + const UINT32 masks[4] = { 1, 5, 3, 1 }; const UINT32 mask = masks[ (m_last.Q << 1) | m_new.Q ]; m_in_queue = 2; /* mark as taken ... */ diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index 5498a78ab22..0d9cbec217a 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -654,19 +654,7 @@ public: protected: - ATTR_COLD virtual void save_register() - { - save(NAME(m_last.Analog)); - save(NAME(m_cur.Analog)); - save(NAME(m_new.Analog)); - save(NAME(m_last.Q)); - save(NAME(m_cur.Q)); - save(NAME(m_new.Q)); - save(NAME(m_time)); - save(NAME(m_active)); - save(NAME(m_in_queue)); - netlist_object_t::save_register(); - } + ATTR_COLD virtual void save_register(); ATTR_COLD virtual void reset(); diff --git a/src/emu/netlist/nl_parser.c b/src/emu/netlist/nl_parser.c index 8c6ad228fbd..e28d43901c2 100644 --- a/src/emu/netlist/nl_parser.c +++ b/src/emu/netlist/nl_parser.c @@ -379,15 +379,22 @@ void netlist_parser::net_alias() void netlist_parser::net_c() { - pstring t1 = get_identifier(); + pstring last = get_identifier(); + require_token(m_tok_comma); - require_token(m_tok_comma); - pstring t2 = get_identifier(); - - require_token(m_tok_param_right); + while (true) + { + pstring t1 = get_identifier(); + m_setup.register_link(last , t1); + token_t n = get_token(); + if (n.is(m_tok_param_right)) + break; + if (!n.is(m_tok_comma)) + error("expected a comma, found <%s>", n.str().cstr()); + last = t1; + } NL_VERBOSE_OUT(("Parser: Connect: %s %s\n", t1.cstr(), t2.cstr())); - m_setup.register_link(t1 , t2); } void netlist_parser::netdev_param() diff --git a/src/emu/netlist/nl_setup.c b/src/emu/netlist/nl_setup.c index 35cccd3ad82..02bb36bc4ca 100644 --- a/src/emu/netlist/nl_setup.c +++ b/src/emu/netlist/nl_setup.c @@ -267,6 +267,20 @@ void netlist_setup_t::register_object(netlist_device_t &dev, const pstring &name } } +void netlist_setup_t::register_link_arr(const pstring &terms) +{ + nl_util::pstring_list list = nl_util::split(terms,", "); + if (list.count() < 2) + netlist().error("You must pass at least 2 terminals to NET_C"); + pstring last = list[0]; + for (int i = 1; i < list.count(); i++) + { + register_link(last, list[i]); + last = list[i]; + } +} + + void netlist_setup_t::register_link(const pstring &sin, const pstring &sout) { link_t temp = link_t(build_fqn(sin), build_fqn(sout)); diff --git a/src/emu/netlist/nl_setup.h b/src/emu/netlist/nl_setup.h index 370f51740a5..7997f5771b4 100644 --- a/src/emu/netlist/nl_setup.h +++ b/src/emu/netlist/nl_setup.h @@ -38,8 +38,14 @@ #define NET_CONNECT(_name, _input, _output) \ setup.register_link(# _name "." # _input, # _output); -#define NET_C(_input, _output) \ - setup.register_link(NET_STR(_input) , NET_STR(_output)); +#if 0 +#define NET_C(_term1, _term2, term...) \ + setup.register_link(NET_STR(_term1) , NET_STR(_term2)); +#endif + +#define NET_C(_term1, _terms...) \ + setup.register_link_arr( #_term1 ", " # _terms); + #define PARAM(_name, _val) \ setup.register_param(# _name, _val); @@ -123,6 +129,7 @@ public: void register_model(const pstring &model); void register_alias(const pstring &alias, const pstring &out); void register_alias_nofqn(const pstring &alias, const pstring &out); + void register_link_arr(const pstring &terms); void register_link(const pstring &sin, const pstring &sout); void register_param(const pstring ¶m, const pstring &value); void register_param(const pstring ¶m, const double value);