	.TITLE	STORE_REGULAR IN SYMBOL TABLE SIMPLE INDEX
	.ENABLE	DEBUG
	.SUBTITLE	LOCAL DATA STORAGE
	.PSECT	IMPURE_DATA,NOEXE,RD,WRT,NOSHR,CON,GBL,NOVEC,LONG
ARG1:	.LONG	0
ARG2:	.LONG	0
	.PSECT	PURE_DATA,RD,NOEXE,NOWRT,SHR,CON,GBL,NOVEC
ARG:	.LONG	2
	.ADDRESS	ARG1,ARG2
	.PAGE
	.SUBTITLE	STORE IN SYMBOLE TABLE CODE
	.PSECT	CODE,EXE,RD,NOWRT,SHR,CON,GBL,NOVEC
	.ENTRY	STORE_SYMBOL,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
;
;	CALL STORE_SYMBOL(SYMBOL,HOW_USED,LINE_NUMBER,FLAGS)
;
;	SYMBOL		PASS BY DESCRIPTER SYMBOL TO BE PUT INTO TABLE
;	HOW_USED	PASS BY REFERENCE HOW USED TOKEN
;	LINE_NUMBER	PASS BY REFERENCE LINE NUMBER
;	FLAGS		PASS BY REFERENCE FLAGS TO BE SET IN SYMBOL
;			FLAG WORD
SYMBOL_FLAG_ARRAY		==^X1		;FLAGS THIS VARIABLE AS BEING   ;V1.4
						;A DECLARED ARRAY. IT IS        ;V1.4
						;EXPECTED TO BE FOLLOWED BY     ;V1.4
						;A "(" AND NOT BE A FUNCTION    ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_ENTRY_POINT		==^X2		;SYMBOL IS AN ENTRY POINT,      ;V1.4
						;EITHER DECLARED OR IMPLIED     ;V1.4
						;IN SUBROUTINE,[type]FUNCTION   ;V1.4
						;BLOCKDATA,PROGRAM,ENTRY,CALL   ;V1.4
						;OR CALLED AS A FUNCTION(EXCEPT ;V1.4
						;FOR STATEMENT FUNCTIONS)       ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_STATEMENT_FN	==^X4		;SYMBOL IS A STATEMENT FUNCTION ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_DEFINED_ENTRY_POINT	==^X8		;SYMBOL IS AN ENTRY POINT       ;V1.4
						;WHOSE ADDRESS IS WITHIN THE    ;V1.4
						;CURRENT MODULE-PROGRAM,        ;V1.4
						;BLOCKDATA,SUBROUTINE,ENTRY     ;V1.4
						;[type] FUNCTION                ;V1.4
						;SYMBOL_FLAG_ENTRY_POINT ALSO   ;V1.4
						;SET                            ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_GLOBAL		==^X10		;SYMBOL IS A VARIABLE THAT      ;V1.4
						;APPEARS IN A COMMON BLOCK      ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_USED		==^X20		;SYMBOL IS USED (NOT JUST       ;V1.4
						;DECLARED) IN THE CURRENT       ;V1.4
						;MODULE                         ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_CHANGED		==^X40		;SYMBOL TS SET IN VALUE IN      ;V1.4
						;THE CURRENT MODULE.            ;V1.4
						;DEPENDING ON THE SITUATION     ;V1.4
						;SYMBOL_FLAG_USED MAY ALSO      ;V1.4
						;BE SET(DATA,PARAMETER,         ;V1.4
						;EQUIVALENCE DO NOT SET IT)     ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_CALLING_ARG		==^X80		;SYMBOL APPEARS AS AN ARGUMENT  ;V1.4
						;IN A CALL STATEMENT OR IN      ;V1.4
						;A FUNCTION INVOCATION          ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_CALLED_BY_ARG	==^X100		;SYMBOL APPEARS AS AN ARGUMENT  ;V1.4
						;IN THE MODULE DEFINED ENTRY    ;V1.4
						;POINTS (SUBROUTINE,ENTRY,      ;V1.4
						;[type] FUNCTION).              ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_CHARACTER		==^X200		;SYMBOL HAS BEEN DECLARED TO BE ;V1.4
						;A CHARACTER. IT STILL COULD BE ;V1.4
						;A FUNCTION BUT MORE CHECKS     ;V1.4
						;HAVE TO BE MADE TO SEE IF THE  ;V1.4
						;TRAILING "(" IS A POSITION     ;V1.4
						;ARGUMENT OR THE START OF A     ;V1.4
						;FUNCTION ARGUMENT LIST.        ;V1.4
						;THE POSITION FORM IS "(p1:p2)" ;V1.4
						;A FUNCTION FORM WOULD NOT      ;V1.4
						;INCLUDE A POSITION ARGUMENT    ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_CALL_ENTRY_POINT	==^X400		;SYMBOL IS AN ENTRY POINT       ;V1.4
						;DECLARED IN A CALL             ;V1.4
						;STATEMENT                      ;V1.4
                                                                                ;V1.4
SYMBOL_FLAG_FN_CALLING_ARG	==^X800		;SYMBOL IS AN ARGUMENT IN       ;V1.4
						;A FUNCTION INVOCATION          ;V1.4
						;(NOT A STATEMENT FUNCTION).    ;V1.4
;                                                                               ;**-12
;	TWO TYPES OF QUEUE ELEMENTS ARE USED FOR EACH SYMBOL
;
;	THE QUEUE IS SET UP AS FOLLOWS-THE HEAD OF THE QUEUE IS
;	"SYMBOL_TABLE_QUEUE"
;	WHICH IS A TREE STRUCTURED LIST OF SYMBOL ELEMENTS IN
;	ALPHABETICAL ORDER (ASCII COALLATEING SEQUENCE)
;	ONLY ONE ENTRY IN THE SYMBOL TABLE LIST FOR EACH
;	UNIQUE SYMBOL.
;	EACH SYMBOL ENTRY IS ITSELF THE HEADER FOR A LINKED LIST
;	QUEUE OF HOW USED ELEMENTS FOR THAT SYMBOL
;
;	SYMBOL ELEMENT TOTAL LENGTH 15 LONG WORDS (60 BYTES)
;	----------------------------------
;	!SYMBOL TABLE LINKED LIST FWD PTR! 0	POINT TO NEXT SYMBOL LOWER
;	----------------------------------	IN COALATEING SEQUENCE
;	!SYMBOL TABLE LINKED LIST BCK PTR! 4
;	----------------------------------
;	!SYMBOL TABLE LINKED LIST FWD PTR! 8	POINT TO NEXT SYMBOL HIGHER
;	----------------------------------	IN COALATEING SEQUENCE
;	!SYMBOL TABLE LINKED LIST BCK PTR!12
;	----------------------------------
;	!HOW USED QUEUE HDR LIST FWD PTR !16
;	----------------------------------
;	!HOW USED QUEUE HDR LIST BCK PTR !20
;	----------------------------------
;	!SYMBOL FLAG WORD                !24
;	----------------------------------
;	!SYMBOL 31 BYTES         !SIZE   !28<=1 BYTE NUMBER OF CHRS IN SYMBOL
;	----------------------------------
;	!NULL PADDED                     !32
;	----------------------------------
;	!                                !36
;	----------------------------------
;	!                                !40
;	----------------------------------
;	!                                !44
;	----------------------------------
;	!                                !48
;	----------------------------------
;	!                                !52
;	----------------------------------
;	!                                !56
;	----------------------------------
;
;	HOW USED ELEMENT TOTAL LENGTH 4 LONG WORDS (16 BYTES)
;
;	----------------------------------
;	!HOW USED LINKED LIST FWD PTR     ! 0
;	----------------------------------
;	!HOW USED LINKED LIST BCK PTR     ! 4
;	----------------------------------
;	!LINE NUMBER OF THIS USE          ! 8
;	----------------------------------
;	!TOKEN OF HOW USED                !12
;	----------------------------------
;
;	SET UP TO SCAN THE SYMBOL QUEUE FOR A MATCHING SYMBOL ALREADY
;	IN TABLE
	MOVL	4(AP),R11	;GET ADDRESS OF DESCRIPTER
	CVTWL	(R11),R10	;GET NUMBER OF CHRS IN STRING
	MOVL	4(R11),R9	;GET ADDRESS OF STRING
	MOVAL	SYMBOL_TABLE_QUEUE,R11	;ADDRESS OF QUEUE HEAD
	MOVL	(R11),R8	;ADDRESS OF SYMBOL CRRRENTLY BEING EXAMINED
	CMPL	R8,R11		;SEE IF EMPTY TREE
	BNEQ	FIND_LOOP	;NO
;	TREE IS STILL A SEED-ADD ROOT
	MOVL	#60,ARG1
	CALLG	ARG,ALLOCATE	;GET ELEMENT
	INCL	SYMBOLS_PROCESSED                                               ;V1.4
	INSQUE	(R0),SYMBOL_TABLE_QUEUE
;	INIT THE SYMBOL ELEMENT
	MOVAL	8(R0),8(R0)
	MOVL	8(R0),12(R0)	;INIT HIGHER COALLATING QUEUE
	MOVAL	16(R0),16(R0)	;INIT HOW USED QUEUE
	MOVL	16(R0),20(R0)
	MOVL	@16(AP),24(R0)	;SET FLAG
	MOVL	R0,R8
	CVTLB	R10,28(R8)	;SAVE LENGTH
	MOVC5	R10,(R9),#0,#31,29(R8)	;SAVE STRING
	BRW	FOUND_SYMBOL
;
;	REGESTER ALLOCATION AS FOLLOWS AS ENTER CHECK LOOP
;	R8	ADDRESS OF CURRENT SYMBOL ELEMENT BEING EXAMINED
;	R9	ADDRESS OF STRING OF SYMBOL BEING LOOKED FOR
;	R10	LENGTH OF TARGET STRING
;	R11	ADDRESS OF SYMBOL TABLE QUEUE HEADER FOR TERMIANTION TEST
FIND_LOOP:
;	COMPARE CURRENT SYMBOL TO TARGET SYMBOL
	CVTBL	28(R8),R7	;GET LENGTH OF CURRENT SYMBOL
	CMPC5	R10,(R9),#0,R7,29(R8)
	BGTR	11$		;WANTED SYMBOL IS GREATER THAN CURRENT SYMBOL
	BLSS	1$		;WANTED SYMBOL IS LESS THAN CURRENT SYMBOL
	JMP	FOUND_SYMBOL	;THIS IS IT
;	CURRENT SYMBOL IS HIGHER THAN CURRENT SYMBOL-RESET QUEUE HEAD VALUE
11$:	MOVAL	8(R8),R11	;RESET LOCATION OF QUEUE HEADER
	CMPL	8(R8),R11	;SEE IF HIGHER BRANCH IS EMPTY
	BNEQ	2$		;NO-GO SET UP TO SEARCH THAT PART OF TREE
;	SYMBOL IS HIGHER THAN CURRENT SYMBOL AND NO BRANCH HAS BEEN CREATED
;	START ONE
	MOVL	#60,ARG1
	CALLG	ARG,ALLOCATE	;GET ELEMENT
	INCL	SYMBOLS_PROCESSED                                               ;V1.4
	INSQUE	(R0),8(R8)
;	INIT THE SYMBOL ELEMENT
	MOVAL	8(R0),8(R0)
	MOVL	8(R0),12(R0)	;INIT HIGHER COALLATING QUEUE
	MOVAL	16(R0),16(R0)	;INIT HOW USED QUEUE
	MOVL	16(R0),20(R0)
	MOVL	@16(AP),24(R0)	;SET FLAG
	MOVL	R0,R8
	CVTLB	R10,28(R8)	;SAVE LENGTH
	MOVC5	R10,(R9),#0,#31,29(R8)	;SAVE STRING
	BRW	FOUND_SYMBOL
2$:	MOVL	8(R8),R8	;UPDATE TO NEXT SYMBOL
	BRW	FIND_LOOP
1$:;	TARGET SYMBOL IS LESS THAN CURRENT SYMBOL
	CMPL	(R8),R11	;SEE IF NO LOWER SYMBOLS EXIST
	BEQL	3$		;NOTHING MORE-GO ADD SOME
	MOVL	(R8),R8		;UPDATE TO NEXT LOWER SYMBOL
	BRW	FIND_LOOP	;AND CONTINUE
3$:	MOVL	#60,ARG1
	CALLG	ARG,ALLOCATE	;GET ELEMENT
	INCL	SYMBOLS_PROCESSED                                               ;V1.4
	INSQUE	(R0),(R8)	;INSERT
;	INIT THE SYMBOL ELEMENT
	MOVAL	8(R0),8(R0)
	MOVL	8(R0),12(R0)	;INIT HIGHER COALLATING QUEUE
	MOVAL	16(R0),16(R0)	;INIT HOW USED QUEUE
	MOVL	16(R0),20(R0)
	MOVL	@16(AP),24(R0)	;SET FLAG
	MOVL	R0,R8
	CVTLB	R10,28(R8)	;SAVE LENGTH
	MOVC5	R10,(R9),#0,#31,29(R8)	;SAVE STRING
	BRW	FOUND_SYMBOL
FOUND_SYMBOL:
;	R8 POINTS TO SYMBOL TABLE ELEMENT
	BISL2	@16(AP),24(R8)		;SET THE FLAG
;	CHECK TO SEE IF THIS SYMBOL ALREADY USED ON SAME LINE
;	IN SAME WAY
	MOVAL	16(R8),R7		;GET QUEUE HEADER
	MOVL	R7,R6			;USE COPY
10$:	MOVL	4(R6),R6		;BACK UP FROM END OF QUEUE
	CMPL	R7,R6			;SEE IF DONE
	BEQL	20$			;YES
	CMPL	@12(AP),8(R6)		;COMPARE LINE NUMBERS
	BNEQ	20$			;IF NOT SAME-ENTER
	CMPL	@8(AP),12(R6)		;HOW USED THE SAME ??
	BNEQ	10$
	RET				;MULTIPLE SAME  HOW USED ON SAME LINE
					;DON'T BOTHER ENTERING
;	ALLOCATE MEMORY FOR HOW USED ELEMENT
20$:	MOVL	#64,ARG1	;ALLOCATE MEMORY
	CALLG	ARG,ALLOCATE
	INCL	HOW_USED_PROCESSED                                              ;V1.4
	INSQUE	(R0),@20(R8)		;INSTALL IN HOW USED QUEUE AT TAIL
	MOVL	@12(AP),8(R0)		;LOAD LINE NUMBER
	MOVL	@8(AP),12(R0)		;LOAD HOW USED TOKEN
	RET				;DONE
	.PAGE
	.SUBTITLE	GET_FLAG
	.ENTRY	GET_FLAG,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
;
;	FUNCTION GET_FLAG(SYMBOL)
;
;	SYMBOL	PASS BY DESCRIPTER SYMBOL TO GET FLAG WORD FOR
;
;	RETURN FLAG LONG WORD IN R0
;
;	SET UP TO SCAN THE SYMBOL QUEUE FOR A MATCHING SYMBOL ALREADY
;	IN TABLE
	MOVL	4(AP),R11	;GET ADDRESS OF DESCRIPTER
	CVTWL	(R11),R10	;GET NUMBER OF CHRS IN STRING
	MOVL	4(R11),R9	;GET ADDRESS OF STRING
	MOVAL	SYMBOL_TABLE_QUEUE,R11	;ADDRESS OF QUEUE HEAD
	MOVL	(R11),R8		;ADDRESS OF SYMBOL CRRRENTLY BEING EXAMINED
	CMPL	R8,R11		;CHECK FOR EMPTY TREE
	BEQL	NO_SYMBOL
;
;	REGESTER ALLOCATION AS FOLLOWS AS ENTER CHECK LOOP
;	R8	ADDRESS OF CURRENT SYMBOL ELEMENT BEING EXAMINED
;	R9	ADDRESS OF STRING OF SYMBOL BEING LOOKED FOR
;	R10	LENGTH OF TARGET STRING
;	R11	ADDRESS OF SYMBOL TABLE QUEUE HEADER FOR TERMIANTION TEST
FLAG_FIND_LOOP:
	CVTBL	28(R8),R7
	CMPC5	R7,29(R8),#0,R10,(R9)	;COMPARE TWO STRINGS
	BEQL	FLAG_FOUND_SYMBOL		;SYMBOL FOUND-GO ADD HOW USED
	BGTR	1$
;	SYMBOL IS GREATER THAT CURRENT SYMBOL
	MOVAL	8(R8),R11	;GET ADDR OF NEW QUEUE HEADER
	CMPL	8(R8),R11	;SEE IF DONE
	BEQL	NO_SYMBOL
	MOVL	8(R8),R8
	BRB	FLAG_FIND_LOOP
1$:;	SYMBOL IS LESS THAN CURRENT SYMBOL
	CMPL	(R8),R11	;SEE IF DONE
	BEQL	NO_SYMBOL
	MOVL	(R8),R8
	BRB	FLAG_FIND_LOOP
NO_SYMBOL:
	CLRL	R0			;NO SUCH SYMBOL-RETURN 0 (NO FLAGS SET)
	RET
FLAG_FOUND_SYMBOL:
	MOVL	24(R8),R0		;GET FLAG WORD
	RET
	.PAGE
	.SUBTITLE	CLEAN UP SYMBOL TABLE SPACE
	.ENTRY	CLEAR_SYMBOL_TABLE,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
	MOVL	ELEMENT_64+4,ELEMENT_64+12                                      ;V1.4
	MOVL	ELEMENT_128+4,ELEMENT_128+12                                    ;V1.4
	MOVL	ELEMENT_192+4,ELEMENT_192+12                                    ;V1.4
	MOVL	ELEMENT_256+4,ELEMENT_256+12                                    ;V1.4
	MOVL	ELEMENT_LARGE+4,ELEMENT_LARGE+12                                ;V1.4
;	REMOVE ALL ENTRYS IN SYMBOL TABLE AND RETURN THEM TO HEAP
	MOVAL	SYMBOL_TABLE_QUEUE,R11	;GET ADDR OF QUEUE HEADER
	CMPL	(R11),R11		;CHECK TO SEE IF TREE EMPTY
	BNEQ	1$
	RET
1$:	MOVL	(R11),R10		;GET QUEUE ELEMENT
	CALLG	NULL,REMOVE_TAIL	;REMOVE ALL ATTACHED ITEMS
	REMQUE	@(R11),(R10)		;REMOVE ELEMENT
	MOVL	#60,ARG1
	MOVL	R10,ARG2
	CALLG	ARG,FREE
	RET
	.ENTRY	REMOVE_TAIL,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
;
;	DOES IT HAVE A LOWER SEQUENCE SYMBOL ATTACHED
	CMPL	(R10),R11
	BEQL	1$		;NO-SEE ABOUT HIGHER
;	HAS LOWER SYMBOL TO REMOVE
	PUSHR	#^M<R10>	;SAVE CURRENT
	MOVL	(R10),R10	;GET LOWER SYMBOL ELEMENT
	CALLG	NULL,REMOVE_TAIL
	REMQUE	@4(R11),R9	;REMOVE FROM TAIL
	MOVL	#60,ARG1
	MOVL	R9,ARG2
	CALLG	ARG,FREE	;FREE BLOCK
	POPR	#^M<R10>
1$:	MOVAL	8(R10),R9	;CHECK ON HIGHER BRANCH OF TREE
	CMPL	8(R10),R9	;ANY HIGHER??
	BEQL	2$		;NO
;	HAS HIGHER SYMBOLS TO REMOVE
	PUSHR	#^M<R10,R11>	;SAVE REGESTERS
	MOVL	R9,R11		;NEW QUEUE HEADER
	MOVL	8(R10),R10	;NEXT ELEMENT
	CALLG	NULL,REMOVE_TAIL
	REMQUE	@4(R11),R0	;REMOVE FROM TAIL
	MOVL	#60,ARG1
	MOVL	R0,ARG2
	CALLG	ARG,FREE
	POPR	#^M<R10,R11>
2$:;	REMOVE ALL HOW USED FROM ELEMENT
	MOVAL	16(R10),R9	;GET ADDR OF HOW USED QUEUE HEADER
3$:	REMQUE	@(R9),ARG2	;GET ELEMENT
	BVS	4$
	MOVL	#60,ARG1
	CALLG	ARG,FREE
	BRB	3$
4$:	RET
	.END
