comparison lwasm/pass1.c @ 383:848d3cca8078

Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
author lost@starbug
date Sat, 15 May 2010 20:01:58 -0600
parents eacdae8a1575
children cf8c92d70eb1
comparison
equal deleted inserted replaced
382:eacdae8a1575 383:848d3cca8078
51 line_t *cl; 51 line_t *cl;
52 char *p1; 52 char *p1;
53 int stspace; 53 int stspace;
54 char *tok, *sym; 54 char *tok, *sym;
55 int opnum; 55 int opnum;
56 56 int lc = 1;
57 for (;;) 57 for (;;)
58 { 58 {
59 sym = NULL; 59 sym = NULL;
60 line = input_readline(as); 60 line = input_readline(as);
61 if (!line) 61 if (!line)
72 if (!strcmp(line + 2, "SETCONTEXT")) 72 if (!strcmp(line + 2, "SETCONTEXT"))
73 { 73 {
74 as -> context = strtol(p1, NULL, 10); 74 as -> context = strtol(p1, NULL, 10);
75 } 75 }
76 lw_free(line); 76 lw_free(line);
77 lc = 1;
77 continue; 78 continue;
78 } 79 }
79 debug_message(as, 75, "Read line: %s", line); 80 debug_message(as, 75, "Read line: %s", line);
80 81
81 cl = lw_alloc(sizeof(line_t)); 82 cl = lw_alloc(sizeof(line_t));
82 memset(cl, 0, sizeof(line_t)); 83 memset(cl, 0, sizeof(line_t));
83 cl -> outputl = -1; 84 cl -> outputl = -1;
85 cl -> linespec = lw_strdup(input_curspec(as));
84 cl -> prev = as -> line_tail; 86 cl -> prev = as -> line_tail;
85 cl -> insn = -1; 87 cl -> insn = -1;
86 cl -> as = as; 88 cl -> as = as;
87 cl -> inmod = as -> inmod; 89 cl -> inmod = as -> inmod;
88 cl -> csect = as -> csect; 90 cl -> csect = as -> csect;
96 } 98 }
97 else 99 else
98 { 100 {
99 lw_expr_t te; 101 lw_expr_t te;
100 102
103 cl -> lineno = as -> line_tail -> lineno + 1;
101 as -> line_tail -> next = cl; 104 as -> line_tail -> next = cl;
102 105
103 // set the line address 106 // set the line address
104 te = lw_expr_build(lw_expr_type_special, lwasm_expr_linelen, cl -> prev); 107 te = lw_expr_build(lw_expr_type_special, lwasm_expr_linelen, cl -> prev);
105 cl -> addr = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, cl -> prev -> addr, te); 108 cl -> addr = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, cl -> prev -> addr, te);
106 lw_expr_destroy(te); 109 lw_expr_destroy(te);
107 lw_expr_simplify(cl -> addr, as); 110 lw_expr_simplify(cl -> addr, as);
108 111
109 // carry DP value forward 112 // carry DP value forward
110 cl -> dpval = cl -> prev -> dpval; 113 cl -> dpval = cl -> prev -> dpval;
114
115 }
116 if (!lc && strcmp(cl -> linespec, cl -> prev -> linespec))
117 lc = 1;
118 if (lc)
119 {
120 cl -> lineno = 1;
121 lc = 0;
111 } 122 }
112 as -> line_tail = cl; 123 as -> line_tail = cl;
113 as -> cl = cl; 124 as -> cl = cl;
114 // blank lines don't count for anything 125 // blank lines don't count for anything
115 // except a local symbol context break 126 // except a local symbol context break