1 #ifndef YACASL2_ASSEMBLE_H_INCLUDED
2 #define YACASL2_ASSEMBLE_H_INCLUDED
3
4 #include <stdbool.h>
5 #include "cerr.h"
6 #include "struct.h"
7 #include "token.h"
8
9
10 /**
11 * @brief アセンブルモードを表すデータ型
12 */
13 typedef struct {
14 bool src; /**<ソースを表示する場合はtrue */
15 bool label; /**<ラベル表を表示する場合はtrue */
16 bool onlylabel; /**<ラベル表を表示して終了する場合はtrue */
17 bool asdetail; /**<アセンブラ詳細結果を表示する場合はtrue */
18 bool onlyassemble; /**<アセンブルだけを行う場合はtrue */
19 } ASMODE;
20
21 /**
22 * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
23 */
24 extern ASMODE asmode;
25
26 /**
27 * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
28 */
29 typedef struct {
30 WORD ptr; /**<現在のアドレス */
31 WORD lptr; /**<リテラル(=付きの値)のアドレス */
32 char *prog; /**<他のプログラムで参照する入口名 */
33 } ASPTR;
34
35 /**
36 * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
37 */
38 extern ASPTR *asptr;
39
40 /**
41 * @brief ラベル配列を表すデータ型
42 */
43 typedef struct {
44 char *prog; /**<プログラム */
45 char *label; /**<ラベル */
46 WORD adr; /**<アドレス */
47 } LABELARRAY;
48
49 /**
50 * @brief ラベル表を表すデータ型
51 */
52 typedef struct _LABELTAB {
53 struct _LABELTAB *next; /**<リスト次項目へのポインタ */
54 LABELARRAY *label; /**<ラベル配列 */
55 } LABELTAB;
56
57 /**
58 * ラベル表のサイズ
59 */
60 enum {
61 LABELTABSIZE = 251, /**<ラベル表のサイズ */
62 };
63
64 /**
65 * @brief アセンブラが、1回目か2回目かを表す数値
66 */
67 typedef enum {
68 FIRST = 0, /**<アセンブラ1回目 */
69 SECOND = 1, /**<アセンブラ2回目 */
70 } PASS;
71
72 /**
73 * @brief ラベルのエラーをエラーリストに追加する
74 *
75 */
76 void addcerrlist_label();
77
78 /**
79 * @brief プログラム名とラベルに対応するアドレスをラベル表から検索する
80 *
81 * @return プログラム名とラベルに対応するアドレス
82 *
83 * @param *prog プログラム名
84 * @param *label ラベル
85 */
86 WORD getlabel(const char *prog, const char *label);
87
88 /**
89 * @brief プログラム名、ラベル、アドレスをラベル表に追加する
90 *
91 * @return 追加に成功した時はtrue、失敗した時はfalse
92 *
93 * @param *prog プログラム名
94 * @param *label ラベル
95 * @param adr アドレス
96 */
97 bool addlabel(const char *prog, const char *label, WORD adr);
98
99 /**
100 * @brief ラベル表を表示する
101 *
102 */
103 void printlabel();
104
105 /**
106 * @brief ラベル表を解放する
107 *
108 */
109 void freelabel();
110
111 /**
112 * @brief アセンブルエラーをエラーリストに追加する
113 *
114 */
115 void addcerrlist_assemble();
116
117 /**
118 * @brief 指定された名前のファイルをアセンブル\n
119 *
120 * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
121 *
122 * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
123 *
124 * @param *file ファイル名
125 * @param pass アセンブラが何回目かを表す数
126 */
127 bool assemblefile(const char *file, PASS pass);
128
129 /**
130 * @brief 指定された1つまたは複数のファイルを2回アセンブル
131 *
132 * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
133 *
134 * @param filec アセンブルするファイルの数
135 * @param filev アセンブルするファイル名の配列
136 * @param adr アセンブル結果を格納するアドレス
137 */
138 bool assemble(int filec, char *filev[], WORD adr);
139
140 /**
141 * @brief ファイルにアセンブル結果を書き込む
142 *
143 * @param *file ファイル名
144 */
145 void outassemble(const char *file);
146
147 #endif