/*
 * File: imp.h
 *
 * Header file for IMP80 compiler
 *
 * Bob Eager   August 2002
 *
 */

#ifdef	__IBMC__
#pragma	strings(readonly)
#if 0
#pragma	info(nogot,nopor,noppc,nouni,nouse)
#endif
#endif

/* Compiler version details */

#define	RELEASE		1		/* Major release number */
#define	EDIT		0		/* Edit number */
#define	LADATE		"31 Aug 2002"	/* Date last altered */
#define	COMPILER	"IMP80 compiler"/* Compiler description */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Miscellaneous defines */

#define	NO		0
#define	YES		1

/* Define the following symbol nonzero only if debugging the compiler */

#define	DEBUG		1

/* Miscellaneous constants */

#define	CONCOP		13		/* Code for string concatenation */
#define	FIXEDGLALEN	48		/* Bytes */
#define	MAXIDEPTH	10		/* Maximum %INCLUDE depth */
#define	MAXLEVELS	31		/* Maximum textual levels */
#define	IMAX		0x7fffffff	/* Maximum positive integer */
#define	SNPT		0x00001006	/* Ptype for special name */
#define	MINSHORT	-131072		/* Minimum %short value */
#define	MAXSHORT	131071		/* Maximum %short value */
#define	MAXSTRING	255		/* Maximum string length */
#define	UNASSPAT	0x81818181	/* Unassigned pattern */

/* Type definitions */

typedef	void		VOID, *PVOID;
typedef	int		BOOL, *PBOOL;
typedef	char		CHAR, *PCHAR;
typedef	signed char	SCHAR, *PSCHAR;
typedef	unsigned char	UCHAR, *PUCHAR;
typedef	short		SHORT, *PSHORT;
typedef	unsigned short	USHORT, *PUSHORT;
typedef	int		INT, *PINT;
typedef	unsigned int	UINT, *PUINT;
typedef	long		LONG, *PLONG;
typedef	unsigned long	ULONG, *PULONG;

/* Formats of cells in 'aslist' */

typedef struct LISTF_ {
INT		s1;
INT		s2;
INT		s3;
INT		link;
} LISTF;

typedef struct RDA_ {
UCHAR		uptype;
UCHAR		ptype;
UCHAR		xb;
UCHAR		flag;
INT		d;
INT		xtra;
} RDA;

typedef struct RDB_ {
INT		s1;
double		lr;
} RDB;

typedef struct RDC_ {
INT		s1;
float		r;
INT		xtra;
} RDC;

typedef union RD_ {
RDA		a;
RDB		b;
RDC		c;
} RD;

/* Function definitions */

extern	VOID	asm_mul(INT[], INT);
extern	VOID	binsert(PINT, PINT, INT, INT, INT);
#if	DEBUG
extern	VOID	check_asl(VOID);
#endif
extern	VOID	clear_list(PINT);
extern	VOID	epilogue(VOID);
extern	INT	eqstring(PUCHAR, PUCHAR);
extern	VOID	fault(INT, UINT, UINT);
extern	VOID	forget(INT);
extern	VOID	from12(INT, PINT, PINT);
extern	VOID	from123(INT, PINT, PINT, PINT);
extern	INT	fromar2(INT);
extern	INT	fromar4(INT);
extern	VOID	iexit(INT);
extern	VOID	imptoc(PUCHAR, PUCHAR);
extern	VOID	init_reguse(VOID);
extern	VOID	insert_at_end(PINT, INT, INT, INT);
extern	INT	intexp(PINT);
extern	VOID	message(PUCHAR, INT);
extern	VOID	mlink(PINT);
extern	VOID	ncode(PUCHAR, PUCHAR, UINT);
extern	VOID	pack(PINT);
extern	VOID	pass1(VOID);
extern	VOID	pass2(VOID);
extern	VOID	p0(INT);
extern	VOID	p1(INT, INT, INT);
extern	VOID	pf0(INT);
extern	VOID	pf1s(INT, INT);
extern	VOID	pname(INT);
extern	VOID	pop(PINT, PVOID, PVOID, PVOID);
extern	VOID	ppj(INT, INT);
#if	DEBUG
extern	VOID	print_list(INT);
#endif
extern	PCHAR	printname(PCHAR, INT); /* was PUCHAR */
extern	VOID	printuse(VOID);
extern	VOID	prologue(VOID);
extern	VOID	push(PINT, INT, INT, INT);
extern	VOID	rdisplay(INT);
extern	VOID	remember(VOID);
extern	VOID	replace123(INT, INT, INT, INT);
extern	VOID	restore(INT);
extern	VOID	restore_state(VOID);
extern	VOID	runtime_entry(VOID);
extern	VOID	runtime_init(VOID);
extern	VOID	save_state(VOID);
extern	VOID	skip_app(VOID);
extern	VOID	skip_exp(VOID);
extern	VOID	test_app(PINT);
extern	VOID	toar2(INT, INT);
extern	VOID	toar4(INT, INT);
extern	VOID	toar8(INT, PUCHAR);
extern	VOID	unpack(VOID);
extern	VOID	warn(INT, UINT);
extern	VOID	wput(USHORT);
extern	PCHAR	xalloc(INT); /* Was PUCHAR */
extern	VOID	xabort(VOID);

/* Macros */

#define	unless(x)	if(!(x))
#define	until(x)	while(!(x))

/* Inline functions */

#define	from1(cell)		(aslist[cell].s1)
#define	from2(cell)		(aslist[cell].s2)
#define	from3(cell)		(aslist[cell].s3)
#define	replace1(cell, s1)	(aslist[cell].s1 = s1)
#define	replace2(cell, s2)	(aslist[cell].s2 = s2)
#define	replace3(cell, s3)	(aslist[cell].s3 = s3)

/*
 * End of file: imp.h
 *
 */
