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