annotate src/insn_misc.c @ 0:57495da01900

Initial checking of LWASM
author lost
date Fri, 03 Oct 2008 02:44:20 +0000
parents
children 34568fab6058
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
1 /*
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
2 * insn_misc.c
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
3 *
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
4 * parsing miscelaneous addressing modes
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
5 */
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
6
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
7 #include <ctype.h>
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
8 #include <stdio.h>
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
9 #include <string.h>
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
10 #include "lwasm.h"
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
11 #include "instab.h"
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
12
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
13 extern void insn_gen_aux(asmstate_t *as, sourceline_t *cl, char **optr, int *b1, int *b2, int *b3, int *op);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
14
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
15 void insn_inh(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
16 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
17 cl -> addrmode = OPER_INH;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
18 emitop(instab[cl -> opcode].ops[0]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
19 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
20
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
21 void insn_rtor(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
22 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
23 int r0, r1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
24 static const char *regs = "D X Y U S PCW V A B CCDP0 0 E F ";
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
25
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
26 cl -> addrmode = OPER_RTOR;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
27 emitop(instab[cl -> opcode].ops[0]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
28 // register to register (r0,r1)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
29 // registers are in order:
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
30 // D,X,Y,U,S,PC,W,V
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
31 // A,B,CC,DP,0,0,E,F
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
32 r0 = lookupreg(regs, optr);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
33 if (r0 < 0 || *(*optr)++ != ',')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
34 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
35 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
36 r0 = r1 = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
37 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
38 else
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
39 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
40 r1 = lookupreg(regs, optr);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
41 if (r1 < 0)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
42 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
43 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
44 r0=r1=0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
45 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
46 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
47 emit((r0 << 4) | r1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
48 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
49
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
50 void insn_rlist(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
51 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
52 int rb = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
53 int rn;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
54 static const char *regs = "CCA B DPX Y U PCD S ";
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
55
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
56 emitop(instab[cl -> opcode].ops[0]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
57 cl -> addrmode = OPER_RLIST;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
58 while (**optr && !isspace(**optr))
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
59 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
60 rn = lookupreg(regs, optr);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
61 if (rn < 0)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
62 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
63 printf("Bad reg (%s)\n", *optr);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
64 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
65 emit(0);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
66 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
67 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
68 if (**optr && **optr != ',' && !isspace(**optr))
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
69 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
70 printf("Bad char (%c)\n", **optr);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
71 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
72 emit(0);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
73 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
74 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
75 if (**optr == ',')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
76 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
77 if (rn == 8)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
78 rn = 6;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
79 else if (rn == 9)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
80 rn = 0x40;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
81 else
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
82 rn = 1 << rn;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
83 rb |= rn;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
84 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
85 emit(rb);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
86 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
87
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
88 // for aim, oim, eim, tim
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
89 void insn_logicmem(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
90 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
91 int rval, v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
92 int b1, b2, b3, op;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
93
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
94 if (**optr == '#')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
95 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
96
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
97 rval = eval_expr(as, cl, optr, &v1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
98 if (rval < 0)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
99 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
100
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
101 if (v1 < -128 || v1 > 255)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
102 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
103 errorp2(ERR_OVERFLOW);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
104 v1 = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
105 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
106
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
107 if (**optr != ',' && **optr != ';')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
108 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
109 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
110 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
111 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
112
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
113 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
114
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
115 // now we have a general addressing mode - call for it
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
116 insn_gen_aux(as, cl, optr, &b1, &b2, &b3, &op);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
117
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
118 emitop(op);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
119 emit(v1 & 0xff);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
120 if (b1 != -1)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
121 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
122 emit(b1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
123 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
124 if (b2 != -1)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
125 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
126 emit(b2);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
127 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
128 if (b3 != -1)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
129 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
130 emit(b3);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
131 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
132 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
133
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
134 void insn_tfm(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
135 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
136 static const char *reglist = "DXYUS AB 00EF";
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
137 int r0, r1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
138 char *c;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
139 int tfm = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
140
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
141 cl -> addrmode = OPER_TFM;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
142
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
143 c = strchr(reglist, toupper(*(*optr)++));
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
144 if (!c)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
145 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
146 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
147 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
148 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
149 r0 = c - reglist;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
150 if (**optr == '+')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
151 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
152 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
153 tfm = 1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
154 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
155 else if (**optr == '-')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
156 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
157 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
158 tfm = 2;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
159 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
160 if (*(*optr)++ != ',')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
161 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
162 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
163 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
164 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
165 c = strchr(reglist, toupper(*(*optr)++));
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
166 if (!c)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
167 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
168 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
169 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
170 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
171 r1 = c - reglist;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
172
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
173 if (**optr == '+')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
174 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
175 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
176 tfm |= 4;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
177 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
178 else if (**optr == '-')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
179 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
180 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
181 tfm |= 8;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
182 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
183
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
184 if (**optr && !isspace(**optr))
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
185 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
186 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
187 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
188 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
189
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
190 // valid values of tfm here are:
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
191 // 1: r0+,r1 (2)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
192 // 4: r0,r1+ (3)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
193 // 5: r0+,r1+ (0)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
194 // 10: r0-,r1- (1)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
195 switch (tfm)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
196 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
197 case 5: //r0+,r1+
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
198 emitop(instab[cl -> opcode].ops[0]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
199 break;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
200 case 10: //r0-,r1-
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
201 emitop(instab[cl -> opcode].ops[1]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
202 break;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
203 case 1: // r0+,r1
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
204 emitop(instab[cl -> opcode].ops[2]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
205 break;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
206 case 4: // r0,r1+
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
207 emitop(instab[cl -> opcode].ops[3]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
208 break;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
209 default:
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
210 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
211 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
212 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
213 emit((r0 << 4) | r1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
214 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
215
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
216 void insn_bitbit(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
217 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
218 int r;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
219 int rval;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
220 int v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
221 int tv;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
222
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
223 emitop(instab[cl -> opcode].ops[0]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
224
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
225 cl -> addrmode = OPER_BITBIT;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
226
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
227 r = toupper(*(*optr)++);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
228 if (r == 'A')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
229 r = 1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
230 else if (r == 'B')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
231 r = 2;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
232 else if (r == 'C' && toupper(**optr) == 'C')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
233 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
234 r = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
235 (*optr)++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
236 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
237 else
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
238 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
239 errorp1(ERR_BADREG);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
240 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
241 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
242 if (*(*optr)++ != ',')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
243 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
244 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
245 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
246 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
247 rval = eval_expr(as, cl, optr, &v1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
248 if (v1 < 0 || v1 > 7)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
249 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
250 errorp2(ERR_OVERFLOW3);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
251 v1 = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
252 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
253 if (*(*optr)++ != ',')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
254 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
255 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
256 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
257 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
258 r = (r << 6) | (v1 << 3);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
259 rval = eval_expr(as, cl, optr, &v1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
260 if (v1 < 0 || v1 > 7)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
261 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
262 errorp2(ERR_OVERFLOW3);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
263 v1 = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
264 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
265 if (*(*optr)++ != ',')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
266 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
267 errorp1(ERR_BADOPER);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
268 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
269 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
270 r |= v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
271
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
272 emit(r);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
273
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
274 // ignore base page address modifier
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
275 if (**optr == '<')
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
276 optr++;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
277
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
278 rval = eval_expr(as, cl, optr, &v1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
279 v1 &= 0xFFFF;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
280 tv = v1 - ((cl -> dpval) << 8);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
281 if (tv > 0xFF || tv < 0)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
282 errorp2(ERR_OVERFLOW);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
283 emit(tv & 0xff);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
284 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
285
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
286 void insn_rel8(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
287 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
288 int v1, rval;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
289
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
290 emitop(instab[cl -> opcode].ops[0]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
291 cl -> addrmode = OPER_REL8;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
292 rval = eval_expr(as, cl, optr, &v1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
293 v1 &= 0xFFFF;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
294 v1 -= cl -> addr + 2;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
295 if (v1 < -128 || v1 > 127)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
296 errorp2(ERR_OVERFLOW);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
297 v1 &= 0xFFFF;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
298 emit(v1 & 0xff);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
299 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
300
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
301 void insn_rel16(asmstate_t *as, sourceline_t *cl, char **optr)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
302 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
303 int v1, rval;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
304
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
305 emitop(instab[cl -> opcode].ops[0]);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
306 cl -> addrmode = OPER_REL16;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
307 rval = eval_expr(as, cl, optr, &v1);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
308 v1 &= 0xFFFF;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
309 v1 -= cl -> addr + 3;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
310 if (instab[cl -> opcode].ops[0] > 0xff)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
311 v1 -= 1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
312 v1 &= 0xFFFF;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
313 emit(v1 >> 8);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
314 emit(v1 & 0xff);
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
315 }