annotate lwasm/pseudo.c @ 389:fbb7bfed8076

Added in structure support and fixed up some warts in the listing code (by adding more warts)
author lost@l-w.ca
date Wed, 14 Jul 2010 22:33:55 -0600
parents a741d2e4869f
children c1d83336e1d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
1 /*
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
2 pseudo.c
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
3 Copyright © 2010 William Astle
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
4
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
5 This file is part of LWASM.
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
6
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
7 LWASM is free software: you can redistribute it and/or modify it under the
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
8 terms of the GNU General Public License as published by the Free Software
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
9 Foundation, either version 3 of the License, or (at your option) any later
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
10 version.
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
11
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
12 This program is distributed in the hope that it will be useful, but WITHOUT
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
15 more details.
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
16
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
17 You should have received a copy of the GNU General Public License along with
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
18 this program. If not, see <http://www.gnu.org/licenses/>.
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
19
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
20 */
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
21
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
22 #include <config.h>
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
23
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
24 #include <stdio.h>
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
25
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
26 #include "lwasm.h"
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
27 #include "instab.h"
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
28 #include "input.h"
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
29
349
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
30 #include "lw_string.h"
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
31
389
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
32 extern void register_struct_entry(asmstate_t *as, line_t *l, int size, structtab_t *ss);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
33
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
34 // for "end"
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
35 PARSEFUNC(pseudo_parse_end)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
36 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
37 lw_expr_t addr;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
38
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
39 as -> endseen = 1;
370
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
40 l -> len = 0;
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
41
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
42 if (as -> output_format != OUTPUT_DECB)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
43 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
44 skip_operand(p);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
45 return;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
46 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
47
370
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
48 if (!**p)
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
49 {
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
50 addr = lw_expr_build(lw_expr_type_int, 0);
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
51 }
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
52 else
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
53 {
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
54 addr = lwasm_parse_expr(as, p);
6b33faa21a0a Debugging output and bugfixing pass 0
lost@starbug
parents: 363
diff changeset
55 }
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
56 if (!addr)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
57 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
58 lwasm_register_error(as, l, "Bad expression");
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
59 addr = lw_expr_build(lw_expr_type_int, 0);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
60 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
61 lwasm_save_expr(l, 0, addr);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
62 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
63
348
11a95c6414b4 Added third func to instab to split resolve and emit logic
lost@starbug
parents: 347
diff changeset
64 EMITFUNC(pseudo_emit_end)
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
65 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
66 lw_expr_t addr;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
67
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
68 addr = lwasm_fetch_expr(l, 0);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
69
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
70 if (addr)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
71 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
72 if (!lw_expr_istype(addr, lw_expr_type_int))
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
73 lwasm_register_error(as, l, "Exec address not constant!");
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
74 else
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
75 as -> execaddr = lw_expr_intval(addr);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
76 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
77 as -> endseen = 1;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
78 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
79
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
80 PARSEFUNC(pseudo_parse_fcb)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
81 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
82 int i = 0;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
83 lw_expr_t e;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
84
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
85 for (;;)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
86 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
87 e = lwasm_parse_expr(as, p);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
88 if (!e)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
89 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
90 lwasm_register_error(as, l, "Bad expression (#%s)", i);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
91 break;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
92 }
382
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
93 lwasm_save_expr(l, i++, e);
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
94 if (**p != ',')
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
95 break;
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
96 (*p)++;
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
97 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
98
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
99 l -> len = i;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
100 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
101
348
11a95c6414b4 Added third func to instab to split resolve and emit logic
lost@starbug
parents: 347
diff changeset
102 EMITFUNC(pseudo_emit_fcb)
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
103 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
104 int i;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
105 lw_expr_t e;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
106 int v;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
107
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
108 for (i = 0; i < l -> len; i++)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
109 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
110 e = lwasm_fetch_expr(l, i);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
111 lwasm_emitexpr(l, e, 1);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
112 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
113 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
114
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
115 PARSEFUNC(pseudo_parse_fdb)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
116 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
117 int i = 0;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
118 lw_expr_t e;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
119
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
120 for (;;)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
121 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
122 e = lwasm_parse_expr(as, p);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
123 if (!e)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
124 {
382
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
125 lwasm_register_error(as, l, "Bad expression (#%d)", i);
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
126 break;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
127 }
382
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
128 lwasm_save_expr(l, i++, e);
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
129 if (**p != ',')
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
130 break;
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
131 (*p)++;
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
132 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
133
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
134 l -> len = i * 2;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
135 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
136
348
11a95c6414b4 Added third func to instab to split resolve and emit logic
lost@starbug
parents: 347
diff changeset
137 EMITFUNC(pseudo_emit_fdb)
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
138 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
139 int i;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
140 lw_expr_t e;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
141 int v;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
142
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
143 for (i = 0; i < (l -> len)/2; i++)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
144 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
145 e = lwasm_fetch_expr(l, i);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
146 lwasm_emitexpr(l, e, 2);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
147 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
148 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
149
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
150 PARSEFUNC(pseudo_parse_fqb)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
151 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
152 int i = 0;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
153 lw_expr_t e;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
154
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
155 for (;;)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
156 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
157 e = lwasm_parse_expr(as, p);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
158 if (!e)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
159 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
160 lwasm_register_error(as, l, "Bad expression (#%s)", i);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
161 break;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
162 }
382
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
163 lwasm_save_expr(l, i++, e);
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
164 if (**p != ',')
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
165 break;
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
166 (*p)++;
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
167 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
168
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
169 l -> len = i * 4;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
170 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
171
348
11a95c6414b4 Added third func to instab to split resolve and emit logic
lost@starbug
parents: 347
diff changeset
172 EMITFUNC(pseudo_emit_fqb)
347
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
173 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
174 int i;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
175 lw_expr_t e;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
176 int v;
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
177
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
178 for (i = 0; i < (l -> len)/4; i++)
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
179 {
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
180 e = lwasm_fetch_expr(l, i);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
181 lwasm_emitexpr(l, e, 4);
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
182 }
1649bc7bda5a Some data oriented pseudo ops added
lost@starbug
parents:
diff changeset
183 }
349
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
184
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
185 PARSEFUNC(pseudo_parse_fcc)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
186 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
187 char delim;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
188 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
189
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
190 if (!**p)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
191 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
192 lwasm_register_error(as, l, "Bad operand");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
193 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
194 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
195
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
196 delim = **p;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
197 (*p)++;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
198
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
199 for (i = 0; (*p)[i] && (*p)[i] != delim; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
200 /* do nothing */ ;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
201
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
202 if ((*p)[i] != delim)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
203 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
204 lwasm_register_error(as, l, "Bad operand");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
205 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
206 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
207
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
208 l -> lstr = lw_strndup(*p, i);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
209 (*p) += i + 1;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
210
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
211 l -> len = i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
212 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
213
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
214 EMITFUNC(pseudo_emit_fcc)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
215 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
216 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
217
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
218 for (i = 0; i < l -> len; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
219 lwasm_emit(l, l -> lstr[i]);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
220 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
221
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
222 PARSEFUNC(pseudo_parse_fcs)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
223 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
224 char delim;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
225 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
226
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
227 if (!**p)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
228 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
229 lwasm_register_error(as, l, "Bad operand");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
230 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
231 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
232
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
233 delim = **p;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
234 (*p)++;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
235
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
236 for (i = 0; (*p)[i] && (*p)[i] != delim; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
237 /* do nothing */ ;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
238
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
239 if ((*p)[i] != delim)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
240 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
241 lwasm_register_error(as, l, "Bad operand");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
242 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
243 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
244
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
245 l -> lstr = lw_strndup(*p, i);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
246 (*p) += i + 1;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
247
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
248 l -> len = i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
249 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
250
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
251 EMITFUNC(pseudo_emit_fcs)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
252 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
253 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
254
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
255 for (i = 0; i < l -> len - 1; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
256 lwasm_emit(l, l -> lstr[i]);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
257 lwasm_emit(l, l -> lstr[i] | 0x80);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
258 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
259
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
260 PARSEFUNC(pseudo_parse_fcn)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
261 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
262 char delim;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
263 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
264
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
265 if (!**p)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
266 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
267 lwasm_register_error(as, l, "Bad operand");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
268 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
269 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
270
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
271 delim = **p;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
272 (*p)++;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
273
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
274 for (i = 0; (*p)[i] && (*p)[i] != delim; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
275 /* do nothing */ ;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
276
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
277 if ((*p)[i] != delim)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
278 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
279 lwasm_register_error(as, l, "Bad operand");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
280 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
281 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
282
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
283 l -> lstr = lw_strndup(*p, i);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
284 (*p) += i + 1;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
285
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
286 l -> len = i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
287 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
288
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
289 EMITFUNC(pseudo_emit_fcn)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
290 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
291 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
292
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
293 for (i = 0; i < l -> len; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
294 lwasm_emit(l, l -> lstr[i]);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
295 lwasm_emit(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
296 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
297
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
298 PARSEFUNC(pseudo_parse_rmb)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
299 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
300 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
301
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
302 expr = lwasm_parse_expr(as, p);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
303 if (!expr)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
304 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
305 lwasm_register_error(as, l, "Bad expression");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
306 }
389
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
307
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
308 if (as -> instruct)
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
309 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
310 lwasm_reduce_expr(as, expr);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
311 if (!lw_expr_istype(expr, lw_expr_type_int))
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
312 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
313 lwasm_register_error(as, l, "Expression must be constant at parse time");
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
314 }
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
315 else
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
316 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
317 int e;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
318 e = lw_expr_intval(expr);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
319 register_struct_entry(as, l, e, NULL);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
320 l -> len = 0;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
321 }
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
322 }
349
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
323
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
324 lwasm_save_expr(l, 0, expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
325 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
326
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
327 RESOLVEFUNC(pseudo_resolve_rmb)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
328 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
329 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
330
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
331 if (l -> len >= 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
332 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
333
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
334 expr = lwasm_fetch_expr(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
335
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
336 if (lw_expr_istype(expr, lw_expr_type_int))
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
337 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
338 l -> len = lw_expr_intval(expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
339 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
340 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
341
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
342 EMITFUNC(pseudo_emit_rmb)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
343 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
344 if (l -> len < 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
345 lwasm_register_error(as, l, "Expression not constant");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
346 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
347
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
348 PARSEFUNC(pseudo_parse_rmd)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
349 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
350 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
351
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
352 expr = lwasm_parse_expr(as, p);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
353 if (!expr)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
354 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
355 lwasm_register_error(as, l, "Bad expression");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
356 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
357
389
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
358 if (as -> instruct)
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
359 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
360 lwasm_reduce_expr(as, expr);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
361 if (!lw_expr_istype(expr, lw_expr_type_int))
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
362 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
363 lwasm_register_error(as, l, "Expression must be constant at parse time");
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
364 }
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
365 else
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
366 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
367 int e;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
368 e = lw_expr_intval(expr) * 2;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
369 register_struct_entry(as, l, e, NULL);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
370 l -> len = 0;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
371 }
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
372 }
349
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
373 lwasm_save_expr(l, 0, expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
374 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
375
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
376 RESOLVEFUNC(pseudo_resolve_rmd)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
377 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
378 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
379
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
380 if (l -> len >= 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
381 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
382
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
383 expr = lwasm_fetch_expr(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
384
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
385 if (lw_expr_istype(expr, lw_expr_type_int))
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
386 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
387 l -> len = lw_expr_intval(expr) * 2;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
388 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
389 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
390
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
391 EMITFUNC(pseudo_emit_rmd)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
392 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
393 if (l -> len < 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
394 lwasm_register_error(as, l, "Expression not constant");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
395 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
396
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
397
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
398 PARSEFUNC(pseudo_parse_rmq)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
399 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
400 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
401
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
402 expr = lwasm_parse_expr(as, p);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
403 if (!expr)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
404 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
405 lwasm_register_error(as, l, "Bad expression");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
406 }
389
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
407 if (as -> instruct)
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
408 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
409 lwasm_reduce_expr(as, expr);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
410 if (!lw_expr_istype(expr, lw_expr_type_int))
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
411 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
412 lwasm_register_error(as, l, "Expression must be constant at parse time");
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
413 }
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
414 else
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
415 {
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
416 int e;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
417 e = lw_expr_intval(expr) * 4;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
418 register_struct_entry(as, l, e, NULL);
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
419 l -> len = 0;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
420 }
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
421 }
349
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
422
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
423 lwasm_save_expr(l, 0, expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
424 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
425
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
426 RESOLVEFUNC(pseudo_resolve_rmq)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
427 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
428 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
429
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
430 if (l -> len >= 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
431 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
432
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
433 expr = lwasm_fetch_expr(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
434
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
435 if (lw_expr_istype(expr, lw_expr_type_int))
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
436 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
437 l -> len = lw_expr_intval(expr) * 4;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
438 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
439 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
440
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
441 EMITFUNC(pseudo_emit_rmq)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
442 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
443 if (l -> len < 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
444 lwasm_register_error(as, l, "Expression not constant");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
445 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
446
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
447
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
448 PARSEFUNC(pseudo_parse_zmq)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
449 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
450 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
451
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
452 expr = lwasm_parse_expr(as, p);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
453 if (!expr)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
454 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
455 lwasm_register_error(as, l, "Bad expression");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
456 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
457
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
458 lwasm_save_expr(l, 0, expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
459 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
460
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
461 RESOLVEFUNC(pseudo_resolve_zmq)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
462 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
463 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
464
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
465 if (l -> len >= 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
466 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
467
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
468 expr = lwasm_fetch_expr(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
469
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
470 if (lw_expr_istype(expr, lw_expr_type_int))
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
471 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
472 l -> len = lw_expr_intval(expr) * 4;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
473 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
474 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
475
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
476 EMITFUNC(pseudo_emit_zmq)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
477 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
478 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
479
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
480 if (l -> len < 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
481 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
482 lwasm_register_error(as, l, "Expression not constant");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
483 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
484 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
485
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
486 for (i = 0; i < l -> len; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
487 lwasm_emit(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
488 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
489
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
490
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
491 PARSEFUNC(pseudo_parse_zmd)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
492 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
493 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
494
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
495 expr = lwasm_parse_expr(as, p);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
496 if (!expr)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
497 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
498 lwasm_register_error(as, l, "Bad expression");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
499 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
500
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
501 lwasm_save_expr(l, 0, expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
502 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
503
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
504 RESOLVEFUNC(pseudo_resolve_zmd)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
505 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
506 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
507
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
508 if (l -> len >= 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
509 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
510
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
511 expr = lwasm_fetch_expr(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
512
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
513 if (lw_expr_istype(expr, lw_expr_type_int))
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
514 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
515 l -> len = lw_expr_intval(expr) * 2;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
516 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
517 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
518
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
519 EMITFUNC(pseudo_emit_zmd)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
520 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
521 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
522
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
523 if (l -> len < 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
524 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
525 lwasm_register_error(as, l, "Expression not constant");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
526 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
527 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
528
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
529 for (i = 0; i < l -> len; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
530 lwasm_emit(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
531 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
532
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
533 PARSEFUNC(pseudo_parse_zmb)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
534 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
535 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
536
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
537 expr = lwasm_parse_expr(as, p);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
538 if (!expr)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
539 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
540 lwasm_register_error(as, l, "Bad expression");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
541 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
542
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
543 lwasm_save_expr(l, 0, expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
544 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
545
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
546 RESOLVEFUNC(pseudo_resolve_zmb)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
547 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
548 lw_expr_t expr;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
549
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
550 if (l -> len >= 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
551 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
552
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
553 expr = lwasm_fetch_expr(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
554
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
555 if (lw_expr_istype(expr, lw_expr_type_int))
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
556 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
557 l -> len = lw_expr_intval(expr);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
558 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
559 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
560
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
561 EMITFUNC(pseudo_emit_zmb)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
562 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
563 int i;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
564
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
565 if (l -> len < 0)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
566 {
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
567 lwasm_register_error(as, l, "Expression not constant");
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
568 return;
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
569 }
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
570
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
571 for (i = 0; i < l -> len; i++)
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
572 lwasm_emit(l, 0);
dcd2978a7d18 More pseudo ops
lost@starbug
parents: 348
diff changeset
573 }
350
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
574
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
575 PARSEFUNC(pseudo_parse_org)
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
576 {
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
577 lw_expr_t e;
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
578
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
579 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
580
350
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
581 e = lwasm_parse_expr(as, p);
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
582 if (!e)
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
583 {
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
584 lwasm_register_error(as, l, "Bad operand");
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
585 return;
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
586 }
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
587
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
588 lw_expr_destroy(l -> addr);
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
589 l -> addr = e;
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
590 l -> len = 0;
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
591 }
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
592
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
593 PARSEFUNC(pseudo_parse_equ)
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
594 {
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
595 lw_expr_t e;
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
596
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
597 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
598
350
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
599 if (!(l -> sym))
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
600 {
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
601 lwasm_register_error(as, l, "Missing symbol");
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
602 return;
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
603 }
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
604
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
605 e = lwasm_parse_expr(as, p);
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
606 if (!e)
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
607 {
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
608 lwasm_register_error(as, l, "Bad operand");
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
609 return;
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
610 }
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
611
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
612 register_symbol(as, l, l -> sym, e, symbol_flag_none);
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
613 l -> symset = 1;
389
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
614 l -> dptr = lookup_symbol(as, l, l -> sym);
350
f5666775d76f Even more pseudo ops
lost@starbug
parents: 349
diff changeset
615 }
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
616
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
617 PARSEFUNC(pseudo_parse_set)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
618 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
619 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
620
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
621 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
622
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
623 if (!(l -> sym))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
624 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
625 lwasm_register_error(as, l, "Missing symbol");
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
626 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
627 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
628
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
629 e = lwasm_parse_expr(as, p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
630 if (!e)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
631 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
632 lwasm_register_error(as, l, "Bad operand");
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
633 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
634 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
635
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
636 register_symbol(as, l, l -> sym, e, symbol_flag_set);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
637 l -> symset = 1;
389
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
638 l -> dptr = lookup_symbol(as, l, l -> sym);
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
639 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
640
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
641 PARSEFUNC(pseudo_parse_setdp)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
642 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
643 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
644
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
645 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
646
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
647 if (as -> output_format == OUTPUT_OBJ)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
648 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
649 lwasm_register_error(as, l, "SETDP not permitted for object target");
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
650 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
651 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
652
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
653 e = lwasm_parse_expr(as, p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
654 if (!e)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
655 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
656 lwasm_register_error(as, l, "Bad operand");
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
657 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
658 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
659
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
660 if (!lw_expr_istype(e, lw_expr_type_int))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
661 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
662 lwasm_register_error(as, l, "SETDP must be constant on pass 1");
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
663 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
664 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
665 l -> dpval = lw_expr_intval(e) & 0xff;
389
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
666 l -> dshow = l -> dpval;
fbb7bfed8076 Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents: 387
diff changeset
667 l -> dsize = 1;
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
668 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
669
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
670 PARSEFUNC(pseudo_parse_ifp1)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
671 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
672 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
673
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
674 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
675 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
676 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
677 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
678 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
679 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
680
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
681 lwasm_register_warning(as, l, "IFP1 if is not supported; ignoring");
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
682
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
683 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
684
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
685 PARSEFUNC(pseudo_parse_ifp2)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
686 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
687 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
688
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
689 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
690 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
691 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
692 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
693 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
694 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
695
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
696 lwasm_register_warning(as, l, "IFP2 if is not supported; ignoring");
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
697 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
698
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
699 PARSEFUNC(pseudo_parse_ifeq)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
700 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
701 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
702
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
703 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
704
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
705 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
706 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
707 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
708 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
709 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
710 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
711
387
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
712 e = lwasm_parse_cond(as, p);
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
713 if (e && lw_expr_intval(e) != 0)
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
714 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
715 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
716 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
717 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
718 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
719
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
720 PARSEFUNC(pseudo_parse_ifne)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
721 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
722 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
723
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
724 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
725
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
726 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
727 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
728 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
729 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
730 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
731 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
732
387
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
733 e = lwasm_parse_cond(as, p);
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
734 if (e && lw_expr_intval(e) == 0)
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
735 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
736 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
737 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
738 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
739 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
740
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
741
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
742 PARSEFUNC(pseudo_parse_ifgt)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
743 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
744 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
745
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
746 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
747
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
748 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
749 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
750 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
751 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
752 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
753 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
754
387
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
755 e = lwasm_parse_cond(as, p);
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
756 if (e && lw_expr_intval(e) <= 0)
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
757 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
758 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
759 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
760 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
761 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
762
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
763 PARSEFUNC(pseudo_parse_ifge)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
764 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
765 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
766
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
767 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
768
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
769 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
770 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
771 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
772 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
773 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
774 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
775
387
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
776 e = lwasm_parse_cond(as, p);
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
777 if (e && lw_expr_intval(e) < 0)
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
778 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
779 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
780 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
781 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
782 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
783
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
784 PARSEFUNC(pseudo_parse_iflt)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
785 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
786 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
787
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
788 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
789
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
790 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
791 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
792 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
793 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
794 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
795 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
796
387
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
797 e = lwasm_parse_cond(as, p);
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
798 if (e && lw_expr_intval(e) >= 0)
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
799 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
800 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
801 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
802 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
803 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
804
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
805 PARSEFUNC(pseudo_parse_ifle)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
806 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
807 lw_expr_t e;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
808
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
809 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
810
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
811 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
812 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
813 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
814 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
815 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
816 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
817
387
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
818 e = lwasm_parse_cond(as, p);
a741d2e4869f Various bugfixes; fixed lwobjdump to display symbols with unprintable characters more sensibly; start of a (nonfunctional for now) testing framework
lost@l-w.ca
parents: 386
diff changeset
819 if (e && lw_expr_intval(e) > 0)
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
820 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
821 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
822 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
823 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
824 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
825
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
826 PARSEFUNC(pseudo_parse_endc)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
827 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
828 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
829 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
830 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
831 as -> skipcount--;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
832 if (as -> skipcount < 0)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
833 as -> skipcond = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
834 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
835 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
836
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
837 PARSEFUNC(pseudo_parse_else)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
838 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
839 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
840
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
841 if (as -> skipmacro)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
842 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
843
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
844 if (as -> skipcond)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
845 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
846 if (as -> skipcount == 1)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
847 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
848 as -> skipcount = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
849 as -> skipcond = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
850 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
851 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
852 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
853 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
854 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
855 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
856
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
857 PARSEFUNC(pseudo_parse_ifdef)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
858 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
859 char *sym;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
860 int i;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
861 struct symtabe *s;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
862
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
863 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
864
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
865 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
866 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
867 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
868 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
869 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
870 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
871
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
872 for (i = 0; (*p)[i] && !isspace((*p)[i]); i++)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
873 /* do nothing */ ;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
874
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
875 sym = lw_strndup(*p, i);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
876
363
d96c30e60ddf Added pass2 and various supporting logic including symbol lookups
lost@starbug
parents: 356
diff changeset
877 s = lookup_symbol(as, l, sym);
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
878
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
879 lw_free(sym);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
880
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
881 if (!s)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
882 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
883 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
884 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
885 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
886 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
887
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
888 PARSEFUNC(pseudo_parse_ifndef)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
889 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
890 char *sym;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
891 int i;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
892 struct symtabe *s;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
893
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
894 l -> len = 0;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
895
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
896 if (as -> skipcond && !(as -> skipmacro))
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
897 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
898 as -> skipcount++;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
899 skip_operand(p);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
900 return;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
901 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
902
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
903 for (i = 0; (*p)[i] && !isspace((*p)[i]); i++)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
904 /* do nothing */ ;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
905
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
906 sym = lw_strndup(*p, i);
386
af5f2c51db76 Bugfixing on includes
lost@starbug
parents: 382
diff changeset
907 (*p) += i;
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
908
363
d96c30e60ddf Added pass2 and various supporting logic including symbol lookups
lost@starbug
parents: 356
diff changeset
909 s = lookup_symbol(as, l, sym);
351
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
910
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
911 lw_free(sym);
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
912
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
913 if (s)
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
914 {
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
915 as -> skipcond = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
916 as -> skipcount = 1;
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
917 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
918 }
4dba8c7e242c conditional pseudo ops added
lost@starbug
parents: 350
diff changeset
919
354
60568b123281 Added os9 opcodes and ERROR
lost@starbug
parents: 351
diff changeset
920 PARSEFUNC(pseudo_parse_error)
60568b123281 Added os9 opcodes and ERROR
lost@starbug
parents: 351
diff changeset
921 {
60568b123281 Added os9 opcodes and ERROR
lost@starbug
parents: 351
diff changeset
922 lwasm_register_error(as, l, "User error: %s", *p);
60568b123281 Added os9 opcodes and ERROR
lost@starbug
parents: 351
diff changeset
923 skip_operand(p);
60568b123281 Added os9 opcodes and ERROR
lost@starbug
parents: 351
diff changeset
924 }
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
925
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
926 PARSEFUNC(pseudo_parse_includebin)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
927 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
928 char *fn, *p2;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
929 int delim = 0;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
930 FILE *fp;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
931 long flen;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
932
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
933 if (!**p)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
934 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
935 lwasm_register_error(as, l, "Missing filename");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
936 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
937 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
938
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
939 if (**p == '"' || **p == '\'')
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
940 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
941 delim = **p;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
942 (*p)++;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
943
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
944 for (p2 = *p; *p2 && *p2 != delim; p2++)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
945 /* do nothing */ ;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
946 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
947 else
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
948 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
949 for (p2 = *p; *p2 && !isspace(*p2); p2++)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
950 /* do nothing */ ;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
951 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
952 fn = lw_strndup(*p, p2 - *p);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
953
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
954 if (delim && **p)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
955 (*p)++;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
956
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
957 fp = input_open_standalone(as, fn);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
958 if (!fp)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
959 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
960 lwasm_register_error(as, l, "Cannot open file");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
961 lw_free(fn);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
962 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
963 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
964
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
965 l -> lstr = fn;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
966
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
967 fseek(fp, 0, SEEK_END);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
968 flen = ftell(fp);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
969 fclose(fp);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
970
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
971 l -> len = flen;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
972 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
973
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
974 EMITFUNC(pseudo_emit_includebin)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
975 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
976 FILE *fp;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
977 int c;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
978
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
979 fp = input_open_standalone(as, l -> lstr);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
980 if (!fp)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
981 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
982 lwasm_register_error(as, l, "Cannot open file (emit)!");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
983 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
984 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
985
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
986 for (;;)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
987 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
988 c = fgetc(fp);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
989 if (c == EOF)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
990 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
991 fclose(fp);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
992 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
993 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
994 lwasm_emit(l, c);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
995 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
996 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
997
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
998 PARSEFUNC(pseudo_parse_include)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
999 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1000 char *fn, *p2;
386
af5f2c51db76 Bugfixing on includes
lost@starbug
parents: 382
diff changeset
1001 char *p3;
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1002 int delim = 0;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1003
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1004 if (!**p)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1005 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1006 lwasm_register_error(as, l, "Missing filename");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1007 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1008 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1009
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1010 if (**p == '"' || **p == '\'')
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1011 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1012 delim = **p;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1013 (*p)++;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1014
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1015 for (p2 = *p; *p2 && *p2 != delim; p2++)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1016 /* do nothing */ ;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1017 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1018 else
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1019 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1020 for (p2 = *p; *p2 && !isspace(*p2); p2++)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1021 /* do nothing */ ;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1022 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1023 fn = lw_strndup(*p, p2 - *p);
386
af5f2c51db76 Bugfixing on includes
lost@starbug
parents: 382
diff changeset
1024 (*p) = p2;
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1025 if (delim && **p)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1026 (*p)++;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1027
386
af5f2c51db76 Bugfixing on includes
lost@starbug
parents: 382
diff changeset
1028 0 == asprintf(&p3, "include:%s", fn);
af5f2c51db76 Bugfixing on includes
lost@starbug
parents: 382
diff changeset
1029 input_open(as, p3);
af5f2c51db76 Bugfixing on includes
lost@starbug
parents: 382
diff changeset
1030 lw_free(p3);
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1031
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1032 l -> len = 0;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1033 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1034
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1035 PARSEFUNC(pseudo_parse_align)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1036 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1037 lw_expr_t e;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1038 if (!**p)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1039 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1040 lwasm_register_error(as, l, "Bad operand");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1041 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1042 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1043
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1044 e = lwasm_parse_expr(as, p);
382
eacdae8a1575 Various bugfixes
lost@starbug
parents: 370
diff changeset
1045
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1046 if (!e)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1047 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1048 lwasm_register_error(as, l, "Bad operand");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1049 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1050 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1051
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1052 lwasm_save_expr(l, 0, e);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1053
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1054 if (**p == ',')
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1055 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1056 e = lwasm_parse_expr(as, p);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1057 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1058 else
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1059 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1060 e = lw_expr_build(lw_expr_type_int, 0);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1061 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1062 if (!e)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1063 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1064 lwasm_register_error(as, l, "Bad padding");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1065 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1066 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1067
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1068 lwasm_save_expr(l, 1, e);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1069 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1070
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1071 RESOLVEFUNC(pseudo_resolve_align)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1072 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1073 lw_expr_t e;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1074 int align;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1075
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1076 e = lwasm_fetch_expr(l, 0);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1077
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1078 if (lw_expr_istype(e, lw_expr_type_int))
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1079 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1080 align = lw_expr_intval(e);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1081 if (align < 1)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1082 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1083 lwasm_register_error(as, l, "Invalid alignment");
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1084 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1085 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1086 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1087
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1088 if (lw_expr_istype(l -> addr, lw_expr_type_int))
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1089 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1090 int a;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1091 a = lw_expr_intval(l -> addr);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1092 if (a % align == 0)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1093 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1094 l -> len = 0;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1095 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1096 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1097 l -> len = align - (a % align);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1098 return;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1099 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1100 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1101
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1102 EMITFUNC(pseudo_emit_align)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1103 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1104 lw_expr_t e;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1105 int i;
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1106
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1107 e = lwasm_fetch_expr(l, 1);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1108 for (i = 0; i < l -> len; i++)
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1109 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1110 lwasm_emitexpr(l, e, 1);
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1111 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 354
diff changeset
1112 }