11 static CMD comet2cmd[] = {
13 { "LD", R_ADR_X_, 0x1000 },
14 { "ST", R_ADR_X, 0x1100 },
15 { "LAD", R_ADR_X, 0x1200 },
16 { "LD", R1_R2, 0x1400 },
17 { "ADDA", R_ADR_X_, 0x2000 },
18 { "SUBA", R_ADR_X_, 0x2100 },
19 { "ADDL", R_ADR_X_, 0x2200 },
20 { "SUBL", R_ADR_X_, 0x2300 },
21 { "ADDA", R1_R2, 0x2400 },
22 { "SUBA", R1_R2, 0x2500 },
23 { "ADDL", R1_R2, 0x2600 },
24 { "SUBL", R1_R2, 0x2700 },
25 { "AND", R_ADR_X_, 0x3000 },
26 { "OR", R_ADR_X_, 0x3100 },
27 { "XOR", R_ADR_X_, 0x3200 },
28 { "AND", R1_R2, 0x3400 },
29 { "OR", R1_R2, 0x3500 },
30 { "XOR", R1_R2, 0x3600 },
31 { "CPA", R_ADR_X_, 0x4000 },
32 { "CPL", R_ADR_X_, 0x4100 },
33 { "CPA", R1_R2, 0x4400 },
34 { "CPL", R1_R2, 0x4500 },
35 { "SLA", R_ADR_X, 0x5000 },
36 { "SRA", R_ADR_X, 0x5100 },
37 { "SLL", R_ADR_X, 0x5200 },
38 { "SRL", R_ADR_X, 0x5300 },
39 { "JMI", ADR_X, 0x6100 },
40 { "JNZ", ADR_X, 0x6200 },
41 { "JZE", ADR_X, 0x6300 },
42 { "JUMP", ADR_X, 0x6400 },
43 { "JPL", ADR_X, 0x6500 },
44 { "JOV", ADR_X, 0x6600 },
45 { "PUSH", ADR_X, 0x7000 },
46 { "POP", R_, 0x7100 },
47 { "CALL", ADR_X, 0x8000 },
48 { "SVC", ADR_X, 0xF000 },
49 { "RET", NONE, 0x8100 },
55 static int comet2cmdsize = ARRAYSIZE(comet2cmd);
60 static int cmdtabsize;
65 static CMDTAB **cmdtype_code, **code_type;
68 * 命令の名前とタイプからハッシュ値を生成する
70 unsigned hash_cmdtype(const char *cmd, CMDTYPE type)
76 keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[0]");
77 keys[0]->type = CHARS;
78 keys[0]->val.s = strdup_chk(cmd, "keys[0].val.s");
80 keys[1] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[1]");
82 keys[1]->val.i = (int)(type & 070);
84 hashval = hash(2, keys, cmdtabsize);
93 * 名前とタイプがキーの命令ハッシュ表を作成する
95 bool create_cmdtype_code()
101 cmdtabsize = comet2cmdsize; /* ハッシュ表のサイズ */
102 cmdtype_code = calloc_chk(cmdtabsize, sizeof(CMDTAB *), "cmdtype_code");
103 for(i = 0; i < comet2cmdsize; i++) {
104 p = malloc_chk(sizeof(CMDTAB), "create_cmdtype_code.p");
105 hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type); /* ハッシュ値の生成 */
106 p->next = cmdtype_code[hashval]; /* ハッシュ表に値を追加 */
107 p->cmd = &comet2cmd[i];
108 cmdtype_code[hashval] = p;
114 * 命令の名前とタイプから、命令コードを返す
117 WORD getcmdcode(const char *cmd, CMDTYPE type)
123 for(p = cmdtype_code[hash_cmdtype(cmd, type)]; p != NULL; p = p->next) {
124 if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) {
133 * 名前とタイプがキーの命令ハッシュ表を解放する
135 void free_cmdtype_code()
140 for(i = 0; i < cmdtabsize; i++) {
141 for(p = cmdtype_code[i]; p != NULL; p = q) {
151 unsigned hash_code(WORD code)
157 keys[0] = malloc_chk(sizeof(HKEY), "hash_code.key");
159 keys[0]->val.i = (int)(code >> 8);
160 h = hash(1, keys, cmdtabsize);
166 * コードがキーの命令ハッシュ表を作成する
168 bool create_code_type()
174 cmdtabsize = comet2cmdsize; /* ハッシュ表のサイズ */
175 code_type = calloc_chk(comet2cmdsize, sizeof(CMDTAB *), "code_type");
176 for(i = 0; i < comet2cmdsize; i++) {
177 p = malloc_chk(sizeof(CMDTAB), "code_type.p");
178 hashval = hash_code((&comet2cmd[i])->code); /* ハッシュ値の生成 */
179 p->next = code_type[hashval]; /* ハッシュ表に値を追加 */
180 p->cmd = &comet2cmd[i];
181 code_type[hashval] = p;
190 CMDTYPE getcmdtype(WORD code)
195 for(p = code_type[hash_code(code)]; p != NULL; p = p->next) {
196 if(code == p->cmd->code) {
205 * コードがキーの命令ハッシュ表を解放する
207 void free_code_type()
211 for(i = 0; i < cmdtabsize; i++) {
212 for(p = code_type[i]; p != NULL; p = q) {