OSDN Git Service

[VM][WIP] Set default name to devices, these are WIP.
[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_t clock;
51
52         uint16_t 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_t input_pa();
60         void output_pa();
61         uint8_t input_pb();
62         void output_pb();
63         void output_irq();
64
65         uint8_t m_in_a;
66         int m_in_ca1;
67         int m_in_ca2;
68         uint8_t m_out_a;
69         int m_out_ca2;
70         uint8_t m_ddr_a;
71         uint8_t m_latch_a;
72
73         uint8_t m_in_b;
74         int m_in_cb1;
75         int m_in_cb2;
76         uint8_t m_out_b;
77         int m_out_cb1;
78         int m_out_cb2;
79         uint8_t m_ddr_b;
80         uint8_t m_latch_b;
81
82         uint8_t m_t1cl;
83         uint8_t m_t1ch;
84         uint8_t m_t1ll;
85         uint8_t m_t1lh;
86         uint8_t m_t2cl;
87         uint8_t m_t2ch;
88         uint8_t m_t2ll;
89         uint8_t m_t2lh;
90
91         uint8_t m_sr;
92         uint8_t m_pcr;
93         uint8_t m_acr;
94         uint8_t m_ier;
95         uint8_t m_ifr;
96
97         int m_t1;
98         uint32_t m_time1;
99         uint8_t m_t1_active;
100         int m_t1_pb7;
101         int m_t2;
102         uint32_t m_time2;
103         uint8_t m_t2_active;
104         int m_ca2_timer;
105
106         int m_shift_timer;
107         uint8_t 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                 set_device_name(_T("SY6522"));
120         }
121         ~SY6522() {}
122         
123         // common functions
124         void initialize();
125         void reset();
126         void write_io8(uint32_t addr, uint32_t data);
127         uint32_t read_io8(uint32_t addr);
128         void event_callback(int event_id, int err);
129         void write_signal(int id, uint32_t data, uint32_t mask);
130         void save_state(FILEIO* state_fio);
131         bool load_state(FILEIO* state_fio);
132         
133         // unique functions
134         void set_context_port_a(DEVICE* device, int id, uint32_t mask, int shift)
135         {
136                 register_output_signal(&outputs_a, device, id, mask, shift);
137         }
138         void set_context_port_b(DEVICE* device, int id, uint32_t mask, int shift)
139         {
140                 register_output_signal(&outputs_b, device, id, mask, shift);
141         }
142         void set_context_ca2(DEVICE* device, int id, uint32_t mask)
143         {
144                 register_output_signal(&outputs_ca2, device, id, mask);
145         }
146         void set_context_cb1(DEVICE* device, int id, uint32_t mask)
147         {
148                 register_output_signal(&outputs_cb1, device, id, mask);
149         }
150         void set_context_cb2(DEVICE* device, int id, uint32_t mask)
151         {
152                 register_output_signal(&outputs_cb2, device, id, mask);
153         }
154         void set_context_irq(DEVICE* device, int id, uint32_t mask)
155         {
156                 register_output_signal(&outputs_irq, device, id, mask);
157         }
158         void set_constant_clock(uint32_t hz)
159         {
160                 clock = hz;
161         }
162 };
163
164 #endif