128 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			2.2 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".
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /*	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;}
 | |
| 	;
 |