1 #define RCSID4 "$Id: mach4.c,v 3.5 1994/06/24 13:54:54 ceriel Exp $"
4 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
5 * See the copyright notice in the ACK home directory, in the file "Copyright".
10 * Zilog Z80 parsing rules
18 case BC: emit1($1); break;
19 case DE: emit1($1 | 020); break;
20 case AF: emit1($1 | 060); break;
23 case IY: xyreg($2,$1 | 040); break;
24 default: serror("register error");
28 { if ($2==DE && $4==HL)
30 else if ($2==AF && $4==AF2)
32 else serror("register error");
34 | EXOP '(' R16 ')' ',' R16
35 { if ($3!=SP) serror("register error");
39 { emit1(0355); emit1($1);}
45 serror("register error");
46 xyreg($2,011 | $4<<4);
50 { if ($2!=HL || $4>SP) serror("register error");
52 emit1(($1==0210 ? 0112 : 0102) | ($4<<4));
56 case BC: case DE: case SP:
57 emit1(($1==04 ? 03 : 013) | $2<<4);
59 case HL: case IX: case IY:
60 xyreg($2,$1==04 ? 043 : 053);
62 default: serror("register error");
68 { xymem($2,$1 | 060);}
72 { emit1($1 | 0106); emit1($2.val);}
78 case 0: emit1(0106); break;
79 case 1: emit1(0126); break;
80 case 2: emit1(0136); break;
81 default: serror("range 0..2");
85 { emit1(0313); emit1($1 | $2);}
87 { xymem($2,0313); emit1($1 | 06);}
90 emit1(0313); emit1($1 | low3($2)<<3 | $4);
95 emit1($1 | low3($2)<<3 | 06);
100 newrelo($2.typ, RELO2);
105 { emit1(0302 | $2<<3);
107 newrelo($4.typ, RELO2);
116 { if ($2 > 3) serror("bad condition code");
117 branch(040 | ($2<<3), $4);
124 newrelo($2.typ, RELO2);
129 { emit1(0304 | $2<<3);
131 newrelo($4.typ, RELO2);
138 { emit1(0300 | $2<<3);}
141 serror("rst expression out of range");
145 { if ($2 != A) serror("register error");
148 newrelo($4.typ, RELO1);
153 { if ($4 != C) serror("register error");
154 emit1(0355); emit1(0100 | $2<<3);
157 { if ($4 != A) serror("register error");
160 newrelo($2.typ, RELO1);
165 { if ($2 != C) serror("register error");
166 emit1(0355); emit1(0101 | $4<<3);
171 { if ($2 != A) serror("register error");}
173 { if ($2 != A) serror("register error");}
176 { if ($1==F || $3==F) serror("register error");
178 emit1(0100 | $1<<3 | $3);
181 if ((($1==A) ^ ($3==A)) == 0)
182 serror("register error");
190 { if ($1==F || $1==I || $1==R)
191 serror("register error");
194 newrelo($3.typ, RELO1);
199 { if ($1==F || $1==I || $1==R)
200 serror("register error");
201 if ($1==A && ($3==BC || $3==DE))
202 emit1($3==BC ? 012 : 032);
204 xymem($3,0106 | $1<<3);
207 { if ($1==F || $1==I || $1==R)
208 serror("register error");
209 xymem($3,0106 | $1<<3);
211 | R8 ',' '(' expr ')'
212 { if ($1!=A) serror("register error");
215 newrelo($4.typ, RELO2);
220 { if ($3==A && ($1==BC || $1==DE))
221 emit1($1==BC ? 02 : 022);
226 { xymem($1,0160 | $3);}
230 newrelo($3.typ, RELO1);
237 newrelo($3.typ, RELO1);
243 case BC: case DE: case HL: case SP:
244 emit1(01 | $1<<4); break;
246 xyreg($1,041); break;
247 default: serror("register error");
250 newrelo($3.typ, RELO2);
255 { if ($1!=SP) serror("register error");
258 | R16 ',' '(' expr ')'
260 case BC: case DE: case SP:
261 emit1(0355); emit1(0113 | $1<<4); break;
262 case HL: case IX: case IY:
263 xyreg($1,052); break;
264 default: serror("register error");
267 newrelo($4.typ, RELO2);
271 | '(' expr ')' ',' R8
272 { if ($5!=A) serror("register error");
275 newrelo($2.typ, RELO2);
279 | '(' expr ')' ',' R16
281 case BC: case DE: case SP:
282 emit1(0355); emit1(0103 | $5<<4); break;
283 case HL: case IX: case IY:
284 xyreg($5,042); break;
285 default: serror("register error");
288 newrelo($2.typ, RELO2);
294 { if ($1==F || $1==I || $1==R)
295 serror("register error");
299 { if ($2>=SP && $2!=IX && $2!=IY)
300 serror("register error");
301 exp_ind.typ = S_ABS; exp_ind.val = 0;
305 index : '(' R16 '+' expr ')'
306 { if ($2!=IX && $2!=IY) serror("register error");
308 RELOMOVE(rel_ind, relonami);
311 | '(' R16 '-' expr ')'
313 if ($2!=IX && $2!=IY) serror("register error");
316 RELOMOVE(rel_ind, relonami);
325 { if ($1 != C) serror("bad condition code");