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