Mercurial > hg-old > index.cgi
comparison lwasm/pseudo.c @ 347:1649bc7bda5a
Some data oriented pseudo ops added
author | lost@starbug |
---|---|
date | Sat, 27 Mar 2010 20:16:24 -0600 |
parents | |
children | 11a95c6414b4 |
comparison
equal
deleted
inserted
replaced
346:a82c55070624 | 347:1649bc7bda5a |
---|---|
1 /* | |
2 pseudo.c | |
3 Copyright © 2010 William Astle | |
4 | |
5 This file is part of LWASM. | |
6 | |
7 LWASM is free software: you can redistribute it and/or modify it under the | |
8 terms of the GNU General Public License as published by the Free Software | |
9 Foundation, either version 3 of the License, or (at your option) any later | |
10 version. | |
11 | |
12 This program is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
15 more details. | |
16 | |
17 You should have received a copy of the GNU General Public License along with | |
18 this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 */ | |
21 | |
22 #include <config.h> | |
23 | |
24 #include "lwasm.h" | |
25 #include "instab.h" | |
26 | |
27 // for no-op pseudos | |
28 PARSEFUNC(pseudo_parse_noop) | |
29 { | |
30 } | |
31 | |
32 RESOLVEFUNC(pseudo_resolve_noop) | |
33 { | |
34 } | |
35 | |
36 // for "end" | |
37 PARSEFUNC(pseudo_parse_end) | |
38 { | |
39 lw_expr_t addr; | |
40 | |
41 as -> endseen = 1; | |
42 | |
43 if (as -> output_format != OUTPUT_DECB) | |
44 { | |
45 skip_operand(p); | |
46 return; | |
47 } | |
48 | |
49 addr = lwasm_parse_expr(as, p); | |
50 if (!addr) | |
51 { | |
52 lwasm_register_error(as, l, "Bad expression"); | |
53 addr = lw_expr_build(lw_expr_type_int, 0); | |
54 } | |
55 lwasm_save_expr(l, 0, addr); | |
56 } | |
57 | |
58 RESOLVEFUNC(pseudo_resolve_end) | |
59 { | |
60 lw_expr_t addr; | |
61 | |
62 addr = lwasm_fetch_expr(l, 0); | |
63 | |
64 if (addr) | |
65 { | |
66 if (!lw_expr_istype(addr, lw_expr_type_int)) | |
67 lwasm_register_error(as, l, "Exec address not constant!"); | |
68 else | |
69 as -> execaddr = lw_expr_intval(addr); | |
70 } | |
71 as -> endseen = 1; | |
72 } | |
73 | |
74 PARSEFUNC(pseudo_parse_fcb) | |
75 { | |
76 int i = 0; | |
77 lw_expr_t e; | |
78 | |
79 for (;;) | |
80 { | |
81 e = lwasm_parse_expr(as, p); | |
82 if (!e) | |
83 { | |
84 lwasm_register_error(as, l, "Bad expression (#%s)", i); | |
85 break; | |
86 } | |
87 lwasm_save_expr(l, i, e); | |
88 i++; | |
89 } | |
90 | |
91 l -> len = i; | |
92 } | |
93 | |
94 RESOLVEFUNC(pseudo_resolve_fcb) | |
95 { | |
96 int i; | |
97 lw_expr_t e; | |
98 int v; | |
99 | |
100 for (i = 0; i < l -> len; i++) | |
101 { | |
102 e = lwasm_fetch_expr(l, i); | |
103 lwasm_emitexpr(l, e, 1); | |
104 } | |
105 } | |
106 | |
107 PARSEFUNC(pseudo_parse_fdb) | |
108 { | |
109 int i = 0; | |
110 lw_expr_t e; | |
111 | |
112 for (;;) | |
113 { | |
114 e = lwasm_parse_expr(as, p); | |
115 if (!e) | |
116 { | |
117 lwasm_register_error(as, l, "Bad expression (#%s)", i); | |
118 break; | |
119 } | |
120 lwasm_save_expr(l, i, e); | |
121 i++; | |
122 } | |
123 | |
124 l -> len = i * 2; | |
125 } | |
126 | |
127 RESOLVEFUNC(pseudo_resolve_fdb) | |
128 { | |
129 int i; | |
130 lw_expr_t e; | |
131 int v; | |
132 | |
133 for (i = 0; i < (l -> len)/2; i++) | |
134 { | |
135 e = lwasm_fetch_expr(l, i); | |
136 lwasm_emitexpr(l, e, 2); | |
137 } | |
138 } | |
139 | |
140 PARSEFUNC(pseudo_parse_fqb) | |
141 { | |
142 int i = 0; | |
143 lw_expr_t e; | |
144 | |
145 for (;;) | |
146 { | |
147 e = lwasm_parse_expr(as, p); | |
148 if (!e) | |
149 { | |
150 lwasm_register_error(as, l, "Bad expression (#%s)", i); | |
151 break; | |
152 } | |
153 lwasm_save_expr(l, i, e); | |
154 i++; | |
155 } | |
156 | |
157 l -> len = i * 4; | |
158 } | |
159 | |
160 RESOLVEFUNC(pseudo_resolve_fqb) | |
161 { | |
162 int i; | |
163 lw_expr_t e; | |
164 int v; | |
165 | |
166 for (i = 0; i < (l -> len)/4; i++) | |
167 { | |
168 e = lwasm_fetch_expr(l, i); | |
169 lwasm_emitexpr(l, e, 4); | |
170 } | |
171 } |