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)