diff options
Diffstat (limited to 'src/devices/machine/netlist.h')
-rw-r--r-- | src/devices/machine/netlist.h | 194 |
1 files changed, 183 insertions, 11 deletions
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 7d5d8848df6..9428da5d348 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -35,14 +35,28 @@ netlist_analog_output_delegate(& _class :: _member, \ # _class "::" # _member, _class_tag, (_class *)nullptr) ); -#define MCFG_NETLIST_LOGIC_INPUT(_basetag, _tag, _name, _shift) \ - MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_INPUT, 0) \ +#define MCFG_NETLIST_LOGIC_OUTPUT(_basetag, _tag, _IN, _class, _member, _class_tag) \ + MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_OUTPUT, 0) \ + netlist_mame_logic_output_t::static_set_params(*device, _IN, \ + netlist_logic_output_delegate(& _class :: _member, \ + # _class "::" # _member, _class_tag, (_class *)nullptr) ); + +#define MCFG_NETLIST_LOGIC_INPUT(_basetag, _tag, _name, _shift) \ + MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_INPUT, 0) \ netlist_mame_logic_input_t::static_set_params(*device, _name, _shift); -#define MCFG_NETLIST_INT_INPUT(_basetag, _tag, _name, _shift, _mask) \ - MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_INT_INPUT, 0) \ +#define MCFG_NETLIST_INT_INPUT(_basetag, _tag, _name, _shift, _mask) \ + MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_INT_INPUT, 0) \ netlist_mame_int_input_t::static_set_params(*device, _name, _mask, _shift); +#define MCFG_NETLIST_ROM_REGION(_basetag, _tag, _region, _name, _offset, _size) \ + MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ROM_REGION, 0) \ + netlist_mame_rom_t::static_set_params(*device, _name, ":" _region, _offset, _size); + +#define MCFG_NETLIST_RAM_POINTER(_basetag, _tag, _name) \ + MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_RAM_POINTER, 0) \ + netlist_ram_pointer_t::static_set_params(*device, _name ".m_RAM"); + #define MCFG_NETLIST_STREAM_INPUT(_basetag, _chan, _name) \ MCFG_DEVICE_ADD(_basetag ":cin" # _chan, NETLIST_STREAM_INPUT, 0) \ netlist_mame_stream_input_t::static_set_params(*device, _chan, _name); @@ -51,7 +65,6 @@ MCFG_DEVICE_ADD(_basetag ":cout" # _chan, NETLIST_STREAM_OUTPUT, 0) \ netlist_mame_stream_output_t::static_set_params(*device, _chan, _name); - #define NETLIST_LOGIC_PORT_CHANGED(_base, _tag) \ PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_logic_input_t, input_changed, 0) @@ -63,11 +76,13 @@ #define MEMREGION_SOURCE(_name) \ - setup.register_source(plib::make_unique_base<netlist::source_t, netlist_source_memregion_t>(_name)); + setup.register_source(plib::make_unique_base<netlist::source_t, netlist_source_memregion_t>(setup, _name)); #define NETDEV_ANALOG_CALLBACK_MEMBER(_name) \ void _name(const double data, const attotime &time) +#define NETDEV_LOGIC_CALLBACK_MEMBER(_name) \ + void _name(const int data, const attotime &time) // ---------------------------------------------------------------------------------------- @@ -77,14 +92,33 @@ class netlist_source_memregion_t : public netlist::source_t { public: - netlist_source_memregion_t(pstring name) - : netlist::source_t(), m_name(name) + netlist_source_memregion_t(netlist::setup_t &setup, pstring name) + : netlist::source_t(setup), m_name(name) + { + } + + virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override; +private: + pstring m_name; +}; + +class netlist_data_memregion_t : public netlist::source_t +{ +public: + netlist_data_memregion_t(netlist::setup_t &setup, + pstring name, uint8_t *ptr, std::size_t size) + : netlist::source_t(setup, netlist::source_t::DATA) + , m_name(name) + , m_ptr(ptr) + , m_size(size) { } - bool parse(netlist::setup_t &setup, const pstring &name) override; + virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override; private: pstring m_name; + uint8_t *m_ptr; + std::size_t m_size; }; class netlist_mame_device_t; @@ -310,6 +344,7 @@ public: virtual ~netlist_mame_sub_interface() { } virtual void custom_netlist_additions(netlist::setup_t &setup) { } + virtual void pre_parse_action(netlist::setup_t &setup) { } inline netlist_mame_device_t &nl_owner() const { return *m_owner; } @@ -410,13 +445,39 @@ private: netlist_analog_output_delegate m_delegate; }; +// ---------------------------------------------------------------------------------------- +// netlist_mame_logic_output_t +// ---------------------------------------------------------------------------------------- + +typedef device_delegate<void(const int, const attotime &)> netlist_logic_output_delegate; + +class netlist_mame_logic_output_t : public device_t, + public netlist_mame_sub_interface +{ +public: + + // construction/destruction + netlist_mame_logic_output_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ~netlist_mame_logic_output_t() { } + + static void static_set_params(device_t &device, const char *in_name, netlist_logic_output_delegate adelegate); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void custom_netlist_additions(netlist::setup_t &setup) override; + +private: + pstring m_in; + netlist_logic_output_delegate m_delegate; +}; // ---------------------------------------------------------------------------------------- // netlist_mame_int_input_t // ---------------------------------------------------------------------------------------- class netlist_mame_int_input_t : public device_t, - public netlist_mame_sub_interface + public netlist_mame_sub_interface { public: @@ -457,6 +518,7 @@ private: pstring m_param_name; }; + // ---------------------------------------------------------------------------------------- // netlist_mame_logic_input_t // ---------------------------------------------------------------------------------------- @@ -503,6 +565,64 @@ private: }; // ---------------------------------------------------------------------------------------- +// netlist_mame_rom_t +// ---------------------------------------------------------------------------------------- + +class netlist_mame_rom_t : public device_t, + public netlist_mame_sub_interface +{ +public: + + // construction/destruction + netlist_mame_rom_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ~netlist_mame_rom_t() { } + + static void static_set_params(device_t &device, const char *name, const char* region_tag, std::size_t offset, std::size_t size); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void custom_netlist_additions(netlist::setup_t &setup) override; + +private: + pstring m_name; + const char* m_region_tag; + std::size_t m_offset; + std::size_t m_size; +}; + +// ---------------------------------------------------------------------------------------- +// netlist_ram_pointer_t +// ---------------------------------------------------------------------------------------- + +class netlist_ram_pointer_t: public device_t, + public netlist_mame_sub_interface +{ +public: + + // construction/destruction + netlist_ram_pointer_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ~netlist_ram_pointer_t() { } + + uint8_t* ptr() const { return m_data; } + + static void static_set_params(device_t &device, const char *param_name); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override + { + m_data = (*m_param)(); + } + +private: + netlist::param_ptr_t *m_param; + pstring m_param_name; + uint8_t* m_data; +}; + +// ---------------------------------------------------------------------------------------- // netlist_mame_stream_input_t // ---------------------------------------------------------------------------------------- @@ -549,8 +669,9 @@ private: uint32_t m_channel; pstring m_out_name; }; + // ---------------------------------------------------------------------------------------- -// netdev_callback +// analog_callback // ---------------------------------------------------------------------------------------- class NETLIB_NAME(analog_callback) : public netlist::device_t @@ -598,6 +719,54 @@ private: }; // ---------------------------------------------------------------------------------------- +// logic_callback +// ---------------------------------------------------------------------------------------- + +class NETLIB_NAME(logic_callback) : public netlist::device_t +{ +public: + NETLIB_NAME(logic_callback)(netlist::netlist_t &anetlist, const pstring &name) + : device_t(anetlist, name) + , m_in(*this, "IN") + , m_cpu_device(nullptr) + , m_last(*this, "m_last", 0) + { + m_cpu_device = downcast<netlist_mame_cpu_device_t *>(&downcast<netlist_mame_t &>(netlist()).parent()); + } + + ATTR_COLD void reset() override + { + m_last = 0; + } + + ATTR_COLD void register_callback(netlist_logic_output_delegate callback) + { + m_callback = callback; + } + + NETLIB_UPDATEI() + { + netlist_sig_t cur = m_in(); + + // FIXME: make this a parameter + // avoid calls due to noise + if (cur != m_last) + { + m_cpu_device->update_time_x(); + m_callback(cur, m_cpu_device->local_time()); + m_cpu_device->check_mame_abort_slice(); + m_last = cur; + } + } + +private: + netlist::logic_input_t m_in; + netlist_logic_output_delegate m_callback; + netlist_mame_cpu_device_t *m_cpu_device; + netlist::state_var<netlist_sig_t> m_last; +}; + +// ---------------------------------------------------------------------------------------- // sound_out // ---------------------------------------------------------------------------------------- @@ -761,7 +930,10 @@ extern const device_type NETLIST_SOUND; extern const device_type NETLIST_ANALOG_INPUT; extern const device_type NETLIST_LOGIC_INPUT; extern const device_type NETLIST_INT_INPUT; +extern const device_type NETLIST_ROM_REGION; +extern const device_type NETLIST_RAM_POINTER; +extern const device_type NETLIST_LOGIC_OUTPUT; extern const device_type NETLIST_ANALOG_OUTPUT; extern const device_type NETLIST_STREAM_INPUT; extern const device_type NETLIST_STREAM_OUTPUT; |