SUBTTL	DATA STRUCTURES

;********** STRUCTURE DEFINTIONS **********

FSTLEN__2			;THIS WILL ACCUMULATE LONGEST BLOCK

COMMENT 
Normally, items must have the same format for the first two words:
This is depended on in many routines (like FNDCLS)

SBLOCK	QOMMON
HWDS	(QLH,QNXT)		;...			NEXT POINTER
HWDS	(QX,QY,E,E)		INDEX__INDEX-1
  FWD	  (QXY)			INDEX__INDEX-1
  HWDS	  (Q2LH,Q2RH)
EBLOCK	QOMMON
NIL,<QOMMON#,QLH#,QNXT#,QX#,QY#,QXY#,Q2LH#,Q2RH#>

;ARGUMENT LIST FOR DIPRED, LIST OF BODIES, AND DIPTYPES TO GET
; FROM DIPS.DIP FILE

SBLOCK	GETDIP
HWDS	(GDIP,GNXT)		;PTR TO DIPNAME		NEXT
HWDS	(GFLAG,GBDY)		;FLAG			BODY OR TYPE
 	 INDEX__INDEX-1
 FWD	 (GFBDY)
EBLOCK	GETDIP

	;FLAG is -1 if diptype came from type

;TYPE - BODY DEFINITIONS
MD,<
;*****************************
;*** TYPE DEFINITION BLOCK ***
;*****************************

SBLOCK	TYPE
HWDS	(TLIB,TNAM)		;LIBRARY POINTER	NAME (LH 1ST WD IS DIP TYPE NAME PTR)??
HWDS	(TYP1,TNXT)		;*+1, OR 0		NEXT TYPE
HWDS	(TYP2,TPIN)		;*+2			PINLOC LIST
HWDS	(TPROP,TLIN)		;PROPERTY LIST		DISPLAY DEFINITION
HWDS	(TBIT,TYP3)		;TYPE BITS		*+2 (0 IF USING DEFAULT CHAR OFFSET)
HWDS	(TX,TY,E,E)			;DEFAULT LOC OFFSET (X,Y)
	 INDEX__INDEX-1
 FWD	 (TXY)			; FOR SIMUL ACCESS
HWDS	(TPAK,TDEF)		;PACKAGE CODE		DIP DEF LIST (0 IF NOT IN)
HWDS	(TOX,TOY,E,E)		;DEFAULT CHAR OFFSET (X,Y)
	 INDEX__INDEX-1
 FWD	 (TOXY)
EBLOCK	TYPE
NIL,<TLIB#,TNAM#,TYP1#,TNXT#,TYP2#,TPIN#,TPROP#,TLIN#,TBIT#,TYP3#,TX#,TY#,TXY#
TOX#,TOY#,TOXY#,TDEF#,TPAK#,TYPE#>	;FOR @CREF LISTING

	;IF TYP1 IS 0, THEN ONLY FIRST 2 WDS ARE PRESENT, TYPES ARE ABBREVIATED IF
	;PRESENT IN LIBRARY BUT NOT USED IN DRAWING

SBLOCK	STYP
HWDS	(SLIB,SNAM)
HWDS	(SYP1,SNXT)
EBLOCK	STYP

	;DISPLAY DEFINITION
	;	--,,	next
	;	X,,	Y
	; low order bit
	; 0 = invisible
	; 1 = visible

;*****************************
;***     TPIN BLOCK (D)    ***
;*****************************

SBLOCK	TYPIN
HWDS	(TP1,TPNX)		;*+2			NEXT
HWDS	(TPX,TPY,E,E)		; LOCATION OF PIN ON BODY
	 INDEX__INDEX-1
 FWD	 (TPXY)			;FOR FULL REFERENCE
HWDS	(TPBIT,TPID)		;PIN BITS		PIN ID
HWDS	(TPPOS,TPNAM)		;PIN POS		PIN NAME
EBLOCK	TYPIN
NIL,<TP1#,TPNX#,TPX#,TPY#,TPXY#,TPBIT#,TPID#,TPPOS#,TPNAM#,TYPIN#,>
	;TPNX MUST BE IN 1ST WORD

	;PIN POS:
	;	BYTE (7)X(7)Y(4) 8 POSITION CODE
	;	 X,Y ARE 2'S COMPL


;********************************************************
;*** TYPE DIP DEF LIST - DIP DEFINITION FROM DIPS.DIP ***
;********************************************************
SBLOCK	DDEF
HWDS	(DDNPN,DDNXT)		;# PINS DEFINED		DIPDEF LIST
HWDS	(,DDMAX)		;			MAX SEC #
EBLOCK	DDEF
NIL,<DDMAX#,DDNXT#,DDNPN#,DDEF#>

SBLOCK	DIPDEF
HWDS	(DPNM,DPNXT)		;PIN NAME		NEXT
HWDS	(DPSEC,DPPIN)		;SECTION BITS		SECTION PIN #
EBLOCK	DIPDEF
NIL,<DPNM#,DPNXT#,DPSEC#,DPPIN#,DIPDEF#,>
>;MD

;TYPE DEFINITIONS (PC)

MPC,<
;********************************************************
;*** TYPE DEFINITION (PC) ***
;********************************************************

SBLOCK	TYPE
HWDS	(TNAM,TNXT)		;NAME (=# PINS USUALLY)	NEXT POINTER
HWDS	(TDPY,TPIN)		;APPROX BOX		TPIN LIST
EBLOCK	TYPE
NIL,<TNAM#,TNXT#,TDPY#,TPIN#,TYPE#>

;********************************************************
;***************    TPIN BLOCK (PC)    ******************
;********************************************************

SBLOCK	TYPIN
HWDS	(TPID,TPNX)		;PIN ID			NEXT PTR
HWDS	(TPX,TPY,E,E)		;PIN OFFSET
	 INDEX__INDEX-1
 FWD	 (TPXY)			;FOR FULL REFERENCE
EBLOCK	TYPIN
NIL,<TPID#,TPNX#,TPX#,TPY#,TPXY#,TYPIN#,>
>;MPC

;POINTS

;BPBIT and PBIT are assumed to be in LH in many places

;********************************************************
;***************     BODY POINT     *********************
;********************************************************

SBLOCK	BPOINT
HWDS	(BP1,BPNXT)		;*+2			NEXT
HWDS	(BPX,BPY,E,E)		;POINT LOC X,Y
	 INDEX__INDEX-1
 FWD	 (BPXY)
HWDS	(BBODY,BPLNK)		;BODY			PIN LINK
HWDS	(BPNEB,BP3)		;NEIGHBORS		*+1
HWDS	(BPTXT,BPLOC)		;POINT TEXT		PINLOC BLOCK IN TYPE
HWDS	(BPBIT,BPPN)		;BITS			PIN# OR PAD#
MD,<				;NEIGHBOR BLOCK ONLY FOR D
				;PC HAS LIST OF POSSIBLY MORE THAN 4 NEIGHBORS
HWDS	(BPND,BPNU)		;NEIGHBORS
HWDS	(BPNL,BPNR)
>;MD
EBLOCK	BPOINT
NIL,<BP1#,BPNXT#,BPX#,BPY#,BPXY#,BBODY#,BPLNK#,BPNEB#,BP3#,BPTXT#,BPLOC#,BPBIT#,
BPPN#,BPNL#,BPNR#,BPNU#,BPND#,BPOINT#,>

	;IF PC, PAD# IS 1 OR 3
	;IF PC, BPNEB IS LIST OF FORM:
	; NEIGHBOR1,,	NEXT
	; NEIGHBOR3,,	NEIGHBOR2

;********************************************************
;*** POINT OR CPIN *** - MUST BE CONGRUENT WITH BPOINT
;********************************************************

SBLOCK	POINT
HWDS	(P1,PNXT)		;*+2			NEXT
HWDS	(PX,PY,E,E)			;POINT LOCN X,Y
	 INDEX__INDEX-1
 FWD	 (PXY)
HWDS	(PFEED,PID)		;0 OR FEEDTHRU		POINT ID
HWDS	(PNEB,P3)		;NIGHBORS		*+1
HWDS	(PTXT,PLOC)		;TEXT			LOCATION
HWDS	(PBIT,PIN)		;POINT BITS		PIN # OR PAD #
MD,<
HWDS	(PND,PNU)		;NEIGHBORS L,R
HWDS	(PNL,PNR)		;NEIGHBORS UP,DOWN ?
>;MD
EBLOCK	POINT
NIL,<P1#,PNXT#,PX#,PY#,PXY#,PFEED#,PID#,PNEB#,P3#,PTXT#,PLOC#,PBIT#,PIN#,
PNL#,PNR#,PNU#,PND#,POINT#,>

;PLOC IS 0 UNLESS CPIN ON IN PBIT
;FORMAT OF LOCN BLOCK IN D
;	B-R-S,,	CPIN-LOC/PIN# (18 PIN FORMAT)
;	CONSTANT OFFSET X,Y
;FORMAT OF LOCN BLOCK IN PC
;	0,,	SOCKET# ???
;	CONSTANT OFFSET X,Y



;TEXT STRINGS AND PROPERTY BLOCKS

;********************************************************
;*************** TYPE TEXT/PROPERTY BLOCK ***************
;********************************************************

SBLOCK	TEXT
HWDS	(TXBIT,TXNXT)		;BITS			NEXT
HWDS	(T.X,T.Y,E,E)		;TEXT LOC X		TEXT LOC Y
	 INDEX__INDEX-1
 FWD	 (TXXY)
	 INDEX__INDEX-1
 HWDS	 (,TXIND)		; --			INDIRECT POINTER
HWDS	(TXNAM,TXVAL)		;PROPERTY NAME (0 IF NONE)	PROPERTY VALUE
HWDS	(TXOX,TXOY,E,E)		;CONSTANT OFFSET X,Y
	 INDEX__INDEX-1
 FWD	 (TXOFF)
EBLOCK	TEXT
NIL,<TXBIT#,TXNXT#,T.X#,T.Y#,TXXY#,TXIND#,TXNAM#,TXVAL#,TXOX#,TXOY#,TXOFF#,TEXT#,>

	;If TXBIND is on in TXBIT, then is indirect. TXIND points to TEXT block in type. 
	;low bit of TXXY is used to mean auto-offset
	;1,, bit of TXXY is sometimes used for flag

	;"0" size text not displayed unless IDENTS is on.

COMMENT 
STANDARD TEXT FORMAT:

------------	!	    ----!------	!  CHAR	    ----!--- NEXT 5
		!		!		!  SIZE		!    CHARS
		!-------!-------!		!-------!-------!
		!CONSTANT OFFSET!		!		!
		!   X	    Y	!		!     5 CHARS	!
		!-------!-------!		!---------------!
OFFSET IS SCALED WITH TEXT SIZE, NOT DRAWING SCALE.


SBLOCK	TEXCOF
HWDS	(,TCSTR)		;...			BARE TEXT STRING
HWDS	(TCX,TCY,E,E)		;CONSTANT OFF. X	Y
	INDEX__INDEX-1
  FWD	  (TCXY)
EBLOCK	TEXCOF

SBLOCK	TEXSTR
HWDS	(TSSIZ,TSNXT)		;CHAR-SIZE		NEXT
FWD	(TSASC)			;         ASCII CHARS
EBLOCK	TEXSTR

;BODY INSTANCE

;**************************************************
;***************    BODY INSTANCE      ************
;**************************************************

SBLOCK	BODY
HWDS	(BOD1,BNXT)		;*+2			NEXT
HWDS	(BX,BY,E,E)		;BODY LOCN X,Y
	INDEX__INDEX-1
FWD	(BXY)			; FOR REFERENCE TOGETHER
HWDS	(BORI,BLNK)		;ORIENTATION		PIN LINK - THRU ALL PINS ON BODY
HWDS	(BOD2,BTYP)		;*+1			TYPE
MPC,<
HWDS	(BID,BLN)		;BODY ID		BYTE (6)L(12)N
HWDS	(BBIT,BNAM)		;BODY BITS		DIP TYPE NAME STRING
>;MPC
MD,<
HWDS	(BID,BLOC)		;BODY ID		*+2 (0 IF NO LOC SET)
HWDS	(BBIT,BTXT)		;BODY BITS		BODY TEXT/PROPERTY LIST (MUST BE RH)
HWDS	(BOD3,)			;*+2			UNUSED
HWDS	(BLX,BLY,E,E)		;BODY LOCN CONSTANT OFFSET X,Y
	  INDEX__INDEX-1
 FWD	 (BLXY)
HWDS	(BBRS,BSOC)		;LOC BAY-RACK-SLOT	SOCKET #
	  INDEX__INDEX-1
 FWD	 (BRSLOC)		;B-R-S,,BODY-LOC
HWDS	(BLOX,BLOY,E,E)		;BODY LOCN CHAR OFFSET X,Y
	  INDEX__INDEX-1
 FWD	 (BLO)
HWDS	(BPAK,BDEF)		;PACKAGE CODE		DIP DEF LIST (IF BODY HAS DIPTYPE)
>;MD
EBLOCK	BODY
NIL,<BOD1#,BNXT#,B.X#,B.Y#,BXY#,BORI#,BLNK#,BOD2#,BTYP#,BID#,BLN#,BBIT#,BNAM#,
BID#,BLOC#,BBIT#,BTXT#,BOD3#,BLX#,BLY#,BLXY#,BBRS#,BSOC#,BLOX#,BLOY#,BLO#,BPAK#,BDEF#,
BRSLOC#,>

;If TXBIND is set in TXBIT, then this is indirect pointer to text/prop block
;in type. TXIND is pointer.
;If a BODY has any props at all, then it contains also indirect pointers
;to all props that were in its type. All or none.

DEFINE	FETPAK (A,B)
<IFDIF<A><B><	FETCH(A,B,BPAK)
		JUMPN A,.+3
		 FETCH(A,B,BTYP)
		 FETCH(A,A,TPAK)
>
IFIDN <A><B><	PUSH P,A
		FETCH(A,A,BPAK)
		JUMPE A,[POP P,A
			FETCH(A,A,BTYP)
			FETCH(A,A,TPAK)
			JRST .+2]
		SUB P,[1,,1]
>
>
