summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/netlist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/netlist.cpp')
-rw-r--r--src/devices/machine/netlist.cpp140
1 files changed, 134 insertions, 6 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 3183f8746fb..7ba29e26fb7 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -15,6 +15,7 @@
#include "netlist/nl_factory.h"
#include "netlist/nl_parser.h"
#include "netlist/devices/net_lib.h"
+#include "plib/palloc.h"
#include "debugger.h"
//#define LOG_DEV_CALLS(x) printf x
@@ -28,9 +29,12 @@ const device_type NETLIST_SOUND = &device_creator<netlist_mame_sound_device_t>;
const device_type NETLIST_ANALOG_INPUT = &device_creator<netlist_mame_analog_input_t>;
const device_type NETLIST_INT_INPUT = &device_creator<netlist_mame_int_input_t>;
+const device_type NETLIST_ROM_REGION = &device_creator<netlist_mame_rom_t>;
+const device_type NETLIST_RAM_POINTER = &device_creator<netlist_ram_pointer_t>;
const device_type NETLIST_LOGIC_INPUT = &device_creator<netlist_mame_logic_input_t>;
const device_type NETLIST_STREAM_INPUT = &device_creator<netlist_mame_stream_input_t>;
+const device_type NETLIST_LOGIC_OUTPUT = &device_creator<netlist_mame_logic_output_t>;
const device_type NETLIST_ANALOG_OUTPUT = &device_creator<netlist_mame_analog_output_t>;
const device_type NETLIST_STREAM_OUTPUT = &device_creator<netlist_mame_stream_output_t>;
@@ -78,12 +82,13 @@ void netlist_mame_analog_input_t::device_start()
}
+
// ----------------------------------------------------------------------------------------
// netlist_mame_analog_output_t
// ----------------------------------------------------------------------------------------
netlist_mame_analog_output_t::netlist_mame_analog_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, NETLIST_ANALOG_INPUT, "Netlist Analog Output", tag, owner, clock, "netlist_analog_output", __FILE__),
+ : device_t(mconfig, NETLIST_ANALOG_OUTPUT, "Netlist Analog Output", tag, owner, clock, "netlist_analog_output", __FILE__),
netlist_mame_sub_interface(*owner),
m_in("")
{
@@ -114,11 +119,46 @@ void netlist_mame_analog_output_t::device_start()
// ----------------------------------------------------------------------------------------
+// netlist_mame_logic_output_t
+// ----------------------------------------------------------------------------------------
+
+netlist_mame_logic_output_t::netlist_mame_logic_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, NETLIST_LOGIC_OUTPUT, "Netlist Logic Output", tag, owner, clock, "netlist_logic_output", __FILE__),
+ netlist_mame_sub_interface(*owner),
+ m_in("")
+{
+}
+
+void netlist_mame_logic_output_t::static_set_params(device_t &device, const char *in_name, netlist_logic_output_delegate adelegate)
+{
+ netlist_mame_logic_output_t &mame_output = downcast<netlist_mame_logic_output_t &>(device);
+ mame_output.m_in = in_name;
+ mame_output.m_delegate = adelegate;
+}
+
+void netlist_mame_logic_output_t::custom_netlist_additions(netlist::setup_t &setup)
+{
+ pstring dname = "OUT_" + m_in;
+ m_delegate.bind_relative_to(owner()->machine().root_device());
+
+ plib::owned_ptr<netlist::device_t> dev = plib::owned_ptr<netlist::device_t>::Create<NETLIB_NAME(logic_callback)>(setup.netlist(), setup.build_fqn(dname));
+ static_cast<NETLIB_NAME(logic_callback) *>(dev.get())->register_callback(m_delegate);
+ setup.netlist().register_dev(std::move(dev));
+ setup.register_link(dname + ".IN", m_in);
+}
+
+void netlist_mame_logic_output_t::device_start()
+{
+ LOG_DEV_CALLS(("start %s\n", tag()));
+}
+
+
+// ----------------------------------------------------------------------------------------
// netlist_mame_int_input_t
// ----------------------------------------------------------------------------------------
netlist_mame_int_input_t::netlist_mame_int_input_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, NETLIST_INT_INPUT, "Netlist Logic Input", tag, owner, clock, "netlist_logic_input", __FILE__),
+ : device_t(mconfig, NETLIST_INT_INPUT, "Netlist Integer Input", tag, owner, clock, "netlist_logic_input", __FILE__),
netlist_mame_sub_interface(*owner),
m_param(nullptr),
m_mask(0xffffffff),
@@ -180,6 +220,75 @@ void netlist_mame_logic_input_t::device_start()
}
// ----------------------------------------------------------------------------------------
+// netlist_mame_rom_t
+// ----------------------------------------------------------------------------------------
+
+netlist_mame_rom_t::netlist_mame_rom_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, NETLIST_ROM_REGION, "Netlist ROM Region", tag, owner, clock, "netlist_rom_region", __FILE__)
+ , netlist_mame_sub_interface(*owner)
+ , m_name("")
+ , m_region_tag(nullptr)
+ , m_offset(0)
+ , m_size(0)
+{
+}
+
+void netlist_mame_rom_t::static_set_params(device_t &device, const char *name, const char* region_tag, std::size_t offset, std::size_t size)
+{
+ netlist_mame_rom_t &r = downcast<netlist_mame_rom_t&>(device);
+ LOG_DEV_CALLS(("static_set_params %s\n", device.tag()));
+ r.m_name = name;
+ r.m_region_tag = region_tag;
+ r.m_offset = offset;
+ r.m_size = size;
+}
+
+void netlist_mame_rom_t::custom_netlist_additions(netlist::setup_t &setup)
+{
+ if (memregion(m_region_tag) == nullptr)
+ fatalerror("device %s region %s not found\n", basetag(), m_region_tag);
+ setup.register_source(plib::make_unique_base<netlist::source_t, netlist_data_memregion_t>(setup,
+ m_name, memregion(m_region_tag)->base() + m_offset, m_size));
+}
+
+void netlist_mame_rom_t::device_start()
+{
+}
+
+// ----------------------------------------------------------------------------------------
+// netlist_ram_pointer_t
+// ----------------------------------------------------------------------------------------
+
+netlist_ram_pointer_t::netlist_ram_pointer_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, NETLIST_RAM_POINTER, "Netlist RAM Pointer", tag, owner, clock, "netlist_ram_pointer", __FILE__)
+ , netlist_mame_sub_interface(*owner)
+ , m_param(nullptr)
+ , m_param_name("")
+ , m_data(nullptr)
+{
+}
+
+void netlist_ram_pointer_t::static_set_params(device_t &device, const char *param_name)
+{
+ netlist_ram_pointer_t &netlist = downcast<netlist_ram_pointer_t&>(device);
+ LOG_DEV_CALLS(("static_set_params %s\n", device.tag()));
+ netlist.m_param_name = param_name;
+}
+
+void netlist_ram_pointer_t::device_start()
+{
+ LOG_DEV_CALLS(("start %s\n", tag()));
+ netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(m_param_name);
+ m_param = dynamic_cast<netlist::param_ptr_t *>(p);
+ if (m_param == nullptr)
+ {
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
+ }
+
+ m_data = (*m_param)();
+}
+
+// ----------------------------------------------------------------------------------------
// netlist_mame_stream_input_t
// ----------------------------------------------------------------------------------------
@@ -339,6 +448,17 @@ void netlist_mame_device_t::device_start()
nl_register_devices();
+ /* let sub-devices add sources and do stuff prior to parsing */
+ for (device_t &d : subdevices())
+ {
+ netlist_mame_sub_interface *sdev = dynamic_cast<netlist_mame_sub_interface *>(&d);
+ if( sdev != nullptr )
+ {
+ LOG_DEV_CALLS(("Preparse subdevice %s/%s\n", d.name(), d.shortname()));
+ sdev->pre_parse_action(*m_setup);
+ }
+ }
+
m_setup_func(*m_setup);
/* let sub-devices tweak the netlist */
@@ -673,9 +793,17 @@ void netlist_mame_sound_device_t::sound_stream_update(sound_stream &stream, stre
// memregion source support
// ----------------------------------------------------------------------------------------
-bool netlist_source_memregion_t::parse(netlist::setup_t &setup, const pstring &name)
+std::unique_ptr<plib::pistream> netlist_source_memregion_t::stream(const pstring &name)
{
- memory_region *mem = downcast<netlist_mame_t &>(setup.netlist()).machine().root_device().memregion(m_name.cstr());
- plib::pimemstream istrm(mem->base(),mem->bytes() );
- return setup.parse_stream(istrm, name);
+ memory_region *mem = downcast<netlist_mame_t &>(setup().netlist()).machine().root_device().memregion(m_name.cstr());
+ return plib::make_unique_base<plib::pistream, plib::pimemstream>(mem->base(), mem->bytes());
}
+
+std::unique_ptr<plib::pistream> netlist_data_memregion_t::stream(const pstring &name)
+{
+ if (name == m_name)
+ return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_ptr, m_size);
+ else
+ return std::unique_ptr<plib::pistream>(nullptr);
+}
+