summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/z80ctc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/z80ctc.h')
-rw-r--r--src/devices/machine/z80ctc.h96
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