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