OSDN Git Service

[General][CMake] Merge upstream 2016-02-26.
[csp-qt/common_source_project-fm7.git] / source / src / vm / sy6522.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME 0.164 Rockwell 6522 VIA
5         Author : Takeda.Toshiya
6         Date   : 2015.08.27-
7
8         [ SY6522 ]
9 */
10
11 // license:BSD-3-Clause
12 // copyright-holders:Peter Trauner, Mathis Rosenhauer
13 /**********************************************************************
14
15     Rockwell 6522 VIA interface and emulation
16
17     This function emulates all the functionality of 6522
18     versatile interface adapters.
19
20     This is based on the pre-existing 6821 emulation.
21
22     Written by Mathis Rosenhauer
23
24 **********************************************************************/
25
26 #ifndef _SY6522_H_
27 #define _SY6522_H_
28
29 #include "vm.h"
30 #include "../emu.h"
31 #include "device.h"
32
33 #define SIG_SY6522_PORT_A       0
34 #define SIG_SY6522_PORT_B       1
35 #define SIG_SY6522_PORT_CA1     2
36 #define SIG_SY6522_PORT_CA2     3
37 #define SIG_SY6522_PORT_CB1     4
38 #define SIG_SY6522_PORT_CB2     5
39
40 class SY6522 : public DEVICE
41 {
42 private:
43         outputs_t outputs_a;
44         outputs_t outputs_b;
45         outputs_t outputs_ca2;
46         outputs_t outputs_cb1;
47         outputs_t outputs_cb2;
48         outputs_t outputs_irq;
49
50         uint32 clock;
51
52         uint16 get_counter1_value();
53
54         void set_int(int data);
55         void clear_int(int data);
56         void shift_out();
57         void shift_in();
58
59         uint8 input_pa();
60         void output_pa();
61         uint8 input_pb();
62         void output_pb();
63         void output_irq();
64
65         uint8 m_in_a;
66         int m_in_ca1;
67         int m_in_ca2;
68         uint8 m_out_a;
69         int m_out_ca2;
70         uint8 m_ddr_a;
71         uint8 m_latch_a;
72
73         uint8 m_in_b;
74         int m_in_cb1;
75         int m_in_cb2;
76         uint8 m_out_b;
77         int m_out_cb1;
78         int m_out_cb2;
79         uint8 m_ddr_b;
80         uint8 m_latch_b;
81
82         uint8 m_t1cl;
83         uint8 m_t1ch;
84         uint8 m_t1ll;
85         uint8 m_t1lh;
86         uint8 m_t2cl;
87         uint8 m_t2ch;
88         uint8 m_t2ll;
89         uint8 m_t2lh;
90
91         uint8 m_sr;
92         uint8 m_pcr;
93         uint8 m_acr;
94         uint8 m_ier;
95         uint8 m_ifr;
96
97         int m_t1;
98         uint32 m_time1;
99         uint8 m_t1_active;
100         int m_t1_pb7;
101         int m_t2;
102         uint32 m_time2;
103         uint8 m_t2_active;
104         int m_ca2_timer;
105
106         int m_shift_timer;
107         uint8 m_shift_counter;
108
109 public:
110         SY6522(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
111         {
112                 initialize_output_signals(&outputs_a);
113                 initialize_output_signals(&outputs_b);
114                 initialize_output_signals(&outputs_ca2);
115                 initialize_output_signals(&outputs_cb1);
116                 initialize_output_signals(&outputs_cb2);
117                 initialize_output_signals(&outputs_irq);
118                 clock = CPU_CLOCKS;
119         }
120         ~SY6522() {}
121         
122         // common functions
123         void initialize();
124         void reset();
125         void write_io8(uint32 addr, uint32 data);
126         uint32 read_io8(uint32 addr);
127         void event_callback(int event_id, int err);
128         void write_signal(int id, uint32 data, uint32 mask);
129         void save_state(FILEIO* state_fio);
130         bool load_state(FILEIO* state_fio);
131         
132         // unique functions
133         void set_context_port_a(DEVICE* device, int id, uint32 mask, int shift)
134         {
135                 register_output_signal(&outputs_a, device, id, mask, shift);
136         }
137         void set_context_port_b(DEVICE* device, int id, uint32 mask, int shift)
138         {
139                 register_output_signal(&outputs_b, device, id, mask, shift);
140         }
141         void set_context_ca2(DEVICE* device, int id, uint32 mask)
142         {
143                 register_output_signal(&outputs_ca2, device, id, mask);
144         }
145         void set_context_cb1(DEVICE* device, int id, uint32 mask)
146         {
147                 register_output_signal(&outputs_cb1, device, id, mask);
148         }
149         void set_context_cb2(DEVICE* device, int id, uint32 mask)
150         {
151                 register_output_signal(&outputs_cb2, device, id, mask);
152         }
153         void set_context_irq(DEVICE* device, int id, uint32 mask)
154         {
155                 register_output_signal(&outputs_irq, device, id, mask);
156         }
157         void set_constant_clock(uint32 hz)
158         {
159                 clock = hz;
160         }
161 };
162
163 #endif