1 // license:BSD-3-Clause
2 // copyright-holders:Peter Trauner, Mathis Rosenhauer
3 /**********************************************************************
4 
5     Rockwell 6522 VIA interface and emulation
6 
7     This function emulates all the functionality of 6522
8     versatile interface adapters.
9 
10     This is based on the pre-existing 6821 emulation.
11 
12     Written by Mathis Rosenhauer
13 
14 **********************************************************************/
15 
16 #ifndef MAME_MACHINE_6522VIA_H
17 #define MAME_MACHINE_6522VIA_H
18 
19 #pragma once
20 
21 /***************************************************************************
22     TYPE DEFINITIONS
23 ***************************************************************************/
24 
25 
26 // ======================> via6522_device
27 
28 class via6522_device : public device_t
29 {
30 public:
31 	enum
32 	{
33 		VIA_PB = 0,
34 		VIA_PA = 1,
35 		VIA_DDRB = 2,
36 		VIA_DDRA = 3,
37 		VIA_T1CL = 4,
38 		VIA_T1CH = 5,
39 		VIA_T1LL = 6,
40 		VIA_T1LH = 7,
41 		VIA_T2CL = 8,
42 		VIA_T2CH = 9,
43 		VIA_SR = 10,
44 		VIA_ACR = 11,
45 		VIA_PCR = 12,
46 		VIA_IFR = 13,
47 		VIA_IER = 14,
48 		VIA_PANH = 15
49 	};
50 
51 	// construction/destruction
52 	via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
53 
54 	// TODO: REMOVE THESE
readpa_handler()55 	auto readpa_handler() { return m_in_a_handler.bind(); }
readpb_handler()56 	auto readpb_handler() { return m_in_b_handler.bind(); }
57 
58 	// TODO: CONVERT THESE TO WRITE LINE
writepa_handler()59 	auto writepa_handler() { return m_out_a_handler.bind(); }
writepb_handler()60 	auto writepb_handler() { return m_out_b_handler.bind(); }
61 
ca2_handler()62 	auto ca2_handler() { return m_ca2_handler.bind(); }
cb1_handler()63 	auto cb1_handler() { return m_cb1_handler.bind(); }
cb2_handler()64 	auto cb2_handler() { return m_cb2_handler.bind(); }
irq_handler()65 	auto irq_handler() { return m_irq_handler.bind(); }
66 
67 	void map(address_map &map);
68 
69 	u8 read(offs_t offset);
70 	void write(offs_t offset, u8 data);
71 
write_pa0(int state)72 	void write_pa0(int state) { set_pa_line(0, state); }
write_pa1(int state)73 	void write_pa1(int state) { set_pa_line(1, state); }
write_pa2(int state)74 	void write_pa2(int state) { set_pa_line(2, state); }
write_pa3(int state)75 	void write_pa3(int state) { set_pa_line(3, state); }
write_pa4(int state)76 	void write_pa4(int state) { set_pa_line(4, state); }
write_pa5(int state)77 	void write_pa5(int state) { set_pa_line(5, state); }
write_pa6(int state)78 	void write_pa6(int state) { set_pa_line(6, state); }
write_pa7(int state)79 	void write_pa7(int state) { set_pa_line(7, state); }
80 	void write_pa( u8 data );
81 	void write_ca1(int state);
82 	void write_ca2(int state);
83 
write_pb0(int state)84 	void write_pb0(int state) { set_pb_line(0, state); }
write_pb1(int state)85 	void write_pb1(int state) { set_pb_line(1, state); }
write_pb2(int state)86 	void write_pb2(int state) { set_pb_line(2, state); }
write_pb3(int state)87 	void write_pb3(int state) { set_pb_line(3, state); }
write_pb4(int state)88 	void write_pb4(int state) { set_pb_line(4, state); }
write_pb5(int state)89 	void write_pb5(int state) { set_pb_line(5, state); }
write_pb6(int state)90 	void write_pb6(int state) { set_pb_line(6, state); }
write_pb7(int state)91 	void write_pb7(int state) { set_pb_line(7, state); }
92 	void write_pb( u8 data );
93 	void write_cb1(int state);
94 	void write_cb2(int state);
95 
96 protected:
97 	// device-level overrides
98 	virtual void device_start() override;
99 	virtual void device_reset() override;
100 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
101 
102 private:
103 	static constexpr device_timer_id TIMER_SHIFT = 0;
104 	static constexpr device_timer_id TIMER_T1 = 1;
105 	static constexpr device_timer_id TIMER_T2 = 2;
106 	static constexpr device_timer_id TIMER_CA2 = 3;
107 	static constexpr device_timer_id TIMER_SHIFT_IRQ = 4;
108 	static constexpr device_timer_id TIMER_CB2 = 5;
109 
110 
111 	uint16_t get_counter1_value();
112 	void counter2_decrement();
113 
114 	void set_int(int data);
115 	void clear_int(int data);
116 	void shift_out();
117 	void shift_in();
118 	void set_pa_line(int line, int state);
119 	void set_pb_line(int line, int state);
120 
121 	uint8_t input_pa();
122 	void output_pa();
123 	uint8_t input_pb();
124 	void output_pb();
125 	void output_irq();
126 
127 	// TODO: REMOVE THESE
128 	devcb_read8 m_in_a_handler;
129 	devcb_read8 m_in_b_handler;
130 
131 	// TODO: CONVERT THESE TO WRITE LINE
132 	devcb_write8 m_out_a_handler;
133 	devcb_write8 m_out_b_handler;
134 
135 	devcb_write_line m_ca2_handler;
136 	devcb_write_line m_cb1_handler;
137 	devcb_write_line m_cb2_handler;
138 	devcb_write_line m_irq_handler;
139 
140 	uint8_t m_in_a;
141 	int m_in_ca1;
142 	int m_in_ca2;
143 	uint8_t m_out_a;
144 	int m_out_ca2;
145 	uint8_t m_ddr_a;
146 	uint8_t m_latch_a;
147 
148 	uint8_t m_in_b;
149 	int m_in_cb1;
150 	int m_in_cb2;
151 	uint8_t m_out_b;
152 	int m_out_cb1;
153 	int m_out_cb2;
154 	uint8_t m_ddr_b;
155 	uint8_t m_latch_b;
156 
157 	uint8_t m_t1cl;
158 	uint8_t m_t1ch;
159 	uint8_t m_t1ll;
160 	uint8_t m_t1lh;
161 	uint8_t m_t2cl;
162 	uint8_t m_t2ch;
163 	uint8_t m_t2ll;
164 	uint8_t m_t2lh;
165 
166 	uint8_t m_sr;
167 	uint8_t m_pcr;
168 	uint8_t m_acr;
169 	uint8_t m_ier;
170 	uint8_t m_ifr;
171 
172 	emu_timer *m_t1;
173 	attotime m_time1;
174 	uint8_t m_t1_active;
175 	int m_t1_pb7;
176 	emu_timer *m_t2;
177 	attotime m_time2;
178 	uint8_t m_t2_active;
179 	emu_timer *m_ca2_timer;
180 	emu_timer *m_cb2_timer;
181 
182 	emu_timer *m_shift_timer;
183 	emu_timer *m_shift_irq_timer;
184 	uint8_t m_shift_counter;
185 };
186 
187 
188 // device type definition
189 DECLARE_DEVICE_TYPE(VIA6522, via6522_device)
190 
191 
192 #endif // MAME_MACHINE_6522VIA_H
193