work on clang. I have no idea whether it runs or not as building a e.out program is quite hard and needs a special platform.
		
			
				
	
	
		
			159 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| 	Defines and externs of general interest
 | |
| */
 | |
| 
 | |
| /* $Id$ */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <stdint.h>
 | |
| 
 | |
| /********* PRIVATE/static *********/
 | |
| 
 | |
| #define	PRIVATE		static		/* or not */
 | |
| 
 | |
| 
 | |
| /********* The internal data types ********/
 | |
| 
 | |
| #define	UNSIGNED			/* the normal case */
 | |
| #ifdef	UNSIGNED
 | |
| 
 | |
| /* The EM pointer is an abstract type and requires explicit conversion*/
 | |
| typedef unsigned long ptr;		/* pointer to EM address */
 | |
| #define	p2i(p)		(p)		/* convert pointer to index */
 | |
| #define	i2p(p)		(ptr)(p)	/* convert index to pointer */
 | |
| 
 | |
| #else	/* UNSIGNED */
 | |
| 
 | |
| typedef char *ptr;			/* pointer to EM address */
 | |
| #define	p2i(p)		(long)(p)	/* convert pointer to index */
 | |
| #define	i2p(p)		(ptr)(p)	/* convert index to pointer */
 | |
| 
 | |
| #endif /* UNSIGNED */
 | |
| 
 | |
| /* The EM size is an integer type; a cast suffices */
 | |
| typedef long size;
 | |
| 
 | |
| 
 | |
| /********* Mathematical constants ********/
 | |
| 
 | |
| #define	I_MAXU1		255L
 | |
| #define	I_MAXS1		127L
 | |
| #define	I_MINS1		(-127L-1L)
 | |
| 
 | |
| #define	I_MAXU2		65535L
 | |
| #define	I_MAXS2		32767L
 | |
| #define	I_MINS2		(-32767L-1L)
 | |
| 
 | |
| #define	I_MAXU4		4294967295L
 | |
| #define	I_MAXS4		2147483647L
 | |
| #define	I_MINS4		(-2147483647L-1L)
 | |
| 
 | |
| #define	FL_MAXU1	255.0
 | |
| #define	FL_MAXS1	127.0
 | |
| #define	FL_MINS1	-128.0
 | |
| 
 | |
| #define	FL_MAXU2	65535.0
 | |
| #define	FL_MAXS2	32767.0
 | |
| #define	FL_MINS2	-32768.0
 | |
| 
 | |
| #define	FL_MAXU4	4294967295.0
 | |
| #define	FL_MAXS4	2147483647.0
 | |
| #define	FL_MINS4	-2147483648.0
 | |
| 
 | |
| #define	BIT(n)		(1L<<(n))
 | |
| 
 | |
| #define	SIGNBIT1	BIT(7)		/* Signbit of one byte signed int */
 | |
| #define	SIGNBIT2	BIT(15)		/* Signbit of two byte signed int */
 | |
| #define	SIGNBIT4	BIT(31)		/* Signbit of four byte signed int */
 | |
| 
 | |
| #define	MASK1		0xFF		/* To mask one byte */
 | |
| #define	MASK2		0xFFFF		/* To mask two bytes */
 | |
| 
 | |
| 
 | |
| /******** Machine constants ********/
 | |
| 
 | |
| #define	MAX_OFF2	I_MAXS2
 | |
| #define	MAX_OFF4	I_MAXS4
 | |
| 
 | |
| 
 | |
| /******** EM machine data sizes ********/
 | |
| 
 | |
| #define	FRALIMIT	8L		/* Default limit */
 | |
| #define	LINSIZE		4L		/* Fixed size of LIN number */
 | |
| 
 | |
| 
 | |
| /******** EM Machine capacity parameters ********/
 | |
| 
 | |
| extern size wsize;		/* wordsize */
 | |
| extern size dwsize;		/* double wordsize */
 | |
| extern size psize;		/* pointersize */
 | |
| extern long i_minsw;		/* Min. value for signed integer of wsize */
 | |
| extern long i_maxsw;		/* Max. value for signed integer of wsize */
 | |
| extern unsigned long i_maxuw;	/* Max. value for unsigned integer of wsize */
 | |
| extern long min_off;		/* Minimum offset */
 | |
| extern long max_off;		/* Maximum offset */
 | |
| extern ptr max_addr;		/* Maximum address */
 | |
| extern size wsizem1;		/* wordsize - 1 */
 | |
| 
 | |
| 
 | |
| /******** EM program parameters ********/
 | |
| 
 | |
| extern ptr ML;			/* Memory Limit */
 | |
| extern ptr HB;			/* Heap Base */
 | |
| extern ptr DB;			/* Procedure Descriptor Base, end of text */
 | |
| extern long NProc;		/* Number of Procedure Descriptors */
 | |
| extern long PreIgnMask;		/* Preset Ignore Mask, from command line */
 | |
| 
 | |
| 
 | |
| /******** EM machine registers ********/
 | |
| 
 | |
| #define	UNDEFINED	(0)
 | |
| #define	DEFINED		(1)
 | |
| 
 | |
| extern long PI;			/* Procedure Identifier of running proc */
 | |
| extern ptr PC;			/* Program Counter */
 | |
| 
 | |
| extern ptr HP;			/* Heap Pointer */
 | |
| extern ptr SP;			/* Stack Pointer */
 | |
| extern ptr LB;			/* Local Base */
 | |
| extern ptr AB;			/* Actual Base */
 | |
| 
 | |
| extern long ES;			/* program Exit Status */
 | |
| extern int ES_def;		/* set iff Exit Status legal */
 | |
| 
 | |
| #define	TR_ABORT	(1)
 | |
| #define	TR_HALT		(2)
 | |
| #define	TR_TRAP		(3)
 | |
| extern int OnTrap;		/* what to do upon trap */
 | |
| extern long IgnMask;		/* Ignore Mask for traps */
 | |
| extern long TrapPI;		/* Procedure Identifier of trap routine */
 | |
| 
 | |
| extern char *FRA;		/* Function Return Area */
 | |
| extern size FRALimit;		/* Function Return Area maximum Size */
 | |
| extern size FRASize;		/* Function Return Area actual Size */
 | |
| extern int FRA_def;		/* set iff Function Return Area legal */
 | |
| 
 | |
| 
 | |
| /******** The EM Machine Memory ********/
 | |
| 
 | |
| extern char *text;		/* program text & procedure descriptors */
 | |
| 
 | |
| extern char *data;		/* global data & heap space */
 | |
| extern ptr HL;			/* Heap Limit */
 | |
| 
 | |
| extern char *stack;		/* stack space and local data */
 | |
| extern char *stackML;		/* stack + ML, to speed up stack accesses */
 | |
| extern ptr SL;			/* Stack Limit */
 | |
| 
 | |
| 
 | |
| /********* Global inline functions ********/
 | |
| 
 | |
| #define	btol(c)		(long)((c) & MASK1)
 | |
| #define	btou(c)		(unsigned int)((c) & MASK1)
 | |
| #define	btos(c)		(c)
 | |
| 
 | |
| #define	max(i,j)	(((i) > (j)) ? (i) : (j))
 | |
| #define	min(i,j)	(((i) < (j)) ? (i) : (j))
 | |
| 
 | |
| 
 |