diff options
Diffstat (limited to 'src/devices/machine/netlist.cpp')
-rw-r--r-- | src/devices/machine/netlist.cpp | 140 |
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); +} + |