summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/serial.h
blob: c5966f35e03194ce5bd612124312831c788b703d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#ifndef __SERIAL_H__
#define __SERIAL_H__

#include "emu.h"

#define MCFG_SERIAL_PORT_ADD(_tag, _intf, _slot_intf, _def_slot, _def_inp) \
	MCFG_DEVICE_ADD(_tag, SERIAL_PORT, 0) \
	MCFG_DEVICE_CONFIG(_intf) \
	MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false)

#define MCFG_RS232_PORT_ADD(_tag, _intf, _slot_intf, _def_slot, _def_inp) \
	MCFG_DEVICE_ADD(_tag, RS232_PORT, 0) \
	MCFG_DEVICE_CONFIG(_intf) \
	MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false)

struct serial_port_interface
{
	devcb_write_line    m_out_rx_cb;
};

class device_serial_port_interface : public device_slot_card_interface
{
public:
	device_serial_port_interface(const machine_config &mconfig, device_t &device);
	virtual ~device_serial_port_interface();

	virtual void tx(UINT8 state) { m_tbit = state; }
	virtual UINT8 rx() { return m_rbit; }
protected:
	UINT8 m_rbit;
	UINT8 m_tbit;
};

class serial_port_device : public device_t,
							public serial_port_interface,
							public device_slot_interface
{
public:
	serial_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
	serial_port_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
	virtual ~serial_port_device();

	DECLARE_WRITE_LINE_MEMBER( tx ) { if(m_dev) m_dev->tx(state); }
	DECLARE_READ_LINE_MEMBER( rx )  { return (m_dev) ? m_dev->rx() : 0; }

	void out_rx(UINT8 param)  { m_out_rx_func(param); }
protected:
	virtual void device_start();
	virtual void device_config_complete();
	device_serial_port_interface *m_dev;
private:
	devcb_resolved_write_line m_out_rx_func;
};

extern const device_type SERIAL_PORT;

struct rs232_port_interface
{
	devcb_write_line    m_out_rx_cb;
	devcb_write_line    m_out_dcd_cb;
	devcb_write_line    m_out_dsr_cb;
	devcb_write_line    m_out_ri_cb;
	devcb_write_line    m_out_cts_cb;
};

class device_rs232_port_interface : public device_serial_port_interface
{
public:
	device_rs232_port_interface(const machine_config &mconfig, device_t &device);
	virtual ~device_rs232_port_interface();

	virtual void dtr_w(UINT8 state) { m_dtr = state; }
	virtual void rts_w(UINT8 state) { m_rts = state; }

	virtual UINT8 dcd_r() { return m_dcd; }
	virtual UINT8 dsr_r() { return m_dsr; }
	virtual UINT8 ri_r()  { return m_ri; }
	virtual UINT8 cts_r() { return m_cts; }
protected:
	UINT8 m_dtr;
	UINT8 m_rts;
	UINT8 m_dcd;
	UINT8 m_dsr;
	UINT8 m_ri;
	UINT8 m_cts;
};

class rs232_port_device : public serial_port_device,
							public rs232_port_interface
{
public:
	rs232_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
	virtual ~rs232_port_device();

	DECLARE_WRITE_LINE_MEMBER( dtr_w );
	DECLARE_WRITE_LINE_MEMBER( rts_w );

	DECLARE_READ_LINE_MEMBER( dcd_r ) { return (m_dev) ? m_dev->dcd_r() : loopdtr; }
	DECLARE_READ_LINE_MEMBER( dsr_r ) { return (m_dev) ? m_dev->dsr_r() : loopdtr; }
	DECLARE_READ_LINE_MEMBER( ri_r )  { return (m_dev) ? m_dev->ri_r() : 0; }
	DECLARE_READ_LINE_MEMBER( cts_r ) { return (m_dev) ? m_dev->cts_r() : looprts; }

	void out_dcd(UINT8 param) { m_out_dcd_func(param); }
	void out_dsr(UINT8 param) { m_out_dsr_func(param); }
	void out_ri(UINT8 param)  { m_out_ri_func(param); }
	void out_cts(UINT8 param) { m_out_cts_func(param); }

protected:
	virtual void device_start();
	virtual void device_config_complete();
	device_rs232_port_interface *m_dev;
private:
	devcb_resolved_write_line m_out_dcd_func;
	devcb_resolved_write_line m_out_dsr_func;
	devcb_resolved_write_line m_out_ri_func;
	devcb_resolved_write_line m_out_cts_func;
	UINT8 loopdtr;
	UINT8 looprts;
};

extern const device_type RS232_PORT;

SLOT_INTERFACE_EXTERN( default_rs232_devices );

#endif