exec.cを一部変更
[YACASL2.git] / include / struct.h
1 #ifndef YACASL2_CASL2_INCLUDED
2 #define YACASL2_CASL2_INCLUDED
3
4 #include "word.h"
5
6 /**
7  * COMET IIの規格
8  */
9 enum {
10     CMDSIZE = 4,              /**<命令の最大文字数 */
11     GRSIZE = 8,               /**<汎用レジスタの数。COMET II規格では、8(0から7) */
12     DEFAULT_MEMSIZE = 512,    /**<デフォルトのメモリ容量。COMET II規格では、65535語(word) */
13     DEFAULT_CLOCKS = 5000000, /**<デフォルトのクロック周波数。COMET II規格では、未定義 */
14 };
15
16 /**
17  * COMET II フラグのマスク値
18  */
19 enum {
20     OF = 0x4,    /**<Overflow Flag */
21     SF = 0x2,    /**<Sign Flag */
22     ZF = 0x1,    /**<Zero Flag */
23 };
24
25 /**
26  * COMET IIのCPU
27  */
28 typedef struct {
29     WORD gr[GRSIZE]; /**<汎用レジスタ */
30     WORD sp;         /**<スタックポインタ */
31     WORD pr;         /**<プログラムレジスタ */
32     WORD fr;         /**<フラグレジスタ */
33 } CPU;
34
35 /**
36  * COMET IIの仮想実行マシンシステム
37  */
38 typedef struct {
39     CPU *cpu;        /**<CPU */
40     WORD *memory;    /**<メモリ */
41     int memsize;     /**<メモリサイズ */
42     int clocks;      /**<クロック周波数 */
43 } SYSTEM;
44
45 extern SYSTEM *sys;
46
47 /**
48  * COMET II 命令
49  * 命令タイプは、オペランドにより6種類に分類
50  */
51 typedef enum {
52     /**
53      *  オペランド数2または3
54      *     第1オペランド: 汎用レジスタ
55      *     第2オペランド: アドレス
56      *     第3オペランド: 指標レジスタ
57      */
58     R_ADR_X = 010,
59     /**
60      *  オペランド数2または3
61      *     第1オペランド: 汎用レジスタ
62      *     第2オペランド: アドレスに格納されている内容
63      *     第3オペランド: 指標レジスタ
64      */
65     R_ADR_X_ = 011,
66     /**
67      *  オペランド数2
68      *     第1オペランド: 汎用レジスタ
69      *     第2オペランド: 汎用レジスタ
70      */
71     R1_R2 = 020,
72     /**
73      * オペランド数1または2
74      *     第1オペランド: アドレス
75      *     第2オペランド: 指標レジスタ
76      */
77     ADR_X = 030,
78     /**
79      *   オペランド数1
80      *     第1オペランド: 汎用レジスタ
81      */
82     R_ = 040,
83     /**
84      *  オペランドなし
85      */
86     NONE = 0,
87     /**
88      *  COMET II命令以外
89      */
90     NOTCMD = 077,
91 } CMDTYPE;
92
93 /**
94  * 命令コード表の項目
95  */
96 typedef struct {
97     char *name;                 /**<命令名 */
98     CMDTYPE type;               /**<命令タイプ */
99     WORD code;                  /**<命令コード */
100     const void (*ptr);                   /**<命令の関数ポインタ */
101 } CMD;
102
103 /**
104  * 命令コードのハッシュ表
105  */
106 typedef struct _CMDTAB {
107     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
108     CMD *cmd;                   /**<命令コード表の項目 */
109 } CMDTAB;
110
111 /**
112  * プログラム実行時の開始と終了のアドレス
113  */
114 typedef struct {
115     WORD start;   /**<開始アドレス */
116     WORD end;     /**<終了アドレス */
117     bool stop;    /**<終了フラグ */
118 } EXECPTR;
119
120 extern EXECPTR *execptr;
121
122 /**
123  * COMET II仮想マシンのリセット
124  */
125 void reset(int memsize, int clocks);
126
127 /**
128  * COMET II仮想マシンのシャットダウン
129  */
130 void shutdown();
131
132 /**
133  * 名前とタイプがキーの命令ハッシュ表を作成する
134  */
135 bool create_cmdtype_code();
136
137 /**
138  * 命令の名前とタイプから、命令コードを返す
139  * 無効な場合は0xFFFFを返す
140  */
141 WORD getcmdcode(const char *cmd, CMDTYPE type);
142
143 /**
144  * 名前とタイプがキーの命令ハッシュ表を解放する
145  */
146 void free_cmdtype_code();
147
148 /**
149  * コードがキーの命令ハッシュ表を作成する
150  */
151 bool create_code_type();
152
153 /**
154  * 命令コードから命令を返す
155  * 命令コードでない場合はNULLを返す
156  */
157 CMD *getcmd(WORD code);
158
159 /**
160  * 命令コードから命令の関数ポインタを返す
161  */
162 const void (*getcmdptr(WORD code));
163
164 /**
165  * コードがキーの命令ハッシュ表を解放する
166  */
167 void free_code_type();
168
169 #endif            /* YACASL2_CASL2_INCLUDEDの終端 */