summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/netlist.cpp
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-06-01 19:57:47 +0200
committer couriersud <couriersud@gmx.org>2020-06-01 19:59:52 +0200
commitefa12efc37bebe169b17833bcbe5f817dd27ea43 (patch)
tree723a97453f3aeb8fc9be54447f862725765d00f1 /src/devices/machine/netlist.cpp
parent215aa82cec996af4f2c1cef16f15e63e1ad22572 (diff)
netlist: debugger - use callbacks to access terminals. (nw)
Diffstat (limited to 'src/devices/machine/netlist.cpp')
-rw-r--r--src/devices/machine/netlist.cpp43
1 files changed, 41 insertions, 2 deletions
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<double> : public device_state_entry
+{
+public:
+ typedef typename std::function<double ()> getter_func;
+ typedef typename std::function<void (double)> 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<netlist::logic_net_t &>(*n).Q_state_ptr()));
+ auto nl = downcast<netlist::logic_net_t *>(n.get());
+ state_add<netlist::netlist_sig_t>(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<netlist::analog_net_t &>(*n).Q_Analog_state_ptr()));
+ auto nl = downcast<netlist::analog_net_t *>(n.get());
+ state_add(std::make_unique<device_pseudo_state_register<double>>(
+ index++,
+ name.c_str(),
+ [nl]() { return nl->Q_Analog(); },
+ [nl](double data) { nl->set_Q_Analog(data); },
+ this));
}
}