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