diff options
Diffstat (limited to 'src/devices/bus/a800/a8sio.h')
-rw-r--r-- | src/devices/bus/a800/a8sio.h | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/devices/bus/a800/a8sio.h b/src/devices/bus/a800/a8sio.h new file mode 100644 index 00000000000..29e548946d4 --- /dev/null +++ b/src/devices/bus/a800/a8sio.h @@ -0,0 +1,144 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/*************************************************************************** + + a8sio.h - Atari 8 bit SIO bus interface + + + 1 1 + 2 4 6 8 0 2 + +-----------+ + / o o o o o o \ + / o o o o o o o \ + +-----------------+ + 1 3 5 7 9 1 1 + 1 3 + + 1 - clock in (to computer) + 2 - clock out + 3 - data in + 4 - GND + 5 - data out + 6 - GND + 7 - command (active low) + 8 - motor + 9 - proceed (active low) + 10 - +5V/ready + 11 - audio in + 12 - +12V (A400/A800) + 13 - interrupt (active low) + +***************************************************************************/ + +#pragma once + +#ifndef __A8SIO_H_ +#define __A8SIO_H_ + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_A8SIO_SLOT_ADD(_nbtag, _tag, _def_slot) \ + MCFG_DEVICE_ADD(_tag, A8SIO_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(a8sio_cards, _def_slot, false) \ + a8sio_slot_device::static_set_a8sio_slot(*device, _nbtag, _tag); + +#define MCFG_A8SIO_DATA_IN_CB(_devcb) \ + devcb = &a8sio_device::set_data_in_callback(*device, DEVCB_##_devcb); + + +class a8sio_slot_device : public device_t, + public device_slot_interface +{ +public: + // construction/destruction + a8sio_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + a8sio_slot_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + + // device-level overrides + virtual void device_start(); + + // inline configuration + static void static_set_a8sio_slot(device_t &device, const char *tag, const char *slottag); + +protected: + // configuration + const char *m_a8sio_tag; + const char *m_a8sio_slottag; +}; + + +// device type definition +extern const device_type A8SIO_SLOT; + + +class device_a8sio_card_interface; + +class a8sio_device : public device_t +{ +public: + // construction/destruction + a8sio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + a8sio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + + // inline configuration + template<class _Object> static devcb_base &set_clock_in_callback(device_t &device, _Object object) { return downcast<a8sio_device &>(device).m_out_clock_in_cb.set_callback(object); } + template<class _Object> static devcb_base &set_data_in_callback(device_t &device, _Object object) { return downcast<a8sio_device &>(device).m_out_data_in_cb.set_callback(object); } + template<class _Object> static devcb_base &set_audio_in_callback(device_t &device, _Object object) { return downcast<a8sio_device &>(device).m_out_audio_in_cb.set_callback(object); } + + void add_a8sio_card(device_a8sio_card_interface *card); + device_a8sio_card_interface *get_a8sio_card(); + + DECLARE_WRITE_LINE_MEMBER( clock_in_w ); // pin 1 + //virtual DECLARE_WRITE_LINE_MEMBER( clock_out_w ); // pin 2 + DECLARE_WRITE_LINE_MEMBER( data_in_w ); // pin 3 + //DECLARE_WRITE_LINE_MEMBER( data_out_wi ); // pin 5 + //DECLARE_WRITE_LINE_MEMBER( command_w ); // pin 7 + DECLARE_WRITE_LINE_MEMBER( motor_w ); // pin 8 + //DECLARE_WRITE_LINE_MEMBER( proceed_w ); // pin 9 + DECLARE_WRITE8_MEMBER( audio_in_w ); // pin 11 + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + devcb_write_line m_out_clock_in_cb; // pin 1 + devcb_write_line m_out_data_in_cb; // pin 3 + devcb_write8 m_out_audio_in_cb; // pin 11 + + device_a8sio_card_interface *m_device; +}; + + +// device type definition +extern const device_type A8SIO; + + +class device_a8sio_card_interface : public device_slot_card_interface +{ + friend class a8sio_device; +public: + // construction/destruction + device_a8sio_card_interface(const machine_config &mconfig, device_t &device); + virtual ~device_a8sio_card_interface(); + + void set_a8sio_device(); + + // inline configuration + static void static_set_a8sio_tag(device_t &device, const char *tag, const char *slottag); + + virtual DECLARE_WRITE_LINE_MEMBER( motor_w ); + +public: + a8sio_device *m_a8sio; + const char *m_a8sio_tag; + const char *m_a8sio_slottag; +}; + + +SLOT_INTERFACE_EXTERN(a8sio_cards); + +#endif |