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