doxygen用にコメント修正。関数のstatic指定を外す
[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  * CASL IIの仕様
10  */
11 enum {
12     LABELSIZE = 8,         /**<ラベルの最大文字数 */
13     OPDSIZE = 40,          /**<オペラントの最大数。CASL IIシミュレータの制限 */
14 };
15
16 /**
17  * YACASL2の制限
18  */
19 enum {
20     LINESIZE = 1024,       /**<行の最大文字数 */
21     TOKENSIZE = 256,       /**<トークンの最大文字数 */
22 };
23
24 /**
25  * アセンブルモード
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 extern ASMODE asmode;
36
37 /**
38  * アセンブルのプロパティ
39  */
40 typedef struct {
41     WORD ptr;     /**<現在のポインタ */
42     WORD lptr;    /**<リテラル(=付きの値)を格納するポインタ */
43     char *prog;   /**<他のプログラムで参照する入口名 */
44 } ASPROP;
45
46 /**
47  * アセンブルのプロパティ: ptr, lptr, *prog
48  */
49 extern ASPROP *asprop;
50
51 /**
52   * アセンブラ命令を表す番号
53   */
54 typedef enum {
55     START = 01,
56     END = 02,
57     DS = 03,
58     DC = 04,
59 } ASCMDID;
60
61 /**
62   * アセンブラ命令を表す配列
63   */
64 typedef struct {
65     ASCMDID cmdid;              /**<アセンブル命令のID */
66     int opdc_min;               /**<最小オペランド数 */
67     int opdc_max;               /**<最大オペランド数 */
68     char *cmd;                  /**<コマンド名 */
69 } ASCMD;
70
71 /**
72  * マクロ命令を表す番号
73  */
74 typedef enum {
75     IN = 011,
76     OUT = 012,
77     RPUSH = 013,
78     RPOP = 014,
79 } MACROCMDID;
80
81 /**
82  * マクロ命令を表す配列
83  */
84 typedef struct {
85     MACROCMDID cmdid;              /**<アセンブル命令のID */
86     int opdc_min;                  /**<最小オペランド数 */
87     int opdc_max;                  /**<最大オペランド数 */
88     char *cmd;                     /**<コマンド名 */
89 } MACROCMD;
90
91 /**
92  * ラベル配列
93  */
94 typedef struct {
95     char *prog;                 /**<プログラム  */
96     char *label;                /**<ラベル */
97     WORD adr;                   /**<アドレス */
98 } LABELARRAY;
99
100 /**
101  * ラベル表
102  */
103 typedef struct _LABELTAB {
104     struct _LABELTAB *next;     /**<リスト次項目へのポインタ */
105     char *prog;                 /**<プログラム名  */
106     char *label;                /**<ラベル名 */
107     WORD adr;                   /**<アドレス */
108 } LABELTAB;
109
110 enum {
111     /**
112      * ラベル表のサイズ
113      */
114     LABELTABSIZE = 251,
115 };
116
117 /**
118  * アセンブラが、1回目か2回目か
119  */
120 typedef enum {
121     FIRST = 0,
122     SECOND = 1,
123 } PASS;
124
125 /**
126  * プログラム名とラベルに対応するアドレスをラベル表から検索する
127  */
128 WORD getlabel(const char *prog, const char *label);
129
130 /**
131  * プログラム名、ラベル、アドレスをラベル表に追加する
132  */
133 bool addlabel(const char *prog, const char *label, WORD word);
134
135 /**
136  * ラベル表を表示する
137  */
138 void printlabel();
139
140 /**
141  * ラベル表を解放する
142  */
143 void freelabel();
144
145 /**
146  * オペランド
147  */
148 typedef struct {
149     int opdc;                   /**<オペランド数 */
150     char *opdv[OPDSIZE];        /**<オペランド配列 */
151 } OPD;
152
153 /**
154  * 命令行
155  */
156 typedef struct {
157     char *label;                /**<ラベル */
158     char *cmd;                  /**<コマンド */
159     OPD *opd;                   /**<オペランド */
160 } CMDLINE;
161
162 /**
163  * 空白またはタブで区切られた1行から、トークンを取得する
164  */
165 CMDLINE *linetok(const char *line);
166
167 /**
168  * 指定された名前のファイルをアセンブル
169  * 2回実行される
170  */
171 bool assemble(const char *file, PASS pass);
172
173 /**
174  * 引数で指定したファイルにアセンブル結果を書込
175  */
176 void outassemble(const char *file);
177
178 #endif            /* YACASL2_ASSEMBLE_INCLUDEDの終端 */