#define RCSID4 "$Header$" /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: Leo van Moergestel */ /* * Signetics 2650 parsing rules */ operation: NOOP { emit1($1);} | ZERO ',' REG { emit1($1 | $3); } | IMMED ',' REG expr { emit1($1 | $3); page(); #ifdef RELOCATION newrelo($4.typ, RELO1); #endif emit1($4.val); } | REL ',' REG expr { emit1($1 | $3); rela($4, 0);} | REL ',' REG '*' expr { emit1($1 | $3); rela($5, 0x80);} | ZEROX ',' REG { if ($3 == R0) serror("register error"); emit1($1 | $3); } | ABSO ',' REG param { emit1($1 | $3); absoa(par_exp, p_indexed, p_indirect); } | PSWM expr { emit1($1); page(); #ifdef RELOCATION newrelo($2.typ, RELO1); #endif emit1($2.val); } | RET ',' CC { emit1($1 | $3);} | BRANCR ',' CC expr { emit1($1 | $3); rela($4, 0);} | BRANCR ',' CC '*' expr { emit1($1 | $3); rela($5, 0x80);} | BRANCRX ',' CC expr { if($3 == 3) serror("wrong condition"); emit1($1 | $3); rela($4, 0);} | BRANCRX ',' CC '*' expr { if($3 == 3) serror("wrong condition"); emit1($1 | $3); rela($5, 0x80);} | BRANCA ',' CC expr { emit1($1 | $3); absob($4, 0);} | BRANCA ',' CC '*' expr { emit1($1 | $3); absob($5, 0x8000);} | BRANCAX ',' CC expr { if($3 == 3) serror("wrong condition"); emit1($1 | $3); absob($4, 0);} | BRANCAX ',' CC '*' expr { if($3 == 3) serror("wrong condition"); emit1($1 | $3); absob($5, 0x8000);} | BRANRA ',' REG expr { emit1($1 | $3); absob($4, 0);} | BRANRA ',' REG '*' expr { emit1($1 | $3); absob($5, 0x8000);} | ZBRR expr { emit1($1); rela($2, 0);} | ZBRR '*' expr { emit1($1); rela($3, 0x80);} | BXSA expr { emit1($1); absob($2, 0);} | BXSA '*' expr { emit1($1); absob($3, 0x8000);} ; param: indir_opt { p_indexed = 0;} | indir_opt ',' INDE { p_indexed = 0x6000;} | indir_opt ',' '+' { p_indexed = 0x2000;} | indir_opt ',' '-' { p_indexed = 0x4000;} ; indir_opt: expr { par_exp = $1; p_indirect = 0;} | '*' expr { par_exp = $2; p_indirect = 0x8000;} ;