Mercurial > hg-old > index.cgi
diff 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 |
line wrap: on
line diff
--- a/lwasm/pseudo.c Wed Jul 14 20:17:57 2010 -0600 +++ b/lwasm/pseudo.c Wed Jul 14 22:33:55 2010 -0600 @@ -29,6 +29,8 @@ #include "lw_string.h" +extern void register_struct_entry(asmstate_t *as, line_t *l, int size, structtab_t *ss); + // for "end" PARSEFUNC(pseudo_parse_end) { @@ -302,6 +304,22 @@ { lwasm_register_error(as, l, "Bad expression"); } + + if (as -> instruct) + { + lwasm_reduce_expr(as, expr); + if (!lw_expr_istype(expr, lw_expr_type_int)) + { + lwasm_register_error(as, l, "Expression must be constant at parse time"); + } + else + { + int e; + e = lw_expr_intval(expr); + register_struct_entry(as, l, e, NULL); + l -> len = 0; + } + } lwasm_save_expr(l, 0, expr); } @@ -337,6 +355,21 @@ lwasm_register_error(as, l, "Bad expression"); } + if (as -> instruct) + { + lwasm_reduce_expr(as, expr); + if (!lw_expr_istype(expr, lw_expr_type_int)) + { + lwasm_register_error(as, l, "Expression must be constant at parse time"); + } + else + { + int e; + e = lw_expr_intval(expr) * 2; + register_struct_entry(as, l, e, NULL); + l -> len = 0; + } + } lwasm_save_expr(l, 0, expr); } @@ -371,6 +404,21 @@ { lwasm_register_error(as, l, "Bad expression"); } + if (as -> instruct) + { + lwasm_reduce_expr(as, expr); + if (!lw_expr_istype(expr, lw_expr_type_int)) + { + lwasm_register_error(as, l, "Expression must be constant at parse time"); + } + else + { + int e; + e = lw_expr_intval(expr) * 4; + register_struct_entry(as, l, e, NULL); + l -> len = 0; + } + } lwasm_save_expr(l, 0, expr); } @@ -563,6 +611,7 @@ register_symbol(as, l, l -> sym, e, symbol_flag_none); l -> symset = 1; + l -> dptr = lookup_symbol(as, l, l -> sym); } PARSEFUNC(pseudo_parse_set) @@ -586,6 +635,7 @@ register_symbol(as, l, l -> sym, e, symbol_flag_set); l -> symset = 1; + l -> dptr = lookup_symbol(as, l, l -> sym); } PARSEFUNC(pseudo_parse_setdp) @@ -613,6 +663,8 @@ return; } l -> dpval = lw_expr_intval(e) & 0xff; + l -> dshow = l -> dpval; + l -> dsize = 1; } PARSEFUNC(pseudo_parse_ifp1)