265 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			265 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Header$ */
 | |
| /*
 | |
|  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  * See the copyright notice in the ACK home directory, in the file "Copyright".
 | |
|  */
 | |
| /* @(#)comm0.h	1.8 */
 | |
| /*
 | |
|  * All preprocessor based options/constants/functions
 | |
|  */
 | |
| 
 | |
| /* ========== ON/OFF options (use #define in mach0.c) ========== */
 | |
| 
 | |
| /*
 | |
|  * The following options are available, to be set/removed in "mach0.c":
 | |
|  *	THREE_PASS:	three passes needed for branch optimization
 | |
|  *	BYTES_REVERSED:	lowest target address for word high-order byte
 | |
|  *	WORDS_REVERSED:	lowest target address for long high-order byte
 | |
|  *	LISTING:	include listing facilities
 | |
|  *	RELOCATION:	relocatable code generated
 | |
|  *	DEBUG:		for debugging purposes only
 | |
|  *	TMPDIR:		directory for temporary files
 | |
|  *	ASLD:		combined assembler/linker
 | |
|  */
 | |
| 
 | |
| /* ========== constants (use #undef, #define in mach0.c) ========== */
 | |
| 
 | |
| /* table sizes */
 | |
| #define	STRINGMAX	200	/* <= 256 */
 | |
| #define	BITMAX		2000	/* for short or long branches */
 | |
| #define	SECTMAX		64
 | |
| #define	NAMEMAX		80
 | |
| #define	MEMINCR		2048
 | |
| 
 | |
| /* Some character constants for parsing */
 | |
| #define	ASC_LPAR	'['
 | |
| #define	ASC_RPAR	']'
 | |
| #define	ASC_SQUO	'\''
 | |
| #define	ASC_DQUO	'"'
 | |
| #define	ASC_COMM	'!'
 | |
| #define	ISALPHA(c)	(isalpha(c) || (c) == '_' || (c) == '.')
 | |
| #define	ISALNUM(c)	(isalnum(c) || (c) == '_')
 | |
| 
 | |
| #define	GENLAB		"I"		/* compiler generated labels */
 | |
| 
 | |
| #define	ushort		unsigned short
 | |
| 
 | |
| #define	valu_t		short		/* type of expression values */
 | |
| #define	addr_t		ushort		/* type of dot */
 | |
| #define	word_t		short		/* type of keyword value */
 | |
| /*
 | |
|  * NOTE: word_t is introduced to reduce the tokenfile size for machines
 | |
|  * with large expressions but smaller opcodes (68000)
 | |
|  */
 | |
| 
 | |
| #define	ALIGNWORD	1
 | |
| #define	ALIGNSECT	1
 | |
| 
 | |
| #define	machstart(x)	/* nothing */
 | |
| #define	machfinish(x)	/* nothing */
 | |
| 
 | |
| #define	SETBASE(sp)	((long)(sp)->s_base)
 | |
| 
 | |
| #define	VALWIDTH	4
 | |
| 
 | |
| /* ========== Machine dependent option/constant settings ========== */
 | |
| 
 | |
| #include	"mach0.c"
 | |
| 
 | |
| /* ========== default option setting ========== */
 | |
| 
 | |
| #ifndef ASLD
 | |
| #ifndef RELOCATION
 | |
| separate linker only possible if relocation info produced
 | |
| #endif RELOCATION
 | |
| #endif ASLD
 | |
| 
 | |
| #ifndef DEBUG
 | |
| #define	DEBUG	1
 | |
| #endif
 | |
| 
 | |
| /* ========== Machine independent type declarations ========== */
 | |
| 
 | |
| #ifdef _include
 | |
| _include	<stdio.h>
 | |
| _include	<ctype.h>
 | |
| _include	<signal.h>
 | |
| #else
 | |
| #include	<stdio.h>
 | |
| #include	<ctype.h>
 | |
| #include	<signal.h>
 | |
| #endif
 | |
| 
 | |
| #ifdef ASLD
 | |
| #include	"arch.h"
 | |
| #endif
 | |
| #include	"out.h"
 | |
| 
 | |
| #if DEBUG == 0
 | |
| #define	assert(ex)	/* nothing */
 | |
| #endif
 | |
| 
 | |
| #if DEBUG == 1
 | |
| #define	assert(ex)	{if (!(ex)) assert1();}
 | |
| #endif
 | |
| 
 | |
| #if DEBUG == 2
 | |
| #define	assert(ex)	{if (!(ex)) assert2(__FILE__, __LINE__);}
 | |
| #endif
 | |
| 
 | |
| #define	CTRL(x) 	((x) & 037)
 | |
| 
 | |
| #define	lowb(z)		((int)(z) & 0xFF)
 | |
| #define	loww(z)		((int)(z) & 0xFFFF)
 | |
| 
 | |
| #define	fitb(x)		((((x) + 0x80) & ~0xFF) == 0)
 | |
| #define	fitw(x)		((((x) + 0x8000) & ~0xFFFF) == 0)
 | |
| 
 | |
| #define	fit(x)		if (!(x)) nofit()
 | |
| 
 | |
| #define	PASS_1		0
 | |
| #define	PASS_2		1
 | |
| #define	PASS_3		2
 | |
| 
 | |
| #ifdef THREE_PASS
 | |
| #define	PASS_SYMB	(pass != PASS_1)
 | |
| #define	PASS_RELO	(pass != PASS_1)
 | |
| #else
 | |
| #define	PASS_SYMB	1
 | |
| #define	PASS_RELO	1
 | |
| #endif THREE_PASS
 | |
| 
 | |
| #ifdef ASLD
 | |
| #define	RELOMOVE(a,b)	/* empty */
 | |
| #else
 | |
| #define	RELOMOVE(a,b)	{a = b; b = 0;}
 | |
| #endif
 | |
| 
 | |
| /* symbol table management */
 | |
| #define	H_SIZE		256		/* hash size */
 | |
| #define	H_KEY		(0*H_SIZE)	/* key symbol headers */
 | |
| #define	H_LOCAL		(1*H_SIZE)	/* module symbol headers */
 | |
| #ifdef ASLD
 | |
| #define	H_GLOBAL	(2*H_SIZE)	/* external symbol headers */
 | |
| #define	H_TOTAL		(3*H_SIZE)
 | |
| #else
 | |
| #define	H_TOTAL		(2*H_SIZE)
 | |
| #endif
 | |
| 
 | |
| /* numeric label table management */
 | |
| #define	FB_SIZE		10
 | |
| #define	FB_HEAD		(0*FB_SIZE)
 | |
| #define	FB_TAIL		(1*FB_SIZE)
 | |
| #define	FB_BACK		(2*FB_SIZE)
 | |
| #define	FB_FORW		(3*FB_SIZE)
 | |
| 
 | |
| /* miscellaneous */
 | |
| #define	KEYDEFINE	0
 | |
| #define KEYSECT		12
 | |
| #define	DOTGAIN		DOTSCT->s_gain
 | |
| 
 | |
| /* ========== type declarations ========== */
 | |
| 
 | |
| struct expr_t {
 | |
| 	short	typ;
 | |
| 	valu_t	val;
 | |
| };
 | |
| 
 | |
| typedef	struct expr_t	expr_t;
 | |
| 
 | |
| struct item_t {
 | |
| 	struct item_t *
 | |
| 		i_next;	/* linked lists with same hash value */
 | |
| 	short	i_type;
 | |
| 	/*
 | |
| 	 * the i_type field is used for two different purposes:
 | |
| 	 *	- the token type for keywords, returned by yylex()
 | |
| 	 *	- the symbol type for IDENT and FBSYM tokens
 | |
| 	 */
 | |
| 	valu_t	i_valu;		/* symbol value */
 | |
| 	char	*i_name;	/* symbol name */
 | |
| };
 | |
| 
 | |
| struct common_t {
 | |
| 	struct common_t *
 | |
| 		c_next;
 | |
| 	struct item_t *c_it;
 | |
| #ifndef ASLD
 | |
| 	valu_t	c_size;
 | |
| #endif
 | |
| };
 | |
| 
 | |
| typedef struct common_t	common_t;
 | |
| 
 | |
| typedef	struct item_t	item_t;
 | |
| 
 | |
| struct sect_t {
 | |
| 	short	s_flag;		/* some flag bits */
 | |
| 	addr_t	s_base;		/* section base */
 | |
| 	addr_t	s_size;		/* section size */
 | |
| 	addr_t	s_comm;		/* length of commons */
 | |
| 	addr_t	s_zero;		/* delayed emit1(0) */
 | |
| 	addr_t	s_lign;		/* section alignment */
 | |
| 	long	s_foff;		/* section file offset */
 | |
| 	item_t	*s_item;	/* points to section name */
 | |
| #ifdef THREE_PASS
 | |
| 	addr_t	s_gain;		/* gain in PASS_2 */
 | |
| #endif
 | |
| };
 | |
| 
 | |
| typedef	struct sect_t	sect_t;
 | |
| 
 | |
| /* ========== flag field bits ========== */
 | |
| 
 | |
| /* s_flag bits: */
 | |
| #define	BASED		1	/* at fixed position */
 | |
| 
 | |
| /* sflag bits: */
 | |
| #define	SYM_EXT		001	/* external symbols */
 | |
| #define	SYM_LOC		002	/* local symbols */
 | |
| #define	SYM_LAB		004	/* local, compiler-generated labels */
 | |
| #define	SYM_SMB		010	/* .symb symbols */
 | |
| #define	SYM_LIN		020	/* .line and .file */
 | |
| #define	SYM_SCT		040	/* section names */
 | |
| #define	SYM_DEF		073	/* default value */
 | |
| 
 | |
| /*
 | |
|  * extra type bits out of S_ETC, internal use only
 | |
|  * S_VAR:
 | |
|  *  - type not known at end of PASS_1 (S_VAR|S_UND)
 | |
|  *  - value not known at end of PASS_2 (S_VAR|S_ABS)
 | |
|  * S_DOT:
 | |
|  *  - dot expression
 | |
|  */
 | |
| #define	S_VAR		0x0200
 | |
| #define	S_DOT		0x0400
 | |
| /* should be tested by preprocessor
 | |
|  * due to error in preprocessor it cannot
 | |
|  * test performed at compiletime by a switch now
 | |
|  * #if (S_ETC|S_COM|S_VAR|S_DOT) != S_ETC
 | |
|  * incorrect type bits
 | |
|  * #endif
 | |
|  */
 | |
| 
 | |
| /* parts of the a.out file */
 | |
| #define	PARTEMIT	0
 | |
| #define	PARTRELO	1
 | |
| #define	PARTNAME	2
 | |
| #define	PARTCHAR	3
 | |
| #define	PARTS		4
 | |
| 
 | |
| #ifdef BYTES_REVERSED
 | |
| #ifdef WORDS_REVERSED
 | |
| #define MACHREL_BWR	(RELBR|RELWR)
 | |
| #else
 | |
| #define	MACHREL_BWR	(RELBR)
 | |
| #endif
 | |
| #else
 | |
| #ifdef WORDS_REVERSED
 | |
| #define	MACHREL_BWR	(RELWR)
 | |
| #else
 | |
| #define	MACHREL_BWR	(0)
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| extern FILE *fopen();   /* some systems don't have this in stdio.h */
 |