diff options
Diffstat (limited to 'trunk/src/emu/machine/i8255.h')
-rw-r--r-- | trunk/src/emu/machine/i8255.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/i8255.h b/trunk/src/emu/machine/i8255.h new file mode 100644 index 00000000000..15498292084 --- /dev/null +++ b/trunk/src/emu/machine/i8255.h @@ -0,0 +1,156 @@ +/********************************************************************** + + Intel 8255(A) Programmable Peripheral Interface emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +********************************************************************** + _____ _____ + PA3 1 |* \_/ | 40 PA4 + PA2 2 | | 39 PA5 + PA1 3 | | 38 PA6 + PA0 4 | | 37 PA7 + _RD 5 | | 36 WR + _CS 6 | | 35 RESET + GND 7 | | 34 D0 + A1 8 | | 33 D1 + A0 9 | | 32 D2 + PC7 10 | 8255 | 31 D3 + PC6 11 | 8255A | 30 D4 + PC5 12 | | 29 D5 + PC4 13 | | 28 D6 + PC0 14 | | 27 D7 + PC1 15 | | 26 Vcc + PC2 16 | | 25 PB7 + PC3 17 | | 24 PB6 + PB0 18 | | 23 PB5 + PB1 19 | | 22 PB4 + PB2 20 |_____________| 21 PB3 + +**********************************************************************/ + +#pragma once + +#ifndef __I8255__ +#define __I8255__ + +#include "emu.h" + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_I8255_ADD(_tag, _intrf) \ + MCFG_DEVICE_ADD(_tag, I8255, 0) \ + MCFG_DEVICE_CONFIG(_intrf) + + +#define MCFG_I8255A_ADD(_tag, _intrf) \ + MCFG_DEVICE_ADD(_tag, I8255A, 0) \ + MCFG_DEVICE_CONFIG(_intrf) + + +#define I8255_INTERFACE(name) \ + const i8255_interface (name) = + + +#define I8255A_INTERFACE(name) \ + const i8255_interface (name) = + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> i8255_interface + +struct i8255_interface +{ + devcb_read8 m_in_pa_cb; + devcb_write8 m_out_pa_cb; + devcb_read8 m_in_pb_cb; + devcb_write8 m_out_pb_cb; + devcb_read8 m_in_pc_cb; + devcb_write8 m_out_pc_cb; +}; + + +// ======================> i8255_device + +class i8255_device : public device_t, + public i8255_interface +{ +public: + // construction/destruction + i8255_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + + DECLARE_READ8_MEMBER( pa_r ); + UINT8 pa_r(); + + DECLARE_READ8_MEMBER( pb_r ); + UINT8 pb_r(); + + DECLARE_WRITE_LINE_MEMBER( pc2_w ); + DECLARE_WRITE_LINE_MEMBER( pc4_w ); + DECLARE_WRITE_LINE_MEMBER( pc6_w ); + +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); + virtual void device_reset(); + +private: + inline void check_interrupt(int port); + inline void set_ibf(int port, int state); + inline void set_obf(int port, int state); + inline void set_inte(int port, int state); + inline void set_inte1(int state); + inline void set_inte2(int state); + inline void set_intr(int port, int state); + inline int group_mode(int group); + inline int port_mode(int port); + inline int port_c_lower_mode(); + inline int port_c_upper_mode(); + + UINT8 read_mode0(int port); + UINT8 read_mode1(int port); + UINT8 read_mode2(); + UINT8 read_pc(); + void write_mode0(int port, UINT8 data); + void write_mode1(int port, UINT8 data); + void write_mode2(UINT8 data); + void write_pc(UINT8 data); + void output_pc(); + void set_mode(UINT8 data); + void set_pc_bit(int bit, int state); + + devcb_resolved_read8 m_in_port_func[3]; + devcb_resolved_write8 m_out_port_func[3]; + + UINT8 m_control; // mode control word + UINT8 m_output[3]; // output latch + UINT8 m_input[3]; // input latch + + int m_ibf[2]; // input buffer full flag + int m_obf[2]; // output buffer full flag, negative logic + int m_inte[2]; // interrupt enable + int m_inte1; // interrupt enable + int m_inte2; // interrupt enable + int m_intr[2]; // interrupt +}; + + +// device type definition +extern const device_type I8255; +extern const device_type I8255A; + + + +#endif |