diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 15a096a6536..137c9e6cf6c 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -1004,17 +1004,18 @@ void netlist_mame_cpu_device::device_start() state_add(STATE_GENPC, "GENPC", m_genPC).noshow(); state_add(STATE_GENPCBASE, "CURPC", m_genPC).noshow(); - for (int i=0; i < netlist().m_nets.size(); i++) + int index = 0; + for (auto &n : netlist().m_nets) { - netlist::detail::net_t *n = netlist().m_nets[i].get(); if (n->is_logic()) { - state_add(i*2, n->name().c_str(), *downcast(n)->Q_state_ptr()); + state_add(index, n->name().c_str(), *(downcast(*n).Q_state_ptr())); } else { - state_add(i*2+1, n->name().c_str(), *downcast(n)->Q_Analog_state_ptr()); + state_add(index, n->name().c_str(), *(downcast(*n).Q_Analog_state_ptr())); } + index++; } // set our instruction counter @@ -1116,15 +1117,15 @@ void netlist_mame_sound_device::device_start() //m_num_outputs = outdevs.size(); /* resort channels */ - for (int i=0; i < outdevs.size(); i++) + for (auto &outdev : outdevs) { - int chan = outdevs[i]->m_channel(); + int chan = outdev->m_channel(); - netlist().log().verbose("Output %d on channel %d", i, chan); + netlist().log().verbose("Output %s on channel %d", outdev->name(), chan); - //if (chan < 0 || chan >= MAX_OUT || chan >= outdevs.size()) - // fatalerror("illegal channel number"); - m_out[chan] = outdevs[i]; + if (chan < 0 || chan >= outdevs.size()) + fatalerror("illegal channel number"); + m_out[chan] = outdev; m_out[chan]->m_sample_time = netlist::netlist_time::from_hz(clock()); m_out[chan]->m_buffer = nullptr; m_out[chan]->m_bufsize = 0; diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index 60abeeef840..37646925ae4 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -12,10 +12,14 @@ namespace netlist { namespace devices { - NETLIB_OBJECT(7474sub) + + NETLIB_OBJECT(7474) { - NETLIB_CONSTRUCTOR(7474sub) - , m_CLK(*this, "CLK") + NETLIB_CONSTRUCTOR(7474) + , m_D(*this, "D") + , m_CLRQ(*this, "CLRQ") + , m_PREQ(*this, "PREQ") + , m_CLK(*this, "CLK", NETLIB_DELEGATE(7474, clk)) , m_Q(*this, "Q") , m_QQ(*this, "QQ") , m_nextD(*this, "m_nextD", 0) @@ -24,42 +28,20 @@ namespace netlist NETLIB_RESETI(); NETLIB_UPDATEI(); + NETLIB_HANDLERI(clk); public: - logic_input_t m_CLK; - logic_output_t m_Q; - logic_output_t m_QQ; - state_var m_nextD; - - inline void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ); - - private: - - }; - - NETLIB_OBJECT(7474) - { - NETLIB_CONSTRUCTOR(7474) - , sub(*this, "sub") - , m_D(*this, "D") - , m_CLRQ(*this, "CLRQ") - , m_PREQ(*this, "PREQ") - { - register_subalias("CLK", sub.m_CLK); - - register_subalias("Q", sub.m_Q); - register_subalias("QQ", sub.m_QQ); - } - - NETLIB_RESETI(); - NETLIB_UPDATEI(); - - public: - NETLIB_SUB(7474sub) sub; - logic_input_t m_D; logic_input_t m_CLRQ; logic_input_t m_PREQ; + logic_input_t m_CLK; + logic_output_t m_Q; + logic_output_t m_QQ; + + private: + state_var m_nextD; + + inline void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ); }; NETLIB_OBJECT(7474_dip) @@ -70,16 +52,16 @@ namespace netlist { register_subalias("1", m_1.m_CLRQ); register_subalias("2", m_1.m_D); - register_subalias("3", m_1.sub.m_CLK); + register_subalias("3", m_1.m_CLK); register_subalias("4", m_1.m_PREQ); - register_subalias("5", m_1.sub.m_Q); - register_subalias("6", m_1.sub.m_QQ); + register_subalias("5", m_1.m_Q); + register_subalias("6", m_1.m_QQ); // register_subalias("7", ); ==> GND - register_subalias("8", m_2.sub.m_QQ); - register_subalias("9", m_2.sub.m_Q); + register_subalias("8", m_2.m_QQ); + register_subalias("9", m_2.m_Q); register_subalias("10", m_2.m_PREQ); - register_subalias("11", m_2.sub.m_CLK); + register_subalias("11", m_2.m_CLK); register_subalias("12", m_2.m_D); register_subalias("13", m_2.m_CLRQ); // register_subalias("14", ); ==> VCC @@ -92,15 +74,15 @@ namespace netlist NETLIB_SUB(7474) m_2; }; - inline void NETLIB_NAME(7474sub)::newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ) + inline void NETLIB_NAME(7474)::newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ) { // 0: High-to-low 40 ns, 1: Low-to-high 25 ns - const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; + static constexpr const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; m_Q.push(stateQ, delay[stateQ]); m_QQ.push(stateQQ, delay[stateQQ]); } - NETLIB_UPDATE(7474sub) + NETLIB_HANDLER(7474, clk) { //if (INP_LH(m_CLK)) { @@ -111,54 +93,34 @@ namespace netlist NETLIB_UPDATE(7474) { - if (m_PREQ() && m_CLRQ()) + const auto preq(m_PREQ()); + const auto clrq(m_CLRQ()); + if (preq & clrq) { m_D.activate(); - sub.m_nextD = m_D(); - sub.m_CLK.activate_lh(); - } - else if (!m_PREQ() && m_CLRQ()) - { - sub.newstate(1, 0); - sub.m_CLK.inactivate(); - m_D.inactivate(); - } - else if (!m_CLRQ() && m_PREQ()) - { - sub.newstate(0, 1); - sub.m_CLK.inactivate(); - m_D.inactivate(); + m_nextD = m_D(); + m_CLK.activate_lh(); } else { - sub.newstate(1, 1); - sub.m_CLK.inactivate(); + newstate(preq ^ 1, clrq ^ 1); + m_CLK.inactivate(); m_D.inactivate(); } } NETLIB_RESET(7474) - { - //sub.do_reset(); - } - - NETLIB_RESET(7474sub) { m_CLK.activate_lh(); - m_nextD = 0; } NETLIB_RESET(7474_dip) { - // m_1.do_reset(); - //m_2.do_reset(); } NETLIB_UPDATE(7474_dip) { - //m_1.update_dev(); - //m_2.update_dev(); } NETLIB_DEVICE_IMPL(7474) diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp index 2ac3d557c57..a7a20635729 100644 --- a/src/lib/netlist/devices/nld_7493.cpp +++ b/src/lib/netlist/devices/nld_7493.cpp @@ -40,7 +40,7 @@ namespace netlist NETLIB_HANDLERI(updA) { - if (m_reset) + //if (m_reset) { m_a ^= 1; m_QA.push(m_a, out_delay); @@ -49,7 +49,7 @@ namespace netlist NETLIB_HANDLERI(updB) { - if (m_reset) + //if (m_reset) { ++m_bcd &= static_cast(0x07); m_QD.push((m_bcd >> 2) & 1, out_delay3); @@ -101,8 +101,8 @@ namespace netlist { m_reset = 1; m_a = m_bcd = 0; - m_CLKA.set_state(logic_t::STATE_INP_HL); - m_CLKB.set_state(logic_t::STATE_INP_HL); + m_CLKA.activate_hl(); + m_CLKB.activate_hl(); } NETLIB_UPDATE(7493) diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index 7c478fd4b05..ba3b4a58167 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -24,12 +24,13 @@ namespace netlist , m_cnt(*this, "m_cnt", 0) , m_ENP(*this, "ENP") , m_CLRQ(*this, "CLRQ") - , m_A(*this, "A", NETLIB_DELEGATE(9316, noop)) - , m_B(*this, "B", NETLIB_DELEGATE(9316, noop)) - , m_C(*this, "C", NETLIB_DELEGATE(9316, noop)) - , m_D(*this, "D", NETLIB_DELEGATE(9316, noop)) + , m_A(*this, "A", NETLIB_DELEGATE(9316, abcd)) + , m_B(*this, "B", NETLIB_DELEGATE(9316, abcd)) + , m_C(*this, "C", NETLIB_DELEGATE(9316, abcd)) + , m_D(*this, "D", NETLIB_DELEGATE(9316, abcd)) , m_Q(*this, {{ "QA", "QB", "QC", "QD" }}) , m_RC(*this, "RC") + , m_abcd(*this, "m_abcd", 0) { } @@ -37,14 +38,17 @@ namespace netlist NETLIB_RESETI(); NETLIB_UPDATEI(); NETLIB_HANDLERI(clk); - NETLIB_HANDLERI(noop) { } + NETLIB_HANDLERI(abcd) + { + m_abcd = (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0); + } logic_input_t m_CLK; logic_input_t m_ENT; logic_input_t m_LOADQ; - state_var m_cnt; + state_var_u8 m_cnt; logic_input_t m_ENP; logic_input_t m_CLRQ; @@ -56,7 +60,7 @@ namespace netlist object_array_t m_Q; logic_output_t m_RC; - + state_var_u8 m_abcd; private: //inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept @@ -95,8 +99,9 @@ namespace netlist NETLIB_RESET(9316) { - m_CLK.set_state(logic_t::STATE_INP_LH); + m_CLK.activate_lh(); m_cnt = 0; + m_abcd = 0; } NETLIB_HANDLER(9316, clk) @@ -105,6 +110,7 @@ namespace netlist { ++m_cnt &= MAXCNT; //m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); +#if 0 if (m_cnt == MAXCNT) { m_RC.push(m_ENT(), NLTIME_FROM_NS(27)); @@ -117,10 +123,24 @@ namespace netlist } else update_outputs_all(m_cnt, NLTIME_FROM_NS(20)); +#else + if (m_cnt > 0 && m_cnt < MAXCNT) + update_outputs_all(m_cnt, NLTIME_FROM_NS(20)); + else if (m_cnt == 0) + { + m_RC.push(0, NLTIME_FROM_NS(27)); + update_outputs_all(0, NLTIME_FROM_NS(20)); + } + else + { + m_RC.push(m_ENT(), NLTIME_FROM_NS(27)); + update_outputs_all(MAXCNT, NLTIME_FROM_NS(20)); + } +#endif } else { - m_cnt = (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0); + m_cnt = m_abcd; m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); update_outputs_all(m_cnt, NLTIME_FROM_NS(22)); } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 16043eb8728..c61b09d7089 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -653,7 +653,7 @@ namespace netlist nldelegate delegate = nldelegate()); virtual ~logic_input_t(); - inline netlist_sig_t operator()() const NL_NOEXCEPT + const netlist_sig_t &operator()() const NL_NOEXCEPT { return Q(); } @@ -663,7 +663,7 @@ namespace netlist void activate_hl() NL_NOEXCEPT; void activate_lh() NL_NOEXCEPT; private: - netlist_sig_t Q() const NL_NOEXCEPT; + const netlist_sig_t &Q() const NL_NOEXCEPT; }; // ----------------------------------------------------------------------------- @@ -778,10 +778,10 @@ namespace netlist logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr); virtual ~logic_net_t(); - inline netlist_sig_t Q() const NL_NOEXCEPT { return m_cur_Q; } + inline const netlist_sig_t & Q() const NL_NOEXCEPT { return m_cur_Q; } void initial(const netlist_sig_t val) NL_NOEXCEPT { m_cur_Q = m_new_Q = val; } - void set_Q_and_push(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT + inline void set_Q_and_push(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT { if (newQ != m_new_Q ) { @@ -789,7 +789,7 @@ namespace netlist push_to_queue(delay); } } - void set_Q_and_push_force(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT + inline void set_Q_and_push_force(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT { if (newQ != m_new_Q || is_queued()) { @@ -798,7 +798,7 @@ namespace netlist } } - void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) NL_NOEXCEPT + inline void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) NL_NOEXCEPT { if (newQ != m_new_Q) { @@ -1462,7 +1462,7 @@ namespace netlist return static_cast(core_terminal_t::net()); } - inline netlist_sig_t logic_input_t::Q() const NL_NOEXCEPT + inline const netlist_sig_t & logic_input_t::Q() const NL_NOEXCEPT { nl_assert(state() != STATE_INP_PASSIVE); return net().Q(); diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp index e4d31985b23..fa87c1cf94f 100644 --- a/src/lib/netlist/plib/palloc.cpp +++ b/src/lib/netlist/plib/palloc.cpp @@ -25,24 +25,24 @@ mempool::~mempool() { for (auto & b : m_blocks) { - if (b.m_num_alloc != 0) + if (b->m_num_alloc != 0) { - fprintf(stderr, "Found block with %d dangling allocations\n", static_cast(b.m_num_alloc)); + fprintf(stderr, "Found block with %d dangling allocations\n", static_cast(b->m_num_alloc)); } - ::operator delete(b.data); + ::operator delete(b->data); } m_blocks.clear(); } -size_t mempool::new_block() +mempool::block * mempool::new_block() { - block b; - b.data = static_cast(::operator new(m_min_alloc)); - b.cur_ptr = b.data; - b.m_free = m_min_alloc; - b.m_num_alloc = 0; + block *b = new block(); + b->data = static_cast(::operator new(m_min_alloc)); + b->cur_ptr = b->data; + b->m_free = m_min_alloc; + b->m_num_alloc = 0; m_blocks.push_back(b); - return m_blocks.size() - 1; + return b; } size_t mempool::mininfosize() @@ -59,29 +59,27 @@ size_t mempool::mininfosize() void *mempool::alloc(size_t size) { size_t rs = (size + mininfosize() + m_min_align - 1) & ~(m_min_align - 1); - for (size_t bn=0; bn < m_blocks.size(); bn++) + for (auto &b : m_blocks) { - auto &b = m_blocks[bn]; - if (b.m_free > rs) + if (b->m_free > rs) { - b.m_free -= rs; - b.m_num_alloc++; - auto i = reinterpret_cast(b.cur_ptr); - i->m_block = bn; - auto ret = reinterpret_cast(b.cur_ptr + mininfosize()); - b.cur_ptr += rs; + b->m_free -= rs; + b->m_num_alloc++; + auto i = reinterpret_cast(b->cur_ptr); + i->m_block = b; + auto ret = reinterpret_cast(b->cur_ptr + mininfosize()); + b->cur_ptr += rs; return ret; } } { - size_t bn = new_block(); - auto &b = m_blocks[bn]; - b.m_num_alloc = 1; - b.m_free = m_min_alloc - rs; - auto i = reinterpret_cast(b.cur_ptr); - i->m_block = bn; - auto ret = reinterpret_cast(b.cur_ptr + mininfosize()); - b.cur_ptr += rs; + block *b = new_block(); + b->m_num_alloc = 1; + b->m_free = m_min_alloc - rs; + auto i = reinterpret_cast(b->cur_ptr); + i->m_block = b; + auto ret = reinterpret_cast(b->cur_ptr + mininfosize()); + b->cur_ptr += rs; return ret; } } @@ -91,7 +89,7 @@ void mempool::free(void *ptr) auto p = reinterpret_cast(ptr); auto i = reinterpret_cast(p - mininfosize()); - block *b = &m_blocks[i->m_block]; + block *b = i->m_block; if (b->m_num_alloc == 0) fprintf(stderr, "Argh .. double free\n"); else diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index 3759d5819de..264cc656bbf 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -153,19 +153,19 @@ private: char *data; }; - size_t new_block(); + block * new_block(); size_t mininfosize(); struct info { - info() : m_block(0) { } - size_t m_block; + info() : m_block(nullptr) { } + block * m_block; }; size_t m_min_alloc; size_t m_min_align; - std::vector m_blocks; + std::vector m_blocks; public: mempool(size_t min_alloc, size_t min_align);