#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".
 *
 */

/*
 * Mostek 6500 parsing tables.
 */

expr
	:	expr	EXTENSION
			{ $$.val = ($1.val >> $2) & 0xFF;
			  $$.typ = combine($1.typ, S_ABS, '&');
			}
	;
operation
	:	NOPOP
			{ emit1($1); }
	|	BITOP	expr
			{ code($2,$1,$1+8); }
	|	JMPOP	expr
			{ emit1($1);
#ifdef RELOCATION
			  newrelo($2.typ, RELO2);
#endif
			  emit2($2.val);
			}
	|	JMPOP	'(' expr ')'
			{ emit1($1+0x20);
#ifdef RELOCATION
			  newrelo($3.typ, RELO2);
#endif
			  emit2($3.val);
			}
	|	JSROP	expr
			{ emit1($1);
#ifdef RELOCATION
			  newrelo($2.typ, RELO2);
#endif
			  emit2($2.val);
			}
	|	LDXOP	'#' expr
			{ emit1(0xA2);
#ifdef RELOCATION
			  newrelo($3.typ, RELO1);
#endif
			  emit1($3);
			}
	|	LDXOP	expr
			{ code($2,0xA6,0xAE); }
	|	LDXOP	expr ',' Y
			{ code($2,0xB6,0xBE); }
	|	LDYOP	'#' expr
			{ emit1(0xA0);
#ifdef RELOCATION
			  newrelo($3.typ, RELO1);
#endif
			  emit1($3);
			}
	|	LDYOP	expr
			{ code($2,0xA4,0xAC); }
	|	LDYOP	expr ',' X
			{ code($2,0xB4,0xBC); }
	|	STXOP	expr
			{ code($2,$1+0x06,$1+0x0E); }
	|	STXOP	expr ',' Y
			{ emit1($1+0x16);
#ifdef RELOCATION
			  newrelo($2.typ, RELO1);
#endif
			  emit1(lowb($2.val));
			}
	|	STYOP	expr
			{ code($2,$1+0x04,$1+0x0C); }
	|	STYOP	expr ',' X
			{ emit1($1+0x14);
#ifdef RELOCATION
			  newrelo($2.typ, RELO1);
#endif
			  emit1(lowb($2.val));
			}
	|	addop	'#' expr
			{ if ($1==0x80) serror("no store immediate");
			  emit1($1+0x09);
#ifdef RELOCATION
			  newrelo($3.typ, RELO1);
#endif
			  emit1($3);
			}
	|	addop	expr
			{ code($2,$1+0x05,$1+0x0D); }
	|	addop	expr ',' X
			{ code($2,$1+0x15,$1+0x1D); }
	|	addop	expr ',' Y
			{ emit1($1+0x19);
#ifdef RELOCATION
			  newrelo($2.typ, RELO2);
#endif
			  emit2($2.val);
			}
	|	addop	'(' expr ',' X ')'
			{ emit1($1+0x01);
#ifdef RELOCATION
			  newrelo($3.typ, RELO1);
#endif
			  emit1(lowb($3.val));
			}
	|	addop	'(' expr ')' ',' Y
			{ emit1($1+0x11);
#ifdef RELOCATION
			  newrelo($3.typ, RELO1);
#endif
			  emit1(lowb($3.val));
			}
	|	ROLOP	/* Default is A. */
			{ emit1($1+0x0A); }
	|	ROLOP	A
			{ emit1($1+0x0A); }
	|	ROLOP	expr
			{ code($2,$1+0x06,$1+0x0E); }
	|	ROLOP	expr ',' X
			{ code($2,$1+0x16,$1+0x1E); }
	|	BRAOP	expr
			{ branch($1,$2); }
	|	CPXOP	'#' expr
			{ emit1($1+0x00);
#ifdef RELOCATION
			  newrelo($3.typ, RELO1);
#endif
			  emit1($3);
			}
	|	CPXOP	expr
			{ code($2,$1+0x04,$1+0x0C); }
	|	INCOP	expr
			{ code($2,$1+0x06,$1+0x0E); }
	|	INCOP	expr ',' X
			{ code($2,$1+0x16,$1+0x1E); }
	;
addop
	:	ADDOP
	|	PSEU
			{ emit1($1>>8); $$ = $1 & 0xFF; }
	;
