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