diff options
Diffstat (limited to 'src/emu/bus/zorro/zorro.h')
-rw-r--r-- | src/emu/bus/zorro/zorro.h | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/src/emu/bus/zorro/zorro.h b/src/emu/bus/zorro/zorro.h new file mode 100644 index 00000000000..d018b217374 --- /dev/null +++ b/src/emu/bus/zorro/zorro.h @@ -0,0 +1,443 @@ +/*************************************************************************** + + Amiga Zorro Slots + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + 86-pin Expansion Slot (Zorro-I), Zorro-II, Zorro-III + + 86-pin Expansion Slot + + 2 Ground 1 Ground + 4 Ground 3 Ground + 6 +5VDC 5 +5VDC + 8 -5VDC 7 N/C + 10 +12VDC 9 N/C *1 + 12 CFGIN 11 N/C *2 + 14 /C3 Clock 13 Ground + 16 /C1 Clock 15 CDAC + 18 XRDY 17 /OVR + 20 N/C *3 19 /INT2 + 22 /INT6 21 A5 + 24 A4 23 A6 + 26 A3 25 Ground + 28 A7 27 A2 + 30 A8 29 A1 + 32 A9 31 FC0 + 34 A10 33 FC1 + 36 A11 35 FC2 + 38 A12 37 Ground + 40 /IPL0 39 A13 + 42 /IPL1 41 A14 + 44 /IPL2 43 A15 + 46 /BEER 45 A16 + 48 /VPA 47 A17 + 50 E Clock 49 Ground + 52 A18 51 /VMA + 54 A19 53 /RST + 56 A20 55 /HLT + 58 A21 57 A22 + 60 /BR *4 59 A23 + 62 /BGACK 61 Ground + 64 /BG *5 63 D15 + 66 /DTACK 65 D14 + 68 R/W 67 D13 + 70 /LDS 69 D12 + 72 /UDS 71 D11 + 74 /AS 73 Ground + 76 D10 75 D0 + 78 D9 77 D1 + 80 D8 79 D2 + 82 D7 81 D3 + 84 D6 83 D4 + 86 D5 85 Ground + + *1 28 MHz Clock on A2000 and B2000 + *2 /COPCFG on B2000 + *3 /PALOPE on A1000, /BOSS on B2000 + *4 /CBR on B2000 + *5 /CBG on B2000 + + Zorro-II (differences only) + + 7 /OWN + 9 /SLAVEn + 11 /CFGOUTn + 12 /CFGINn + 20 -12VDC + 40 /EINT7 + 42 /EINT5 + 44 /EINT4 + 60 /BRn + 64 /BGn + + 88 Ground 87 Ground + 90 Ground 89 Ground + 92 7 MHz 91 Ground + 94 /BURST 93 DOE + 96 /EINT1 95 /BG *5 + 98 N/C 97 N/C + 100 Ground 99 Ground + + *6 /GBG on B2000 + + Zorro-III + + The Zorro-III is a multiplexed Zorro-II bus with address- and + data phases. Signals changes as follows: + + 17 /CINH + 18 /MTCR + 29 /LOCK + 30 AD8 (D0) + 32 AD9 (D1) + 34 AD10 (D2) + 36 AD11 (D3) + 38 AD12 (D4) + 39 AD13 (D5) + 40 Reserved + 41 AD14 (D6) + 42 Reserved + 43 AD15 (D7) + 44 Reserved + 45 AD16 (D8) + 47 AD17 (D9) + 48 /MTACK + 51 /DS0 + 52 AD18 (D10) + 54 AD19 (D11) + 56 AD20 (D12) + 57 AD22 (D14) + 58 AD21 (D13) + 59 AD23 (D15) + 63 AD31 + 65 AD30 + 67 AD29 + 69 AD28 + 70 /DS2 + 71 AD27 + 72 /DS3 + 74 /CCS + 75 SD0 (D16) + 76 AD26 + 77 SD1 (D17) + 78 AD25 + 79 SD2 (D18) + 80 AD24 + 81 SD3 (D19) + 82 SD7 (D23) + 83 SD4 (D20) + 84 SD6 (D22) + 86 SD5 (D21) + 91 Sense Z3 + 94 /IORST + 95 /BCLR + 97 /FCS + 98 /DS1 + + +***************************************************************************/ + +#pragma once + +#ifndef __ZORRO_H__ +#define __ZORRO_H__ + +#include "emu.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_ZORRO_SLOT_ADD(_zorrotag, _tag, _slot_intf, _def_slot) \ + MCFG_DEVICE_ADD(_tag, ZORRO_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ + zorro_slot_device::set_zorro_slot(*device, owner, _zorrotag); + +// ======================> expansion slot + +#define MCFG_EXPANSION_SLOT_ADD(_cputag, _slot_intf, _def_slot) \ + MCFG_DEVICE_ADD("exp", EXP_SLOT, 0) \ + zorro_device::set_cputag(*device, _cputag); \ + MCFG_ZORRO_SLOT_ADD("exp", "slot", _slot_intf, _def_slot) + +// callbacks +#define MCFG_EXPANSION_SLOT_OVR_HANDLER(_devcb) \ + devcb = &zorro_device::set_ovr_handler(*device, DEVCB2_##_devcb); + +#define MCFG_EXPANSION_SLOT_INT2_HANDLER(_devcb) \ + devcb = &zorro_device::set_int2_handler(*device, DEVCB2_##_devcb); + +#define MCFG_EXPANSION_SLOT_INT6_HANDLER(_devcb) \ + devcb = &zorro_device::set_int6_handler(*device, DEVCB2_##_devcb); + +#define MCFG_EXPANSION_SLOT_IPL_HANDLER(_devcb) \ + devcb = &exp_slot_device::set_ipl_handler(*device, DEVCB2_##_devcb); + +// ======================> zorro 2 bus + +#define MCFG_ZORRO2_ADD(_cputag) \ + MCFG_DEVICE_ADD("zorrobus", ZORRO2, 0) \ + zorro_device::set_cputag(*device, _cputag); + +#define MCFG_ZORRO2_SLOT_ADD(_tag, _slot_intf, _def_slot) \ + MCFG_ZORRO_SLOT_ADD("zorrobus", _tag, _slot_intf, _def_slot) + +#define MCFG_ZORRO2_OVR_HANDLER(_devcb) \ + devcb = &zorro_device::set_ovr_handler(*device, DEVCB2_##_devcb); + +#define MCFG_ZORRO2_INT2_HANDLER(_devcb) \ + devcb = &zorro_device::set_int2_handler(*device, DEVCB2_##_devcb); + +#define MCFG_ZORRO2_INT6_HANDLER(_devcb) \ + devcb = &zorro_device::set_int6_handler(*device, DEVCB2_##_devcb); + +#define MCFG_ZORRO2_EINT1_HANDLER(_devcb) \ + devcb = &zorro2_device::set_eint1_handler(*device, DEVCB2_##_devcb); + +#define MCFG_ZORRO2_EINT4_HANDLER(_devcb) \ + devcb = &zorro2_device::set_eint4_handler(*device, DEVCB2_##_devcb); + +#define MCFG_ZORRO2_EINT5_HANDLER(_devcb) \ + devcb = &zorro2_device::set_eint5_handler(*device, DEVCB2_##_devcb); + +#define MCFG_ZORRO2_EINT7_HANDLER(_devcb) \ + devcb = &zorro2_device::set_eint7_handler(*device, DEVCB2_##_devcb); + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// forward declaration of card interfaces +class device_zorro_card_interface; +class device_exp_card_interface; +class device_zorro2_card_interface; + +// ======================> zorro slot device + +class zorro_slot_device : public device_t, public device_slot_interface +{ +public: + // construction/destruction + zorro_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + zorro_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 set_zorro_slot(device_t &device, device_t *owner, const char *zorro_tag); + +protected: + // configuration + const char *m_zorro_tag; +}; + +// device type definition +extern const device_type ZORRO_SLOT; + +// ======================> base zorro bus device + +class zorro_device : public device_t +{ +public: + // construction/destruction + zorro_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); + + // static configuration helpers + static void set_cputag(device_t &device, const char *tag); + + template<class _Object> static devcb2_base &set_int2_handler(device_t &device, _Object object) + { return downcast<zorro_device &>(device).m_int2_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_int6_handler(device_t &device, _Object object) + { return downcast<zorro_device &>(device).m_int6_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_ovr_handler(device_t &device, _Object object) + { return downcast<zorro_device &>(device).m_ovr_handler.set_callback(object); } + + virtual void add_card(device_zorro_card_interface *card) = 0; + + // interface (from slot device) + virtual DECLARE_WRITE_LINE_MEMBER( cfgout_w ) {}; + + DECLARE_WRITE_LINE_MEMBER( int2_w ); + DECLARE_WRITE_LINE_MEMBER( int6_w ); + DECLARE_WRITE_LINE_MEMBER( ovr_w ); + + // interface (from host) + virtual void fc_w(int code) = 0; + + // access to the host space + address_space *m_space; + +protected: + // device-level overrides + virtual void device_start(); + +private: + const char *m_cputag; + + devcb2_write_line m_ovr_handler; + devcb2_write_line m_int2_handler; + devcb2_write_line m_int6_handler; +}; + +// ======================> expansion slot device + +class exp_slot_device : public zorro_device +{ +public: + // construction/destruction + exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + exp_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); + + template<class _Object> static devcb2_base &set_ipl_handler(device_t &device, _Object object) + { return downcast<exp_slot_device &>(device).m_ipl_handler.set_callback(object); } + + // the expansion slot can only have a single card + virtual void add_card(device_zorro_card_interface *card); + + // interface (from slot device) + void ipl_w(int interrupt); + + // interface (from host) + virtual void fc_w(int code); + +protected: + // device-level overrides + virtual void device_start(); + +private: + devcb2_write8 m_ipl_handler; + + device_exp_card_interface *m_dev; +}; + +// device type definition +extern const device_type EXP_SLOT; + +// ======================> zorro2 slot device + +class zorro2_device : public zorro_device +{ +public: + // construction/destruction + zorro2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + zorro2_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); + + template<class _Object> static devcb2_base &set_eint1_handler(device_t &device, _Object object) + { return downcast<zorro2_device &>(device).m_eint1_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_eint4_handler(device_t &device, _Object object) + { return downcast<zorro2_device &>(device).m_eint4_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_eint5_handler(device_t &device, _Object object) + { return downcast<zorro2_device &>(device).m_eint5_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_eint7_handler(device_t &device, _Object object) + { return downcast<zorro2_device &>(device).m_eint7_handler.set_callback(object); } + + // device-level overrides + virtual void device_reset(); + + // the zorro2 bus supports multiple cards + virtual void add_card(device_zorro_card_interface *card); + + // interface (from slot device) + virtual DECLARE_WRITE_LINE_MEMBER( cfgout_w ); + + DECLARE_WRITE_LINE_MEMBER( eint1_w ); + DECLARE_WRITE_LINE_MEMBER( eint4_w ); + DECLARE_WRITE_LINE_MEMBER( eint5_w ); + DECLARE_WRITE_LINE_MEMBER( eint7_w ); + + // interface (from host) + virtual void fc_w(int code); + +protected: + // device-level overrides + virtual void device_start(); + +private: + devcb2_write_line m_eint1_handler; + devcb2_write_line m_eint4_handler; + devcb2_write_line m_eint5_handler; + devcb2_write_line m_eint7_handler; + + simple_list<device_zorro2_card_interface> m_dev; + + // the device which is currently configuring + device_zorro2_card_interface *m_autoconfig_device; +}; + +// device type definition +extern const device_type ZORRO2; + + +// ======================> base zorro card interface + +class device_zorro_card_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_zorro_card_interface(const machine_config &mconfig, device_t &device); + virtual ~device_zorro_card_interface(); + + virtual void set_zorro_device() = 0; + + void set_zorro_bus(zorro_device *device); + + // interface (from device) + void cfgout_w(int state) { m_zorro->cfgout_w(state); } + + // interface (from host) + virtual void fc_w(int code); + virtual DECLARE_WRITE_LINE_MEMBER( cfgin_w ); + +protected: + zorro_device *m_zorro; +}; + +// ======================> expansion slot card interface + +class device_exp_card_interface : public device_zorro_card_interface +{ +public: + // construction/destruction + device_exp_card_interface(const machine_config &mconfig, device_t &device); + virtual ~device_exp_card_interface(); + + virtual void set_zorro_device(); + +protected: + exp_slot_device *m_slot; +}; + +// ======================> zorro2 card interface + +class device_zorro2_card_interface : public device_zorro_card_interface +{ +public: + // construction/destruction + device_zorro2_card_interface(const machine_config &mconfig, device_t &device); + virtual ~device_zorro2_card_interface(); + + virtual void set_zorro_device(); + + device_zorro2_card_interface *next() const { return m_next; } + device_zorro2_card_interface *m_next; + +protected: + zorro2_device *m_slot; +}; + + +// include this here so that you don't need to include it into every +// driver that uses zorro slots +#include "cards.h" + + +#endif // __ZORRO_H__ |