summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/nec/v5x.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/nec/v5x.h')
-rw-r--r--src/devices/cpu/nec/v5x.h72
1 files changed, 42 insertions, 30 deletions
diff --git a/src/devices/cpu/nec/v5x.h b/src/devices/cpu/nec/v5x.h
index f82c50223e0..d30bb5fdb4a 100644
--- a/src/devices/cpu/nec/v5x.h
+++ b/src/devices/cpu/nec/v5x.h
@@ -19,29 +19,29 @@ public:
// TCU
void set_tclk(double clk) { m_tclk = clk; }
void set_tclk(const XTAL &xtal) { set_tclk(xtal.dvalue()); }
- DECLARE_WRITE_LINE_MEMBER(tclk_w);
+ void tclk_w(int state);
// DMAU
- auto out_hreq_cb() { return device().subdevice<v5x_dmau_device>("dmau")->out_hreq_callback(); }
- auto out_eop_cb() { return device().subdevice<v5x_dmau_device>("dmau")->out_eop_callback(); }
- auto in_memr_cb() { return device().subdevice<v5x_dmau_device>("dmau")->in_memr_callback(); }
- auto in_mem16r_cb() { return device().subdevice<v5x_dmau_device>("dmau")->in_mem16r_callback(); }
- auto out_memw_cb() { return device().subdevice<v5x_dmau_device>("dmau")->out_memw_callback(); }
- auto out_mem16w_cb() { return device().subdevice<v5x_dmau_device>("dmau")->out_mem16w_callback(); }
- template <unsigned Channel> auto in_ior_cb() { return device().subdevice<v5x_dmau_device>("dmau")->in_ior_callback<Channel>(); }
- template <unsigned Channel> auto in_io16r_cb() { return device().subdevice<v5x_dmau_device>("dmau")->in_io16r_callback<Channel>(); }
- template <unsigned Channel> auto out_iow_cb() { return device().subdevice<v5x_dmau_device>("dmau")->out_iow_callback<Channel>(); }
- template <unsigned Channel> auto out_io16w_cb() { return device().subdevice<v5x_dmau_device>("dmau")->out_io16w_callback<Channel>(); }
- template <unsigned Channel> auto out_dack_cb() { return device().subdevice<v5x_dmau_device>("dmau")->out_dack_callback<Channel>(); }
+ auto out_hreq_cb() { return m_dmau.lookup()->out_hreq_callback(); }
+ auto out_eop_cb() { return m_dmau.lookup()->out_eop_callback(); }
+ auto in_memr_cb() { return m_dmau.lookup()->in_memr_callback(); }
+ auto in_mem16r_cb() { return m_dmau.lookup()->in_mem16r_callback(); }
+ auto out_memw_cb() { return m_dmau.lookup()->out_memw_callback(); }
+ auto out_mem16w_cb() { return m_dmau.lookup()->out_mem16w_callback(); }
+ template <unsigned Channel> auto in_ior_cb() { return m_dmau.lookup()->in_ior_callback<Channel>(); }
+ template <unsigned Channel> auto in_io16r_cb() { return m_dmau.lookup()->in_io16r_callback<Channel>(); }
+ template <unsigned Channel> auto out_iow_cb() { return m_dmau.lookup()->out_iow_callback<Channel>(); }
+ template <unsigned Channel> auto out_io16w_cb() { return m_dmau.lookup()->out_io16w_callback<Channel>(); }
+ template <unsigned Channel> auto out_dack_cb() { return m_dmau.lookup()->out_dack_callback<Channel>(); }
// SCU
- auto txd_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->txd_handler(); }
- auto dtr_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->dtr_handler(); }
- auto rts_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->rts_handler(); }
- auto rxrdy_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->rxrdy_handler(); }
- auto txrdy_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->txrdy_handler(); }
- auto txempty_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->txempty_handler(); }
- auto syndet_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->syndet_handler(); }
+ auto txd_handler_cb() { return m_scu.lookup()->txd_handler(); }
+ auto dtr_handler_cb() { return m_scu.lookup()->dtr_handler(); }
+ auto rts_handler_cb() { return m_scu.lookup()->rts_handler(); }
+ auto rxrdy_handler_cb() { return m_scu.lookup()->rxrdy_handler(); }
+ auto txrdy_handler_cb() { return m_scu.lookup()->txrdy_handler(); }
+ auto txempty_handler_cb() { return m_scu.lookup()->txempty_handler(); }
+ auto syndet_handler_cb() { return m_scu.lookup()->syndet_handler(); }
protected:
device_v5x_interface(const machine_config &mconfig, nec_common_device &device, bool is_16bit);
@@ -50,7 +50,7 @@ protected:
virtual void interface_post_start() override;
virtual void interface_pre_reset() override;
virtual void interface_post_load() override;
- virtual void interface_clock_changed() override;
+ virtual void interface_clock_changed(bool sync_on_new_clock_domain) override;
void v5x_set_input(int inputnum, int state);
void v5x_add_mconfig(machine_config &config);
@@ -105,8 +105,8 @@ protected:
void OPHA_w(u8 data);
u8 OPSEL_r();
void OPSEL_w(u8 data);
- u8 get_pic_ack() { return 0; }
- DECLARE_WRITE_LINE_MEMBER(internal_irq_w);
+ virtual u8 get_pic_ack(offs_t offset) { return 0; }
+ void internal_irq_w(int state);
void tcu_clock_update();
@@ -141,12 +141,14 @@ protected:
class v50_base_device : public nec_common_device, public device_v5x_interface
{
public:
- template <unsigned Channel> DECLARE_WRITE_LINE_MEMBER(dreq_w) { m_dmau->dreq_w<Channel>(state); }
- DECLARE_WRITE_LINE_MEMBER(hack_w) { m_dmau->hack_w(state); }
- DECLARE_WRITE_LINE_MEMBER(tctl2_w) { m_tcu->write_gate2(state); }
+ template <unsigned Channel> void dreq_w(int state) { m_dmau->dreq_w<Channel>(state); }
+ void hack_w(int state) { m_dmau->hack_w(state); }
+ void tctl2_w(int state) { m_tcu->write_gate2(state); }
auto tout1_cb() { return m_tout1_callback.bind(); }
- auto tout2_cb() { return subdevice<pit8253_device>("tcu")->out_handler<2>(); }
+ auto tout2_cb() { return m_tcu.lookup()->out_handler<2>(); }
+
+ auto icu_slave_ack_cb() { return m_icu_slave_ack.bind(); }
protected:
v50_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, bool is_16bit, u8 prefetch_size, u8 prefetch_cycles, u32 chip_type);
@@ -177,10 +179,20 @@ protected:
u8 OPCN_r();
void OPCN_w(u8 data);
+ // TODO: non-offset 7 configuration
+ // Currently used by pc88va only, which uses the canonical IRQ7 for cascading an external PIC to the internal one.
+ virtual u8 get_pic_ack(offs_t offset) override
+ {
+ if (offset == 7)
+ return m_icu_slave_ack(0);
+ return 0;
+ }
+
private:
- DECLARE_WRITE_LINE_MEMBER(tout1_w);
+ void tout1_w(int state);
devcb_write_line m_tout1_callback;
+ devcb_read8 m_icu_slave_ack;
u8 m_OPCN;
bool m_tout1;
@@ -211,7 +223,7 @@ class v53_device : public v33_base_device, public device_v5x_interface
public:
v53_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- template <unsigned Channel> DECLARE_WRITE_LINE_MEMBER(dreq_w)
+ template <unsigned Channel> void dreq_w(int state)
{
// dreq0 could be wrong / nonexistent
if (!(m_SCTL & 0x02))
@@ -223,9 +235,9 @@ public:
logerror("dreq%d not in 71071mode\n", Channel);
}
}
- DECLARE_WRITE_LINE_MEMBER(hack_w);
+ void hack_w(int state);
- template <unsigned Timer> auto out_handler() { return subdevice<pit8253_device>("tcu")->out_handler<Timer>(); }
+ template <unsigned Timer> auto tout_handler() { return m_tcu.lookup()->out_handler<Timer>(); }
protected:
v53_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);