Doxygenのコメントに、classとcodeを適用
[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  * 命令タイプは、オペランドにより6種類に分類
51  */
52 typedef enum {
53     /**
54      *  オペランド数2または3。命令語長2
55      *     第1オペランド: 汎用レジスタ
56      *     第2オペランド: アドレス
57      *     第3オペランド: 指標レジスタ
58      */
59     R_ADR_X = 010,
60     /**
61      *  オペランド数2または3。。命令語長2
62      *     第1オペランド: 汎用レジスタ
63      *     第2オペランド: アドレスに格納されている内容
64      *     第3オペランド: 指標レジスタ
65      */
66     R1_R2 = 020,
67     /**
68      * オペランド数1または2。命令語長1
69      *     第1オペランド: アドレス
70      *     第2オペランド: 指標レジスタ
71      */
72     ADR_X = 030,
73     /**
74      *   オペランド数1。命令語長1
75      *     第1オペランド: 汎用レジスタ
76      */
77     R_ = 040,
78     /**
79      *  オペランドなし。命令語長1
80      */
81     NONE = 0,
82     /**
83      *  COMET II命令以外
84      */
85     NOTCMD = 077,
86 } CMDTYPE;
87
88 /**
89  * 命令コード表の項目
90  */
91 typedef struct {
92     char *name;                 /**<命令名 */
93     const void (*ptr);          /**<命令の関数ポインタ */
94 } CMD;
95
96 /**
97  * COMET II命令コード表の項目
98  */
99 typedef struct {
100     char *name;                 /**<命令名 */
101     CMDTYPE type;               /**<命令タイプ */
102     WORD code;                  /**<命令コード */
103     const void (*ptr);          /**<命令の関数ポインタ */
104 } COMET2CMD;
105
106 /**
107  * 命令コードのハッシュ表
108  */
109 typedef struct _CMDTAB {
110     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
111     COMET2CMD *cmd;             /**<命令コード表の項目 */
112 } CMDTAB;
113
114 /**
115  * プログラム実行時の開始と終了のアドレス
116  */
117 typedef struct {
118     WORD start;   /**<開始アドレス */
119     WORD end;     /**<終了アドレス */
120     bool stop;    /**<終了フラグ */
121 } EXECPTR;
122
123 extern EXECPTR *execptr;
124
125 /**
126  * COMET II仮想マシンのリセット
127  */
128 void reset(int memsize, int clocks);
129
130 /**
131  * COMET II仮想マシンのシャットダウン
132  */
133 void shutdown();
134
135 /**
136  * 名前とタイプがキーの命令ハッシュ表を作成する
137  */
138 bool create_cmdtype_code();
139
140 /**
141  * 命令の名前とタイプから、命令コードを返す
142  * 無効な場合は0xFFFFを返す
143  */
144 WORD getcmdcode(const char *cmd, CMDTYPE type);
145
146 /**
147  * 名前とタイプがキーの命令ハッシュ表を解放する
148  */
149 void free_cmdtype_code();
150
151 /**
152  * コードがキーの命令ハッシュ表を作成する
153  */
154 bool create_code_type();
155
156 /**
157  * 命令コードから命令の関数ポインタを返す
158  */
159 const void (*getcmdptr(WORD code));
160
161 /**
162  * コードがキーの命令ハッシュ表を解放する
163  */
164 void free_code_type();
165
166 #endif            /* YACASL2_CASL2_INCLUDEDの終端 */