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