3e36e4be681c897dab1f77ce279a08418d59ce46
[YACASL2.git] / include / exec.h
1 #ifndef YACASL2_EXEC_INCLUDED
2 #define YACASL2_EXEC_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 #include "monitor.h"
13
14 enum {
15     INSIZE = 256    /**<IN命令の、入力領域 */
16 };
17
18 /**
19  * @brief 実行モードを表すデータ型
20  */
21 typedef struct {
22     bool trace;           /**<レジストリの内容をステップごとに表示する場合はtrue */
23     bool logical;         /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
24     bool dump;            /**<メモリの内容をステップごとに表示する場合はtrue */
25     bool step;           /**<ステップ実行の場合はtrue */
26 } EXECMODE;
27
28 /**
29  * @brief 実行モード: trace, logical, dump, step
30  */
31 extern EXECMODE execmode;
32
33 /**
34  * @brief 実行エラーをエラーリストに追加する
35  */
36 void addcerrlist_exec();
37
38 /**
39  * @brief アセンブル結果読み込みエラーをエラーリストに追加する
40  */
41 void addcerrlist_load();
42
43 /**
44  * @brief 指定されたファイルからアセンブル結果を読み込む
45  */
46 bool loadassemble(const char *file);
47
48
49 /**
50  * @class Exec
51  * @brief execから関数ポインタで呼び出される関数
52  * @relatesalso exec
53  **/
54
55 /**
56  * @brief COMET II仮想マシンを実行する
57  *
58  * @relatesalso Exec
59  *
60  * @return なし
61  */
62 void exec();
63
64 /**
65  * @brief NOP命令。語長1(OPのみ)
66  * @relatesalso Exec
67  *
68  * @return なし
69  */
70 void nop();
71
72 /**
73  * @brief LD命令 - オペランドr,adr,x。語長2
74  * @relatesalso Exec
75  *
76  * @return なし
77  */
78 void ld_r_adr_x();
79
80 /**
81  * @brief LD命令 - オペランドr1,r2。語長1
82  * @relatesalso Exec
83  *
84  * @return なし
85  */
86 void ld_r1_r2();
87
88 /**
89  * @brief ST命令。語長2
90  * @relatesalso Exec
91  *
92  * @return なし
93  */
94 void st();
95
96 /**
97  * @brief LAD命令。語長2
98  * @relatesalso Exec
99  *
100  * @return なし
101  */
102 void lad();
103
104 /**
105  * @brief ADDA命令 - オペランドr,adr,x。語長2
106  * @relatesalso Exec
107  *
108  * @return なし
109  */
110 void adda_r_adr_x();
111
112 /**
113  * @brief ADDA命令 - オペランドr1,r2。語長1
114  * @relatesalso Exec
115  *
116  * @return なし
117  */
118 void adda_r1_r2();
119
120 /**
121  * @brief SUBA命令 - オペランドr,adr,x。語長2
122  * @relatesalso Exec
123  *
124  * @return なし
125  */
126 void suba_r_adr_x();
127
128 /**
129  * @brief SUBA命令 - オペランドr1,r2。語長1
130  * @relatesalso Exec
131  *
132  * @return なし
133  */
134 void suba_r1_r2();
135
136 /**
137  * @brief ADDL命令 - オペランドr,adr,x。語長2
138  * @relatesalso Exec
139  *
140  * @return なし
141  */
142 void addl_r_adr_x();
143
144 /**
145  * @brief ADDL命令 - オペランドr1,r2。語長1
146  * @relatesalso Exec
147  *
148  * @return なし
149  */
150 void addl_r1_r2();
151
152 /**
153  * @brief SUBL命令 - オペランドr,adr,x。語長2
154  * @relatesalso Exec
155  *
156  * @return なし
157  */
158 void subl_r_adr_x();
159
160 /**
161  * @brief SUBL命令 - オペランドr1,r2。語長1
162  * @relatesalso Exec
163  *
164  * @return なし
165  */
166 void subl_r1_r2();
167
168 /**
169  * @brief AND命令 - オペランドr,adr,x。語長2
170  * @relatesalso Exec
171  *
172  * @return なし
173  */
174 void and_r_adr_x();
175
176 /**
177  * @brief AND命令 - オペランドr1,r2。語長1
178  * @relatesalso Exec
179  *
180  * @return なし
181  */
182 void and_r1_r2();
183
184 /**
185  * @brief OR命令 - オペランドr,adr,x。語長2
186  * @relatesalso Exec
187  *
188  * @return なし
189  */
190 void or_r_adr_x();
191
192 /**
193  * @brief OR命令 - オペランドr1,r2。語長1
194  * @relatesalso Exec
195  *
196  * @return なし
197  */
198 void or_r1_r2();
199
200 /**
201  * @brief XOR命令 - オペランドr,adr,x。語長2
202  * @relatesalso Exec
203  *
204  * @return なし
205  */
206 void xor_r_adr_x();
207
208 /**
209  * @brief XOR命令 - オペランドr1,r2。語長1
210  * @relatesalso Exec
211  *
212  * @return なし
213  */
214 void xor_r1_r2();
215
216 /**
217  * @brief CPA命令 - オペランドr,adr,x。語長2
218  * @relatesalso Exec
219  *
220  * @return なし
221  */
222 void cpa_r_adr_x();
223
224 /**
225  * @brief CPA命令 - オペランドr1,r2。語長1
226  * @relatesalso Exec
227  *
228  * @return なし
229  */
230 void cpa_r1_r2();
231
232 /**
233  * @brief CPL命令 - オペランドr,adr,x。語長2
234  * @relatesalso Exec
235  *
236  * @return なし
237  */
238 void cpl_r_adr_x();
239
240 /**
241  * @brief CPL命令 - オペランドr1,r2。語長1
242  * @relatesalso Exec
243  *
244  * @return なし
245  */
246 void cpl_r1_r2();
247
248 /**
249  * @brief SLA命令 - オペランドr,adr,x。語長2
250  *
251  * 算術演算なので、第15ビットは送り出されない
252  * @relatesalso Exec
253  *
254  * @return なし
255  */
256 void sla();
257
258 /**
259  * @brief SRA命令 - オペランドr,adr,x。語長2
260  *
261  * 算術演算なので、第15ビットは送り出されない
262  * 空いたビット位置には符号と同じものが入る
263  * @relatesalso Exec
264  *
265  * @return なし
266  */
267 void sra();
268
269 /**
270  * @brief SLL命令 - オペランドr,adr,x。語長2
271  * @relatesalso Exec
272  *
273  * @return なし
274  */
275 void sll();
276
277 /**
278  * @brief SRL命令 - オペランドr,adr,x。語長2
279  * @relatesalso Exec
280  *
281  * @return なし
282  */
283 void srl();
284
285 /**
286  * @brief JPL命令。語長2
287  * @relatesalso Exec
288  *
289  * @return なし
290  */
291 void jpl();
292
293 /**
294  * @brief JMI命令。語長2
295  * @relatesalso Exec
296  *
297  * @return なし
298  */
299 void jmi();
300
301 /**
302  * @brief JNZ命令。語長2
303  * @relatesalso Exec
304  *
305  * @return なし
306  */
307 void jnz();
308
309 /**
310  * @brief JZE命令。語長2
311  * @relatesalso Exec
312  *
313  * @return なし
314  */
315 void jze();
316
317 /**
318  * @brief JOV命令。語長2
319  * @relatesalso Exec
320  *
321  * @return なし
322  */
323 void jov();
324
325 /**
326  * @brief JUMP命令。語長2
327  * @relatesalso Exec
328  *
329  * @return なし
330  */
331 void jump();
332
333 /**
334  * @brief PUSH命令。語長2
335  * @relatesalso Exec
336  *
337  * @return なし
338  */
339 void push();
340
341 /**
342  * @brief POP命令。語長1
343  * @relatesalso Exec
344  *
345  * @return なし
346  */
347 void pop();
348
349 /**
350  * @brief CALL命令。語長2
351  * @relatesalso Exec
352  *
353  * @return なし
354  */
355 void call();
356
357 /**
358  * @brief RET命令。語長1(OPのみ)
359  * @relatesalso Exec
360  *
361  * @return なし
362  */
363 void ret();
364
365 /**
366  * @brief SVC命令。語長2
367  * @relatesalso Exec
368  *
369  * @return なし
370  */
371 void svc();
372
373 /**
374  * @brief COMET IIのメモリを表示する
375  *
376  * @return なし
377  *
378  * @param start 表示の開始アドレス
379  * @param end 表示の終了アドレス
380  */
381 void dumpmemory(WORD start, WORD end);
382
383 /**
384  * @brief COMET IIのレジスタを表示する
385  *
386  * @return なし
387  */
388 void dspregister();
389
390 /**
391  * @brief CASL IIのオブジェクトファイルを逆アセンブルし、標準出力へ出力する
392  *
393  * @return 正常終了時は0、異常終了時は0以外
394  *
395  * @param *file オブジェクトファイルのファイル名
396  */
397 bool disassemble_file(const char *file);
398
399
400 /**
401  * @brief COMET IIのメモリーを逆アセンブルし、標準出力へ出力する
402  *
403  * @return なし
404  *
405  * @param *start 逆アセンブルの開始位置
406  * @param *end 逆アセンブルの終了位置
407  */
408 void disassemble_memory(WORD start, WORD end);
409
410 #endif            /* YACASL2_EXEC_INCLUDEDの終端 */