OSDN Git Service

[VM][COMMON_VM] Include IO:: class to common_vm.
[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 VM;
41 class EMU;
42 class SY6522 : public DEVICE
43 {
44 private:
45         outputs_t outputs_a;
46         outputs_t outputs_b;
47         outputs_t outputs_ca2;
48         outputs_t outputs_cb1;
49         outputs_t outputs_cb2;
50         outputs_t outputs_irq;
51
52         uint32_t clock;
53
54         uint16_t get_counter1_value();
55
56         void set_int(int data);
57         void clear_int(int data);
58         void shift_out();
59         void shift_in();
60
61         uint8_t input_pa();
62         void output_pa();
63         uint8_t input_pb();
64         void output_pb();
65         void output_irq();
66
67         uint8_t m_in_a;
68         int m_in_ca1;
69         int m_in_ca2;
70         uint8_t m_out_a;
71         int m_out_ca2;
72         uint8_t m_ddr_a;
73         uint8_t m_latch_a;
74
75         uint8_t m_in_b;
76         int m_in_cb1;
77         int m_in_cb2;
78         uint8_t m_out_b;
79         int m_out_cb1;
80         int m_out_cb2;
81         uint8_t m_ddr_b;
82         uint8_t m_latch_b;
83
84         uint8_t m_t1cl;
85         uint8_t m_t1ch;
86         uint8_t m_t1ll;
87         uint8_t m_t1lh;
88         uint8_t m_t2cl;
89         uint8_t m_t2ch;
90         uint8_t m_t2ll;
91         uint8_t m_t2lh;
92
93         uint8_t m_sr;
94         uint8_t m_pcr;
95         uint8_t m_acr;
96         uint8_t m_ier;
97         uint8_t m_ifr;
98
99         int m_t1;
100         uint32_t m_time1;
101         uint8_t m_t1_active;
102         int m_t1_pb7;
103         int m_t2;
104         uint32_t m_time2;
105         uint8_t m_t2_active;
106         int m_ca2_timer;
107
108         int m_shift_timer;
109         uint8_t m_shift_counter;
110
111 public:
112         SY6522(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
113         {
114                 initialize_output_signals(&outputs_a);
115                 initialize_output_signals(&outputs_b);
116                 initialize_output_signals(&outputs_ca2);
117                 initialize_output_signals(&outputs_cb1);
118                 initialize_output_signals(&outputs_cb2);
119                 initialize_output_signals(&outputs_irq);
120                 clock = CPU_CLOCKS;
121                 set_device_name(_T("SY6522 VIA"));
122         }
123         ~SY6522() {}
124         
125         // common functions
126         void initialize();
127         void reset();
128         void __FASTCALL write_io8(uint32_t addr, uint32_t data);
129         uint32_t __FASTCALL read_io8(uint32_t addr);
130         void event_callback(int event_id, int err);
131         void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
132         bool process_state(FILEIO* state_fio, bool loading);
133         
134         // unique functions
135         void set_context_port_a(DEVICE* device, int id, uint32_t mask, int shift)
136         {
137                 register_output_signal(&outputs_a, device, id, mask, shift);
138         }
139         void set_context_port_b(DEVICE* device, int id, uint32_t mask, int shift)
140         {
141                 register_output_signal(&outputs_b, device, id, mask, shift);
142         }
143         void set_context_ca2(DEVICE* device, int id, uint32_t mask)
144         {
145                 register_output_signal(&outputs_ca2, device, id, mask);
146         }
147         void set_context_cb1(DEVICE* device, int id, uint32_t mask)
148         {
149                 register_output_signal(&outputs_cb1, device, id, mask);
150         }
151         void set_context_cb2(DEVICE* device, int id, uint32_t mask)
152         {
153                 register_output_signal(&outputs_cb2, device, id, mask);
154         }
155         void set_context_irq(DEVICE* device, int id, uint32_t mask)
156         {
157                 register_output_signal(&outputs_irq, device, id, mask);
158         }
159         void set_constant_clock(uint32_t hz)
160         {
161                 clock = hz;
162         }
163 };
164
165 #endif