ack/mach/6805/as/mach4.c
1987-03-10 01:26:51 +00:00

195 lines
2.8 KiB
C

#define RCSID4 "$Header$"
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*
*/
/*
* Motorola 6805 parsing rules
*/
expr8
:
expr
{
fit(fitb($1.val));
}
;
bitexp
:
absexp
{
fit((unsigned) $1 <= 7);
$$ = $1 & 07;
}
;
operation
:
NOARG
{ emit1($1);}
|
BRANCH expr
{ branch($1,$2);}
|
BBRANCH bitexp ',' expr8 ',' expr
{
branch($1+($2 << 1), $6, $4);
}
|
BIT bitexp ',' expr8
{
emit1($1+($2 << 1));
#ifdef RELOCATION
newrelo($4.typ, RELO1);
#endif
emit1($4.val);
}
|
RMR '<' expr8
|
RMR expr8
{
emit1($1);
#ifdef RELOCATION
newrelo($2.typ, RELO1);
#endif
emit1($2.val);
}
|
RMR expr8 ',' X
{
if(small($2.val == 0 &&
($2.typ & ~S_DOT) == DOTTYP &&
pass == PASS_2, 1))
emit1($1+0x40);
else
{
emit1($1+0x30);
#ifdef RELOCATION
newrelo($2.typ, RELO1);
#endif
emit1($2.val);
}
}
|
RMR ',' X
{ emit1($1+0x40); }
|
RM '#' expr8
{
switch($1) {
case 0xa7:
case 0xac:
case 0xad:
case 0xaf:
serror("mode error");
default:
emit1($1);
}
#ifdef RELOCATION
newrelo($3.typ, RELO1);
#endif
emit1($3.val);
}
|
RM '<' expr8
{
emit1($1+0x10);
#ifdef RELOCATION
newrelo($3.typ, RELO1);
#endif
emit1($3.val);
}
|
RM expr
{
if(small(pass == PASS_2 &&
($2.typ & ~S_DOT) == DOTTYP &&
fitb($2.val),1)) {
emit1($1+0x10);
#ifdef RELOCATION
newrelo($2.typ, RELO1);
#endif
emit1($2.val);
} else {
emit1($1+0x20);
#ifdef RELOCATION
newrelo($2.typ, RELO2|RELBR);
#endif
emit2($2.val);
}
}
|
RM '>' expr
{
emit1($1+0x20);
#ifdef RELOCATION
newrelo($3.typ, RELO2|RELBR);
#endif
emit2($3.val);
}
|
RM '>' expr ',' X
{
emit1($1+0x30);
#ifdef RELOCATION
newrelo($3.typ, RELO2|RELBR);
#endif
emit2($3.val);
}
|
RM expr ',' X
{
if(small(pass == PASS_2 &&
($2.typ & ~S_DOT) == DOTTYP &&
fitb($2.val),1)) {
if(small(pass == PASS_2 &&
($2.typ & ~S_DOT) == DOTTYP &&
$2.val == 0,1))
emit1($1+0x50);
else {
emit1($1+0x40);
#ifdef RELOCATION
newrelo($2.typ, RELO1);
#endif
emit1($2.val);
}
} else {
small(0,1); /* dummy */
emit1($1+0x30);
#ifdef RELOCATION
newrelo($2.typ, RELO2|RELBR);
#endif
emit2($2.val);
}
}
|
RM '<' expr8 ',' X
{
emit1($1+0x40);
#ifdef RELOCATION
newrelo($3.typ, RELO1);
#endif
emit1($3.val);
}
|
RM ',' X
{ emit1($1+0x50); }
|
CMOS
{
switch($1) {
case 0:
opt_cmos = 1;
break;
case 0x8e:
case 0x8f:
if(! opt_cmos)
serror("bad opcode");
emit1($1);
}
}
;