diff options
Diffstat (limited to 'src/devices/machine/z80ctc.h')
-rw-r--r-- | src/devices/machine/z80ctc.h | 96 |
1 files changed, 53 insertions, 43 deletions
diff --git a/src/devices/machine/z80ctc.h b/src/devices/machine/z80ctc.h index 7da3f480bf7..724a6dbb9c0 100644 --- a/src/devices/machine/z80ctc.h +++ b/src/devices/machine/z80ctc.h @@ -39,33 +39,68 @@ devcb = &downcast<z80ctc_device &>(*device).set_intr_callback(DEVCB_##_devcb); #define MCFG_Z80CTC_ZC0_CB(_devcb) \ - devcb = &downcast<z80ctc_device &>(*device).set_zc0_callback(DEVCB_##_devcb); + devcb = &downcast<z80ctc_device &>(*device).set_zc_callback<0>(DEVCB_##_devcb); #define MCFG_Z80CTC_ZC1_CB(_devcb) \ - devcb = &downcast<z80ctc_device &>(*device).set_zc1_callback(DEVCB_##_devcb); + devcb = &downcast<z80ctc_device &>(*device).set_zc_callback<1>(DEVCB_##_devcb); #define MCFG_Z80CTC_ZC2_CB(_devcb) \ - devcb = &downcast<z80ctc_device &>(*device).set_zc2_callback(DEVCB_##_devcb); + devcb = &downcast<z80ctc_device &>(*device).set_zc_callback<2>(DEVCB_##_devcb); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** +// forward declaration +class z80ctc_device; + +// ======================> z80ctc_channel_device + +// a single channel within the CTC +class z80ctc_channel_device : public device_t +{ + friend class z80ctc_device; + +public: + // construction/destruction + z80ctc_channel_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + u8 read(); + void write(u8 data); + + attotime period() const; + void trigger(bool state); + TIMER_CALLBACK_MEMBER(timer_callback); + + required_device<z80ctc_device> m_device; // pointer back to our device + int m_index; // our channel index + u16 m_mode; // current mode + u16 m_tconst; // time constant + u16 m_down; // down counter (clock mode only) + bool m_extclk; // current signal from the external clock + emu_timer * m_timer; // array of active timers + u8 m_int_state; // interrupt status (for daisy chain) +}; // ======================> z80ctc_device class z80ctc_device : public device_t, public device_z80daisy_interface { + friend class z80ctc_channel_device; + public: // construction/destruction - z80ctc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + z80ctc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); template <class Object> devcb_base &set_intr_callback(Object &&cb) { return m_intr_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_zc0_callback(Object &&cb) { return m_zc0_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_zc1_callback(Object &&cb) { return m_zc1_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_zc2_callback(Object &&cb) { return m_zc2_cb.set_callback(std::forward<Object>(cb)); } + template <int Channel, class Object> devcb_base &set_zc_callback(Object &&cb) { return m_zc_cb[Channel].set_callback(std::forward<Object>(cb)); } // read/write handlers DECLARE_READ8_MEMBER( read ); @@ -75,12 +110,14 @@ public: DECLARE_WRITE_LINE_MEMBER( trg2 ); DECLARE_WRITE_LINE_MEMBER( trg3 ); - uint16_t get_channel_constant(uint8_t channel) { return m_channel[channel].m_tconst; } + u16 get_channel_constant(u8 channel) const { return m_channel[channel]->m_tconst; } protected: // device-level overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_resolve_objects() override; virtual void device_start() override; - virtual void device_reset() override; + virtual void device_reset_after_children() override; // z80daisy_interface overrides virtual int z80daisy_irq_state() override; @@ -91,46 +128,19 @@ private: // internal helpers void interrupt_check(); - // a single channel within the CTC - class ctc_channel - { - public: - ctc_channel(); - - void start(z80ctc_device *device, int index); - void reset(); - - uint8_t read(); - void write(uint8_t data); - - attotime period() const; - void trigger(uint8_t data); - TIMER_CALLBACK_MEMBER(timer_callback); - - z80ctc_device * m_device; // pointer back to our device - int m_index; // our channel index - uint16_t m_mode; // current mode - uint16_t m_tconst; // time constant - uint16_t m_down; // down counter (clock mode only) - uint8_t m_extclk; // current signal from the external clock - emu_timer * m_timer; // array of active timers - uint8_t m_int_state; // interrupt status (for daisy chain) - }; - // internal state devcb_write_line m_intr_cb; // interrupt callback - devcb_write_line m_zc0_cb; // channel 0 zero crossing callbacks - devcb_write_line m_zc1_cb; // channel 1 zero crossing callbacks - devcb_write_line m_zc2_cb; // channel 2 zero crossing callbacks - devcb_write_line m_zc3_cb; // channel 3 zero crossing callbacks = nullptr ? + devcb_write_line m_zc_cb[4]; // zero crossing/timer output callbacks - uint8_t m_vector; // interrupt vector - ctc_channel m_channel[4]; // data for each channel + u8 m_vector; // interrupt vector + + // subdevice for each channel + required_device_array<z80ctc_channel_device, 4> m_channel; }; -// device type definition +// device type definitions DECLARE_DEVICE_TYPE(Z80CTC, z80ctc_device) - +DECLARE_DEVICE_TYPE(Z80CTC_CHANNEL, z80ctc_channel_device) #endif // MAME_MACHINE_Z80CTC_H |