1 #ifndef YACASL2_EXEC_H_INCLUDED
2 #define YACASL2_EXEC_H_INCLUDED
3
4 #include <stdbool.h>
5 #include <stdio.h>
6 #include <assert.h>
7 #include <time.h>
8 #include "struct.h"
9 #include "word.h"
10 #include "cmem.h"
11 #include "cerr.h"
12
13 enum {
14 INSIZE = 256 /**<IN命令の、入力領域 */
15 };
16
17 /**
18 * @brief クロック周波数を表す数値文字列を、正の整数値であるCLOCK型の数値に変換。変換できない場合は、エラーを表示して0を返す
19 *
20 * @return クロック周波数を表すCLOCK型の正の整数値。エラー時は0
21 *
22 * @param str クロック周波数を表す数値文字列
23 */
24 CLOCK clock_str2clock(const char *str);
25
26 /**
27 * @brief 実行エラーをエラーリストに追加する
28 */
29 void addcerrlist_exec();
30
31 /**
32 * @class Exec
33 * @brief execから関数ポインタで呼び出される関数
34 * @relatesalso exec
35 **/
36
37 /**
38 * @brief COMET II仮想マシンを実行する
39 *
40 * @relatesalso Exec
41 *
42 */
43 void exec();
44
45 /**
46 * @brief NOP命令。語長1(OPのみ)
47 * @relatesalso Exec
48 *
49 */
50 void nop();
51
52 /**
53 * @brief LD命令 - オペランドr,adr,x。語長2
54 * @relatesalso Exec
55 *
56 */
57 void ld_r_adr_x();
58
59 /**
60 * @brief LD命令 - オペランドr1,r2。語長1
61 * @relatesalso Exec
62 *
63 */
64 void ld_r1_r2();
65
66 /**
67 * @brief ST命令。語長2
68 * @relatesalso Exec
69 *
70 */
71 void st();
72
73 /**
74 * @brief LAD命令。語長2
75 * @relatesalso Exec
76 *
77 */
78 void lad();
79
80 /**
81 * @brief ADDA命令 - オペランドr,adr,x。語長2
82 * @relatesalso Exec
83 *
84 */
85 void adda_r_adr_x();
86
87 /**
88 * @brief ADDA命令 - オペランドr1,r2。語長1
89 * @relatesalso Exec
90 *
91 */
92 void adda_r1_r2();
93
94 /**
95 * @brief SUBA命令 - オペランドr,adr,x。語長2
96 * @relatesalso Exec
97 *
98 */
99 void suba_r_adr_x();
100
101 /**
102 * @brief SUBA命令 - オペランドr1,r2。語長1
103 * @relatesalso Exec
104 *
105 */
106 void suba_r1_r2();
107
108 /**
109 * @brief ADDL命令 - オペランドr,adr,x。語長2
110 * @relatesalso Exec
111 *
112 */
113 void addl_r_adr_x();
114
115 /**
116 * @brief ADDL命令 - オペランドr1,r2。語長1
117 * @relatesalso Exec
118 *
119 */
120 void addl_r1_r2();
121
122 /**
123 * @brief SUBL命令 - オペランドr,adr,x。語長2
124 * @relatesalso Exec
125 *
126 */
127 void subl_r_adr_x();
128
129 /**
130 * @brief SUBL命令 - オペランドr1,r2。語長1
131 * @relatesalso Exec
132 *
133 */
134 void subl_r1_r2();
135
136 /**
137 * @brief AND命令 - オペランドr,adr,x。語長2
138 * @relatesalso Exec
139 *
140 */
141 void and_r_adr_x();
142
143 /**
144 * @brief AND命令 - オペランドr1,r2。語長1
145 * @relatesalso Exec
146 *
147 */
148 void and_r1_r2();
149
150 /**
151 * @brief OR命令 - オペランドr,adr,x。語長2
152 * @relatesalso Exec
153 *
154 */
155 void or_r_adr_x();
156
157 /**
158 * @brief OR命令 - オペランドr1,r2。語長1
159 * @relatesalso Exec
160 *
161 */
162 void or_r1_r2();
163
164 /**
165 * @brief XOR命令 - オペランドr,adr,x。語長2
166 * @relatesalso Exec
167 *
168 */
169 void xor_r_adr_x();
170
171 /**
172 * @brief XOR命令 - オペランドr1,r2。語長1
173 * @relatesalso Exec
174 *
175 */
176 void xor_r1_r2();
177
178 /**
179 * @brief CPA命令 - オペランドr,adr,x。語長2
180 * @relatesalso Exec
181 *
182 */
183 void cpa_r_adr_x();
184
185 /**
186 * @brief CPA命令 - オペランドr1,r2。語長1
187 * @relatesalso Exec
188 *
189 */
190 void cpa_r1_r2();
191
192 /**
193 * @brief CPL命令 - オペランドr,adr,x。語長2
194 * @relatesalso Exec
195 *
196 */
197 void cpl_r_adr_x();
198
199 /**
200 * @brief CPL命令 - オペランドr1,r2。語長1
201 * @relatesalso Exec
202 *
203 */
204 void cpl_r1_r2();
205
206 /**
207 * @brief SLA命令 - オペランドr,adr,x。語長2
208 *
209 * 算術演算なので、第15ビットは送り出されない
210 * @relatesalso Exec
211 *
212 */
213 void sla();
214
215 /**
216 * @brief SRA命令 - オペランドr,adr,x。語長2
217 *
218 * 算術演算なので、第15ビットは送り出されない
219 * 空いたビット位置には符号と同じものが入る
220 * @relatesalso Exec
221 *
222 */
223 void sra();
224
225 /**
226 * @brief SLL命令 - オペランドr,adr,x。語長2
227 * @relatesalso Exec
228 *
229 */
230 void sll();
231
232 /**
233 * @brief SRL命令 - オペランドr,adr,x。語長2
234 * @relatesalso Exec
235 *
236 */
237 void srl();
238
239 /**
240 * @brief JPL命令。語長2
241 * @relatesalso Exec
242 *
243 */
244 void jpl();
245
246 /**
247 * @brief JMI命令。語長2
248 * @relatesalso Exec
249 *
250 */
251 void jmi();
252
253 /**
254 * @brief JNZ命令。語長2
255 * @relatesalso Exec
256 *
257 */
258 void jnz();
259
260 /**
261 * @brief JZE命令。語長2
262 * @relatesalso Exec
263 *
264 */
265 void jze();
266
267 /**
268 * @brief JOV命令。語長2
269 * @relatesalso Exec
270 *
271 */
272 void jov();
273
274 /**
275 * @brief JUMP命令。語長2
276 * @relatesalso Exec
277 *
278 */
279 void jump();
280
281 /**
282 * @brief PUSH命令。語長2
283 * @relatesalso Exec
284 *
285 */
286 void push();
287
288 /**
289 * @brief POP命令。語長1
290 * @relatesalso Exec
291 *
292 */
293 void pop();
294
295 /**
296 * @brief CALL命令。語長2
297 * @relatesalso Exec
298 *
299 */
300 void call();
301
302 /**
303 * @brief RET命令。語長1(OPのみ)
304 * @relatesalso Exec
305 *
306 */
307 void ret();
308
309 /**
310 * @brief SVC命令。語長2
311 * @relatesalso Exec
312 *
313 */
314 void svc();
315
316 /**
317 * @brief COMET IIのメモリを表示する
318 *
319 * @param start 表示の開始アドレス
320 * @param end 表示の終了アドレス
321 */
322 void dumpmemory(WORD start, WORD end);
323
324 /**
325 * @brief COMET IIのレジスタを表示する
326 *
327 */
328 void dspregister();
329
330 #endif