248 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#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 IDLENGTH        8       /* length of glo's and pro's */
 | 
						|
#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[IDLENGTH+1];     /* name + null-byte */
 | 
						|
	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        3       /* 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[IDLENGTH+1];     /* name + 1 null-byte */
 | 
						|
	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 */
 | 
						|
};
 |