スタイルシートで、実行例の背景色を黒から白へ
[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     char *prog;                 /**<プログラム名  */
69     char *label;                /**<ラベル名 */
70     WORD adr;                   /**<アドレス */
71 } LABELTAB;
72
73 /**
74  * ラベル表のサイズ
75  */
76 enum {
77     LABELTABSIZE = 251,         /**<ラベル表のサイズ */
78 };
79
80 /**
81  * @brief アセンブラが、1回目か2回目かを表す数値
82  */
83 typedef enum {
84     FIRST = 0,                  /**<アセンブラ1回目 */
85     SECOND = 1,                 /**<アセンブラ2回目 */
86 } PASS;
87
88 /**
89  * @brief ラベルのエラーをエラーリストに追加する
90  *
91  * @return なし
92  */
93 void addcerrlist_label();
94
95 /**
96  * @brief プログラム名とラベルに対応するアドレスをラベル表から検索する
97  *
98  * @return プログラム名とラベルに対応するアドレス
99  *
100  * @param *prog プログラム名
101  * @param *label ラベル
102  */
103 WORD getlabel(const char *prog, const char *label);
104
105 /**
106  * @brief プログラム名、ラベル、アドレスをラベル表に追加する
107  *
108  * @return 追加に成功した時はtrue、失敗した時はfalse
109  *
110  * @param *prog プログラム名
111  * @param *label ラベル
112  * @param adr アドレス
113  */
114 bool addlabel(const char *prog, const char *label, WORD adr);
115
116 /**
117  * @brief ラベル表を表示する
118  *
119  * @return なし
120  */
121 void printlabel();
122
123 /**
124  * @brief ラベル表を解放する
125  *
126  * @return なし
127  */
128 void freelabel();
129
130 /**
131  * @brief オペランドを表すデータ型
132  */
133 typedef struct {
134     int opdc;                   /**<オペランド数 */
135     char *opdv[OPDSIZE];        /**<オペランド配列 */
136 } OPD;
137
138 /**
139  * @brief 命令行を表すデータ型
140  */
141 typedef struct {
142     char *label;                /**<ラベル */
143     char *cmd;                  /**<コマンド */
144     OPD *opd;                   /**<オペランド */
145 } CMDLINE;
146
147 /**
148  * @brief トークン取得のエラーを追加する
149  *
150  * @return なし
151  */
152 void addcerrlist_tok();
153
154 /**
155  * @brief 行から、ラベル・コマンド・オペランドを取得する
156  *
157  * @return ラベル・コマンド・オペランド
158  *
159  * @param *line 行
160  */
161 CMDLINE *linetok(const char *line);
162
163 /**
164  * @brief アセンブルエラーをエラーリストに追加する
165  *
166  * @return なし
167  */
168 void addcerrlist_assemble();
169
170 /**
171  * @brief 指定された名前のファイルをアセンブル\n
172  *
173  * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
174  *
175  * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
176  *
177  * @param *file ファイル名
178  * @param pass アセンブラが何回目かを表す数
179  */
180 bool assemblefile(const char *file, PASS pass);
181
182 /**
183  * @brief ファイルにアセンブル結果を書き込む
184  *
185  * @return なし
186  *
187  * @param *file ファイル名
188  */
189 void outassemble(const char *file);
190
191 #endif            /* YACASL2_ASSEMBLE_INCLUDEDの終端 */