ブランチ「label-local」をマージ
[YACASL2.git] / include / casl2.h
1 #ifndef YACASL2_CASL2_INCLUDED
2 #define YACASL2_CASL2_INCLUDED
3
4 #include <stdio.h>
5 #include <malloc.h>
6 #include <stdbool.h>
7 #include <time.h>
8 #include <assert.h>
9 #include <ctype.h>
10 #include <string.h>
11
12 #include "word.h"
13 #include "hash.h"
14 #include "cerr.h"
15
16 #ifndef ARRAYSIZE
17 #define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0]))
18 #endif
19
20 /* COMET IIの規格 */
21 enum {
22     CMDSIZE = 4,      /* 命令の最大文字数 */
23     REGSIZE = 8,      /* 汎用レジスタの数 */
24     DEFAULT_MEMSIZE = 512,    /* デフォルトのメモリ容量。COMET II規格では、65536語 */
25     DEFAULT_CLOCKS = 5000000, /* デフォルトのクロック周波数。COMET II規格では、未定義 */
26 };
27
28 /* COMET IIのメモリ */
29 extern WORD *memory;
30
31 /* COMET IIのCPUレジスタ */
32 extern WORD GR[REGSIZE], SP, PR, FR;
33
34 /* COMET II フラグのマスク値 */
35 enum {
36     OF = 0x4,    /* Overflow Flag */
37     SF = 0x2,    /* Sign Flag */
38     ZF = 0x1,    /* Zero Flag */
39 };
40
41 /* レジストリの内容を表示する場合はTRUE */
42 extern bool tracemode;
43
44 /* レジストリの内容を論理値(0〜65535)で表示する場合はTRUE */
45 extern bool logicalmode;
46
47 /* メモリの内容を表示する場合はTRUE */
48 extern bool dumpmode;
49
50 /* ソースを表示する場合はTRUE */
51 extern bool srcmode;
52
53 /* ラベル表を表示する場合はTRUE */
54 extern bool labelmode;
55
56 /* ラベル表を表示して終了する場合はTRUE */
57 extern bool onlylabelmode;
58
59 /* アセンブラ詳細結果を表示するならTRUE */
60 extern bool asdetailmode;
61
62 /* アセンブルだけを行う場合はTRUE */
63 extern bool onlyassemblemode;
64
65 /* メモリーサイズ */
66 extern int memsize;
67
68 /* クロック周波数 */
69 extern int clocks;
70
71 /* 実行開始番地 */
72 extern WORD startptr;
73
74 /* 実行終了番地 */
75 extern WORD endptr;
76
77 /* COMET II 命令
78    命令タイプは、オペランドにより6つに分類
79        R_ADR_X = 010: オペランド数2または3。
80                 第1オペランドは汎用レジスタ、第2オペランドはアドレス、第3オペランドは指標レジスタ
81        R_ADR_X_ = 011: 同上。ただし、実効アドレスに格納されている内容を示す
82        R1_R2 = 020: オペランド数2。第1オペランド、第2オペランドともに汎用レジスタ
83        ADR_X = 030: オペランド数1または2。第1オペランドはアドレス、第2オペランドは指標レジスタ
84        R_ = 040: オペランド数1。第1オペランドはGR
85        NONE = 0: オペランドなし
86 */
87 typedef enum {
88     R_ADR_X = 010,
89     R_ADR_X_ = 011,
90     R1_R2 = 020,
91     ADR_X = 030,
92     R_ = 040,
93     NONE = 0,
94 } CMDTYPE;
95
96 typedef struct {
97     char *cmd;
98     CMDTYPE type;
99     WORD code;
100 } CMDCODEARRAY;
101
102 /* 命令コードのハッシュ表 */
103 typedef struct _CMDCODETAB {
104     struct _CMDCODETAB *next;
105     CMDCODEARRAY *cca;
106 } CMDCODETAB;
107
108 /* 命令と命令タイプがキーのハッシュ表を作成する */
109 bool create_cmdtype_code();
110
111 /* 命令と命令タイプから、命令コードを取得する。
112    無効な場合は0xFFFFを返す */
113 WORD getcmdcode(const char *cmd, CMDTYPE type);
114
115 /* 命令と命令タイプからハッシュ値を生成する */
116 unsigned hash_cmdtype(const char *cmd, CMDTYPE type);
117
118 /* 命令と命令タイプがキーのハッシュ表を表示する */
119 void print_cmdtype_code();
120
121 /* 命令と命令タイプがキーのハッシュ表を解放する */
122 void free_cmdtype_code();
123
124 /* 命令コードがキーのハッシュ表を作成する */
125 bool create_code_type();
126
127 /* 命令コードからハッシュ値を生成する */
128 unsigned hash_code(WORD code);
129
130 /* 命令コードから命令タイプを取得する。
131    無効な場合はNONEを返す */
132 CMDTYPE getcmdtype(WORD code);
133
134 /* 命令コードがキーのハッシュ表を表示する */
135 void print_code_type();
136
137 /* 命令コードがキーのハッシュ表を解放する */
138 void free_code_type();
139
140 /* 指定されたファイルにアセンブル結果を書込 */
141 void outassemble(char *file);
142
143 #endif