ラベルの出力時、アドレス順に並べ替えるように仕様変更
[YACASL2.git] / include / assemble.h
1 #ifndef YACASL2_ASSEMBLE_INCLUDED
2 #define YACASL2_ASSEMBLE_INCLUDED
3
4 /* CASL IIの仕様 */
5 enum {
6     LABELSIZE = 8,         /* ラベルの最大文字数 */
7     OPDSIZE = 40,          /* オペラントの最大数。CASL IIシミュレータの制限 */
8 };
9
10 /* YACASL2の制限 */
11 enum {
12     LINESIZE = 1024,       /* 行の最大文字数 */
13     TOKENSIZE = 256,       /* トークンの最大文字数 */
14 };
15
16 /* アセンブルモード */
17 typedef struct {
18     bool src;             /* ソースを表示する場合はtrue */
19     bool label;           /* ラベル表を表示する場合はtrue */
20     bool onlylabel;       /* ラベル表を表示して終了する場合はtrue */
21     bool asdetail;        /* アセンブラ詳細結果を表示する場合はtrue */
22     bool onlyassemble;    /* アセンブルだけを行う場合はtrue */
23 } ASMODE;
24 extern ASMODE asmode;
25
26 /* 値を格納するポインタ */
27 extern WORD ptr;
28
29 /* リテラル(=付きの値)を格納するポインタ */
30 extern WORD lptr;
31
32 /* 他のプログラムで参照する入口名 */
33 extern char *prog;
34
35 /* アセンブラ命令とマクロ命令を表す番号 */
36 typedef enum {
37     START = 01,
38     END = 02,
39     DS = 03,
40     DC = 04,
41     IN = 011,
42     OUT = 012,
43     RPUSH = 013,
44     RPOP = 014,
45 } CASLCMD;
46
47 /* アセンブラ命令とマクロ命令を表す配列 */
48 typedef struct {
49     CASLCMD cmdid;
50     int opdc_min;
51     int opdc_max;
52     char *cmd;
53 } CMDARRAY;
54
55 /* ラベル配列 */
56 typedef struct {
57     char *prog;
58     char *label;
59     WORD adr;
60 } LABELARRAY;
61
62 /* ラベル表 */
63 typedef struct _LABELTAB {
64     struct _LABELTAB *next;
65     char *prog;
66     char *label;
67     WORD adr;
68 } LABELTAB;
69
70 enum {
71     LABELTABSIZE = 251,    /* ラベル表のサイズ */
72 };
73
74 /* アセンブラが、1回目か、2回目か、を表す */
75 typedef enum {
76     FIRST = 0,
77     SECOND = 1,
78 } PASS;
79
80 /* プログラム名とラベルに対応するハッシュ値を返す */
81 unsigned labelhash(const char *prog, const char *label);
82
83 /* プログラム名とラベルに対応するアドレスをラベル表から検索する */
84 WORD getlabel(const char *prog, const char *label);
85
86 /* ラベルを表に追加する */
87 bool addlabel(const char *prog, const char *label, WORD word);
88
89 /* ラベル表を表示する */
90 void printlabel();
91
92 /* ラベル表を解放する */
93 void freelabel();
94
95 /* オペランド */
96 typedef struct {
97     int opdc;
98     char *opdv[OPDSIZE];
99 } OPD;
100
101 /* 命令行 */
102 typedef struct {
103     char *label;
104     char *cmd;
105     OPD *opd;
106 } CMDLINE;
107
108 /* 命令がマクロ命令の場合はメモリに書込
109    書込に成功した場合TRUE、それ以外の場合はFALSEを返す */
110 bool macrocmd(const CMDLINE *cmdl, PASS pass);
111
112 /* 「,」区切りの文字列から、オペランドを取得する */
113 OPD *opdtok(const char *str);
114
115 /* 1行を解析する */
116 CMDLINE *linetok(const char *line);
117
118 /* 汎用レジスタを表す文字列「GR[0-7]」から、レジスタ番号[0-7]をWORD値で返す */
119 /* 文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
120 /* is_xがtrueの場合は指標レジスタ。GR0は、COMET IIの仕様により、エラー発生 */
121 WORD getgr(const char *str, bool is_x);
122
123 /* 10進定数をWORDに変換 */
124 WORD getint(const char *str);
125
126 /* 16進定数をWORDに変換 */
127 WORD gethex(const char *str);
128
129 /* アドレスを返す */
130 /* アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
131 WORD getadr(const char *prog, const char *str, PASS pass);
132
133 /* 定数の前に等号(=)をつけて記述される、リテラルを返す */
134 /* リテラルには、10進定数/16進定数/文字定数が含まれる */
135 WORD getliteral(const char *str, PASS pass);
136
137 /* COMET IIのメモリにアドレス値を書き込む */
138 bool writememory(WORD word, WORD adr, PASS pass);
139
140 /* ' 'で囲まれた、文字定数をメモリに書込 */
141 /* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
142 void writestr(const char *str, bool literal, PASS pass);
143
144 /* アセンブラ命令DCをメモリに書込 */
145 void writeDC(const char *str, PASS pass);
146
147 /* 命令がアセンブラ命令の場合は処理を実行する。
148    実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
149 bool assemblecmd(const CMDLINE *cmdl, PASS pass);
150
151 /* 命令のコードを返す
152    命令が無効な場合は0xFFFF */
153 WORD getcmd(CMDTYPE type, const char *cmd);
154
155 /* 命令が機械語命令の場合は処理を実行
156    実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
157 bool cometcmd(const CMDLINE *cmdl, PASS pass);
158
159 /* 1行のアセンブル */
160 /* アセンブル完了時はTRUE、未完了時はFALSEを返す */
161 bool assembleline(const CMDLINE *cmdl, PASS pass);
162
163 /* 指定された名前のファイルをアセンブル */
164 /* 2回実行される */
165 bool assemble(const char *file, PASS pass);
166
167 /* マクロ命令「IN IBUF,LEN」をメモリに書込 */
168 bool writeIN(const char *ibuf, const char *len, PASS pass);
169
170 /* マクロ命令「OUT OBUF,LEN」をメモリに書込 */
171 bool writeOUT(const char *obuf, const char *len, PASS pass);
172
173 /* マクロ命令「RPUSH」をメモリに書込 */
174 bool writeRPUSH(PASS pass);
175
176 /* マクロ命令「RPOP」をメモリに書込 */
177 bool writeRPOP(PASS pass);
178
179 #endif            /* YACASL2_ASSEMBLE_INCLUDEDの終端 */