Merge branch
[YACASL2.git] / include / assemble.h
1 #ifndef YACASL2_ASSEMBLE_INCLUDED
2 #define YACASL2_ASSEMBLE_INCLUDED
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <stdbool.h>
8 #include <ctype.h>
9 #include <assert.h>
10 #include <errno.h>
11 #include "cerr.h"
12 #include "cmem.h"
13 #include "exec.h"
14 #include "hash.h"
15 #include "struct.h"
16 #include "word.h"
17
18 /**
19  * @brief CASL IIの仕様
20  */
21 enum {
22     LABELSIZE = 8,         /**<ラベルの最大文字数 */
23     OPDSIZE = 40,          /**<オペラントの最大数。CASL IIシミュレータの制限 */
24 };
25
26 /**
27  * @brief YACASL2の制限
28  */
29 enum {
30     LINESIZE = 1024,       /**<行の最大文字数 */
31     TOKENSIZE = 256,       /**<トークンの最大文字数 */
32 };
33
34 /**
35  * @brief アセンブルモードを表すデータ型
36  */
37 typedef struct {
38     bool src;             /**<ソースを表示する場合はtrue */
39     bool label;           /**<ラベル表を表示する場合はtrue */
40     bool onlylabel;       /**<ラベル表を表示して終了する場合はtrue */
41     bool asdetail;        /**<アセンブラ詳細結果を表示する場合はtrue */
42     bool onlyassemble;    /**<アセンブルだけを行う場合はtrue */
43 } ASMODE;
44
45 /**
46  * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
47  */
48 extern ASMODE asmode;
49
50 /**
51  * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
52  */
53 typedef struct {
54     WORD ptr;     /**<現在のアドレス */
55     WORD lptr;    /**<リテラル(=付きの値)のアドレス */
56     char *prog;   /**<他のプログラムで参照する入口名 */
57 } ASPTR;
58
59 /**
60  * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
61  */
62 extern ASPTR *asptr;
63
64 /**
65  * @brief ラベル配列を表すデータ型
66  */
67 typedef struct {
68     char *prog;                 /**<プログラム  */
69     char *label;                /**<ラベル */
70     WORD adr;                   /**<アドレス */
71 } LABELARRAY;
72
73 /**
74  * @brief ラベル表を表すデータ型
75  */
76 typedef struct _LABELTAB {
77     struct _LABELTAB *next;     /**<リスト次項目へのポインタ */
78     LABELARRAY *label;          /**<ラベル配列 */
79 } LABELTAB;
80
81 /**
82  * ラベル表のサイズ
83  */
84 enum {
85     LABELTABSIZE = 251,         /**<ラベル表のサイズ */
86 };
87
88 /**
89  * @brief アセンブラが、1回目か2回目かを表す数値
90  */
91 typedef enum {
92     FIRST = 0,                  /**<アセンブラ1回目 */
93     SECOND = 1,                 /**<アセンブラ2回目 */
94 } PASS;
95
96 /**
97  * @brief ラベルのエラーをエラーリストに追加する
98  *
99  * @return なし
100  */
101 void addcerrlist_label();
102
103 /**
104  * @brief プログラム名とラベルに対応するアドレスをラベル表から検索する
105  *
106  * @return プログラム名とラベルに対応するアドレス
107  *
108  * @param *prog プログラム名
109  * @param *label ラベル
110  */
111 WORD getlabel(const char *prog, const char *label);
112
113 /**
114  * @brief プログラム名、ラベル、アドレスをラベル表に追加する
115  *
116  * @return 追加に成功した時はtrue、失敗した時はfalse
117  *
118  * @param *prog プログラム名
119  * @param *label ラベル
120  * @param adr アドレス
121  */
122 bool addlabel(const char *prog, const char *label, WORD adr);
123
124 /**
125  * @brief ラベル表を表示する
126  *
127  * @return なし
128  */
129 void printlabel();
130
131 /**
132  * @brief ラベル表を解放する
133  *
134  * @return なし
135  */
136 void freelabel();
137
138 /**
139  * @brief オペランドを表すデータ型
140  */
141 typedef struct {
142     int opdc;                   /**<オペランド数 */
143     char *opdv[OPDSIZE];        /**<オペランド配列 */
144 } OPD;
145
146 /**
147  * @brief 命令行を表すデータ型
148  */
149 typedef struct {
150     char *label;                /**<ラベル */
151     char *cmd;                  /**<コマンド */
152     OPD *opd;                   /**<オペランド */
153 } CMDLINE;
154
155 /**
156  * @brief トークン取得のエラーを追加する
157  *
158  * @return なし
159  */
160 void addcerrlist_tok();
161
162 /**
163  * @brief 行から、ラベル・コマンド・オペランドを取得する
164  *
165  * @return ラベル・コマンド・オペランド
166  *
167  * @param *line 行
168  */
169 CMDLINE *linetok(const char *line);
170
171 /**
172  * @brief アセンブルエラーをエラーリストに追加する
173  *
174  * @return なし
175  */
176 void addcerrlist_assemble();
177
178 /**
179  * @brief 指定された名前のファイルをアセンブル\n
180  *
181  * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
182  *
183  * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
184  *
185  * @param *file ファイル名
186  * @param pass アセンブラが何回目かを表す数
187  */
188 bool assemblefile(const char *file, PASS pass);
189
190 /**
191  * @brief 指定された1つまたは複数のファイルを2回アセンブル
192  *
193  * @return なし
194  *
195  * @param filec アセンブルするファイルの数
196  * @param filev アセンブルするファイル名の配列
197  * @param adr アセンブル結果を格納するアドレス
198  */
199 void assemble(int filec, char *filev[], WORD adr);
200
201 /**
202  * @brief ファイルにアセンブル結果を書き込む
203  *
204  * @return なし
205  *
206  * @param *file ファイル名
207  */
208 void outassemble(const char *file);
209
210 #endif            /* YACASL2_ASSEMBLE_INCLUDEDの終端 */