253 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			253 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  * See the copyright notice in the ACK home directory, in the file "Copyright".
 | |
|  */
 | |
| #include <stdio.h>
 | |
| #include "../../h/em_spec.h"
 | |
| #include "../../h/as_spec.h"
 | |
| #include "../../h/em_flag.h"
 | |
| #include "../../h/arch.h"
 | |
| #include "../../h/local.h"
 | |
| 
 | |
| #define	RCS_ASS	"$Header$"
 | |
| 
 | |
| /*
 | |
|  * compile time options
 | |
|  */
 | |
| 
 | |
| #define DUMP            1       /* dump between passes */
 | |
| /*  #define TIMING          1       /* some timing measurements */
 | |
| /*  #define JOHAN           1       /* dump the loaded instructions */
 | |
| #define MEMUSE          1       /* print memory usage statistics */
 | |
| 
 | |
| #ifndef DUMP
 | |
| #define dump(x)                  /* nothing */
 | |
| #endif
 | |
| 
 | |
| #ifndef TIMING
 | |
| #define timing()                /* nothing */
 | |
| #endif
 | |
| 
 | |
| #ifndef MEMUSE
 | |
| #define memuse()                /* nothing */
 | |
| #endif
 | |
| 
 | |
| /* Used to clear the upper byte(s) of characters.
 | |
|    Not nessecary if your C-compiler does not sign-extend char's
 | |
| */
 | |
| 
 | |
| #ifdef CPM
 | |
| # define        LC(ch)   ( ((ch)<'A' | (ch)>'Z' ) ? (ch) : ((ch)-('A'-'a')))
 | |
| #else
 | |
| # define        LC(ch)          (ch)
 | |
| #endif
 | |
| 
 | |
| #define ctrunc(val)             ( (val)&0377 )
 | |
| 
 | |
| #define odd(n)                  ((n)&1)         /* Boolean odd function */
 | |
| 
 | |
| #define lnp_cast                (line_t *)
 | |
| #define gbp_cast                (glob_t *)
 | |
| #define lbp_cast                (locl_t *)
 | |
| #define prp_cast                (proc_t *)
 | |
| #define ptp_cast                (ptab_t *)
 | |
| #define rlp_cast                (relc_t *)
 | |
| #define pst_cast                (stat_t *)
 | |
| #define chp_cast                (char   *)
 | |
| #define ipp_cast                (int   **)
 | |
| #define iip_cast                (int    *)
 | |
| #define int_cast                (int     )
 | |
| 
 | |
| typedef struct lines            line_t;
 | |
| typedef struct loc_label        locl_t;
 | |
| typedef struct glob_label       glob_t;
 | |
| typedef struct rel              relc_t;
 | |
| typedef struct procstat         stat_t;
 | |
| typedef struct sizes            size_t;
 | |
| typedef struct ar_hdr           arch_t;
 | |
| typedef struct procs            proc_t;
 | |
| typedef struct proctab          ptab_t;
 | |
| typedef char *                  area_t;
 | |
| typedef long                    cons_t;
 | |
| 
 | |
| typedef union {
 | |
| 	cons_t  ad_i;
 | |
| 	locl_t  *ad_lp;
 | |
| 	glob_t  *ad_gp;
 | |
| 	proc_t  *ad_pp;
 | |
| 	struct sad_ln {
 | |
| 		short   ln_extra;
 | |
| 		short   ln_first;
 | |
| 	}       ad_ln ;
 | |
| 	struct sad_df {
 | |
| 		cons_t  df_i;
 | |
| 		glob_t  *df_gp;
 | |
| 	}       ad_df;
 | |
| }       addr_u;
 | |
| 
 | |
| typedef union {
 | |
| 	cons_t  rel_i;
 | |
| 	locl_t  *rel_lp;
 | |
| 	glob_t  *rel_gp;
 | |
| } rel_u;
 | |
| 
 | |
| #define FOFFSET         long             /* offset into file */
 | |
| 
 | |
| /*
 | |
|  * Global variables and definitions for EM1-assembler/loader
 | |
|  */
 | |
| 
 | |
| #define DEFINING        0       /* parameters for glolookup */
 | |
| #define OCCURRING       1
 | |
| #define INTERNING       2
 | |
| #define EXTERNING       3
 | |
| #define SEARCHING       4
 | |
| #define ENTERING        5
 | |
| 
 | |
| #define PRO_OCC         0       /* parameters for prolookup */
 | |
| #define PRO_DEF         1
 | |
| #define PRO_INT         2
 | |
| #define PRO_EXT         3
 | |
| 
 | |
| #define TRUE            1
 | |
| #define FALSE           0
 | |
| 
 | |
| #define MAXBYTE 255
 | |
| 
 | |
| #define MAXSTRING       200     /* Maximum string length accepted */
 | |
| #define LOCLABSIZE      128     /* size of local label hash table */
 | |
| 				/* may not be smaller */
 | |
| #define ABSSIZE         8
 | |
| 
 | |
| struct  lines {
 | |
| 	char    instr_num;      /* index into mnemon[] */
 | |
| 	char    type1;          /* see below */
 | |
| 	line_t  *l_next;        /* next in chain */
 | |
| 	char    *opoff;         /* pointer into opchoice[] */
 | |
| 	addr_u  ad;             /* depending on type, various pointers */
 | |
| };
 | |
| 
 | |
| /* contents of type1 */
 | |
| #define MISSING         0       /* no operand */
 | |
| #define CONST           1       /* ad contains operand */
 | |
| #define PROCNAME        2       /* ad contains struct procs pointer */
 | |
| #define GLOSYM          3       /* ad contains pointer into mproc[] */
 | |
| #define LOCSYM          4       /* ad contains pointer into locs[] */
 | |
| #define GLOOFF          5       /* ad contains CONST and GLOSYM in ad_df */
 | |
| #define LINES           6       /* Line number setting, only param of pseudo*/
 | |
| #define VALLOW          7       /* value's between LOW and HIGH are x-MID */
 | |
| #define VALMID         50
 | |
| #define VALHIGH       127       /* to avoid sign extension problems */
 | |
| 
 | |
| #define VAL1(x)         ((x)-VALMID)
 | |
| 
 | |
| /* Used to indicate a invalid contents of opoff */
 | |
| #define NO_OFF          ((char *)-1)
 | |
| 
 | |
| /* The structure containing procedure pertinent data */
 | |
| /* Used for environment stacking for nested PRO's */
 | |
| 
 | |
| struct  procstat  {
 | |
| 	line_t  *s_fline;       /* points to first line of procedure */
 | |
| 	locl_t  (*s_locl)[];    /* pointer to local labels */
 | |
| 	proc_t  *s_curpro;      /* identifies current procedure */
 | |
| 	relc_t  *s_fdata;       /* last datareloc before procedure */
 | |
| 	stat_t  *s_prevstat;    /* backward chain of nested procedures */
 | |
| } ;
 | |
| 
 | |
| struct  loc_label {
 | |
| 	locl_t  *l_chain;       /* The next label with same low order bits */
 | |
| 	char    l_hinum;        /* high bits of number of label */
 | |
| 	char    l_defined;      /* see below */
 | |
| 	int     l_min,l_max;    /* boundaries of value */
 | |
| };
 | |
| 
 | |
| /* contents of l_defined */
 | |
| #define EMPTY           0       /* Empty slot */
 | |
| #define NO              1       /* not defined yet */
 | |
| #define YES             2       /* defined */
 | |
| #define SEEN            3       /* intermediate state */
 | |
| #define NOTPRESENT      4       /* Undefined and error message given */
 | |
| 
 | |
| struct  glob_label {
 | |
| 	char    *g_name;
 | |
| 	char    g_status;               /* see below */
 | |
| 	union {
 | |
| 		cons_t  g_addr;         /* value if status&DEF */
 | |
| 		struct glob_label *g_gp; /* ref. to xglobs */
 | |
| 	} g_val ;
 | |
| };
 | |
| 
 | |
| #define glostring(gl)   ((gl)->g_name)
 | |
| 
 | |
| /* contents of g_status */
 | |
| #define DEF             01      /* defined */
 | |
| #define OCC             02      /* used */
 | |
| #define EXT             04      /* external */
 | |
| 
 | |
| struct  rel {                   /* for relocation tables */
 | |
| 	relc_t  *r_next;        /* chain */
 | |
| 	FOFFSET r_off;          /* offset in text/data of word to relocate */
 | |
| 	rel_u   r_val;          /* constant or pointer to global symbol */
 | |
| 	int     r_typ;          /* different use in text or data */
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * When used with textrelocation r_typ contains the flag bits as defined
 | |
|  * in ip_spec.h together with the RELMNS bit if r_val contains an integer
 | |
|  */
 | |
| 
 | |
| #define RELMNS          020000          /* indicates integer i.s.o. glob */
 | |
| 
 | |
| /* Contents of r_typ when used with data relocation */
 | |
| #define RELNULL         0
 | |
| #define RELGLO          1
 | |
| #define RELHEAD         2
 | |
| #define RELLOC          3
 | |
| #define RELADR          4
 | |
| 
 | |
| /* modes of data output */
 | |
| #define DATA_NUL        0
 | |
| #define DATA_REP        1
 | |
| #define DATA_CONST      2
 | |
| #define DATA_BSS        3
 | |
| #define DATA_DPTR       4
 | |
| #define DATA_IPTR       5
 | |
| #define DATA_ICON       6
 | |
| #define DATA_UCON       7
 | |
| #define DATA_FCON       8
 | |
| #define DATA_BYTES      9
 | |
| 
 | |
| /* name of procedure to be called first */
 | |
| #define MAIN            "m_a_i_n"
 | |
| 
 | |
| /* headers of datablocks written */
 | |
| #define HEADREP         0
 | |
| #define HEADBSS         1
 | |
| #define HEADBYTE        2
 | |
| #define HEADCONST       3
 | |
| #define HEADDPTR        4
 | |
| #define HEADIPTR        5
 | |
| #define HEADICON        6
 | |
| #define HEADUCON        7
 | |
| #define HEADFCON        8
 | |
| 
 | |
| #define NDEFAULT        4       /* number of different sizes available */
 | |
| struct  sizes {
 | |
| 	int     n_mlab;         /* # of global labels per module */
 | |
| 	int     n_glab;         /* # of extern global labels */
 | |
| 	int     n_mproc;        /* # of local procs per module */
 | |
| 	int     n_xproc;        /* # of external procs */
 | |
| 	int     n_proc;         /* total # of procedures */
 | |
| };
 | |
| 
 | |
| struct  procs {                 /* format of mprocs[] and xprocs[] */
 | |
| 	char    *p_name;
 | |
| 	char    p_status;       /* same bits as g_status except REL */
 | |
| 	int     p_num;          /* unique procedure descriptor */
 | |
| };
 | |
| 
 | |
| struct  proctab {
 | |
| 	cons_t  pr_off;         /* distance from pb */
 | |
| 	cons_t  pr_loc;         /* number of bytes locals */
 | |
| };
 |