summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/im6402.h
blob: b7918abcfcbde6f5c4dfd4aa0220e10adce64d5b (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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/***************************************************************************

    Intersil IM6402 Universal Asynchronous Receiver/Transmitter emulation

****************************************************************************
                            _____   _____
                   Vcc   1 |*    \_/     | 40  NOTE
                  NOTE   2 |             | 39  EPE
                   GND   3 |             | 38  CLS1
                   RRD   4 |             | 37  CLS2
                  RBR8   5 |             | 36  SBS
                  RBR7   6 |             | 35  PI
                  RBR6   7 |             | 34  CRL
                  RBR5   8 |             | 33  TBR8
                  RBR4   9 |             | 32  TBR7
                  RBR3  10 |    IM6402   | 31  TBR6
                  RBR2  11 |    IM6403   | 30  TBR5
                  RBR1  12 |             | 29  TBR4
                    PE  13 |             | 28  TBR3
                    FE  14 |             | 27  TBR2
                    OE  15 |             | 26  TBR1
                   SFD  16 |             | 25  TRO
                  NOTE  17 |             | 24  TRE
                   DRR  18 |             | 23  TRBL
                    DR  19 |             | 22  TBRE
                   RRI  20 |_____________| 21  MR


                NOTE:   PIN     IM6402      IM6403
                        ---------------------------
                        2       N/C         CONTROL
                        17      RRC         OSC IN
                        40      TRC         OSC OUT

***************************************************************************/

#ifndef MAME_MACHINE_IM6402_H
#define MAME_MACHINE_IM6402_H

#pragma once

#include "diserial.h"

class im6402_device : public device_t, public device_serial_interface
{
public:
	// construction/destruction
	im6402_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t rrc, uint32_t trc)
		: im6402_device(mconfig, tag, owner, 0)
	{
		set_rrc(rrc);
		set_trc(trc);
	}

	im6402_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	void set_rrc(int rrc) { m_rrc = rrc; }
	void set_trc(int trc) { m_trc = trc; }

	auto tro_callback() { return m_write_tro.bind(); }
	auto dr_callback() { return m_write_dr.bind(); }
	auto tbre_callback() { return m_write_tbre.bind(); }
	auto tre_callback() { return m_write_tre.bind(); }

	uint8_t read() { return m_rbr; }
	void write(uint8_t data);

	int dr_r() { return m_dr; }
	int tbre_r() { return m_tbre; }
	int tre_r() { return m_tre; }
	int pe_r() { return m_pe; }
	int fe_r() { return m_fe; }
	int oe_r() { return m_oe; }

	void rri_w(int state);
	void rrc_w(int state);
	void trc_w(int state);
	void rrd_w(int state);
	void sfd_w(int state);
	void drr_w(int state);
	void mr_w(int state);
	void crl_w(int state);
	void pi_w(int state);
	void sbs_w(int state);
	void cls1_w(int state);
	void cls2_w(int state);
	void epe_w(int state);

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

	// device_serial_interface overrides
	virtual void tra_callback() override;
	virtual void tra_complete() override;
	virtual void rcv_complete() override;

private:
	inline void set_dr(int state);
	inline void set_tbre(int state);
	inline void set_tre(int state);

	devcb_write_line   m_write_tro;
	devcb_write_line   m_write_dr;
	devcb_write_line   m_write_tbre;
	devcb_write_line   m_write_tre;

	// status
	int m_dr;
	int m_tbre;
	int m_tre;
	int m_pe;
	int m_fe;
	int m_oe;

	// control
	int m_cls1;
	int m_cls2;
	int m_sbs;
	int m_sfd;
	int m_epe;
	int m_pi;

	// receiver
	uint8_t m_rbr;
	int m_rrc;
	int m_rrc_count;

	// transmitter
	uint8_t m_tbr;
	int m_trc;
	int m_trc_count;
};

DECLARE_DEVICE_TYPE(IM6402, im6402_device)

#endif // MAME_MACHINE_IM6402_H