#ifndef LSPTYPES_H
#define LSPTYPES_H 1
/*  @(#) lsptypes.h Version 1.4 (12/29/94). copyright Venue   */

/************************************************************************/
/*									*/
/*	(C) Copyright 1989-92 Venue. All Rights Reserved.		*/
/*	Manufactured in the United States of America.			*/
/*									*/
/************************************************************************/

/**********************************************************************/
/*
		File Name :	lsptypes.h

		Define Constants for Datatype

*/
/**********************************************************************/
#include "version.h" /* for BIGVM, BIGATOMS */
#include <stdint.h> /* for int32_t */
#include "lispemul.h" /* for LispPTR, DLword */

/************************************************************************/
/*									*/
/*		T Y P E   T A B L E    M A S K    B I T S		*/
/*									*/
/*  These are used for quick type checks, and are ORed into the type	*/
/*  number in the DTD.							*/
/*									*/
/*  [TT_LISPREF renamed to TT_SYMBOLP 2/7/91 by JDS for 3-byte atoms]	*/
/*									*/
/************************************************************************/

#define TT_ATOM		0x0800	/* ATOM in CL sense			 */
#define TT_NUMBERP	0x1000	/* It's a number. 			 */
#define TT_FIXP		0x2000	/* It's an integer.			 */
#define TT_SYMBOLP	0x4000	/* It's a symbol (LITATOM or NEWATOM.	 */
#define TT_NOREF	0x8000	/* Don't Refcount these objects.	 */




/************************************************************************/
/*									*/
/*			T Y P E   N U M B E R S				*/
/*									*/
/*  These are the type numbers "known to the microcode".  This must     */
/*  match the list \BUILT-IN-SYSTEM-TYPES, in LLDATATYPE.  It's the     */
/*  list of types that MUST be known to microcode or emulator, and      */
/*  which can't rely on the luck of what's loaded when for assignment.  */
/*									*/
/*  Change History:	2/27/89 Sybalsky  Added BIGNUM-PATHNAME, to     */
/*					  support SXHASH opcode. 	*/
/*			3/1/89	Sybalsky  Added type #s for hunked	*/
/*					  storage, for use in GC, in	*/
/*					  place of absolute #s (!!)	*/
/*			7/25/90 Osamu     Added type# for NEWATOM.						*/
/************************************************************************/

#define TYPE_ARRAYBLOCK		0	/* Pseudo type # for array blocks */
#define TYPE_SMALLP		1
#define TYPE_FIXP		2
#define TYPE_FLOATP		3
#define TYPE_LITATOM		4
#define TYPE_LISTP		5
#define TYPE_ARRAYP		6
#define TYPE_STRINGP		7	/* old IL strings (obs) */
#define TYPE_STACKP		8
#define TYPE_CHARACTERP		9
#define TYPE_VMEMPAGEP		10
#define TYPE_STREAM		11

#define TYPE_BITMAP		12
#define TYPE_COMPILED_CLOSURE	13
#define TYPE_ONED_ARRAY		14	/* array, string */
#define TYPE_TWOD_ARRAY		15
#define TYPE_GENERAL_ARRAY	16

#define TYPE_BIGNUM		17	/* Bignums */
#define TYPE_RATIO		18	/* Commonlisp rationals */
#define TYPE_COMPLEX		19	/* Commonlisp complex's */
#define TYPE_PATHNAME		20	/* CL path-name structure */

#ifdef BIGATOMS
#define TYPE_NEWATOM		21	/* New Atom */

/* type number 22~30 reserved for future use */

#define TYPE_PTRHUNK1		31	/********************************/
#define TYPE_PTRHUNK2		32	/*  				*/
#define TYPE_PTRHUNK3		33	/*  Type numbers for "hunked"	*/
#define TYPE_PTRHUNK4		34	/*  Storage region, used for	*/
#define TYPE_PTRHUNK5		35	/*  small arrays.  This range	*/
#define TYPE_PTRHUNK6		36	/*  is for arrays of pointers.	*/
#define TYPE_PTRHUNK7		37	/*				*/
#define TYPE_PTRHUNK8		38	/********************************/
#define TYPE_PTRHUNK9		39
#define TYPE_PTRHUNK10		40
#define TYPE_PTRHUNK11		41
#define TYPE_PTRHUNK12		42
#define TYPE_PTRHUNK13		43

#define TYPE_UNBOXEDHUNK1	44	/********************************/
#define TYPE_UNBOXEDHUNK2	45	/*  				*/
#define TYPE_UNBOXEDHUNK3	46	/*  This range is for arrays	*/
#define TYPE_UNBOXEDHUNK4	47	/*  of unboxed items -- the	*/
#define TYPE_UNBOXEDHUNK5	48	/*  contents are not GC'd	*/
#define TYPE_UNBOXEDHUNK6	49	/*				*/
#define TYPE_UNBOXEDHUNK7	50	/********************************/
#define TYPE_UNBOXEDHUNK8	51
#define TYPE_UNBOXEDHUNK9	52
#define TYPE_UNBOXEDHUNK10	53
#define TYPE_UNBOXEDHUNK11	54
#define TYPE_UNBOXEDHUNK12	55
#define TYPE_UNBOXEDHUNK13	56
#define TYPE_UNBOXEDHUNK14	57
#define TYPE_UNBOXEDHUNK15	58
#define TYPE_UNBOXEDHUNK16	59
#define TYPE_UNBOXEDHUNK17	60
#define TYPE_UNBOXEDHUNK18	61
#define TYPE_UNBOXEDHUNK19	62
#define TYPE_UNBOXEDHUNK20	63

#define TYPE_CODEHUNK1		64	/********************************/
#define TYPE_CODEHUNK2		65	/*  				*/
#define TYPE_CODEHUNK3		66	/*  This range is for small	*/
#define TYPE_CODEHUNK4		67	/*  CODE blocks -- the code 	*/
#define TYPE_CODEHUNK5		68	/*  for small functions.  It	*/
#define TYPE_CODEHUNK6		69	/*  gets reclaimed using the	*/
#define TYPE_CODEHUNK7		70	/*  function reclaimcodeblock.	*/
#define TYPE_CODEHUNK8		71	/*				*/
#define TYPE_CODEHUNK9		72	/********************************/
#define TYPE_CODEHUNK10		73


#define INIT_TYPENUM		74

#else
#define TYPE_PTRHUNK1		21	/********************************/
#define TYPE_PTRHUNK2		22	/*  				*/
#define TYPE_PTRHUNK3		23	/*  Type numbers for "hunked"	*/
#define TYPE_PTRHUNK4		24	/*  Storage region, used for	*/
#define TYPE_PTRHUNK5		25	/*  small arrays.  This range	*/
#define TYPE_PTRHUNK6		26	/*  is for arrays of pointers.	*/
#define TYPE_PTRHUNK7		27	/*				*/
#define TYPE_PTRHUNK8		28	/********************************/
#define TYPE_PTRHUNK9		29
#define TYPE_PTRHUNK10		30
#define TYPE_PTRHUNK11		31
#define TYPE_PTRHUNK12		32
#define TYPE_PTRHUNK13		33

#define TYPE_UNBOXEDHUNK1	34	/********************************/
#define TYPE_UNBOXEDHUNK2	35	/*  				*/
#define TYPE_UNBOXEDHUNK3	36	/*  This range is for arrays	*/
#define TYPE_UNBOXEDHUNK4	37	/*  of unboxed items -- the	*/
#define TYPE_UNBOXEDHUNK5	38	/*  contents are not GC'd	*/
#define TYPE_UNBOXEDHUNK6	39	/*				*/
#define TYPE_UNBOXEDHUNK7	40	/********************************/
#define TYPE_UNBOXEDHUNK8	41
#define TYPE_UNBOXEDHUNK9	42
#define TYPE_UNBOXEDHUNK10	43
#define TYPE_UNBOXEDHUNK11	44
#define TYPE_UNBOXEDHUNK12	45
#define TYPE_UNBOXEDHUNK13	46
#define TYPE_UNBOXEDHUNK14	47
#define TYPE_UNBOXEDHUNK15	48
#define TYPE_UNBOXEDHUNK16	49
#define TYPE_UNBOXEDHUNK17	50
#define TYPE_UNBOXEDHUNK18	51
#define TYPE_UNBOXEDHUNK19	52
#define TYPE_UNBOXEDHUNK20	53

#define TYPE_CODEHUNK1		54	/********************************/
#define TYPE_CODEHUNK2		55	/*  				*/
#define TYPE_CODEHUNK3		56	/*  This range is for small	*/
#define TYPE_CODEHUNK4		57	/*  CODE blocks -- the code 	*/
#define TYPE_CODEHUNK5		58	/*  for small functions.  It	*/
#define TYPE_CODEHUNK6		59	/*  gets reclaimed using the	*/
#define TYPE_CODEHUNK7		60	/*  function reclaimcodeblock.	*/
#define TYPE_CODEHUNK8		61	/*				*/
#define TYPE_CODEHUNK9		62	/********************************/
#define TYPE_CODEHUNK10		63


#define INIT_TYPENUM		64

#endif /* BIGATOMS */



#ifndef BYTESWAP
	/* Normal byte-order versions of declarations */
#ifdef BIGVM
struct dtd {
	unsigned unuse	:2 ;
	unsigned dtd_obsolate :1 ;
	unsigned dtd_finalizable :1 ;
	unsigned dtd_name: 28 ;	/* type name */
	DLword dtd_cnt0 ;
	DLword dtd_size ;
	LispPTR dtd_free ;		/* really a FULLXPOINTER */
	unsigned dtd_lockedp : 1 ;
	unsigned dtd_hunkp : 1 ;
	unsigned dtd_gctype :2 ;
	unsigned dtd_descrs: 28;
	LispPTR dtd_typespecs;
	LispPTR dtd_ptrs ;
	int  dtd_oldcnt;
	int dtd_nextpage ;
	DLword dtd_typeentry ;
	DLword dtd_supertype ;
};

typedef  struct stringp {

	unsigned origin			: 1 ;
	unsigned substringed		: 1 ;
	unsigned readonly		: 1 ;
	unsigned nil			: 1 ;

	unsigned base			: 28 ;
	unsigned type			: 4 ;
	unsigned   length: 28 ;
	LispPTR   offset ;
 } STRINGP ;

typedef struct oned_array {
		unsigned int nil1 : 4 ;
		unsigned int base : 28  ;
		unsigned int readonlyp :1 ;
		unsigned int indirectp : 1; /* as used arrayheader */
		unsigned int bitp :1 ;
		unsigned int stringp : 1;
		unsigned int ajustablep : 1; /* as used arrayheader */
		unsigned int displacedp : 1;
		unsigned int fillpointerp :1;
		unsigned int extendablep : 1;
		unsigned int typenumber : 8 ;
		DLword offset;
		int32_t fillpointer ;
		int32_t totalsize ; } OneDArray;

typedef struct oned_array NEWSTRINGP;

typedef struct general_array {
		unsigned int nil1 : 4 ;
		unsigned int base : 28  ;
		unsigned int readonlyp :1 ;
		unsigned int indirectp : 1; /* as used arrayheader */
		unsigned int bitp :1 ;
		unsigned int stringp : 1;
		unsigned int ajustablep : 1; /* as used arrayheader */
		unsigned int displacedp : 1;
		unsigned int fillpointerp :1;
		unsigned int extendablep : 1;
		unsigned int typenumber : 8 ;
		unsigned int nil2:16;
		int32_t Dim0;
		int32_t totalsize;
		int32_t Dim1 ;
		int32_t Dim2 ; } LispArray;

typedef struct compiled_closure {
		unsigned int nil1	: 4 ;
		unsigned int def_ptr	: 28; /* function */
		unsigned int nil2	: 4 ;
		unsigned int env_ptr	: 28; /* environment */
  } CClosure ;
#else
/* Structure for DTD */
struct dtd {
	DLword dtd_namelo ;
	DLword dtd_size ;
	LispPTR dtd_free ;		/* really a FULLXPOINTER */
	unsigned unuse	:2 ;
	unsigned dtd_obsolate :1 ;
	unsigned dtd_finalizable :1 ;
	unsigned dtd_lockedp : 1 ;
	unsigned dtd_hunkp : 1 ;
	unsigned dtd_gctype :2 ;
	unsigned dtd_descrs : 24;
	unsigned dtd_namehi : 8;
	unsigned dtd_typespecs : 24 ;
	LispPTR dtd_ptrs ;
	int  dtd_oldcnt;
	DLword dtd_cnt0 ;
	DLword dtd_nextpage ;
	DLword dtd_typeentry ;
	DLword dtd_supertype ;
};

typedef  struct stringp {
	unsigned origin			: 1 ;
	unsigned substringed		: 1 ;
	unsigned readonly		: 1 ;
	unsigned nil			: 1 ;
	unsigned type			: 4 ;

	unsigned base			: 24 ;
	DLword   length ;
	DLword   offset ;
 } STRINGP ;

typedef struct oned_array {
		unsigned int nil1 : 8 ;
		unsigned int base : 24  ;
		unsigned int readonlyp :1 ;
		unsigned int indirectp : 1; /* as used arrayheader */
		unsigned int bitp :1 ;
		unsigned int stringp : 1;
		unsigned int ajustablep : 1; /* as used arrayheader */
		unsigned int displacedp : 1;
		unsigned int fillpointerp :1;
		unsigned int extendablep : 1;
		unsigned int typenumber : 8 ;
		DLword offset;
		DLword fillpointer ;
		DLword totalsize ; } OneDArray;

typedef struct oned_array NEWSTRINGP;

typedef struct general_array {
		unsigned int nil1 : 8 ;
		unsigned int base : 24  ;
		unsigned int readonlyp :1 ;
		unsigned int indirectp : 1; /* as used arrayheader */
		unsigned int bitp :1 ;
		unsigned int stringp : 1;
		unsigned int ajustablep : 1; /* as used arrayheader */
		unsigned int displacedp : 1;
		unsigned int fillpointerp :1;
		unsigned int extendablep : 1;
		unsigned int typenumber : 8 ;
		DLword Dim0;
		DLword totalsize;
		DLword Dim1 ;
		DLword Dim2 ; } LispArray;

typedef struct compiled_closure {
		unsigned int nil1	: 8 ;
		unsigned int def_ptr	: 24; /* function */
		unsigned int nil2	: 8 ;
		unsigned int env_ptr	: 24; /* environment */
  } CClosure ;
#endif /* BIGVM */

/* Structure for initialdtdcontents */
 struct system_dtd_contents {
	char   *dtd_name ;  /* type name string >> changed 4-feb-87 */
	DLword  name_len ;  /* type name length in BYTE 27-Mar-87 take */
	DLword  dtd_size ;
};

typedef struct{
	LispPTR	bmbase;
	DLword	bmrasterwidth;
	DLword	bmheight;
	DLword	bmwidth;
	DLword	bmbitperpixel;
}BITMAP;


	/****************************************************************/
	/*		Byte- and Word-array access macros 		*/
	/* 								*/
	/* Use these macros instead of dereferencing a char pointer	*/
	/* so we can encapsulate byte-ordering effects on different	*/
	/* hardware!							*/
	/* 								*/
	/****************************************************************/

#define GETBYTE(base) (* (base))
/* GETBASEWORD only works if base points to a 32-bit boundary */
#define GETBASEWORD(base, offset) (* ((base)+(offset)))
  /* GETWORDBASEWORD works right with base on a 16-bit boundary. */
#define GETWORDBASEWORD(base, offset) (* (((DLword *)(base))+(offset)))
#define GETWORD(base) (* (base))
#define WORDPTR(base) (base)
#define BYTEPTR(base) (base)

#else
	/********************************************************/
	/*							*/
	/*  Byte-swapped structure definitions, for 80386 &c	*/
	/*							*/
	/********************************************************/

#ifdef BIGVM
struct dtd {
	unsigned dtd_name: 28 ;	/* type name */
	unsigned dtd_finalizable :1 ;
	unsigned dtd_obsolate :1 ;
	unsigned unuse	:2 ;
	DLword dtd_size ;
	DLword dtd_cnt0 ;
	LispPTR dtd_free ;		/* really a FULLXPOINTER */
	unsigned dtd_descrs: 28;
	unsigned dtd_gctype :2 ;
	unsigned dtd_hunkp : 1 ;
	unsigned dtd_lockedp : 1 ;
	LispPTR dtd_typespecs;
	LispPTR dtd_ptrs ;
	int  dtd_oldcnt;
	LispPTR dtd_nextpage ;
	DLword dtd_supertype ;
	DLword dtd_typeentry ;
};

typedef  struct stringp {

	unsigned base			: 28 ;
	unsigned nil			: 1 ;
	unsigned readonly		: 1 ;
	unsigned substringed		: 1 ;
	unsigned origin			: 1 ;

	unsigned   length: 28 ;
	unsigned type			: 4 ;
	LispPTR   offset ;
 } STRINGP ;


typedef struct oned_array {
		unsigned int base : 28  ;
		unsigned int nil1 : 4 ;
		DLword offset;
		unsigned int typenumber : 8 ;
		unsigned int extendablep : 1;
		unsigned int fillpointerp :1;
		unsigned int displacedp : 1;
		unsigned int ajustablep : 1; /* as used arrayheader */
		unsigned int stringp : 1;
		unsigned int bitp :1 ;
		unsigned int indirectp : 1; /* as used arrayheader */
		unsigned int readonlyp :1 ;
		int32_t fillpointer ;
		int32_t totalsize ; } OneDArray;


typedef struct oned_array NEWSTRINGP;

typedef struct general_array {
		unsigned int base : 28  ;
		unsigned int nil1 : 4 ;
		unsigned int nil2:16;
		unsigned int typenumber : 8 ;
		unsigned int extendablep : 1;
		unsigned int fillpointerp :1;
		unsigned int displacedp : 1;
		unsigned int ajustablep : 1; /* as used arrayheader */
		unsigned int stringp : 1;
		unsigned int bitp :1 ;
		unsigned int indirectp : 1; /* as used arrayheader */
		unsigned int readonlyp :1 ;
		int32_t Dim0;
		int32_t totalsize;
		int32_t Dim1 ;
		int32_t Dim2 ; } LispArray;

typedef struct compiled_closure {
		unsigned int def_ptr	: 28; /* function */
		unsigned int nil1	: 4 ;
		unsigned int env_ptr	: 28; /* environment */
		unsigned int nil2	: 4 ;
  } CClosure ;
#else
/* Structure for DTD */
struct dtd {
	DLword dtd_size ;
	DLword dtd_namelo ;
	LispPTR dtd_free ;		/* really a FULLXPOINTER */
	unsigned dtd_descrs : 24;
	unsigned dtd_gctype :2 ;
	unsigned dtd_hunkp : 1 ;
	unsigned dtd_lockedp : 1 ;
	unsigned dtd_finalizable :1 ;
	unsigned dtd_obsolate :1 ;
	unsigned unuse	:2 ;
	unsigned dtd_typespecs : 24 ;
	unsigned dtd_namehi : 8;
	LispPTR dtd_ptrs ;
	int  dtd_oldcnt;
	DLword dtd_nextpage ;
	DLword dtd_cnt0 ;
	DLword dtd_supertype ;
	DLword dtd_typeentry ;
};

typedef  struct stringp
  {
	unsigned base			: 24 ;
	unsigned type			: 4 ;
	unsigned nil			: 1 ;
	unsigned readonly		: 1 ;
	unsigned substringed		: 1 ;
	unsigned origin			: 1 ;
	DLword   offset ;
	DLword   length ;
  } STRINGP ;

typedef struct oned_array
  {
	unsigned int base : 24  ;
	unsigned int nil1 : 8 ;
	DLword offset;
	unsigned int typenumber : 8 ;
	unsigned int extendablep : 1;
	unsigned int fillpointerp :1;
	unsigned int displacedp : 1;
	unsigned int ajustablep : 1; /* as used arrayheader */
	unsigned int stringp : 1;
	unsigned int bitp :1 ;
	unsigned int indirectp : 1; /* as used arrayheader */
	unsigned int readonlyp :1 ;
	DLword totalsize ;
	DLword fillpointer ;
  } OneDArray;

typedef struct oned_array NEWSTRINGP;

typedef struct general_array
  {
	unsigned int base : 24  ;
	unsigned int nil1 : 8 ;
	DLword Dim0;
	unsigned int typenumber : 8 ;
	unsigned int extendablep : 1;
	unsigned int fillpointerp :1;
	unsigned int displacedp : 1;
	unsigned int ajustablep : 1; /* as used arrayheader */
	unsigned int stringp : 1;
	unsigned int bitp :1 ;
	unsigned int indirectp : 1; /* as used arrayheader */
	unsigned int readonlyp :1 ;
	DLword Dim2 ;
	DLword Dim1 ;
  } LispArray;

typedef struct compiled_closure
  {
    unsigned int def_ptr : 24; /* function */
    unsigned int nil1 : 8 ;
    unsigned int env_ptr: 24; /* environment */
    unsigned int nil2 : 8 ;
  } CClosure ;
#endif /* BIGVM */
/* Structure for initialdtdcontents */

 struct system_dtd_contents
  {
    char   *dtd_name ;  /* type name string >> changed 4-feb-87 */
    DLword  dtd_size ;
    DLword  name_len ;  /* type name length in BYTE 27-Mar-87 take */
  };

typedef struct
  {
    LispPTR	bmbase;
    DLword	bmheight;
    DLword	bmrasterwidth;
    DLword	bmbitperpixel;
    DLword	bmwidth;
  }BITMAP;


	/****************************************************************/
	/*		Byte- and Word-array access macros 		*/
	/* 								*/
	/* Use these macros instead of dereferencing a char pointer	*/
	/* so we can encapsulate byte-ordering effects on different	*/
	/* hardware!							*/
	/* 								*/
	/****************************************************************/

#define GETBYTE(base) (* (unsigned char *) (3^(UNSIGNED)(base)))
  /* GETBASEWORD only works if base points to a 32-bit boundary */
#define GETBASEWORD(base, offset) GETWORDBASEWORD((base),(offset))
#define GETWORDBASEWORD(base, offset) (* (DLword *) (2^(UNSIGNED)((base)+(offset))))
#define GETWORD(base) (* (DLword *) (2^(UNSIGNED)(base)))
#define WORDPTR(base) ((DLword *)(2^(UNSIGNED)(base)))
#define BYTEPTR(base) ((char *) (3^(UNSIGNED)(base)))

#endif /* BYTESWAP */



#define ST_POS16	1
#define ST_BYTE		0
#define THIN_CHAR_TYPENUMBER	67
#define FAT_CHAR_TYPENUMBER	68


/************************************************************************/
/*									*/
/*		T Y P E   E N T R Y   A C C E S S O R S			*/
/*									*/
/*	GetDTD		Gets the (C-native) address for the DTD		*/
/*			(Data Type Descriptor) for the type whose	*/
/*			number you hand it (LESS the mask bits!).	*/
/*									*/
/*	GetTypeEntry	Gets the entire 16-bit "type number" field	*/
/*			from the DTD, including type-mask bits.		*/
/*			Use this one when you want the mask bits for	*/
/*			a quick category check.				*/
/*									*/
/*	GetTypeNumber	Gets only the Type Number (without mask bits)	*/
/*			from the DTD for the object you give it.	*/
/*			Use this one for doing type checks and 		*/
/*			dispatching.					*/
/*									*/
/*	Listp		If 'address' is the address of a cons cell,	*/
/*			returns TRUE.  Equivalent to the LISTP pred.	*/
/*									*/
/************************************************************************/

/* Get DTD pointer(68k) from typenum */
#ifdef BIGVM
#define GetDTD(typnum)	(void *)(DTDspace + ((typnum)<<4)+((typnum)<<1))
#else
#define GetDTD(typnum)	(void *)(DTDspace + ((typnum)<<4))
#endif /* BIGVM */

/* Get all type entry */
#define GetTypeEntry(address)      ( GETWORD(MDStypetbl+((address)>>9)) )

/* the type number is in the low 11 bits */
#define GetTypeNumber(address)     (GetTypeEntry(address) & 0x7ff)

/* This MACRO is similar to LISTP */
#define Listp(address)	(GetTypeNumber(address) == TYPE_LISTP)

#define Numberp(address) (GetTypeEntry(address) & TT_NUMBERP)

	/******************************************/
	/*        Lisp's PATHNAME datatype        */
	/*                                        */
	/*   This MUST change whenever the Lisp   */
	/*   definition of the PATHNAME structure */
	/*   changes.                             */
	/*                                        */
	/******************************************/
typedef
  struct
    {
      LispPTR host;
      LispPTR device;
      LispPTR directory;
      LispPTR name;
      LispPTR type;
      LispPTR version;
    } PATHNAME;
  
	/******************************************/
	/*         Lisp's COMPLEX datatype        */
	/*                                        */
	/*   This MUST change whenever the Lisp   */
	/*   definition of the COMPLEX structure  */
	/*   changes.                             */
	/*                                        */
	/******************************************/
typedef
  struct
    {
      LispPTR real;
      LispPTR imaginary;
    } COMPLEX;


	/******************************************/
	/*          Lisp's RATIO datatype         */
	/*                                        */
	/*   This MUST change whenever the Lisp   */
	/*   definition of the RATIO structure    */
	/*   changes.                             */
	/*                                        */
	/******************************************/
typedef
  struct
    {
      LispPTR numerator;
      LispPTR denominator;
    } RATIO;


	/******************************************/
	/*         Lisp's BIGNUM datatype         */
	/*                                        */
	/*   This MUST change whenever the Lisp   */
	/*   definition of the BIGNUM structure   */
	/*   changes.                             */
	/*                                        */
	/******************************************/
typedef
  struct
    {
      LispPTR contents;	/* a list of 12-bit segments of value, */
			/* low-order 12 bits first.            */
    } BIGNUM;


/* Ethernet records */

#ifndef BYTESWAP
typedef struct { 
	DLword	DLLOCALHOST0;
	DLword	DLLOCALHOST1;
	DLword	DLLOCALHOST2;
	DLword	DLFIRSTICB;
	DLword	DLINPUTMASK;
	DLword	DLFIRSTOCB;
	DLword	DLOUTPUTMASK;
	DLword	DLMISSEDPACKETS;
	DLword	DLLASTICB;
	DLword	DLLASTOCB;
} DLETHERCSB;

typedef struct{ 
	DLword	DLIOCBLENGTH;
	DLword	DLIOCBBUFFERLO;
	DLword	DLIOCBBUFFERHI;
	DLword	DLRETRANSMISSIONMASK;
	DLword	DLIOCBBYTESUSED;
	DLword	DLIOCBSTATUS;
	DLword	DLNEXTIOCB;
	DLword	DLFOROUTPUTUSE;
} DLETHERIOCB;

typedef struct { 
	unsigned int	NETTYPE : 8;
	unsigned int	NDBNEXT : 24;
	unsigned int	NDBPUPNET : 8;
	unsigned int	NDBNSNET : 24;
	unsigned int	NDBTASK : 8;
	unsigned int	NDBBROADCASTP : 24;
	unsigned int	NDBPUPHOST : 8;
	unsigned int	NDBTRANSMITTER : 24;
	unsigned int	nil1: 8;
	unsigned int	NDBENCAPSULATOR : 24;
	unsigned int	NDBIQLENGTH : 8; /* DATATYPE */
	unsigned int	NDBCSB : 24; /* DATATYPE */
	LispPTR		NDBIQ;
	LispPTR		NDBTQ;
	LispPTR		NDBTRANSLATIONS;
	LispPTR		NDBETHERFLUSHER;
	LispPTR		NDBWATCHER;
	LispPTR		NDBCANHEARSELF;
	LispPTR		NDBIPNET;
	LispPTR		NDBIPHOST;
	DLword		NDBPUPTYPE;
	DLword		nil2;
	LispPTR		nil3;
} NDB;
#else
	/***********************************************/
	/* Byte-swapped definitions, for e.g., 80386's */
	/***********************************************/
typedef struct { 
	DLword	DLLOCALHOST1;
	DLword	DLLOCALHOST0;
	DLword	DLFIRSTICB;
	DLword	DLLOCALHOST2;
	DLword	DLFIRSTOCB;
	DLword	DLINPUTMASK;
	DLword	DLMISSEDPACKETS;
	DLword	DLOUTPUTMASK;
	DLword	DLLASTOCB;
	DLword	DLLASTICB;
} DLETHERCSB;

typedef struct{ 
	DLword	DLIOCBBUFFERLO;
	DLword	DLIOCBLENGTH;
	DLword	DLRETRANSMISSIONMASK;
	DLword	DLIOCBBUFFERHI;
	DLword	DLIOCBSTATUS;
	DLword	DLIOCBBYTESUSED;
	DLword	DLFOROUTPUTUSE;
	DLword	DLNEXTIOCB;
} DLETHERIOCB;

typedef struct { 
	unsigned int	NDBNEXT : 24;
	unsigned int	NETTYPE : 8;
	unsigned int	NDBNSNET : 24;
	unsigned int	NDBPUPNET : 8;
	unsigned int	NDBBROADCASTP : 24;
	unsigned int	NDBTASK : 8;
	unsigned int	NDBTRANSMITTER : 24;
	unsigned int	NDBPUPHOST : 8;
	unsigned int	NDBENCAPSULATOR : 24;
	unsigned int	nil1: 8;
	unsigned int	NDBCSB : 24; /* DATATYPE */
	unsigned int	NDBIQLENGTH : 8; /* DATATYPE */
	LispPTR		NDBIQ;
	LispPTR		NDBTQ;
	LispPTR		NDBTRANSLATIONS;
	LispPTR		NDBETHERFLUSHER;
	LispPTR		NDBWATCHER;
	LispPTR		NDBCANHEARSELF;
	LispPTR		NDBIPNET;
	LispPTR		NDBIPHOST;
	DLword		nil2;
	DLword		NDBPUPTYPE;
	LispPTR		nil3;
} NDB;
#endif /* BYTESWAP */
#endif /* LSPTYPES_H */
