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 }