201 lines
3.8 KiB
C
201 lines
3.8 KiB
C
/* $Header$ */
|
|
/*
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
*/
|
|
/* @(#)mach4.c 1.11 */
|
|
/*
|
|
* Motorola 68000/68010 syntax rules
|
|
*/
|
|
|
|
operation
|
|
: bcdx DREG ',' DREG
|
|
{ emit2($1 | $2 | $4<<9);}
|
|
| bcdx '-' '(' AREG ')' ',' '-' '(' AREG ')'
|
|
{ emit2($1 | $4 | $9<<9 | 010);}
|
|
| ADD sizedef ea_ea
|
|
{ add($1, $2);}
|
|
| AND sizenon ea_ea
|
|
{ and($1, $2);}
|
|
| SHIFT sizedef ea_ea
|
|
{ shift_op($1, $2);}
|
|
| BR expr
|
|
{ branch($1, $2);}
|
|
| DBR DREG ',' expr
|
|
{ $4.val -= (DOTVAL+2);
|
|
Xfit(fitw($4.val));
|
|
emit2($1 | $2);
|
|
#ifdef RELOCATION
|
|
newrelo($4.typ, RELPC|RELO2|RELBR|RELWR);
|
|
#endif
|
|
emit2(loww($4.val));
|
|
}
|
|
| BITOP ea_ea
|
|
{ bitop($1);}
|
|
| OP_EA_D sizedef ea ',' DREG
|
|
{ if ($2 != SIZE_W) {
|
|
serror("illegal size");
|
|
}
|
|
emit2($1 | mrg_2 | $5<<9);
|
|
ea_2(SIZE_W, DTA);
|
|
}
|
|
| LEA ea ',' AREG
|
|
{ emit2(040700 | mrg_2 | $4<<9);
|
|
ea_2(SIZE_L, CTR);
|
|
}
|
|
| op_ea ea
|
|
{ emit2(($1&0177700) | mrg_2);
|
|
ea_2($1&0300, $1&017);
|
|
}
|
|
| OP_NOOP
|
|
{ emit2($1);}
|
|
| CMP sizedef ea_ea
|
|
{ cmp($2);}
|
|
| MOVE sizenon ea_ea
|
|
{ move($2);}
|
|
| MOVEP sizedef ea_ea
|
|
{ movep($2);}
|
|
| MOVEM sizedef regs ',' notimmreg
|
|
{ movem(0, $2, $3);}
|
|
| MOVEM sizedef notimmreg ',' regs
|
|
{ movem(1, $2, $5);}
|
|
| MOVES sizedef ea_ea
|
|
{ test68010();
|
|
if (mrg_1 <= 017) {
|
|
emit2(007000 | $2 | mrg_2);
|
|
emit2(mrg_1 << 12 | 04000);
|
|
ea_2($2,ALT|MEM);
|
|
} else if (mrg_2 <= 017) {
|
|
emit2(007000 | $2 | mrg_1);
|
|
emit2(mrg_2 << 12);
|
|
ea_1($2,ALT|MEM);
|
|
} else
|
|
badoperand();
|
|
}
|
|
| MOVEC creg ',' reg
|
|
{ test68010();
|
|
emit2(047172); emit2($2 | $4<<12);
|
|
}
|
|
| MOVEC reg ',' creg
|
|
{ test68010();
|
|
emit2(047173); emit2($4 | $2<<12);
|
|
}
|
|
| EXG reg ',' reg
|
|
{ if (($2 & 010) == 0)
|
|
emit2(
|
|
(0140500|$4|$2<<9)
|
|
+
|
|
(($4&010)<<3)
|
|
);
|
|
else
|
|
emit2(
|
|
(0140610|$2|($4&07)<<9)
|
|
-
|
|
(($4&010)<<3)
|
|
);
|
|
}
|
|
| OP_EXT sizedef DREG
|
|
{ checksize($2, 2|4); emit2(044000 | $2+0100 | $3);}
|
|
| SWAP DREG
|
|
{ emit2(044100 | $2);}
|
|
| STOP imm
|
|
{ emit2($1); ea_2(SIZE_W, 0);}
|
|
| LINK AREG ',' imm
|
|
{ emit2(047120 | $2); ea_2(SIZE_W, 0);}
|
|
| UNLK AREG
|
|
{ emit2(047130 | $2);}
|
|
| TRAP '#' absexp
|
|
{ Xfit(fit4($3)); emit2(047100|low4($3));}
|
|
| RTD imm
|
|
{ test68010();
|
|
emit2(047164);
|
|
ea_2(SIZE_W, 0);
|
|
}
|
|
| MODEL
|
|
{ model = $1;}
|
|
;
|
|
bcdx : ABCD
|
|
| ADDX sizedef
|
|
{ $$ = $1 | $2;}
|
|
;
|
|
creg : CREG
|
|
| SPEC { if ($1 != 075) badoperand(); $$ = 04000;}
|
|
;
|
|
op_ea : OP_EA
|
|
| SZ_EA sizedef
|
|
{ $$ = $1 | $2;}
|
|
;
|
|
regs : rrange
|
|
| regs '/' rrange
|
|
{ $$ = $1 | $3;}
|
|
;
|
|
rrange : reg
|
|
{ $$ = 1<<$1;}
|
|
| reg '-' reg
|
|
{ if ($1 > $3)
|
|
badoperand();
|
|
for ($$ = 0; $1 <= $3; $1++)
|
|
$$ |= (1<<$1);
|
|
}
|
|
;
|
|
ea : DREG
|
|
{ mrg_2 = $1;}
|
|
| AREG
|
|
{ mrg_2 = 010 | $1;}
|
|
| SPEC
|
|
{ mrg_2 = $1;}
|
|
| notimmreg
|
|
| imm
|
|
;
|
|
notimmreg
|
|
: '(' AREG ')'
|
|
{ mrg_2 = 020 | $2;}
|
|
| '(' AREG ')' '+'
|
|
{ mrg_2 = 030 | $2;}
|
|
| '-' '(' AREG ')'
|
|
{ mrg_2 = 040 | $3;}
|
|
| expr sizenon
|
|
{ exp_2 = $1; ea707172($2);
|
|
RELOMOVE(rel_2, relonami);
|
|
}
|
|
| expr '(' reg sizenon ')'
|
|
{ exp_2 = $1; ea5x73($3, $4);
|
|
RELOMOVE(rel_2, relonami);
|
|
}
|
|
| expr '(' AREG ',' reg sizedef ')'
|
|
{ exp_2 = $1; ea6x($3, $5, $6);
|
|
RELOMOVE(rel_2, relonami);
|
|
}
|
|
| expr '(' PC ')'
|
|
{ exp_2 = $1; ea72();
|
|
RELOMOVE(rel_2, relonami);
|
|
}
|
|
| expr '(' PC ',' reg sizedef ')'
|
|
{ exp_2 = $1; ea73($5, $6);
|
|
RELOMOVE(rel_2, relonami);
|
|
}
|
|
;
|
|
imm : '#' expr
|
|
{ mrg_2 = 074; exp_2 = $2;
|
|
RELOMOVE(rel_2, relonami);
|
|
}
|
|
;
|
|
reg : DREG
|
|
| AREG
|
|
{ $$ = $1 | 010;}
|
|
;
|
|
sizedef : /* empty */
|
|
{ $$ = SIZE_DEF;}
|
|
| SIZE
|
|
;
|
|
sizenon : /* empty */
|
|
{ $$ = SIZE_NON;}
|
|
| SIZE
|
|
;
|
|
ea_ea : ea ','
|
|
{ mrg_1 = mrg_2; exp_1 = exp_2;
|
|
RELOMOVE(rel_1, rel_2);
|
|
}
|
|
ea
|
|
;
|