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 */
81 void addcerrlist_label();
82
83 /**
84 * @brief プログラム名とラベルに対応するアドレスをラベル表から検索する
85 *
86 * @return プログラム名とラベルに対応するアドレス
87 *
88 * @param *prog プログラム名
89 * @param *label ラベル
90 */
91 WORD getlabel(const char *prog, const char *label);
92
93 /**
94 * @brief プログラム名、ラベル、アドレスをラベル表に追加する
95 *
96 * @return 追加に成功した時はtrue、失敗した時はfalse
97 *
98 * @param *prog プログラム名
99 * @param *label ラベル
100 * @param adr アドレス
101 */
102 bool addlabel(const char *prog, const char *label, WORD adr);
103
104 /**
105 * @brief ラベル表を表示する
106 *
107 */
108 void printlabel();
109
110 /**
111 * @brief ラベル表を解放する
112 *
113 */
114 void freelabel();
115
116 /**
117 * @brief アセンブルエラーをエラーリストに追加する
118 *
119 */
120 void addcerrlist_assemble();
121
122 /**
123 * @brief 指定された名前のファイルをアセンブル\n
124 *
125 * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
126 *
127 * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
128 *
129 * @param *file ファイル名
130 * @param pass アセンブラが何回目かを表す数
131 */
132 bool assemblefile(const char *file, PASS pass);
133
134 /**
135 * @brief 指定された1つまたは複数のファイルを2回アセンブル
136 *
137 * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
138 *
139 * @param filec アセンブルするファイルの数
140 * @param filev アセンブルするファイル名の配列
141 * @param adr アセンブル結果を格納するアドレス
142 */
143 bool assemble(int filec, char *filev[], WORD adr);
144
145 /**
146 * @brief ファイルにアセンブル結果を書き込む
147 *
148 * @param *file ファイル名
149 */
150 void outassemble(const char *file);
151
152 #endif