summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/6522via.h
blob: deb02af94f12398c5fd09a6f84b61c053c492313 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/**********************************************************************

    Rockwell 6522 VIA interface and emulation

    This function emulates all the functionality of 6522
    versatile interface adapters.

    This is based on the pre-existing 6821 emulation.

    Written by Mathis Rosenhauer

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

#pragma once

#ifndef __6522VIA_H__
#define __6522VIA_H__

#include "emu.h"



//**************************************************************************
//  INTERFACE CONFIGURATION MACROS
//**************************************************************************

#define MCFG_VIA6522_ADD(_tag, _clock, _intrf) \
    MCFG_DEVICE_ADD(_tag, VIA6522, _clock) \
    MCFG_DEVICE_CONFIG(_intrf)



/***************************************************************************
    MACROS / CONSTANTS
***************************************************************************/

#define	VIA_PB	    0
#define	VIA_PA	    1
#define	VIA_DDRB    2
#define	VIA_DDRA    3
#define	VIA_T1CL    4
#define	VIA_T1CH    5
#define	VIA_T1LL    6
#define	VIA_T1LH    7
#define	VIA_T2CL    8
#define	VIA_T2CH    9
#define	VIA_SR     10
#define	VIA_ACR    11
#define	VIA_PCR    12
#define	VIA_IFR    13
#define	VIA_IER    14
#define	VIA_PANH   15


/***************************************************************************
    TYPE DEFINITIONS
***************************************************************************/


// ======================> via6522_interface

struct via6522_interface
{
    devcb_read8 m_in_a_func;
    devcb_read8 m_in_b_func;
    devcb_read_line m_in_ca1_func;
    devcb_read_line m_in_cb1_func;
    devcb_read_line m_in_ca2_func;
    devcb_read_line m_in_cb2_func;
    devcb_write8 m_out_a_func;
    devcb_write8 m_out_b_func;
    devcb_write_line m_out_ca1_func;
    devcb_write_line m_out_cb1_func;
    devcb_write_line m_out_ca2_func;
    devcb_write_line m_out_cb2_func;
    devcb_write_line m_irq_func;
};


// ======================> via6522_device_config

class via6522_device_config :   public device_config,
                                public via6522_interface
{
    friend class via6522_device;

    // construction/destruction
    via6522_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);

public:
    // allocators
    static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
    virtual device_t *alloc_device(running_machine &machine) const;

protected:
    // device_config overrides
    virtual void device_config_complete();
};


// ======================> via6522_device

class via6522_device :  public device_t
{
    friend class via6522_device_config;
    friend class dart_channel;

    // construction/destruction
    via6522_device(running_machine &_machine, const via6522_device_config &_config);

public:
    DECLARE_READ8_MEMBER( read );
    DECLARE_WRITE8_MEMBER( write );

    DECLARE_WRITE8_MEMBER( write_porta ) { m_in_a = data; }

    DECLARE_READ8_MEMBER( read_portb ) { return m_in_b; }
    DECLARE_WRITE8_MEMBER( write_portb ) { m_in_b = data; }

    DECLARE_READ_LINE_MEMBER( read_ca1 ) { return m_in_ca1; }
    DECLARE_WRITE_LINE_MEMBER( write_ca1 );

    DECLARE_READ_LINE_MEMBER( read_ca2 ) { return m_in_ca2; }
    DECLARE_WRITE_LINE_MEMBER( write_ca2 );

    DECLARE_READ_LINE_MEMBER( read_cb1 ) { return m_in_cb1; }
    DECLARE_WRITE_LINE_MEMBER( write_cb1 );

    DECLARE_READ_LINE_MEMBER( read_cb2 ) { return m_in_cb2; }
    DECLARE_WRITE_LINE_MEMBER( write_cb2 );

protected:
    // device-level overrides
    virtual void device_start();
    virtual void device_reset();
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);

private:
	static const device_timer_id TIMER_SHIFT = 0;
	static const device_timer_id TIMER_T1 = 1;
	static const device_timer_id TIMER_T2 = 2;

    attotime cycles_to_time(int c);
    UINT32 time_to_cycles(attotime t);
    UINT16 get_counter1_value();

    void set_int(int data);
    void clear_int(int data);
    void shift();

    devcb_resolved_read8 m_in_a_func;
    devcb_resolved_read8 m_in_b_func;
    devcb_resolved_read_line m_in_ca1_func;
    devcb_resolved_read_line m_in_cb1_func;
    devcb_resolved_read_line m_in_ca2_func;
    devcb_resolved_read_line m_in_cb2_func;
    devcb_resolved_write8 m_out_a_func;
    devcb_resolved_write8 m_out_b_func;
    devcb_resolved_write_line m_out_ca1_func;
    devcb_resolved_write_line m_out_cb1_func;
    devcb_resolved_write_line m_out_ca2_func;
    devcb_resolved_write_line m_out_cb2_func;
    devcb_resolved_write_line m_irq_func;

    UINT8 m_in_a;
    UINT8 m_in_ca1;
    UINT8 m_in_ca2;
    UINT8 m_out_a;
    UINT8 m_out_ca2;
    UINT8 m_ddr_a;

    UINT8 m_in_b;
    UINT8 m_in_cb1;
    UINT8 m_in_cb2;
    UINT8 m_out_b;
    UINT8 m_out_cb2;
    UINT8 m_ddr_b;

    UINT8 m_t1cl;
    UINT8 m_t1ch;
    UINT8 m_t1ll;
    UINT8 m_t1lh;
    UINT8 m_t2cl;
    UINT8 m_t2ch;
    UINT8 m_t2ll;
    UINT8 m_t2lh;

    UINT8 m_sr;
    UINT8 m_pcr;
    UINT8 m_acr;
    UINT8 m_ier;
    UINT8 m_ifr;

    emu_timer *m_t1;
    attotime m_time1;
    UINT8 m_t1_active;
    emu_timer *m_t2;
    attotime m_time2;
    UINT8 m_t2_active;

    emu_timer *m_shift_timer;
    UINT8 m_shift_counter;

    const via6522_device_config &m_config;
};


// device type definition
extern const device_type VIA6522;


#endif /* __6522VIA_H__ */