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