ack/mach/s2650/as/mach4.c

140 lines
2.5 KiB
C
Raw Normal View History

1985-06-10 16:57:01 +00:00
#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;}
;