comet2monitorの追加と、モニター機能作成
[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
18 /**
19  * @brief CASL IIの仕様
20  */
21 enum {
22     LABELSIZE = 8,         /**<ラベルの最大文字数 */
23     OPDSIZE = 40,          /**<オペラントの最大数。CASL IIシミュレータの制限 */
24 };
25
26 /**
27  * @brief YACASL2の制限
28  */
29 enum {
30     LINESIZE = 1024,       /**<行の最大文字数 */
31     TOKENSIZE = 256,       /**<トークンの最大文字数 */
32 };
33
34 /**
35  * @brief アセンブルモードを表すデータ型
36  */
37 typedef struct {
38     bool src;             /**<ソースを表示する場合はtrue */
39     bool label;           /**<ラベル表を表示する場合はtrue */
40     bool onlylabel;       /**<ラベル表を表示して終了する場合はtrue */
41     bool asdetail;        /**<アセンブラ詳細結果を表示する場合はtrue */
42     bool onlyassemble;    /**<アセンブルだけを行う場合はtrue */
43 } ASMODE;
44
45 /**
46  * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
47  */
48 extern ASMODE asmode;
49
50 /**
51  * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
52  */
53 typedef struct {
54     WORD ptr;     /**<現在のアドレス */
55     WORD lptr;    /**<リテラル(=付きの値)のアドレス */
56     char *prog;   /**<他のプログラムで参照する入口名 */
57 } ASPTR;
58
59 /**
60  * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
61  */
62 extern ASPTR *asptr;
63
64 /**
65  * @brief ラベル配列を表すデータ型
66  */
67 typedef struct {
68     char *prog;                 /**<プログラム  */
69     char *label;                /**<ラベル */
70     WORD adr;                   /**<アドレス */
71 } LABELARRAY;
72
73 /**
74  * @brief ラベル表を表すデータ型
75  */
76 typedef struct _LABELTAB {
77     struct _LABELTAB *next;     /**<リスト次項目へのポインタ */
78     LABELARRAY *label;          /**<ラベル配列 */
79 } LABELTAB;
80
81 /**
82  * ラベル表のサイズ
83  */
84 enum {
85     LABELTABSIZE = 251,         /**<ラベル表のサイズ */
86 };
87
88 /**
89  * @brief アセンブラが、1回目か2回目かを表す数値
90  */
91 typedef enum {
92     FIRST = 0,                  /**<アセンブラ1回目 */
93     SECOND = 1,                 /**<アセンブラ2回目 */
94 } PASS;
95
96 /**
97  * @brief ラベルのエラーをエラーリストに追加する
98  *
99  * @return なし
100  */
101 void addcerrlist_label();
102
103 /**
104  * @brief プログラム名とラベルに対応するアドレスをラベル表から検索する
105  *
106  * @return プログラム名とラベルに対応するアドレス
107  *
108  * @param *prog プログラム名
109  * @param *label ラベル
110  */
111 WORD getlabel(const char *prog, const char *label);
112
113 /**
114  * @brief プログラム名、ラベル、アドレスをラベル表に追加する
115  *
116  * @return 追加に成功した時はtrue、失敗した時はfalse
117  *
118  * @param *prog プログラム名
119  * @param *label ラベル
120  * @param adr アドレス
121  */
122 bool addlabel(const char *prog, const char *label, WORD adr);
123
124 /**
125  * @brief ラベル表を表示する
126  *
127  * @return なし
128  */
129 void printlabel();
130
131 /**
132  * @brief ラベル表を解放する
133  *
134  * @return なし
135  */
136 void freelabel();
137
138 /**
139  * @brief オペランドを表すデータ型
140  */
141 typedef struct {
142     int opdc;                   /**<オペランド数 */
143     char *opdv[OPDSIZE];        /**<オペランド配列 */
144 } OPD;
145
146 /**
147  * @brief 命令行を表すデータ型
148  */
149 typedef struct {
150     char *label;                /**<ラベル */
151     char *cmd;                  /**<コマンド */
152     OPD *opd;                   /**<オペランド */
153 } CMDLINE;
154
155 /**
156  * @brief トークン取得のエラーを追加する
157  *
158  * @return なし
159  */
160 void addcerrlist_tok();
161