From efa12efc37bebe169b17833bcbe5f817dd27ea43 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 1 Jun 2020 19:57:47 +0200 Subject: netlist: debugger - use callbacks to access terminals. (nw) --- src/devices/machine/netlist.cpp | 43 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'src/devices/machine/netlist.cpp') diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 8b3971acf2e..26c1b16cf00 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -1334,6 +1334,35 @@ netlist_mame_cpu_device::netlist_mame_cpu_device(const machine_config &mconfig, } +// Fixes overflow error in device_pseudo_state_register +template<> +class device_pseudo_state_register : public device_state_entry +{ +public: + typedef typename std::function getter_func; + typedef typename std::function setter_func; + + // construction/destruction + device_pseudo_state_register(int index, const char *symbol, getter_func &&getter, setter_func &&setter, device_state_interface *dev) + : device_state_entry(index, symbol, sizeof(double), ~u64(0), DSF_FLOATING_POINT, dev), + m_getter(std::move(getter)), + m_setter(std::move(setter)) + { + } + +protected: + // device_state_entry overrides + virtual u64 entry_value() const override { return u64(m_getter()); } + virtual void entry_set_value(u64 value) const override { m_setter(double(value)); } + virtual double entry_dvalue() const override { return m_getter(); } + virtual void entry_set_dvalue(double value) const override { m_setter(value); } + +private: + getter_func m_getter; // function to retrieve the data + setter_func m_setter; // function to store the data +}; + + void netlist_mame_cpu_device::device_start() { netlist_mame_device::device_start(); @@ -1346,13 +1375,23 @@ void netlist_mame_cpu_device::device_start() int index = 0; for (auto &n : netlist().nets()) { + pstring name = n->name(); //plib::replace_all(n->name(), ".", "_"); if (n->is_logic()) { - state_add(index++, n->name().c_str(), *(downcast(*n).Q_state_ptr())); + auto nl = downcast(n.get()); + state_add(index++, name.c_str(), + [nl]() { return nl->Q(); }, + [nl](netlist::netlist_sig_t data) { nl->set_Q_and_push(data, netlist::netlist_time::quantum()); }); } else { - //state_add(index++, n->name().c_str(), *(downcast(*n).Q_Analog_state_ptr())); + auto nl = downcast(n.get()); + state_add(std::make_unique>( + index++, + name.c_str(), + [nl]() { return nl->Q_Analog(); }, + [nl](double data) { nl->set_Q_Analog(data); }, + this)); } } -- cgit v1.2.3