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)