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