READMEのCASL II仕様書へのリンクを修正
[YACASL2.git] / include / struct.h
1 #ifndef YACASL2_STRUCT_INCLUDED
2 #define YACASL2_STRUCT_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 #include "exec.h"
12
13 /**
14  * @brief COMET IIの規格値
15  */
16 enum {
17     CMDSIZE = 4,              /**<命令の最大文字数 */
18     GRSIZE = 8,               /**<汎用レジスタの数。COMET II規格では、8(0から7) */
19     DEFAULT_MEMSIZE = 512,    /**<デフォルトのメモリ容量。COMET II規格では、65535語(word) */
20     DEFAULT_CLOCKS = 5000000, /**<デフォルトのクロック周波数。COMET II規格では、未定義 */
21 };
22
23 /**
24  * @brief COMET II フラグのマスク値
25  */
26 enum {
27     OF = 0x4,    /**<Overflow Flag */
28     SF = 0x2,    /**<Sign Flag */
29     ZF = 0x1,    /**<Zero Flag */
30 };
31
32 /**
33  * @brief COMET IIのCPUを表すデータ型
34  */
35 typedef struct {
36     WORD gr[GRSIZE]; /**<汎用レジスタ */
37     WORD sp;         /**<スタックポインタ */
38     WORD pr;         /**<プログラムレジスタ */
39     WORD fr;         /**<フラグレジスタ */
40 } CPU;
41
42 /**
43  * @brief COMET IIの仮想実行マシンシステムを表すデータ型
44  */
45 typedef struct {
46     CPU *cpu;        /**<CPU */
47     WORD *memory;    /**<メモリ */
48     int memsize;     /**<メモリサイズ */
49     clock_t clocks;  /**<クロック周波数 */
50 } SYSTEM;
51
52 /**
53  * @brief COMET IIの仮想実行マシンシステム
54  */
55 extern SYSTEM *sys;
56
57 /**
58  * 命令ハッシュ表のハッシュの種類
59  */
60 typedef enum {
61     HASH_CMDTYPE,
62     HASH_CODE,
63     HASH_MAX,
64 } CMDTAB_HASH;
65
66 /**
67  * COMET II 命令
68  * 命令タイプは、オペランドにより5種類に分類
69  */
70 typedef enum {
71     /**
72      *  オペランド数2または3
73      *  - 第1オペランド: 汎用レジスタ。必須
74      *  - 第2オペランド: アドレス。必須
75      *  - 第3オペランド: 指標レジスタとして用いる汎用レジスタ。任意
76      */
77     R_ADR_X = 01,
78     /**
79      *  オペランド数2
80      *  - 第1オペランド: 汎用レジスタ。必須
81      *  - 第2オペランド: 汎用レジスタ。必須
82      */
83     R1_R2 = 02,
84     /**
85      * オペランド数1または2
86      * - 第1オペランド: アドレス。必須
87      * - 第2オペランド: 指標レジスタとして用いる汎用レジスタ。任意
88      */
89     ADR_X = 03,
90     /**
91      * オペランド数1
92      * - 第1オペランド: 汎用レジスタ。必須
93      */
94     R_ = 04,
95     /**
96      * オペランドなし
97      */
98     NONE = 0,
99 } CMDTYPE;
100
101 /**
102  * 命令コード表の項目
103  */
104 typedef struct {
105     char *name;                 /**<命令名 */
106     const void (*ptr);          /**<命令の関数ポインタ */
107 } CMD;
108
109 /**
110  * COMET II命令コード表の項目
111  */
112 typedef struct {
113     char *name;                 /**<命令名 */
114     CMDTYPE type;               /**<命令タイプ */
115     WORD code;                  /**<命令コード */
116     const void (*ptr);          /**<命令の関数ポインタ */
117 } COMET2CMD;
118
119 /**
120  * 命令コードのハッシュ表
121  */
122 typedef struct _CMDTAB {
123     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
124     const COMET2CMD *cmd;       /**<命令コード表の項目 */
125 } CMDTAB;
126
127 /**
128  * プログラム実行時の開始と終了のアドレス
129  */
130 typedef struct {
131     WORD start;   /**<開始アドレス */
132     WORD end;     /**<終了アドレス */
133     bool stop;    /**<終了フラグ */
134 } EXECPTR;
135
136 extern EXECPTR *execptr;
137
138 /**
139  * @brief 実行モードを表すデータ型
140  */
141 typedef struct {
142     bool trace;           /**<レジストリの内容をステップごとに表示する場合はtrue */
143     bool logical;         /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
144     bool dump;            /**<メモリの内容をステップごとに表示する場合はtrue */
145     int dump_start;       /**<メモリの内容をステップごとに表示する場合の開始アドレス */
146     int dump_end;         /**<メモリの内容をステップごとに表示する場合の終了アドレス */
147     bool monitor;         /**<モニターモードの場合はtrue */
148     bool step;            /**<ステップ実行の場合はtrue */
149 } EXECMODE;
150
151 /**
152  * @brief 実行モード: trace, logical, dump, monitor, step
153  */
154 extern EXECMODE execmode;
155
156 /**
157  * @brief 汎用レジスタの番号からレジスタを表す文字列を返す
158  *
159  * @return 汎用レジスタを表す文字列。「GR0」「GR1」・・・「GR7」のいずれか
160  *
161  * @param word レジスタ番号[0-7]を表すWORD値
162  */
163 char *grstr(WORD word);
164
165 /**
166  * COMET II仮想マシンのリセット
167  */
168 void reset(int memsize, int clocks);
169
170 /**
171  * COMET II仮想マシンのシャットダウン
172  */
173 void shutdown();
174
175 /**
176  * @brief 命令ハッシュ表を作成する
177  *
178  * @return なし
179  *
180  * @param hash ハッシュ値
181  */
182 bool create_cmdtable(CMDTAB_HASH hash);
183
184 /**
185  * 命令ハッシュ表を解放する
186  */
187 void free_cmdtable(CMDTAB_HASH hash);
188
189 /**
190  * 命令の名前とタイプから、命令コードを返す
191  * 無効な場合は0xFFFFを返す
192  */
193 WORD getcmdcode(const char *cmd, CMDTYPE type);
194
195 /**
196  * 命令コードから命令の関数ポインタを返す
197  */
198 const void (*getcmdptr(WORD code));
199
200 /**
201  * 命令コードから命令のタイプを返す
202  */
203 CMDTYPE getcmdtype(WORD code);
204
205 /**
206  * 命令コードから命令の名前を返す
207  */
208 char *getcmdname(WORD code);
209
210 #endif