1 #ifndef YACASL2_STRUCT_H_INCLUDED
2 #define YACASL2_STRUCT_H_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 comet2_init(int memsize, int clocks);
168
169 /**
170 * COMET II仮想マシンのCPUをリセット
171 */
172 void comet2_reset();
173
174 /**
175 * COMET II仮想マシンのCPUとメモリをリセット
176 */
177 void comet2_resetall();
178
179 /**
180 * COMET II仮想マシンのシャットダウン
181 */
182 void comet2_shutdown();
183
184 /**
185 * @brief 命令ハッシュ表を作成する
186 *
187 * @param hash ハッシュ値
188 */
189 bool create_cmdtable(CMDTAB_HASH hash);
190
191 /**
192 * 命令ハッシュ表を解放する
193 */
194 void free_cmdtable(CMDTAB_HASH hash);
195
196 /**
197 * 命令の名前とタイプから、命令コードを返す
198 * 無効な場合は0xFFFFを返す
199 */
200 WORD getcmdcode(const char *cmd, CMDTYPE type);
201
202 /**
203 * 命令コードから命令の関数ポインタを返す
204 */
205 const void (*getcmdptr(WORD code));
206
207 /**
208 * 命令コードから命令のタイプを返す
209 */
210 CMDTYPE getcmdtype(WORD code);
211
212 /**
213 * 命令コードから命令の名前を返す
214 */
215 char *getcmdname(WORD code);
216
217 #endif