summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/machine/z80pio.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/machine/z80pio.h')
-rw-r--r--trunk/src/emu/machine/z80pio.h221
1 files changed, 221 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/z80pio.h b/trunk/src/emu/machine/z80pio.h
new file mode 100644
index 00000000000..4a2df0bb03e
--- /dev/null
+++ b/trunk/src/emu/machine/z80pio.h
@@ -0,0 +1,221 @@
+/***************************************************************************
+
+ Zilog Z80 Parallel Input/Output Controller implementation
+
+ Copyright Nicola Salmoria and the MAME Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+***************************************************************************
+ _____ _____
+ D2 1 |* \_/ | 40 D3
+ D7 2 | | 39 D4
+ D6 3 | | 38 D5
+ _CE 4 | | 37 _M1
+ C/_D 5 | | 36 _IORQ
+ B/_A 6 | | 35 RD
+ PA7 7 | | 34 PB7
+ PA6 8 | | 33 PB6
+ PA5 9 | | 32 PB5
+ PA4 10 | Z8420 | 31 PB4
+ GND 11 | | 30 PB3
+ PA3 12 | | 29 PB2
+ PA2 13 | | 28 PB1
+ PA1 14 | | 27 PB0
+ PA0 15 | | 26 +5V
+ _ASTB 16 | | 25 CLK
+ _BSTB 17 | | 24 IEI
+ ARDY 18 | | 23 _INT
+ D0 19 | | 22 IEO
+ D1 20 |_____________| 21 BRDY
+
+***************************************************************************/
+
+#ifndef __Z80PIO__
+#define __Z80PIO__
+
+#include "cpu/z80/z80daisy.h"
+
+
+//**************************************************************************
+// DEVICE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_Z80PIO_ADD(_tag, _clock, _intrf) \
+ MCFG_DEVICE_ADD(_tag, Z80PIO, _clock) \
+ MCFG_DEVICE_CONFIG(_intrf)
+
+#define Z80PIO_INTERFACE(_name) \
+ const z80pio_interface (_name) =
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+
+// ======================> z80pio_interface
+
+struct z80pio_interface
+{
+ devcb_write_line m_out_int_cb;
+
+ devcb_read8 m_in_pa_cb;
+ devcb_write8 m_out_pa_cb;
+ devcb_write_line m_out_ardy_cb;
+
+ devcb_read8 m_in_pb_cb;
+ devcb_write8 m_out_pb_cb;
+ devcb_write_line m_out_brdy_cb;
+};
+
+
+
+// ======================> z80pio_device
+
+class z80pio_device : public device_t,
+ public device_z80daisy_interface,
+ public z80pio_interface
+{
+public:
+ enum
+ {
+ PORT_A = 0,
+ PORT_B,
+ PORT_COUNT
+ };
+
+ // construction/destruction
+ z80pio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // I/O line access
+ int rdy(int which) { return m_port[which].rdy(); }
+ void strobe(int which, bool state) { m_port[which].strobe(state); }
+
+ // control register I/O
+ UINT8 control_read();
+ void control_write(int offset, UINT8 data) { m_port[offset & 1].control_write(data); }
+
+ // data register I/O
+ UINT8 data_read(int offset) { return m_port[offset & 1].data_read(); }
+ void data_write(int offset, UINT8 data) { m_port[offset & 1].data_write(data); }
+
+ // port I/O
+ UINT8 port_read(int offset) { return m_port[offset & 1].read(); }
+ void port_write(int offset, UINT8 data) { m_port[offset & 1].write(data); }
+
+private:
+ // device-level overrides
+ virtual void device_config_complete();
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_z80daisy_interface overrides
+ virtual int z80daisy_irq_state();
+ virtual int z80daisy_irq_ack();
+ virtual void z80daisy_irq_reti();
+
+ // internal helpers
+ void check_interrupts();
+
+ // a single PIO port
+ class pio_port
+ {
+ friend class z80pio_device;
+
+ public:
+ pio_port();
+
+ void start(z80pio_device *device, int index, const devcb_read8 &infunc, const devcb_write8 &outfunc, const devcb_write_line &rdyfunc);
+ void reset();
+
+ bool interrupt_signalled();
+ void trigger_interrupt();
+
+ int rdy() const { return m_rdy; }
+ void set_rdy(bool state);
+ void set_mode(int mode);
+ void strobe(bool state);
+
+ UINT8 read();
+ void write(UINT8 data);
+
+ void control_write(UINT8 data);
+
+ UINT8 data_read();
+ void data_write(UINT8 data);
+
+ private:
+ void check_interrupts() { m_device->check_interrupts(); }
+
+ z80pio_device * m_device;
+ int m_index;
+
+ devcb_resolved_read8 m_in_p_func;
+ devcb_resolved_write8 m_out_p_func;
+ devcb_resolved_write_line m_out_rdy_func;
+
+ int m_mode; // mode register
+ int m_next_control_word; // next control word
+ UINT8 m_input; // input latch
+ UINT8 m_output; // output latch
+ UINT8 m_ior; // input/output register
+ bool m_rdy; // ready
+ bool m_stb; // strobe
+
+ // interrupts
+ bool m_ie; // interrupt enabled
+ bool m_ip; // interrupt pending
+ bool m_ius; // interrupt under service
+ UINT8 m_icw; // interrupt control word
+ UINT8 m_vector; // interrupt vector
+ UINT8 m_mask; // interrupt mask
+ bool m_match; // logic equation match
+ };
+
+ // internal state
+ pio_port m_port[2];
+ devcb_resolved_write_line m_out_int_func;
+};
+
+
+// device type definition
+extern const device_type Z80PIO;
+
+
+
+//**************************************************************************
+// FUNCTION PROTOTYPES
+//**************************************************************************
+
+// control register access
+READ8_DEVICE_HANDLER( z80pio_c_r );
+WRITE8_DEVICE_HANDLER( z80pio_c_w );
+
+// data register access
+READ8_DEVICE_HANDLER( z80pio_d_r );
+WRITE8_DEVICE_HANDLER( z80pio_d_w );
+
+// register access
+READ8_DEVICE_HANDLER( z80pio_cd_ba_r );
+WRITE8_DEVICE_HANDLER( z80pio_cd_ba_w );
+
+READ8_DEVICE_HANDLER( z80pio_ba_cd_r );
+WRITE8_DEVICE_HANDLER( z80pio_ba_cd_w );
+
+// port access
+READ8_DEVICE_HANDLER( z80pio_pa_r );
+WRITE8_DEVICE_HANDLER( z80pio_pa_w );
+
+READ8_DEVICE_HANDLER( z80pio_pb_r );
+WRITE8_DEVICE_HANDLER( z80pio_pb_w );
+
+// ready
+READ_LINE_DEVICE_HANDLER( z80pio_ardy_r );
+READ_LINE_DEVICE_HANDLER( z80pio_brdy_r );
+
+// strobe
+WRITE_LINE_DEVICE_HANDLER( z80pio_astb_w );
+WRITE_LINE_DEVICE_HANDLER( z80pio_bstb_w );
+
+#endif