diff options
Diffstat (limited to 'src/devices/machine/smpc.h')
-rw-r--r-- | src/devices/machine/smpc.h | 115 |
1 files changed, 19 insertions, 96 deletions
diff --git a/src/devices/machine/smpc.h b/src/devices/machine/smpc.h index 2321448a67f..e832cdd2558 100644 --- a/src/devices/machine/smpc.h +++ b/src/devices/machine/smpc.h @@ -17,57 +17,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_SMPC_HLE_ADD(tag, clock) \ - MCFG_DEVICE_ADD((tag), SMPC_HLE, (clock)) - -#define MCFG_SMPC_HLE_SCREEN(screen_tag) \ - downcast<smpc_hle_device &>(*device).set_screen_tag(screen_tag); - -#define MCFG_SMPC_HLE_CONTROL_PORTS(ctrl1_tag, ctrl2_tag) \ - downcast<smpc_hle_device &>(*device).set_control_port_tags(ctrl1_tag, ctrl2_tag); - -#define MCFG_SMPC_HLE_PDR1_IN_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_pdr1_in_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_PDR2_IN_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_pdr2_in_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_PDR1_OUT_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_pdr1_out_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_PDR2_OUT_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_pdr2_out_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_MASTER_RESET_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_master_reset_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_MASTER_NMI_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_master_nmi_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_SLAVE_RESET_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_slave_reset_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_SOUND_RESET_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_sound_reset_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_SYSTEM_RESET_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_system_reset_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_SYSTEM_HALT_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_system_halt_handler(DEVCB_##_devcb); - -#define MCFG_SMPC_HLE_DOT_SELECT_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_dot_select_handler(DEVCB_##_devcb); - -// set_irq_handler doesn't work in Saturn driver??? -#define MCFG_SMPC_HLE_IRQ_HANDLER_CB(_devcb) \ - downcast<smpc_hle_device &>(*device).set_interrupt_handler(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -94,63 +43,39 @@ public: uint8_t get_ddr(bool which); // system delegation - template<class Object> - devcb_base &set_master_reset_handler(Object &&cb) - { return m_mshres.set_callback(std::forward<Object>(cb)); } + auto master_reset_handler() { return m_mshres.bind(); } - template<class Object> - devcb_base &set_master_nmi_handler(Object &&cb) - { return m_mshnmi.set_callback(std::forward<Object>(cb)); } + auto master_nmi_handler() { return m_mshnmi.bind(); } - template<class Object> - devcb_base &set_slave_reset_handler(Object &&cb) - { return m_sshres.set_callback(std::forward<Object>(cb)); } + auto slave_reset_handler() { return m_sshres.bind(); } - template<class Object> - devcb_base &set_sound_reset_handler(Object &&cb) - { return m_sndres.set_callback(std::forward<Object>(cb)); } + auto sound_reset_handler() { return m_sndres.bind(); } - template<class Object> - devcb_base &set_system_reset_handler(Object &&cb) - { return m_sysres.set_callback(std::forward<Object>(cb)); } + auto system_reset_handler() { return m_sysres.bind(); } - template<class Object> - devcb_base &set_system_halt_handler(Object &&cb) - { return m_syshalt.set_callback(std::forward<Object>(cb)); } + auto system_halt_handler() { return m_syshalt.bind(); } - template<class Object> - devcb_base &set_dot_select_handler(Object &&cb) - { return m_dotsel.set_callback(std::forward<Object>(cb)); } + auto dot_select_handler() { return m_dotsel.bind(); } // PDR delegation - template<class Object> - devcb_base &set_pdr1_in_handler(Object &&cb) - { return m_pdr1_read.set_callback(std::forward<Object>(cb)); } + auto pdr1_in_handler() { return m_pdr1_read.bind(); } - template<class Object> - devcb_base &set_pdr2_in_handler(Object &&cb) - { return m_pdr2_read.set_callback(std::forward<Object>(cb)); } + auto pdr2_in_handler() { return m_pdr2_read.bind(); } - template<class Object> - devcb_base &set_pdr1_out_handler(Object &&cb) - { return m_pdr1_write.set_callback(std::forward<Object>(cb)); } + auto pdr1_out_handler() { return m_pdr1_write.bind(); } - template<class Object> - devcb_base &set_pdr2_out_handler(Object &&cb) - { return m_pdr2_write.set_callback(std::forward<Object>(cb)); } + auto pdr2_out_handler() { return m_pdr2_write.bind(); } - // interrupt handler - template<class Object> - devcb_base &set_interrupt_handler(Object &&cb) - { return m_irq_line.set_callback(std::forward<Object>(cb)); } + // interrupt handler, doesn't work in Saturn driver??? + auto interrupt_handler() { return m_irq_line.bind(); } void set_region_code(uint8_t rgn) { m_region_code = rgn; } - void set_screen_tag(const char *tag) { m_screen.set_tag(tag); } - void set_control_port_tags(const char *tag1, const char *tag2) + template <typename T> void set_screen_tag(T &&tag) { m_screen.set_tag(std::forward<T>(tag)); } + template <typename T, typename U> void set_control_port_tags(T &&tag1, U &&tag2) { - m_ctrl1_tag = tag1; - m_ctrl2_tag = tag2; + m_ctrl1.set_tag(std::forward<T>(tag1)); + m_ctrl2.set_tag(std::forward<U>(tag2)); // TODO: checking against nullptr still returns a device!? m_has_ctrl_ports = true; } @@ -178,8 +103,6 @@ private: emu_timer *m_rtc_timer; emu_timer *m_intback_timer; emu_timer *m_sndres_timer; - const char *m_ctrl1_tag; - const char *m_ctrl2_tag; bool m_has_ctrl_ports; bool m_sf; @@ -247,8 +170,8 @@ private: devcb_write8 m_pdr1_write; devcb_write8 m_pdr2_write; devcb_write_line m_irq_line; - saturn_control_port_device *m_ctrl1; - saturn_control_port_device *m_ctrl2; + optional_device<saturn_control_port_device> m_ctrl1; + optional_device<saturn_control_port_device> m_ctrl2; required_device<screen_device> m_screen; |