/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
/* $Header$ */
/*
 * output format for ACK assemblers
 */
#ifndef ushort
#define ushort	unsigned short
#endif ushort

struct outhead {
	ushort 	oh_magic;	/* magic number */
	ushort 	oh_stamp;	/* version stamp */
	ushort	oh_flags;	/* several format flags */
	ushort	oh_nsect;	/* number of outsect structures */
	ushort	oh_nrelo;	/* number of outrelo structures */
	ushort	oh_nname;	/* number of outname structures */
	long	oh_nemit;	/* sum of all os_flen */
	long	oh_nchar;	/* size of string area */
};

#define O_MAGIC	0x0201		/* magic number of output file */
#define	O_STAMP	0		/* version stamp */
#define MAXSECT	64		/* Maximum number of sections */

#define	HF_LINK	0x0004		/* unresolved references left */
#define	HF_8086	0x0008		/* os_base specially encoded */

struct outsect {
	long 	os_base;	/* startaddress in machine */
	long	os_size;	/* section size in machine */
	long	os_foff;	/* startaddress in file */
	long	os_flen;	/* section size in file */
	long	os_lign;	/* section alignment */
};

struct outrelo {
	char	or_type;	/* type of reference */
	char	or_sect;	/* referencing section */
	ushort	or_nami;	/* referenced symbol index */
	long	or_addr;	/* referencing address */
};

struct outname {
	union {
	  char	*on_ptr;	/* symbol name (in core) */
	  long	on_off;		/* symbol name (in file) */
	}	on_u;
#define on_mptr	on_u.on_ptr
#define on_foff	on_u.on_off
	ushort	on_type;	/* symbol type */
	ushort	on_desc;	/* debug info */
	long	on_valu;	/* symbol value */
};

/*
 * relocation type bits
 */
#define RELSZ	0x07		/* relocation length */
#define RELO1	   1		/* 1 byte */
#define RELO2	   2		/* 2 bytes */
#define RELO4	   4		/* 4 bytes */
#define RELPC	0x08		/* pc relative */
#define RELBR	0x10		/* High order byte lowest address. */
#define RELWR	0x20		/* High order word lowest address. */

/*
 * section type bits and fields
 */
#define S_TYP	0x007F		/* undefined, absolute or relative */
#define S_EXT	0x0080		/* external flag */
#define S_ETC	0x7F00		/* for symbolic debug, bypassing 'as' */

/*
 * S_TYP field values
 */
#define S_UND	0x0000		/* undefined item */
#define S_ABS	0x0001		/* absolute item */
#define S_MIN	0x0002		/* first user section */
#define S_MAX	S_TYP		/* last user section */

/*
 * S_ETC field values
 */
#define S_SCT	0x0100		/* section names */
#define S_LIN	0x0200		/* hll source line item */
#define S_FIL	0x0300		/* hll source file item */
#define S_MOD	0x0400		/* ass source file item */
#define S_COM	0x1000		/* Common name. */

/*
 * structure format strings
 */
#define SF_HEAD		"22222244"
#define SF_SECT		"44444"
#define SF_RELO		"1124"
#define SF_NAME		"4224"

/*
 * structure sizes (bytes in file; add digits in SF_*)
 */
#define SZ_HEAD		20
#define SZ_SECT		20
#define SZ_RELO		8
#define SZ_NAME		12

/*
 * file access macros
 */
#define BADMAGIC(x)	((x).oh_magic!=O_MAGIC)
#define OFF_SECT(x)	SZ_HEAD
#define OFF_EMIT(x)	(OFF_SECT(x) + ((long)(x).oh_nsect * SZ_SECT))
#define OFF_RELO(x)	(OFF_EMIT(x) + (x).oh_nemit)
#define OFF_NAME(x)	(OFF_RELO(x) + ((long)(x).oh_nrelo * SZ_RELO))
#define OFF_CHAR(x)	(OFF_NAME(x) + ((long)(x).oh_nname * SZ_NAME))
