132 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#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
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
operation
 | 
						|
	:	prefix oper
 | 
						|
	;
 | 
						|
prefix	:	/* empty */
 | 
						|
	|	prefix PREFIX
 | 
						|
			{	emit1($2);}
 | 
						|
	;
 | 
						|
oper	:	NOOP_1
 | 
						|
			{	emit1($1);}
 | 
						|
	|	NOOP_2
 | 
						|
			{	emit2($1);}
 | 
						|
	|	JOP expr
 | 
						|
			{	branch($1,$2);}
 | 
						|
	|	PUSHOP ea_1
 | 
						|
			{	pushop($1);}
 | 
						|
	|	IOOP expr
 | 
						|
			{	emit1($1);
 | 
						|
#ifdef RELOCATION
 | 
						|
				newrelo($2.typ, RELO1);
 | 
						|
#endif
 | 
						|
				emit1($2.val);
 | 
						|
			}
 | 
						|
	|	IOOP R16
 | 
						|
			{	if ($2!=2) serror("register error");
 | 
						|
				emit1($1+010);
 | 
						|
			}
 | 
						|
	|	ADDOP ea_ea
 | 
						|
			{	addop($1);}
 | 
						|
	|	ROLOP ea_ea
 | 
						|
			{	rolop($1);}
 | 
						|
	|	INCOP ea_1
 | 
						|
			{	incop($1);}
 | 
						|
	|	NOTOP ea_1
 | 
						|
			{	regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
 | 
						|
	|	CALLOP ea_1
 | 
						|
			{	callop($1&0xFFFF);}
 | 
						|
	|	CALFOP expr ':' expr
 | 
						|
			{	emit1($1>>8);
 | 
						|
#ifdef RELOCATION
 | 
						|
				newrelo($4.typ, RELO2);
 | 
						|
#endif
 | 
						|
				emit2($4.val);
 | 
						|
#ifdef RELOCATION
 | 
						|
				newrelo($2.typ, RELO2);
 | 
						|
#endif
 | 
						|
				emit2($2.val);
 | 
						|
			}
 | 
						|
	|	CALFOP mem
 | 
						|
			{	emit1(0377); ea_2($1&0xFF);}
 | 
						|
	|	LEAOP R16 ',' mem
 | 
						|
			{	emit1($1); ea_2($2<<3);}
 | 
						|
	|	ESC absexp ',' mem
 | 
						|
			{	fit(fit6($2));
 | 
						|
				emit1(0330 | $2>>3);
 | 
						|
				ea_2(($2&7)<<3);
 | 
						|
			}
 | 
						|
	|	INT absexp
 | 
						|
			{	if ($2==3)
 | 
						|
					emit1(0314);
 | 
						|
				else {
 | 
						|
					emit1(0315); emit1($2);
 | 
						|
				}
 | 
						|
			}
 | 
						|
	|	RET
 | 
						|
			{	emit1($1);}
 | 
						|
	|	RET expr
 | 
						|
			{	emit1($1-1);
 | 
						|
#ifdef RELOCATION
 | 
						|
				newrelo($2.typ, RELO2);
 | 
						|
#endif
 | 
						|
				emit2($2.val);
 | 
						|
			}
 | 
						|
	|	XCHG ea_ea
 | 
						|
			{	xchg($1);}
 | 
						|
	|	TEST ea_ea
 | 
						|
			{	test($1);}
 | 
						|
	|	MOV ea_ea
 | 
						|
			{	mov($1);}
 | 
						|
mem	:	'(' expr ')'
 | 
						|
			{	mrg_2 = 6; exp_2 = $2;
 | 
						|
				RELOMOVE(rel_2, relonami);
 | 
						|
			}
 | 
						|
	|	bases
 | 
						|
			{	exp_2.val = 0; exp_2.typ = S_ABS; indexed();}
 | 
						|
	|	expr bases
 | 
						|
			{	exp_2 = $1; indexed();
 | 
						|
				RELOMOVE(rel_2, relonami);
 | 
						|
			}
 | 
						|
	;
 | 
						|
bases	:	'(' R16 ')'
 | 
						|
			{	mrg_2 = sr_m[$2];}
 | 
						|
	|	'(' R16 ')' '(' R16 ')'
 | 
						|
			{	mrg_2 = dr_m[$2][$5];}
 | 
						|
	;
 | 
						|
ea_2	:	mem
 | 
						|
	|	R8
 | 
						|
			{	mrg_2 = $1 | 0300;}
 | 
						|
	|	R16
 | 
						|
			{	mrg_2 = $1 | 0310;}
 | 
						|
	|	RSEG
 | 
						|
			{	mrg_2 = $1 | 020;}
 | 
						|
	|	expr
 | 
						|
			{	mrg_2 = 040; exp_2 = $1;
 | 
						|
				RELOMOVE(rel_2, relonami);
 | 
						|
			}
 | 
						|
	;
 | 
						|
ea_1	:	ea_2
 | 
						|
			{	mrg_1 = mrg_2; exp_1 = exp_2;
 | 
						|
				RELOMOVE(rel_1, rel_2);
 | 
						|
			}
 | 
						|
	;
 | 
						|
ea_ea	:	ea_1 ',' ea_2
 | 
						|
	;
 |