テストがMacやCygwinなどでも成功するように変更
[YACASL2.git] / include / assemble.h
1 #ifndef YACASL2_ASSEMBLE_INCLUDED
2 #define YACASL2_ASSEMBLE_INCLUDED
3
4 /* CASL IIの仕様 */
5 enum {
6     LABELSIZE = 8,         /* ラベルの最大文字数 */
7     OPDSIZE = 40,          /* オペラントの最大数。CASL IIシミュレータの制限 */
8 };
9
10 /* YACASL2の制限 */
11 enum {
12     LINESIZE = 1024,       /* 行の最大文字数 */
13     TOKENSIZE = 256,       /* トークンの最大文字数 */
14 };
15
16 /* アセンブルモード */
17 typedef struct {
18     bool src;             /* ソースを表示する場合はtrue */
19     bool label;           /* ラベル表を表示する場合はtrue */
20     bool onlylabel;       /* ラベル表を表示して終了する場合はtrue */
21     bool asdetail;        /* アセンブラ詳細結果を表示する場合はtrue */
22     bool onlyassemble;    /* アセンブルだけを行う場合はtrue */
23 } ASMODE;
24
25 extern ASMODE asmode;
26
27 /* アセンブル時のプロパティ */
28 typedef struct {
29     WORD ptr;     /* 現在のポインタ */
30     WORD lptr;    /* リテラル(=付きの値)を格納するポインタ */
31     char *prog;   /* 他のプログラムで参照する入口名 */
32 } ASPROP;
33
34 extern ASPROP *asprop;
35
36 /* アセンブラ命令を表す番号 */
37 typedef enum {
38     START = 01,
39     END = 02,
40     DS = 03,
41     DC = 04,
42 } ASCMDID;
43
44 /* アセンブラ命令を表す配列 */
45 typedef struct {
46     ASCMDID cmdid;
47     int opdc_min;
48     int opdc_max;
49     char *cmd;
50 } ASCMD;
51
52 /* マクロ命令を表す番号 */
53 typedef enum {
54     IN = 011,
55     OUT = 012,
56     RPUSH = 013,
57     RPOP = 014,
58 } MACROCMDID;
59
60 /* マクロ命令を表す配列 */
61 typedef struct {
62     MACROCMDID cmdid;
63     int opdc_min;
64     int opdc_max;
65     char *cmd;
66 } MACROCMD;
67
68 /* ラベル配列 */
69 typedef struct {
70     char *prog;
71     char *label;
72     WORD adr;
73 } LABELARRAY;
74
75 /* ラベル表 */
76 typedef struct _LABELTAB {
77     struct _LABELTAB *next;
78     char *prog;
79     char *label;
80     WORD adr;
81 } LABELTAB;
82
83 enum {
84     LABELTABSIZE = 251,    /* ラベル表のサイズ */
85 };
86
87 /* アセンブラが、1回目か、2回目か、を表す */
88 typedef enum {
89     FIRST = 0,
90     SECOND = 1,
91 } PASS;
92
93 /* アセンブルのエラー定義 */
94 bool addcerrlist_assemble();
95
96 /* プログラム名とラベルに対応するハッシュ値を返す */
97 unsigned labelhash(const char *prog, const char *label);
98
99 /* プログラム名とラベルに対応するアドレスをラベル表から検索する */
100 WORD getlabel(const char *prog, const char *label);
101
102 /* ラベルを表に追加する */
103 bool addlabel(const char *prog, const char *label, WORD word);
104
105 /* ラベル表を表示する */
106 void printlabel();
107
108 /* ラベル表を解放する */
109 void freelabel();
110
111 /* オペランド */
112 typedef struct {
113     int opdc;
114     char *opdv[OPDSIZE];
115 } OPD;
116
117 /* 命令行 */
118 typedef struct {
119     char *label;
120     char *cmd;
121     OPD *opd;
122 } CMDLINE;
123
124 /* 命令がマクロ命令の場合はメモリに書込
125    書込に成功した場合TRUE、それ以外の場合はFALSEを返す */
126 bool macrocmd(const CMDLINE *cmdl, PASS pass);
127
128 /* 「,」区切りの文字列から、オペランドを取得する */
129 OPD *opdtok(const char *str);
130
131 /* 1行を解析する */
132 CMDLINE *linetok(const char *line);
133
134 /* 汎用レジスタを表す文字列「GR[0-7]」から、レジスタ番号[0-7]をWORD値で返す */
135 /* 文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
136 /* is_xがtrueの場合は指標レジスタ。GR0は、COMET IIの仕様により、エラー発生 */
137 WORD getgr(const char *str, bool is_x);
138
139 /* 10進定数をWORDに変換 */
140 WORD getint(const char *str);
141
142 /* 16進定数をWORDに変換 */
143 WORD gethex(const char *str);
144
145 /* アドレスを返す */
146 /* アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
147 WORD getadr(const char *prog, const char *str, PASS pass);
148
149 /* 定数の前に等号(=)をつけて記述される、リテラルを返す */
150 /* リテラルには、10進定数/16進定数/文字定数が含まれる */
151 WORD getliteral(const char *str, PASS pass);
152
153 /* COMET IIのメモリにアドレス値を書き込む */
154 bool writememory(WORD word, WORD adr, PASS pass);
155
156 /* ' 'で囲まれた、文字定数をメモリに書込 */
157 /* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
158 void writestr(const char *str, bool literal, PASS pass);
159
160 /* アセンブラ命令DCをメモリに書込 */
161 void writeDC(const char *str, PASS pass);
162
163 /* 命令がアセンブラ命令の場合は処理を実行する。 */
164 /* 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
165 bool assemblecmd(const CMDLINE *cmdl, PASS pass);
166
167 /* 命令のコードを返す
168    命令が無効な場合は0xFFFF */
169 WORD getcmd(CMDTYPE type, const char *cmd);
170
171 /* 命令が機械語命令の場合は処理を実行 */
172 /* 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
173 bool cometcmd(const CMDLINE *cmdl, PASS pass);
174
175 /* 1行のアセンブル */
176 /* アセンブル完了時はTRUE、未完了時はFALSEを返す */
177 bool assembleline(const CMDLINE *cmdl, PASS pass);
178
179 /* 指定された名前のファイルをアセンブル */
180 /* 2回実行される */
181 bool assemble(const char *file, PASS pass);
182
183 /* マクロ命令「IN IBUF,LEN」をメモリに書込 */
184 bool writeIN(const char *ibuf, const char *len, PASS pass);
185
186 /* マクロ命令「OUT OBUF,LEN」をメモリに書込 */
187 bool writeOUT(const char *obuf, const char *len, PASS pass);
188
189 /* マクロ命令「RPUSH」をメモリに書込 */
190 bool writeRPUSH(PASS pass);
191
192 /* マクロ命令「RPOP」をメモリに書込 */
193 bool writeRPOP(PASS pass);
194
195 #endif            /* YACASL2_ASSEMBLE_INCLUDEDの終端 */