194 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			194 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);
 | 
						|
				}
 | 
						|
			}
 | 
						|
	;
 |