Mercurial > hg-old > index.cgi
comparison src/pseudo.c @ 50:e672232caffe
Added rmb pseudo op
author | lost |
---|---|
date | Sun, 04 Jan 2009 07:56:55 +0000 |
parents | 21ae0fab469b |
children | b9856da2674a |
comparison
equal
deleted
inserted
replaced
49:21ae0fab469b | 50:e672232caffe |
---|---|
20 | 20 |
21 This file implements the various pseudo operations. | 21 This file implements the various pseudo operations. |
22 */ | 22 */ |
23 | 23 |
24 #include <stdlib.h> | 24 #include <stdlib.h> |
25 #include <string.h> | |
25 #include "lwasm.h" | 26 #include "lwasm.h" |
26 #include "instab.h" | 27 #include "instab.h" |
27 #include "expr.h" | 28 #include "expr.h" |
28 | 29 |
29 | 30 |
43 return; | 44 return; |
44 } | 45 } |
45 if (!lwasm_expr_is_constant(s)) | 46 if (!lwasm_expr_is_constant(s)) |
46 { | 47 { |
47 register_error(as, l, 1, "Illegal incomplete reference (pass 1)"); | 48 register_error(as, l, 1, "Illegal incomplete reference (pass 1)"); |
49 lwasm_expr_stack_free(s); | |
48 return; | 50 return; |
49 } | 51 } |
50 rval = lwasm_expr_get_value(s) & 0xffff; | 52 rval = lwasm_expr_get_value(s) & 0xffff; |
53 lwasm_expr_stack_free(s); | |
51 l -> codeaddr = rval; | 54 l -> codeaddr = rval; |
52 l -> addrset = 1; | 55 l -> addrset = 1; |
53 as -> addr = rval; | 56 as -> addr = rval; |
54 } | 57 } |
55 | 58 |
75 fn[v1] = '\0'; | 78 fn[v1] = '\0'; |
76 lwasm_read_file(as, fn); | 79 lwasm_read_file(as, fn); |
77 } | 80 } |
78 } | 81 } |
79 | 82 |
80 | 83 */ |
81 void pseudo_rmb(asmstate_t *as, sourceline_t *cl, char **optr) | 84 OPFUNC(pseudo_rmb) |
82 { | 85 { |
83 int rval, v1; | 86 int rval; |
84 | 87 lwasm_expr_stack_t *s; |
85 rval = eval_expr(as, cl, optr, &v1); | 88 |
86 if (rval < 0) | 89 s = lwasm_evaluate_expr(as, l, *p, NULL); |
87 { | 90 if (!s) |
88 errorp1(ERR_FORWARD); | 91 { |
89 return; | 92 register_error(as, l, 1, "Bad expression"); |
90 } | 93 return; |
91 if (v1 < 0) | 94 } |
92 { | 95 if (!lwasm_expr_is_constant(s)) |
93 errorp1(ERR_BADOPER); | 96 { |
94 return; | 97 register_error(as, l, 1, "Illegal incomplete reference (pass 1)"); |
95 } | 98 lwasm_expr_stack_free(s); |
96 cl -> len = v1; | 99 return; |
97 cl -> nocode = 1; | 100 } |
98 } | 101 rval = lwasm_expr_get_value(s); |
99 | 102 lwasm_expr_stack_free(s); |
103 l -> nocodelen = rval; | |
104 as -> addr += rval; | |
105 } | |
106 /* | |
100 void pseudo_rmd(asmstate_t *as, sourceline_t *cl, char **optr) | 107 void pseudo_rmd(asmstate_t *as, sourceline_t *cl, char **optr) |
101 { | 108 { |
102 int rval, v1; | 109 int rval, v1; |
103 | 110 |
104 rval = eval_expr(as, cl, optr, &v1); | 111 rval = eval_expr(as, cl, optr, &v1); |
242 { | 249 { |
243 emit(0); | 250 emit(0); |
244 cn--; | 251 cn--; |
245 } | 252 } |
246 } | 253 } |
247 | 254 */ |
248 void pseudo_equ(asmstate_t *as, sourceline_t *cl, char **optr) | 255 OPFUNC(pseudo_equ) |
249 { | 256 { |
250 int rval, v1; | 257 lwasm_expr_stack_t *s; |
251 | 258 int rval; |
252 if (cl -> hassym == 0) | 259 |
253 { | 260 if (l -> sym == NULL) |
254 errorp1(ERR_NOSYM); | 261 { |
255 return; | 262 register_error(as, l, 1, "No symbol specified"); |
256 } | 263 return; |
257 rval = eval_expr(as, cl, optr, &v1); | 264 } |
258 // eval_expr returns -1 if there was a forward ref | 265 |
259 // or -2 if the expr was invalid | 266 s = lwasm_evaluate_expr(as, l, *p, NULL); |
260 if (rval == -2) | 267 |
261 { | 268 if (!s) |
262 // carp | 269 { |
263 errorp1(ERR_FORWARD); | 270 register_error(as, l, 1, "Bad expression"); |
264 } | 271 rval = 0; |
265 if (rval < 0) | 272 } |
266 { | 273 else |
267 // remove symbol ref | 274 { |
268 cl -> hassym = 0; | 275 if (!lwasm_expr_is_constant(s)) |
269 // mark as a "comment" so it isn't processed next time | 276 register_error(as, l, 1, "Invalid incomplete reference (pass 1)"); |
270 cl -> opcode = -1; | 277 rval = lwasm_expr_get_value(s); |
271 return; | 278 lwasm_expr_stack_free(s); |
272 } | 279 } |
273 cl -> code_symloc = v1; | 280 l -> symaddr = rval & 0xFFFF; |
274 cl -> isequ = 1; | 281 l -> addrset = 2; |
275 cl -> symaddr = v1 & 0xFFFF; | 282 if (strchr(l -> sym, '@') || strchr(l -> sym, '?')) |
276 } | 283 lwasm_set_symbol(as, l -> sym, as -> context, l -> symaddr); |
277 | 284 else |
285 lwasm_set_symbol(as, l -> sym, -1, l -> symaddr); | |
286 } | |
287 /* | |
278 void pseudo_set(asmstate_t *as, sourceline_t *cl, char **optr) | 288 void pseudo_set(asmstate_t *as, sourceline_t *cl, char **optr) |
279 { | 289 { |
280 int rval, v1; | 290 int rval, v1; |
281 | 291 |
282 if (cl -> hassym == 0) | 292 if (cl -> hassym == 0) |