Mercurial > hg-old > index.cgi
annotate src/insn_gen.c @ 76:2fe5fd7d65a3
Checkpointing object target implementation
author | lost |
---|---|
date | Thu, 08 Jan 2009 02:57:24 +0000 |
parents | 31d8e85706e7 |
children | a338d496350e |
rev | line source |
---|---|
0 | 1 /* |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
2 insn_gen.c, Copyright © 2009 William Astle |
4
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
3 |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
4 This file is part of LWASM. |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
5 |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
6 LWASM is free software: you can redistribute it and/or modify it under the |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
7 terms of the GNU General Public License as published by the Free Software |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
8 Foundation, either version 3 of the License, or (at your option) any later |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
9 version. |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
10 |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
11 This program is distributed in the hope that it will be useful, but WITHOUT |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
14 more details. |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
15 |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
16 You should have received a copy of the GNU General Public License along with |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
17 this program. If not, see <http://www.gnu.org/licenses/>. |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
18 |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
19 Contains code for parsing general addressing modes (IMM+DIR+EXT+IND) |
34568fab6058
Fixed package to include all required files; also added copyright preamble to all source files
lost
parents:
0
diff
changeset
|
20 */ |
0 | 21 |
22 #include <ctype.h> | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
23 #include <stdlib.h> |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
24 |
0 | 25 #include "lwasm.h" |
26 #include "instab.h" | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
27 #include "expr.h" |
0 | 28 |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
29 extern void insn_indexed_aux(asmstate_t *as, lwasm_line_t *l, const char **p, int *b1, int *b2, int *b3); |
0 | 30 |
34 | 31 // "extra" is required due to the way OIM, EIM, TIM, and AIM work |
32 void insn_gen_aux(asmstate_t *as, lwasm_line_t *l, char **optr, int opnum, int extra) | |
0 | 33 { |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
34 int b1 = -1, b2 = -1, b3 = -1; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
35 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
36 const char *optr2; |
0 | 37 int v1, tv, rval; |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
38 lwasm_expr_stack_t *s; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
39 int f8 = 0; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
40 int f16 = 0; |
65
31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents:
62
diff
changeset
|
41 int isdp = 0; |
31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents:
62
diff
changeset
|
42 |
0 | 43 optr2 = *optr; |
44 while (*optr2 && !isspace(*optr2) && *optr2 != ',') optr2++ | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
45 /* do nothing */ ; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
46 |
0 | 47 if (*optr2 != ',' && **optr != '[') |
48 { | |
49 // not indexed | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
50 if (l -> fsize == 1) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
51 f8 = 1; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
52 else if (l -> fsize == 2) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
53 f16 = 1; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
54 |
0 | 55 if (**optr == '<') |
56 { | |
57 (*optr)++; | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
58 f8 = 1; |
0 | 59 } |
60 else if (**optr == '>') | |
61 { | |
62 (*optr)++; | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
63 f16 = 1; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
64 } |
37
538e15927776
Added symbol handling to expression subsystem; adpated instruction handlers to the new scheme; misc fixes
lost
parents:
34
diff
changeset
|
65 s = lwasm_evaluate_expr(as, l, *optr, NULL); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
66 if (!s) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
67 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
68 register_error(as, l, 1, "Bad expression"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
69 return; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
70 } |
65
31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents:
62
diff
changeset
|
71 if (!lwasm_expr_is_constant(s) && as -> passnum == 1) |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
72 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
73 f16 = 1; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
74 l -> fsize = 2; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
75 register_error(as, l, 2, "Incomplete reference"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
76 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
77 v1 = lwasm_expr_get_value(s); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
78 lwasm_expr_stack_free(s); |
65
31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents:
62
diff
changeset
|
79 |
31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents:
62
diff
changeset
|
80 if (((v1 >> 8) & 0xff) == (as -> dpval & 0xff)) |
31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents:
62
diff
changeset
|
81 isdp = 1; |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
82 |
65
31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents:
62
diff
changeset
|
83 if (f8 || (!f16 && isdp)) |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
84 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
85 v1 = v1 & 0xffff; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
86 tv = v1 - ((as -> dpval) << 8); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
87 if (tv < 0 || tv > 0xff) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
88 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
89 register_error(as, l, 2, "Byte overflow"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
90 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
91 v1 = v1 & 0xff; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
92 lwasm_emitop(as, l, instab[opnum].ops[0]); |
34 | 93 if (extra != -1) |
94 lwasm_emit(as, l, extra); | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
95 lwasm_emit(as, l, v1 & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
96 return; |
0 | 97 } |
98 else | |
99 { | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
100 // everything else is 16 bit.... |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
101 lwasm_emitop(as, l, instab[opnum].ops[2]); |
34 | 102 if (extra != -1) |
103 lwasm_emit(as, l, extra); | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
104 lwasm_emit(as, l, v1 >> 8); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
105 lwasm_emit(as, l, v1 & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
106 return; |
0 | 107 } |
108 } | |
109 | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
110 lwasm_emitop(as, l, instab[opnum].ops[1]); |
34 | 111 if (extra != -1) |
112 lwasm_emit(as, l, extra); | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
113 insn_indexed_aux(as, l, (const char **)optr, &b1, &b2, &b3); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
114 if (b1 != -1) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
115 lwasm_emit(as, l, b1); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
116 if (b2 != -1) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
117 lwasm_emit(as, l, b2); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
118 if (b3 != -1) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
119 lwasm_emit(as, l, b3); |
0 | 120 return; |
121 } | |
122 | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
123 // the various insn_gen? functions have an immediate mode of ? bits |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
124 OPFUNC(insn_gen0) |
0 | 125 { |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
126 if (**p == '#') |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
127 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
128 register_error(as, l, 1, "Immediate mode not allowed"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
129 return; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
130 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
131 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
132 // handle non-immediate |
34 | 133 insn_gen_aux(as, l, p, opnum, -1); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
134 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
135 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
136 OPFUNC(insn_gen8) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
137 { |
0 | 138 int rval; |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
139 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
140 if (**p == '#') |
0 | 141 { |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
142 lwasm_emitop(as, l, instab[opnum].ops[3]); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
143 (*p)++; |
62 | 144 if (lwasm_expr_result(as, l, p, EXPR_PASS2CONST | EXPR_BYTE, &rval) < 0) |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
145 rval = 0; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
146 lwasm_emit(as, l, rval & 0xff); |
0 | 147 return; |
148 } | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
149 |
34 | 150 insn_gen_aux(as, l, p, opnum, -1); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
151 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
152 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
153 OPFUNC(insn_gen16) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
154 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
155 lwasm_expr_stack_t *s; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
156 int rval; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
157 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
158 if (**p == '#') |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
159 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
160 lwasm_emitop(as, l, instab[opnum].ops[3]); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
161 (*p)++; |
37
538e15927776
Added symbol handling to expression subsystem; adpated instruction handlers to the new scheme; misc fixes
lost
parents:
34
diff
changeset
|
162 s = lwasm_evaluate_expr(as, l, *p, NULL); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
163 if (!s) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
164 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
165 register_error(as, l, 1, "Bad expression"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
166 rval = 0; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
167 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
168 else |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
169 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
170 if (!lwasm_expr_is_constant(s)) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
171 register_error(as, l, 2, "Incomplete reference"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
172 rval = lwasm_expr_get_value(s); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
173 lwasm_expr_stack_free(s); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
174 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
175 lwasm_emit(as, l, (rval >> 8) & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
176 lwasm_emit(as, l, rval & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
177 return; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
178 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
179 |
34 | 180 insn_gen_aux(as, l, p, opnum, -1); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
181 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
182 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
183 OPFUNC(insn_gen32) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
184 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
185 lwasm_expr_stack_t *s; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
186 int rval; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
187 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
188 if (**p == '#') |
0 | 189 { |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
190 lwasm_emitop(as, l, instab[opnum].ops[3]); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
191 (*p)++; |
37
538e15927776
Added symbol handling to expression subsystem; adpated instruction handlers to the new scheme; misc fixes
lost
parents:
34
diff
changeset
|
192 s = lwasm_evaluate_expr(as, l, *p, NULL); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
193 if (!s) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
194 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
195 register_error(as, l, 1, "Bad expression"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
196 rval = 0; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
197 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
198 else |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
199 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
200 if (!lwasm_expr_is_constant(s)) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
201 register_error(as, l, 2, "Incomplete reference"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
202 rval = lwasm_expr_get_value(s); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
203 lwasm_expr_stack_free(s); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
204 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
205 lwasm_emit(as, l, (rval >> 24) & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
206 lwasm_emit(as, l, (rval >> 16) & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
207 lwasm_emit(as, l, (rval >> 8) & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
208 lwasm_emit(as, l, rval & 0xff); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
209 return; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
210 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
211 |
34 | 212 insn_gen_aux(as, l, p, opnum, -1); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
213 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
214 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
215 OPFUNC(insn_imm8) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
216 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
217 lwasm_expr_stack_t *s; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
218 int rval; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
219 |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
220 if (**p == '#') |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
221 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
222 lwasm_emitop(as, l, instab[opnum].ops[0]); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
223 (*p)++; |
37
538e15927776
Added symbol handling to expression subsystem; adpated instruction handlers to the new scheme; misc fixes
lost
parents:
34
diff
changeset
|
224 s = lwasm_evaluate_expr(as, l, *p, NULL); |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
225 if (!s) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
226 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
227 register_error(as, l, 1, "Bad expression"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
228 rval = 0; |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
229 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
230 else |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
231 { |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
232 if (!lwasm_expr_is_constant(s)) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
233 register_error(as, l, 2, "Incomplete reference"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
234 rval = lwasm_expr_get_value(s); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
235 lwasm_expr_stack_free(s); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
236 } |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
237 if (rval < -128 || rval > 255) |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
238 register_error(as, l, 2, "Byte overflow"); |
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
239 lwasm_emit(as, l, rval & 0xff); |
0 | 240 return; |
241 } | |
242 | |
33
74a3fef7c8d0
Added general addressing modes (immediate, base page, extended, indexed)
lost
parents:
4
diff
changeset
|
243 register_error(as, l, 1, "Bad operand"); |
0 | 244 } |