OSDN Git Service

[VM][I286] Save cpustate without StateBuffer().
[csp-qt/common_source_project-fm7.git] / source / src / vm / fp1100 / sub.h
1 /*
2         CASIO FP-1100 Emulator 'eFP-1100'
3
4         Author : Takeda.Toshiya
5         Date   : 2010.06.09-
6
7         [ sub pcb ]
8 */
9
10 #ifndef _SUB_H_
11 #define _SUB_H_
12
13 #include "../vm.h"
14 #include "../../emu.h"
15 #include "../device.h"
16
17 #define SIG_SUB_INT2    0
18 #define SIG_SUB_COMM    1
19 #define SIG_SUB_HSYNC   2
20 #define SIG_SUB_SO      3
21 #define SIG_SUB_EAR     4
22
23 class HD46505;
24
25 class SUB : public DEVICE
26 {
27 private:
28         // to sub cpu
29         DEVICE *d_cpu;
30         // to main pcb
31         DEVICE *d_main;
32         // to beep
33         DEVICE *d_beep;
34         // to data recorder
35         DEVICE *d_drec;
36         // from/to crtc
37         HD46505 *d_crtc;
38         uint8_t *regs;
39         
40         uint8_t *wbank[0x200];
41         uint8_t *rbank[0x200];
42         uint8_t wdmy[0x80];
43         uint8_t rdmy[0x80];
44         
45         uint8_t ram[0x80];
46         uint8_t vram_b[0x4000];
47         uint8_t vram_r[0x4000];
48         uint8_t vram_g[0x4000];
49         uint8_t sub1[0x1000];
50         uint8_t sub2[0x1000];
51         uint8_t sub3[0x1000];
52         
53         uint8_t pa, pb, pc;
54         uint8_t comm_data;
55         
56         bool so;
57         uint8_t clock;
58         
59         // 74LS74
60         struct {
61                 bool in_d, in_ck, in_s, in_r;
62                 bool out_q, out_nq;
63                 bool tmp_ck;
64                 void update()
65                 {
66                         if(!in_s && in_r) {
67                                 out_q = true;
68                                 out_nq = false;
69                         } else if(in_s && !in_r) {
70                                 out_q = false;
71                                 out_nq = true;
72                         } else if(!in_s && !in_r) {
73                                 out_q = out_nq = true; // undetermined
74                         } else if(!tmp_ck && in_ck) {
75                                 out_q = in_d;
76                                 out_nq = !in_d;
77                         }
78                         tmp_ck = in_ck;
79                 }
80         } b16_1, b16_2, g21_1, g21_2;
81         
82         // 74LS151
83         struct {
84                 bool in_d0, in_d1, in_d2, in_d3, in_d4, in_d5, in_d6, in_d7;
85                 bool in_a, in_b, in_c, in_s;
86                 bool out_y, out_ny;
87                 void update()
88                 {
89                         if(in_s) {
90                                 out_y = false;
91                         } else if(!in_a && !in_b && !in_c) {
92                                 out_y = in_d0;
93                         } else if( in_a && !in_b && !in_c) {
94                                 out_y = in_d1;
95                         } else if(!in_a &&  in_b && !in_c) {
96                                 out_y = in_d2;
97                         } else if( in_a &&  in_b && !in_c) {
98                                 out_y = in_d3;
99                         } else if(!in_a && !in_b &&  in_c) {
100                                 out_y = in_d4;
101                         } else if( in_a && !in_b &&  in_c) {
102                                 out_y = in_d5;
103                         } else if(!in_a &&  in_b &&  in_c) {
104                                 out_y = in_d6;
105                         } else if( in_a &&  in_b &&  in_c) {
106                                 out_y = in_d7;
107                         }
108                         out_ny = !out_y;
109                 }
110         } c15;
111         
112         // 74LS93
113         struct {
114                 bool in_a, in_b, in_rc1, in_rc2;
115                 bool out_qa, out_qb, out_qc;
116                 bool tmp_a, tmp_b;
117                 uint8_t counter_a, counter_b;
118                 void update()
119                 {
120                         if(in_rc1 && in_rc2) {
121                                 counter_a = counter_b = 0;
122                         } else {
123                                 if(tmp_a && !in_a) {
124                                         counter_a++;
125                                 }
126                                 if(tmp_b && !in_b) {
127                                         counter_b++;
128                                 }
129                         }
130                         tmp_a = in_a;
131                         tmp_b = in_b;
132                         out_qa = ((counter_a & 1) != 0);
133                         out_qb = ((counter_b & 1) != 0);
134                         out_qc = ((counter_b & 2) != 0);
135                 }
136         } c16;
137         
138         // TC4024BP
139         struct {
140                 bool in_ck, in_clr;
141                 bool out_q5, out_q6;
142                 bool tmp_ck;
143                 uint8_t counter;
144                 void update()
145                 {
146                         if(in_clr) {
147                                 counter = 0;
148                         } else if(tmp_ck && !in_ck) {
149                                 counter++;
150                         }
151                         tmp_ck = in_ck;
152                         out_q5 = ((counter & 0x10) != 0);
153                         out_q6 = ((counter & 0x20) != 0);
154                 }
155         } f21;
156         
157         void update_cmt();
158         
159         const uint8_t *key_stat;
160         uint8_t key_sel, key_data;
161         
162         uint8_t color_reg;
163         bool hsync, wait;
164         uint8_t cblink;
165         uint8_t screen[400][640];
166         scrntype_t palette_pc[8];
167         
168         void key_update();
169         
170 public:
171         SUB(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
172         {
173                 set_device_name(_T("Sub CPU Bus"));
174         }
175         ~SUB() {}
176         
177         // common functions
178         void initialize();
179         void reset();
180         void write_data8(uint32_t addr, uint32_t data);
181         uint32_t read_data8(uint32_t addr);
182         void write_io8(uint32_t addr, uint32_t data);
183         uint32_t read_io8(uint32_t addr);
184         void write_signal(int id, uint32_t data, uint32_t mask);
185         void event_frame();
186         void event_callback(int event_id, int err);
187         bool process_state(FILEIO* state_fio, bool loading);
188         
189         // unique functions
190         void set_context_cpu(DEVICE *device)
191         {
192                 d_cpu = device;
193         }
194         void set_context_main(DEVICE *device)
195         {
196                 d_main = device;
197         }
198         void set_context_beep(DEVICE *device)
199         {
200                 d_beep = device;
201         }
202         void set_context_drec(DEVICE *device)
203         {
204                 d_drec = device;
205         }
206         void set_context_crtc(HD46505 *device, uint8_t *ptr)
207         {
208                 d_crtc = device;
209                 regs = ptr;
210         }
211         void key_down(int code);
212         void key_up(int code);
213         void draw_screen();
214 };
215
216 #endif