Mercurial > hg-old > index.cgi
diff src/pseudo.c @ 50:e672232caffe
Added rmb pseudo op
author | lost |
---|---|
date | Sun, 04 Jan 2009 07:56:55 +0000 |
parents | 21ae0fab469b |
children | b9856da2674a |
line wrap: on
line diff
--- a/src/pseudo.c Sun Jan 04 07:37:19 2009 +0000 +++ b/src/pseudo.c Sun Jan 04 07:56:55 2009 +0000 @@ -22,6 +22,7 @@ */ #include <stdlib.h> +#include <string.h> #include "lwasm.h" #include "instab.h" #include "expr.h" @@ -45,9 +46,11 @@ if (!lwasm_expr_is_constant(s)) { register_error(as, l, 1, "Illegal incomplete reference (pass 1)"); + lwasm_expr_stack_free(s); return; } rval = lwasm_expr_get_value(s) & 0xffff; + lwasm_expr_stack_free(s); l -> codeaddr = rval; l -> addrset = 1; as -> addr = rval; @@ -77,26 +80,30 @@ } } - -void pseudo_rmb(asmstate_t *as, sourceline_t *cl, char **optr) +*/ +OPFUNC(pseudo_rmb) { - int rval, v1; + int rval; + lwasm_expr_stack_t *s; - rval = eval_expr(as, cl, optr, &v1); - if (rval < 0) + s = lwasm_evaluate_expr(as, l, *p, NULL); + if (!s) { - errorp1(ERR_FORWARD); + register_error(as, l, 1, "Bad expression"); return; } - if (v1 < 0) + if (!lwasm_expr_is_constant(s)) { - errorp1(ERR_BADOPER); + register_error(as, l, 1, "Illegal incomplete reference (pass 1)"); + lwasm_expr_stack_free(s); return; } - cl -> len = v1; - cl -> nocode = 1; + rval = lwasm_expr_get_value(s); + lwasm_expr_stack_free(s); + l -> nocodelen = rval; + as -> addr += rval; } - +/* void pseudo_rmd(asmstate_t *as, sourceline_t *cl, char **optr) { int rval, v1; @@ -244,37 +251,40 @@ cn--; } } - -void pseudo_equ(asmstate_t *as, sourceline_t *cl, char **optr) +*/ +OPFUNC(pseudo_equ) { - int rval, v1; + lwasm_expr_stack_t *s; + int rval; - if (cl -> hassym == 0) + if (l -> sym == NULL) { - errorp1(ERR_NOSYM); + register_error(as, l, 1, "No symbol specified"); return; } - rval = eval_expr(as, cl, optr, &v1); - // eval_expr returns -1 if there was a forward ref - // or -2 if the expr was invalid - if (rval == -2) + + s = lwasm_evaluate_expr(as, l, *p, NULL); + + if (!s) { - // carp - errorp1(ERR_FORWARD); + register_error(as, l, 1, "Bad expression"); + rval = 0; } - if (rval < 0) + else { - // remove symbol ref - cl -> hassym = 0; - // mark as a "comment" so it isn't processed next time - cl -> opcode = -1; - return; + if (!lwasm_expr_is_constant(s)) + register_error(as, l, 1, "Invalid incomplete reference (pass 1)"); + rval = lwasm_expr_get_value(s); + lwasm_expr_stack_free(s); } - cl -> code_symloc = v1; - cl -> isequ = 1; - cl -> symaddr = v1 & 0xFFFF; + l -> symaddr = rval & 0xFFFF; + l -> addrset = 2; + if (strchr(l -> sym, '@') || strchr(l -> sym, '?')) + lwasm_set_symbol(as, l -> sym, as -> context, l -> symaddr); + else + lwasm_set_symbol(as, l -> sym, -1, l -> symaddr); } - +/* void pseudo_set(asmstate_t *as, sourceline_t *cl, char **optr) { int rval, v1;