diff lwasm/pass1.c @ 142:697bc543368c

Implement distinction between . and * for OS9 modules
author lost@l-w.ca
date Fri, 19 Aug 2011 23:55:40 -0600
parents b3557f8325f7
children 9cf1796259b2
line wrap: on
line diff
--- a/lwasm/pass1.c	Fri Aug 19 20:36:43 2011 -0600
+++ b/lwasm/pass1.c	Fri Aug 19 23:55:40 2011 -0600
@@ -118,11 +118,13 @@
 		cl -> dsize = 0;
 		cl -> dptr = NULL;
 		cl -> isbrpt = 0;
+		cl -> dlen = 0;
 		as -> cl = cl;
 		if (!as -> line_tail)
 		{
 			as -> line_head = cl;
 			cl -> addr = lw_expr_build(lw_expr_type_int, 0);
+			cl -> daddr = lw_expr_build(lw_expr_type_int, 0);
 		}
 		else
 		{
@@ -138,6 +140,12 @@
 			lwasm_reduce_expr(as, cl -> addr);
 //			lw_expr_simplify(cl -> addr, as);
 
+			// set the data address if relevant
+			te = lw_expr_build(lw_expr_type_special, lwasm_expr_linedlen, cl -> prev);
+			cl -> daddr = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, cl -> prev -> daddr, te);
+			lw_expr_destroy(te);
+			lwasm_reduce_expr(as, cl -> daddr);
+
 			// carry DP value forward
 			cl -> dpval = cl -> prev -> dpval;
 			
@@ -321,7 +329,15 @@
 
 						cl -> len = -1;
 						// call parse function
+					debug_message(as, 100, "len = %d, dlen = %d", cl -> len, cl -> dlen);
 						(instab[opnum].parse)(as, cl, &p1);
+						if ((cl -> inmod == 0) && cl -> len >= 0 && cl -> dlen >= 0)
+						{
+							if (cl -> len == 0)
+								cl -> len = cl -> dlen;
+							else
+								cl -> dlen = cl -> len;
+						}
 					
 						if (*p1 && !isspace(*p1))
 						{
@@ -343,6 +359,13 @@
 						if (cl -> insn >= 0 && instab[cl -> insn].resolve)
 						{
 							(instab[cl -> insn].resolve)(as, cl, 0);
+							if ((cl -> inmod == 0) && cl -> len >= 0 && cl -> dlen >= 0)
+							{
+								if (cl -> len == 0)
+									cl -> len = cl -> dlen;
+								else
+									cl -> dlen = cl -> len;
+							}
 						}
 
 					}
@@ -362,10 +385,21 @@
 				debug_message(as, 50, "Register symbol %s: %s", cl -> sym, lw_expr_print(cl -> addr));
 	
 				// register symbol at line address
-				if (!register_symbol(as, cl, cl -> sym, cl -> addr, symbol_flag_none))
+				if (instab[cl -> insn].flags & lwasm_insn_setdata)
 				{
-					// symbol error
-					// lwasm_register_error(as, cl, "Bad symbol '%s'", cl -> sym);
+					if (!register_symbol(as, cl, cl -> sym, cl -> daddr, symbol_flag_none))
+					{
+						// symbol error
+						// lwasm_register_error(as, cl, "Bad symbol '%s'", cl -> sym);
+					}
+				}
+				else
+				{
+					if (!register_symbol(as, cl, cl -> sym, cl -> addr, symbol_flag_none))
+					{
+						// symbol error
+						// lwasm_register_error(as, cl, "Bad symbol '%s'", cl -> sym);
+					}
 				}
 			}
 			debug_message(as, 40, "Line address: %s", lw_expr_print(cl -> addr));