summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/smpc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/smpc.h')
-rw-r--r--src/devices/machine/smpc.h79
1 files changed, 69 insertions, 10 deletions
diff --git a/src/devices/machine/smpc.h b/src/devices/machine/smpc.h
index 9c8a33e43dc..f5bcdc1144e 100644
--- a/src/devices/machine/smpc.h
+++ b/src/devices/machine/smpc.h
@@ -32,6 +32,31 @@
#define MCFG_SMPC_HLE_PDR2_OUT_CB(_devcb) \
devcb = &smpc_hle_device::set_pdr2_out_handler(*device, DEVCB_##_devcb);
+#define MCFG_SMPC_HLE_MASTER_RESET_CB(_devcb) \
+ devcb = &smpc_hle_device::set_master_reset_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_SMPC_HLE_MASTER_NMI_CB(_devcb) \
+ devcb = &smpc_hle_device::set_master_nmi_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_SMPC_HLE_SLAVE_RESET_CB(_devcb) \
+ devcb = &smpc_hle_device::set_slave_reset_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_SMPC_HLE_SOUND_RESET_CB(_devcb) \
+ devcb = &smpc_hle_device::set_sound_reset_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_SMPC_HLE_SYSTEM_RESET_CB(_devcb) \
+ devcb = &smpc_hle_device::set_system_reset_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_SMPC_HLE_SYSTEM_HALT_CB(_devcb) \
+ devcb = &smpc_hle_device::set_system_halt_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_SMPC_HLE_DOT_SELECT_CB(_devcb) \
+ devcb = &smpc_hle_device::set_dot_select_handler(*device, DEVCB_##_devcb);
+
+// set_irq_handler doesn't work in Saturn driver???
+#define MCFG_SMPC_HLE_IRQ_HANDLER_CB(_devcb) \
+ devcb = &smpc_hle_device::set_interrupt_handler(*device, DEVCB_##_devcb);
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -49,15 +74,6 @@ public:
virtual space_config_vector memory_space_config() const override;
// I/O operations
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( read );
- // TODO: public stuff that should be internal to the device
- void sr_set(uint8_t data);
- void sr_ack();
- void sf_ack(bool cd_enable);
- void sf_set();
- bool get_iosel(bool which);
- uint8_t get_ddr(bool which);
DECLARE_READ8_MEMBER( status_register_r );
DECLARE_WRITE8_MEMBER( status_flag_w );
DECLARE_READ8_MEMBER( status_flag_r );
@@ -69,13 +85,45 @@ public:
DECLARE_WRITE8_MEMBER( ddr2_w );
DECLARE_WRITE8_MEMBER( iosel_w );
DECLARE_WRITE8_MEMBER( exle_w );
+
+ // TODO: public stuff & trampolines that should be internal to the device
+ DECLARE_WRITE8_MEMBER( write );
+ DECLARE_READ8_MEMBER( read );
+ void sr_set(uint8_t data);
+ void sr_ack();
+ void sf_ack(bool cd_enable);
+ void sf_set();
+ void master_sh2_reset(bool state);
+ void master_sh2_nmi(bool state);
+ void slave_sh2_reset(bool state);
+ void sound_reset(bool state);
+ void system_reset(bool state);
+ void dot_select_request(bool state);
+ void system_halt_request(bool state);
+ void irq_request();
+ bool get_iosel(bool which);
+ uint8_t get_ddr(bool which);
+
+// system delegation
+ template <class Object> static devcb_base &set_master_reset_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_mshres.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_master_nmi_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_mshnmi.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_slave_reset_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_sshres.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_sound_reset_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_sndres.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_system_reset_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_sysres.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_system_halt_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_syshalt.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_dot_select_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_dotsel.set_callback(std::forward<Object>(cb)); }
+
+
+// PDR delegation
template <class Object> static devcb_base &set_pdr1_in_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_pdr1_read.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_pdr2_in_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_pdr2_read.set_callback(std::forward<Object>(cb)); }
-
template <class Object> static devcb_base &set_pdr1_out_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_pdr1_write.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_pdr2_out_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_pdr2_write.set_callback(std::forward<Object>(cb)); }
+ // interrupt handler
+ template <class Object> static devcb_base &set_interrupt_handler(device_t &device, Object &&cb) { return downcast<smpc_hle_device &>(device).m_irq_line.set_callback(std::forward<Object>(cb)); }
+
protected:
// device-level overrides
@@ -95,10 +143,21 @@ private:
uint8_t m_pdr1_readback, m_pdr2_readback;
bool m_iosel1, m_iosel2;
bool m_exle1, m_exle2;
+
+ devcb_write_line m_mshres;
+ devcb_write_line m_mshnmi;
+ devcb_write_line m_sshres;
+// devcb_write_line m_sshnmi;
+ devcb_write_line m_sndres;
+ devcb_write_line m_sysres;
+// devcb_write_line m_cdres;
+ devcb_write_line m_syshalt;
+ devcb_write_line m_dotsel;
devcb_read8 m_pdr1_read;
devcb_read8 m_pdr2_read;
devcb_write8 m_pdr1_write;
devcb_write8 m_pdr2_write;
+ devcb_write_line m_irq_line;
};