diff options
Diffstat (limited to 'src/emu/cpu/z80/z80daisy.h')
-rw-r--r-- | src/emu/cpu/z80/z80daisy.h | 97 |
1 files changed, 66 insertions, 31 deletions
diff --git a/src/emu/cpu/z80/z80daisy.h b/src/emu/cpu/z80/z80daisy.h index ad3adcfbc0d..dee7525f44d 100644 --- a/src/emu/cpu/z80/z80daisy.h +++ b/src/emu/cpu/z80/z80daisy.h @@ -13,56 +13,91 @@ -/*************************************************************************** - CONSTANTS -***************************************************************************/ +//************************************************************************** +// CONSTANTS +//************************************************************************** + +// these constants are returned from the irq_state function +const UINT8 Z80_DAISY_INT = 0x01; // interrupt request mask +const UINT8 Z80_DAISY_IEO = 0x02; // interrupt disable mask (IEO) + -/* these constants are returned from the irq_state function */ -#define Z80_DAISY_INT 0x01 /* interrupt request mask */ -#define Z80_DAISY_IEO 0x02 /* interrupt disable mask (IEO) */ +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** -enum + +// ======================> z80_daisy_config + +struct z80_daisy_config { - DEVINFO_FCT_IRQ_STATE = DEVINFO_FCT_DEVICE_SPECIFIC, /* R/O: z80_daisy_irq_state */ - DEVINFO_FCT_IRQ_ACK, /* R/O: z80_daisy_irq_ack */ - DEVINFO_FCT_IRQ_RETI /* R/O: z80_daisy_irq_reti */ + const char * devname; // name of the device }; -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ +// ======================> device_config_z80daisy_interface -/* per-device callback functions */ -typedef int (*z80_daisy_irq_state)(running_device *device); -typedef int (*z80_daisy_irq_ack)(running_device *device); -typedef int (*z80_daisy_irq_reti)(running_device *device); +// device_config_z80daisy_interface represents configuration information for a z80daisy device +class device_config_z80daisy_interface : public device_config_interface +{ +public: + // construction/destruction + device_config_z80daisy_interface(const machine_config &mconfig, device_config &devconfig); + virtual ~device_config_z80daisy_interface(); +}; -/* opaque internal daisy chain state */ -typedef struct _z80_daisy_state z80_daisy_state; +// ======================> device_z80daisy_interface -/* daisy chain structure */ -typedef struct _z80_daisy_chain z80_daisy_chain; -struct _z80_daisy_chain +class device_z80daisy_interface : public device_interface { - const char * devname; /* name of the device */ +public: + // construction/destruction + device_z80daisy_interface(running_machine &machine, const device_config &config, device_t &device); + virtual ~device_z80daisy_interface(); + + // required operation overrides + virtual int z80daisy_irq_state() = 0; + virtual int z80daisy_irq_ack() = 0; + virtual void z80daisy_irq_reti() = 0; + +protected: + const device_config_z80daisy_interface &m_z80daisy_config; }; -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ +// ======================> z80_daisy_chain -z80_daisy_state *z80daisy_init(running_device *cpudevice, const z80_daisy_chain *daisy); +class z80_daisy_chain +{ +public: + z80_daisy_chain(); + void init(device_t *cpudevice, const z80_daisy_config *daisy); + + bool present() const { return (m_daisy_list != NULL); } + + void reset(); + int update_irq_state(); + int call_ack_device(); + void call_reti_device(); + +protected: + class daisy_entry + { + public: + daisy_entry(device_t *device); + + daisy_entry * m_next; // next device + device_t * m_device; // associated device + device_z80daisy_interface * m_interface; // associated device's daisy interface + }; + + daisy_entry * m_daisy_list; // head of the daisy chain +}; -void z80daisy_reset(z80_daisy_state *daisy); -int z80daisy_update_irq_state(z80_daisy_state *chain); -int z80daisy_call_ack_device(z80_daisy_state *chain); -void z80daisy_call_reti_device(z80_daisy_state *chain); #endif |