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