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 typedef unsigned int CLOCK;
13
14 /**
15 * @brief COMET IIの規格値
16 */
17 enum {
18 CMDSIZE = 4, /**<命令の最大文字数 */
19 GRSIZE = 8, /**<汎用レジスタの数。COMET II規格で、GR0〜GR7までの8 */
20 MAX_MEMSIZE = 65536, /**<メモリ容量の最大値。COMET II規格で、アドレス0~65535の65536語(word) */
21 DEFAULT_MEMSIZE = 512, /**<メモリ容量の初期値。COMET II規格では、アドレス0~65535の65536語(word) */
22 MAX_CLOCKS = 1000000, /**<クロック周波数の最大値。POSIXのCLOCKS_PER_SECと同値 */
23 DEFAULT_CLOCKS = MAX_CLOCKS, /**<クロック周波数の初期値。最大値と同値 */
24 };
25
26 /**
27 * @brief COMET II フラグのマスク値
28 */
29 enum {
30 OF = 0x4, /**<Overflow Flag */
31 SF = 0x2, /**<Sign Flag */
32 ZF = 0x1, /**<Zero Flag */
33 };
34
35 /**
36 * @brief COMET IIのCPUを表すデータ型
37 */
38 typedef struct {
39 WORD gr[GRSIZE]; /**<汎用レジスタ */
40 WORD sp; /**<スタックポインタ */
41 WORD pr; /**<プログラムレジスタ */
42 WORD fr; /**<フラグレジスタ */
43 } CPU;
44
45 /**
46 * @brief COMET IIの仮想実行マシンシステムを表すデータ型
47 */
48 typedef struct {
49 CPU *cpu; /**<CPU */
50 WORD *memory; /**<メモリ */
51 WORD memsize; /**<メモリサイズ */
52 CLOCK clocks; /**<クロック周波数 */
53 } SYSTEM;
54
55 /**
56 * @brief COMET IIの仮想実行マシンシステム
57 */
58 extern SYSTEM *sys;
59
60 /**
61 * 命令ハッシュ表のハッシュの種類
62 */
63 typedef enum {
64 HASH_CMDTYPE,
65 HASH_CODE,
66 HASH_MAX,
67 } CMDTAB_HASH;
68
69 /**
70 * COMET II 命令
71 * 命令タイプは、オペランドにより5種類に分類
72 */
73 typedef enum {
74 /**
75 * オペランド数2または3
76 * - 第1オペランド: 汎用レジスタ。必須
77 * - 第2オペランド: アドレス。必須
78 * - 第3オペランド: 指標レジスタとして用いる汎用レジスタ。任意
79 */
80 R_ADR_X = 01,
81 /**
82 * オペランド数2
83 * - 第1オペランド: 汎用レジスタ。必須
84 * - 第2オペランド: 汎用レジスタ。必須
85 */
86 R1_R2 = 02,
87 /**
88 * オペランド数1または2
89 * - 第1オペランド: アドレス。必須
90 * - 第2オペランド: 指標レジスタとして用いる汎用レジスタ。任意
91 */
92 ADR_X = 03,
93 /**
94 * オペランド数1
95 * - 第1オペランド: 汎用レジスタ。必須
96 */
97 R_ = 04,
98 /**
99 * オペランドなし
100 */
101 NONE = 0,
102 } CMDTYPE;
103
104 /**
105 * 命令コード表の項目
106 */
107 typedef struct {
108 char *name; /**<命令名 */
109 void (*ptr); /**<命令の関数ポインタ */
110 } CMD;
111
112 /**
113 * COMET II命令コード表の項目
114 */
115 typedef struct {
116 char *name; /**<命令名 */
117 CMDTYPE type; /**<命令タイプ */
118 WORD code; /**<命令コード */
119 void (*ptr); /**<命令の関数ポインタ */
120 int wordlen; /**<命令語長 */
121 } COMET2CMD;
122
123 /**
124 * 命令コードのハッシュ表
125 */
126 typedef struct _CMDTAB {
127 struct _CMDTAB *next; /**<リスト次項目へのポインタ */
128 const COMET2CMD *cmd; /**<命令コード表の項目 */
129 } CMDTAB;
130
131 /**
132 * プログラム実行時の開始と終了のアドレス
133 */
134 typedef struct {
135 WORD start; /**<開始アドレス */
136 WORD end; /**<終了アドレス */
137 bool stop; /**<終了フラグ */
138 bool started; /**<開始済みフラグ */
139 } EXECPTR;
140
141 extern EXECPTR *execptr;
142
143 /**
144 * @brief 実行モードを表すデータ型
145 */
146 typedef struct {
147 bool trace; /**<レジストリの内容をステップごとに表示する場合はtrue */
148 bool logical; /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
149 bool dump; /**<メモリの内容をステップごとに表示する場合はtrue */
150 WORD dump_start; /**<メモリの内容をステップごとに表示する場合の開始アドレス */
151 WORD dump_end; /**<メモリの内容をステップごとに表示する場合の終了アドレス */
152 bool reverse; /**<逆アセンブルの結果をステップごとに表示する場合はtrue */
153 bool monitor; /**<モニターモードの場合はtrue */
154 bool step; /**<ステップ実行の場合はtrue */
155 } EXECMODE;
156
157 /**
158 * @brief 実行モード: trace, logical, dump, reverse, monitor, step
159 */
160 extern EXECMODE execmode;
161
162 /**
163 * @brief 汎用レジスタの番号からレジスタを表す文字列を返す
164 *
165 * @return 汎用レジスタを表す文字列。「GR0」「GR1」・・・「GR7」のいずれか
166 *
167 * @param word レジスタ番号[0-7]を表すWORD値
168 */
169 char *grstr(WORD word);
170
171 /**
172 * @brief メモリーサイズを表す数値文字列をWORD値に変換して返す。WORD値に変換できない場合は、エラーを表示して0を返す
173 *
174 * @return メモリーサイズのWORD値である、1から65536までの範囲の整数。エラー時は0
175 *
176 * @param str メモリーサイズを表す数値文字列
177 */
178 WORD memsize_str2word(const char *str);
179
180 /**
181 * @brief COMET II仮想マシンの初期化
182 *
183 * @param memsize メモリーサイズ。1から65535までの範囲の整数
184 * @param clocks クロック数。1から1000000までの範囲の整数
185 */
186 void comet2_init(WORD memsize, CLOCK clocks);
187
188 /**
189 * @brief COMET II仮想マシンのCPUをリセット
190 */
191 void comet2_reset();
192
193 /**
194 * COMET II仮想マシンのCPUとメモリをリセット
195 */
196 void comet2_resetall();
197
198 /**
199 * @brief COMET II仮想マシンのシャットダウン
200 */
201 void comet2_shutdown();
202
203 /**
204 * @brief 命令ハッシュ表を作成する
205 *
206 * @param hash ハッシュ値
207 */
208 bool create_cmdtable(CMDTAB_HASH hash);
209
210 /**
211 * 命令ハッシュ表を解放する
212 */
213 void free_cmdtable(CMDTAB_HASH hash);
214
215 /**
216 * 命令の名前とタイプから、命令コードを返す
217 * 無効な場合は0xFFFFを返す
218 */
219 WORD getcmdcode(const char *cmd, CMDTYPE type);
220
221 /**
222 * コードが命令コードでR/R1またはR2/XのGRが範囲外の場合はfalse、それ以外はtrueを返す
223 */
224 bool code_gr_valid(WORD code);
225
226 /**
227 * 命令の名前とタイプから、命令語長を返す
228 * 無効な場合は0を返す
229 */
230 WORD getcmdwordlen(const char *cmd, CMDTYPE type);
231
232 /**
233 * 命令コードから命令の関数ポインタを返す
234 */
235 void (*getcmdptr(WORD code));
236
237 /**
238 * 命令コードから命令のタイプを返す
239 */
240 CMDTYPE getcmdtype(WORD code);
241
242 /**
243 * 命令コードから命令の名前を返す
244 */
245 char *getcmdname(WORD code);
246
247 #endif
248
249 /**
250 * 命令コードから、命令語長を返す\n
251 * 無効な場合は0を返す
252 */
253 WORD code2cmdwordlen(WORD code);