バージョンアップ
[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  * 命令ハッシュ表のハッシュの種類
58  */
59 typedef enum {
60     HASH_CMDTYPE,
61     HASH_CODE,
62     HASH_MAX,
63 } CMDTAB_HASH;
64
65 /**
66  * COMET II 命令
67  * 命令タイプは、オペランドにより5種類に分類
68  */
69 typedef enum {
70     /**
71      *  オペランド数2または3
72      *  - 第1オペランド: 汎用レジスタ。必須
73      *  - 第2オペランド: アドレス。必須
74      *  - 第3オペランド: 指標レジスタとして用いる汎用レジスタ。任意
75      */
76     R_ADR_X = 01,
77     /**
78      *  オペランド数2
79      *  - 第1オペランド: 汎用レジスタ。必須
80      *  - 第2オペランド: 汎用レジスタ。必須
81      */
82     R1_R2 = 02,
83     /**
84      * オペランド数1または2
85      * - 第1オペランド: アドレス。必須
86      * - 第2オペランド: 指標レジスタとして用いる汎用レジスタ。任意
87      */
88     ADR_X = 03,
89     /**
90      * オペランド数1
91      * - 第1オペランド: 汎用レジスタ。必須
92      */
93     R_ = 04,
94     /**
95      * オペランドなし
96      */
97     NONE = 0,
98 } CMDTYPE;
99
100 /**
101  * 命令コード表の項目
102  */
103 typedef struct {
104     char *name;                 /**<命令名 */
105     const void (*ptr);          /**<命令の関数ポインタ */
106 } CMD;
107
108 /**
109  * COMET II命令コード表の項目
110  */
111 typedef struct {
112     char *name;                 /**<命令名 */
113     CMDTYPE type;               /**<命令タイプ */
114     WORD code;                  /**<命令コード */
115     const void (*ptr);          /**<命令の関数ポインタ */
116 } COMET2CMD;
117
118 /**
119  * 命令コードのハッシュ表
120  */
121 typedef struct _CMDTAB {
122     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
123     const COMET2CMD *cmd;       /**<命令コード表の項目 */
124 } CMDTAB;
125
126 /**
127  * プログラム実行時の開始と終了のアドレス
128  */
129 typedef struct {
130     WORD start;   /**<開始アドレス */
131     WORD end;     /**<終了アドレス */
132     bool stop;    /**<終了フラグ */
133 } EXECPTR;
134
135 extern EXECPTR *execptr;
136
137 /**
138  * @brief 実行モードを表すデータ型
139  */
140 typedef struct {
141     bool trace;           /**<レジストリの内容をステップごとに表示する場合はtrue */
142     bool logical;         /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
143     bool dump;            /**<メモリの内容をステップごとに表示する場合はtrue */
144     int dump_start;       /**<メモリの内容をステップごとに表示する場合の開始アドレス */
145     int dump_end;         /**<メモリの内容をステップごとに表示する場合の終了アドレス */
146     bool monitor;         /**<モニターモードの場合はtrue */
147     bool step;            /**<ステップ実行の場合はtrue */
148 } EXECMODE;
149
150 /**
151  * @brief 実行モード: trace, logical, dump, monitor, step
152  */
153 extern EXECMODE execmode;
154
155 /**
156  * @brief 汎用レジスタの番号からレジスタを表す文字列を返す
157  *
158  * @return 汎用レジスタを表す文字列。「GR0」「GR1」・・・「GR7」のいずれか
159  *
160  * @param word レジスタ番号[0-7]を表すWORD値
161  */
162 char *grstr(WORD word);
163
164 /**
165  * COMET II仮想マシンのリセット
166  */
167 void reset(int memsize, int clocks);
168
169 /**
170  * COMET II仮想マシンのシャットダウン
171  */
172 void shutdown();
173
174 /**
175  * @brief 命令ハッシュ表を作成する
176  *
177  * @return なし
178  *
179  * @param hash ハッシュ値
180  */
181 bool create_cmdtable(CMDTAB_HASH hash);
182
183 /**
184  * 命令ハッシュ表を解放する
185  */
186 void free_cmdtable(CMDTAB_HASH hash);
187
188 /**
189  * 命令の名前とタイプから、命令コードを返す
190  * 無効な場合は0xFFFFを返す
191  */
192 WORD getcmdcode(const char *cmd, CMDTYPE type);
193
194 /**
195  * 命令コードから命令の関数ポインタを返す
196  */
197 const void (*getcmdptr(WORD code));
198
199 /**
200  * 命令コードから命令のタイプを返す
201  */
202 CMDTYPE getcmdtype(WORD code);
203
204 /**
205  * 命令コードから命令の名前を返す
206  */
207 char *getcmdname(WORD code);
208
209 #endif            /* YACASL2_CASL2_INCLUDEDの終端 */