/* asm.h */

/*
 * (C) Copyright 1989
 * All Rights Reserved
 *
 * Alan R. Baldwin
 * 721 Berkeley St.
 * Kent, Ohio  44240
 */

/* DECUS C void definition */

#ifdef	decus
#define	VOID	char
#else
#define	VOID	void
#endif

/*
 * Case Sensitivity Flag
 */
#define	CASE_SENSITIVE	1

/*
 * Assembler header.
 */
#define	LFTERM	'('		/* Left expression delimeter */
#define	RTTERM	')'		/* Right expression delimeter */

#define NCPS	8		/* Chars. per symbol */
#define	HUGE	1000		/* A huge number */
#define NERR	3		/* Errors per line */
#define NINPUT	128		/* Input buffer size */
#define NCODE	128		/* Listing code buffer size */
#define NTITL	64		/* Title buffer size */
#define	NSBTL	64		/* SubTitle buffer size */
#define	NHASH	64		/* Buckets in hash table */
#define	HMASK	077		/* Hash mask */
#define	NLPP	60		/* Lines per page */
#define	MAXFIL	6		/* Maximum command line input files */
#define	MAXINC	6		/* Maximum nesting of include files */
#define	MAXIF	10		/* Maximum nesting of if/else/endif */
#define	FILSPC	15		/* Chars. in filespec */

#define NLIST	0		/* No listing */
#define SLIST	1		/* Source only */
#define ALIST	2		/* Address only */
#define CLIST	3		/* Code */

#define	dot	(&sym[0])	/* Dot, current loc */
#define	dca	(&area[0])	/* Dca, default code area */

typedef	unsigned addr_t;

struct	area
{
	struct	area *a_ap;	/* Area link */
	char	a_id[NCPS];	/* Area Name */
	int	a_ref;		/* Ref. number */
	addr_t	a_size;		/* Area size */
	addr_t	a_fuzz;		/* Area fuzz */
	int	a_flag;		/* Area flags */
};

#define	A_CON	000		/* Concatenating */
#define	A_OVR	004		/* Overlaying */
#define	A_REL	000		/* Relocatable */
#define	A_ABS	010		/* absolute */

struct	mne
{
	struct	mne  *m_mp;	/* Hash link */
	char	m_id[NCPS];	/* Mnemonic */
	char	m_type;		/* Mnemonic subtype */
	char	m_flag;		/* Mnemonic flags */
	addr_t	m_valu;		/* Value */
};

struct	sym
{
	struct	sym  *s_sp;	/* Hash link */
	struct	tsym *s_tsym;	/* Temporary symbol link */
	char	s_id[NCPS];	/* Symbol */
	char	s_type;		/* Symbol subtype */
	char	s_flag;		/* Symbol flags */
	struct	area *s_area;	/* Area line, 0 if absolute */
	int	s_ref;		/* Ref. number */
	addr_t	s_addr;		/* Address */
};

#define	S_GBL	01		/* Global */
#define	S_ASG	02		/* Assigned */
#define	S_MDF	04		/* Mult. def */
#define	S_END	010		/* End mark for pst. */

#define	S_NEW	0		/* New name */
#define	S_USER	1		/* User name */
				/* unused slot */
				/* unused slot */
				/* unused slot */

#define	S_BYTE	5		/* .byte */
#define	S_WORD	6		/* .word */
#define	S_ASCII	7		/* .ascii */
#define	S_ASCIZ	8		/* .asciz */
#define	S_BLK	9		/* .blkb or .blkw */
#define	S_INCL	10		/* .include */
#define	S_DAREA	11		/* .area */
#define	S_ATYP	12		/* .area type */
#define	S_AREA	13		/* .area name */
#define	S_GLOBL	14		/* .globl */
#define	S_PAGE	15		/* .page */
#define	S_TITLE	16		/* .title */
#define	S_SBTL	17		/* .sbttl */
#define	S_IF	18		/* .if */
#define	S_ELSE	19		/* .else */
#define	S_ENDIF	20		/* .endif */
#define	S_EVEN	21		/* .even */
#define	S_ODD	22		/* .odd */
#define	S_RADIX	23		/* .radix */
#define	S_ORG	24		/* .org */
#define	S_MODUL	25		/* .module */

struct	tsym
{
	struct	tsym *t_lnk;	/* Link to next */
	char t_num;		/* 0-255$ */
	char t_flg;		/* flags */
	struct	area *t_area;	/* Area */
	addr_t	t_addr;		/* Address */
};

extern	jmp_buf	jump_env;
extern	int	inpfil;
extern	int	incfil;
extern	int	cfile;
extern	int	flevel;
extern	int	tlevel;
extern	int	ifcnd[];
extern	int	iflvl[];
extern	int	radix;
extern	VOID	*new();
extern	int	line;
extern	int	page;
extern	int	lop;
extern	int	pass;
extern	int	lflag;
extern	int	gflag;
extern	int	aflag;
extern	int	oflag;
extern	int	sflag;
extern	int	xflag;
extern	addr_t	laddr;
extern	addr_t	fuzz;
extern	int	lmode;
extern	struct	area	area[];
extern	struct	area *areap;
extern	struct	sym	sym[];
extern	struct	sym *symp;
extern	struct	sym *symhash[NHASH];
extern	struct	mne *mnehash[NHASH];
extern	char	*ep;
extern	char	eb[NERR];
extern	char	*ip;
extern	char	ib[NINPUT];
extern	char	*cp;
extern	char	cb[NCODE];
extern	char	tb[NTITL];
extern	char	stb[NSBTL];
extern	char	symtbl[];
extern	char	aretbl[];
extern	char	module[NCPS];
extern	FILE	*lfp;
extern	FILE	*ofp;
extern	FILE	*tfp;
extern	FILE	*sfp[];
extern	FILE	*ifp[];
extern	char	ctype[];

#if	CASE_SENSITIVE
#else
extern	char	ccase[];
#endif

#define	LETTER	0
#define	DIGIT	1
#define	BINOP	2
#define ETC	3
#define	ILL	4
#define	SPACE	5

/*
 * Expression.
 */
struct	expr
{
	char	e_mode;		/* Address mode */
	char	e_flag;		/* Symbol flag */
	addr_t	e_addr;		/* Address */
	union	{
		struct area *e_ap;
		struct sym  *e_sp;
	} e_base;		/* Rel. base */
};

/* C Library functions */
/* for reference only
extern	VOID *		calloc();
extern	int		fclose();
extern	char *		fgets();
extern	FILE *		fopen();
extern	int		fprintf();
extern	VOID		longjmp();
extern	VOID *		malloc();
extern	int		printf();
extern	char		putc();
extern	int		rewind();
extern	int		setjmp();
extern	int		strcmp();
extern	char *		strcpy();
extern	int		strlen();
extern	char *		strncpy();
*/

/* Machine independent functions */

/* asmain.c */
extern	VOID		asmbl();
extern	VOID		main();
extern	VOID		newdot();
extern	VOID		phase();
extern	VOID		usage();

/* aslex.c */
extern	char		endline();
extern	char		get();
extern	VOID		getid();
extern	int		getline();
extern	char		getmap();
extern	char		getnb();
extern	int		more();
extern	VOID		unget();

/* assym.c */
extern	struct	area *	alookup();
extern	struct	mne *	mlookup();
extern	int		hash();
extern	struct	sym *	lookup();
extern	VOID *		new();
extern	int		symeq();
extern	VOID		syminit();
extern	VOID		symglob();
extern	VOID		allglob();

/* assubr.c */
extern	VOID		aerr();
extern	VOID		diag();
extern	VOID		err();
extern	VOID		qerr();
extern	VOID		rerr();

/* asexpr.c */
extern	VOID		abscheck();
extern	addr_t		absexpr();
extern	int		digit();
extern	VOID		expr();
extern	int		oprio();
extern	VOID		term();

/* aslist.c */
extern	VOID		list();
extern	VOID		list1();
extern	VOID		lstsym();
extern	VOID		slew();

/* asout.c */
extern	int		hibyte();
extern	int		lobyte();
extern	VOID		out();
extern	VOID		outab();
extern	VOID		outarea();
extern	VOID		outaw();
extern	VOID		outall();
extern	VOID		outbuf();
extern	VOID		outchk();
extern	VOID		outgsd();
extern	VOID		outrb();
extern	VOID		outrw();
extern	VOID		outsym();
extern	VOID		out_lb();
extern	VOID		out_lw();
extern	VOID		out_rw();
extern	VOID		out_tw();


/* Machine dependent variables */

extern	char *		cpu;
extern	char *		dsft;
extern	int		hilo;
extern	struct	mne	mne[];

/* Machine dependent functions */

extern	VOID		machin();
extern	VOID		minit();

