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