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