	.TITLE	INDEX-FORTRAN CROSS REFERENCE FOR VAX/VMS
	.IDENT	/V01.9/                                                         ;V1.9
	.ENABLE	DEBUG                                                           ;**-1
;	GENERAL HISTORY
;
;	The original INDEX-FORTRAN Cross Referencer  was written
;	in FORTRAN in 1966 by Harry M. Murphy Jr of the
;	Air Force Weapons Laboratory
;	Kirkland Air Force Base
;	New Mexico
;
;	This Fortran version was ported to run on the
;	Naval Weapons Center, China lake, Ca
;	UNIVAC 1100 series computer.
;
;	In 1974, Michael N. LeVine of N.W.C. attemped
;	to port the UNIVAC version to a PDP-11/20 running
;	RT-11 but was unsucessfull. Useing as a target, the
;	capabilities of the original, an assembly langauge
;	version was written to run under RT-11. Between 1974 and
;	1983, the PDP-11 version was enhanced to a superset
;	of the features of the original FORTRAN program.
;	The final version (6.4) running under RT/RSX/IAS
;	with many user selectable features such as looking
;	for variables fitting selected conditions, and
;	a full entry point cross reference in tabular
;	and graphical format.
;
;	This VAX/VMS version is a complete rewrite in
;	VAX assembly language of the PDP-11 V6.4 INDEX.
;
;	Michael N. LeVine
;	Code 3513
;	Naval Weapons Center
;	China Lake
;	Ca
;	93555
;
;	(619)939-2318
;	 AVN 437-2318
;
;
;	History
;		Version 1.0
;			Started May 1983, completed July 15,1983
;			Deficencies
;				Switches not implimented
;					/OPTIONS
;					/STATISTICS
;			Possable future enhacements
;				Update the symbol table on the super index
;				to a tree structure, like the regular index,
;				from the current linear list structure
;				now in use. When doing so, must look into
;				some method to aleviate the ubalanced tree
;				generated by the alphabetically stored
;				symbol data.
;
;				Upgrade the input and parseing of command lines
;				to be more in line with the format of the
;				FORTRAN compiler.
;
;				Change the messages to SYS$OUTPUT from the
;				current method to useing the system message
;				facility.
;
;	REVISION HISTORY
;		26-JULY-83 MNL
;			FOUND THAT CONSTRUCTS OF THE FORM
;			IF(A.EQ.B)IFREEP=ABC
;			WERE NOT PROPERLY HANDLED. THE CONDITIONAL PART OF THE
;			IF WAS FIRST GUESSED AS AN IF, BUT WHEN FOUND NOT TO
;			FIT THE FORMAT- RETRYED AS AN ARITHMETIC. ERROR CAME IN
;			AS THE CONDITIONAL PART DID NOT START AT THE BEGINNING
;			OF THE LINE. THE RESET STARTED THE RETRY AT THE
;			START OF THE LINE EVEN THOUGH IN THIS CASE THAT
;			WAS NOT RIGHT. CHANGED "LINETYPE.MAR"
;
;		3-AUGUST-83 MNL
;			LOGIC TO SAY THAT VARIABLES IN DATA STATEMNTS HAVE
;			BEEN CHANGED (SET) IN VALUE INVERTED. CAUSED
;			WRONG FLAGGING OF DATA,PARAMETER,EQUIVALENCE AND
;			SAVE. CHANGED "EVAL.MAR"
;		15-AUGUST-83 MNL                                                ;V1.3
;			ADDED SWITCHES AND SUPPORTING CODE -/COMMENT,           ;V1.3
;			/EXPORT,/IMPORT.                                        ;V1.3
;			/COMMENT="  " ALLOWS THE USER TO INSERT A COMMENT       ;V1.3
;			INTO THE HEADER OF EACH PAGE.                           ;V1.3
;			/IMPORT	GETS IMPORTED VARIABLES INTO ROUTINE            ;V1.3
;			/EXPORT GETS EXPORTED VARIABLES FROM ROUTINE            ;V1.3
;			CHANGED "OPENCLOSE,EVAL,OUTPUT,STORE"                   ;V1.3
;		22-AUGUST-83 MNL                                                ;V1.4
;			ADDED HOOKS FOR FLOW CHART GENERATION                   ;V1.4
;			PUT IN CODE TO IMPLIMENT STATISTICS OUTPUT              ;V1.4
;			CHANGED "INDEX,OPENCLOSE,STORE,IOLINE,HEAP,OUTPUT       ;V1.4
;			TABLE,SUPER,FLOW", ADDED                                ;V1.4
;			MODULE "STATS". ALSO CHANGED                            ;V1.4
;			COMMAND FILES "INDEX,INDEXCOPY,LINK" AND                ;V1.4
;			"INDEX.RNO"                                             ;V1.4
;		26-AUGUST-83 MNL						;V1.5
;			FORGOT TO SET FLAG IN EVALUATEING INLINE FUNCTION       ;V1.5
;			CALLS STATEING THAT THE ARGUMENTS ARE USED.             ;V1.5
;			CANGED "INDEX,EVAL,IOLINE"                              ;V1.5
;               12-SEPTEMBER-83 MNL                                             ;V1.6
;			ADDITIONS TO MAKE SPOOLING OPTION WORK                  ;V1.6
;			ALSO ADDED /DELETE SWITCH                               ;V1.6
;                       CHANGED "INDEX,IOLINE,OPENCLOSE"                        ;V1.6
;		21-SEPTEMBER-83 MNL                                             ;V1.7
;			ENCODE/DECODE ERROR-THE I/O STRING SPECIFICATION        ;V1.7
;			DID NOT ALLOW FOR ARRAY OR CHR SUBSTRING SPECIFIATION   ;V1.7
;			CHANGED MODULES "LINETYPE,INDEX,IOLINE"                 ;V1.7
;		3-OCTOBER-83 MNL                                                ;V1.8
;			ERROR IN HANDLEING "TYPE * STATEMENTS, CAUSED THE       ;V1.8
;			PROGRAM TO BOMB IN "OUTPUT" DUE TO INVALID MENEMONIC    ;V1.8
;			NUMBER LOADED INTO SYMBOL TABLE HOW USED ELEMENT.       ;V1.8
;			CHANGED MODULES "EVAL,IOLINE,INDEX"                     ;V1.8
;		17-OCTOBER-83 MNL                                               ;V1.9
;			FOUND THAT THE NAME BLOCK AND ASSOCIATED STRINGS        ;V1.9
;			HAVE TO BE RE INITIALIZE BEFORE REUSE.CAUSED THE        ;V1.9
;                       OUTPUT TO GO ALWAYS TO THE FIRST OUPUT SPECIFIED        ;V1.9
;                       EITHER IMPLICITLY OR EXPLICITLY ON SUBSEQUENT FILES     ;V1.9
;			BEING CROSS REFENENCED                                  ;V1.9
;			CHANGED MODULES "OPENCLOSE,IOLINE,INDEX"                ;V1.9
;
	.PSECT	PURE_DATA,NOEXE,CON,NOWRT,SHR,GBL,RD
;
;	LOCAL PURE DATA
;
NO_END:	.ASCID	/INDEX-E-Missing End Statement/
CODE_1:	.LONG	1                                                               ;V1.4
CODE_2:	.LONG	2                                                               ;V1.4
CODE_3:	.LONG	3                                                               ;V1.4
CODE_4:	.LONG	4                                                               ;V1.4
CODE_5:	.LONG	5                                                               ;V1.4
	.PSECT	IMPURE_DATA,NOEXE,CON,WRT,NOSHR,GBL,RD,LONG
;
;	LOCAL IMPURE DATA
;
SCRATCH:.BLKL	2
ARG:	.LONG	2
	.ADDRESS	ARG1,ARG2
ARG1:	.LONG	0
ARG2:	.LONG	0
	.PSECT	CODE,EXE,CON,NOWRT,SHR,GBL,NOVEC
	.ENTRY	INDEX,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
;
;	ONE TIME ONLY CODE INITIALLIZATION
;
;	LINES PER PAGE ON LINE PRINTER
	CALLG	NULL,LIB$LP_LINES
	MOVL	R0,LINES_PER_PAGE
;
;	OPEN SCRATCH FILES
	CALLG	NULL,OPEN_SCRATCH

;	INIT SYMBOL TABLE AREA
	MOVAL	SYMBOL_TABLE_QUEUE,SYMBOL_TABLE_QUEUE
	MOVAL	SYMBOL_TABLE_QUEUE,SYMBOL_TABLE_QUEUE+4
	MOVAL	LINE_TOKEN_QUEUE,LINE_TOKEN_QUEUE
	MOVAL	LINE_TOKEN_QUEUE,LINE_TOKEN_QUEUE+4
;	INIT THE STATISTICS BUFFERS                                             ;V1.4
	MOVC5	#0,NULL,#0,#<VM_INUSE-TIME_COMMAND>,TIME_COMMAND                ;V1.4
;	INIT THE HEAP
	CALLG	NULL,INIT_HEAP
;
;	NEW FILE INITIALIZATION CODE LOOP ENTRY POINT
;
;	INIT TIMER FOR STATISTICS                                               ;V1.4
;                                                                               ;V1.4
	CALLG	NULL,G^LIB$INIT_TIMER                                           ;V1.4
NEW_FILE:                                                                       ;V1.4
;                                                                               ;V1.4
;                                                                               ;**-1
;	GET COMMAND FROM OPERATOR, PARSE IT AND OPEN FILES
;
	CALLG	NULL,OPEN
;	GET DAY-TIME FOR LIST HEADER
	PUSHAL	DAY_TIME
	CALLS	#1,LIB$DATE_TIME
;	CLEAR END OF FILE FLAG AND INPUT BUFFER IN USE FLAG
	CLRL	END_OF_FILE
	CLRL	DEFFERED_END_OF_FILE
	CLRL	INPUT_BUFFER_FLAG
;
;	COMMAND TIME STATISTICS SAVE                                            ;V1.4
;                                                                               ;V1.4
	PUSHAL	TIME_COMMAND                                                    ;V1.4
	PUSHAL	CODE_1                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_COMMAND+8                                                  ;V1.4
	PUSHAL	CODE_2                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_COMMAND+12                                                 ;V1.4
	PUSHAL	CODE_3                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_COMMAND+16                                                 ;V1.4
	PUSHAL	CODE_4                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_COMMAND+20                                                 ;V1.4
	PUSHAL	CODE_5                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	CALLG	NULL,G^LIB$INIT_TIMER                                           ;V1.4
		                                                                ;V1.4
;                                                                               ;V1.4
;	NEW SORCE MODULE INITIALIZATION CODE
;
NEW_MODULE:
;
;	MODULE PARSE LOOP
;	SET STATUS WORD
	MOVL	#PARSE_LINES,STATUS_WORD
	CLRL	LINES_ON_PAGE
;	INITIALIZE STATISTICS ACCUMULATION
;	INI NEW SOURCE DATA INCL LINE NUMBER,PAGE NUMBER
	CLRL	LINE_NUMBER
	CLRL	PAGE_NUMBER
	CLRL	INCLUDE_LEVEL
	CLRL	PROGRAM_LEVEL
	CLRL	BLOCK_DATA_FLAG
	CLRL	END_FLAG
	CLRL	PROGRAM_FLAG
	MOVC3	#31,DEFAULT_NAME,MODULE_NAME
;                                                                               ;**-2
;	GET A LINE TO PARSE (INCLUDEING COMMENTS)
;
	CALLG	NULL,GET_LINE
NEW_LINE:
;
;	IF E.O.F. AND NOT IN INCLUDE FILE GO TO CLOSE PROCESSING
;	IF E.O.F. AND IN INCLUDE FILE-POP UP ONE LEVEL IN PROCESSING
;	AND GET NEW LINE
	TSTL	END_OF_FILE	;END OF FILE CHECK
	BNEQ	3$                                                              ;V1.4
	BRW	1$                                                              ;V1.4
3$:	TSTL	LINE_NUMBER	;CHECK FOR REQUIRED END PROCESSING              ;V1.4
	BNEQ	1003$                                                           ;V1.4
	BRW	2$                                                              ;V1.4
1003$:	PUSHAL	NO_END                                                          ;V1.4
	CALLS	#1,G^LIB$PUT_OUTPUT                                             ;V1.4
	CALLG	NULL,PARSE_BAD_END                                              ;V1.4
;	RESET SYMBOL TABLE AREA                                                 ;V1.4
	CALLG	NULL,CLEAR_SYMBOL_TABLE                                         ;V1.4
	PUSHAL	TIME_CLEANUP                                                    ;V1.4
	PUSHAL	CODE_1                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+8                                                  ;V1.4
	PUSHAL	CODE_2                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+12                                                 ;V1.4
	PUSHAL	CODE_3                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+16                                                 ;V1.4
	PUSHAL	CODE_4                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+20                                                 ;V1.4
	PUSHAL	CODE_5                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	CALLG	NULL,G^LIB$INIT_TIMER                                           ;V1.4
	CALLG	NULL,DUMP_STATS                                                 ;V1.4
2$:	JMP	CLOSE_DOWN                                                      ;**-6
1$:
;	USE LIB$FREE_VM TO RELEASE MEMORY IN USE IN LINE TOKEN QUEUE
4$:	REMQUE	@LINE_TOKEN_QUEUE,R11	;REMOVE ELEMENT FROM QUEUE
	BVS	5$			;IF QUEUE EMPTY-DONE
	CVTWL	14(R11),ARG1		;GET SIZE IN BYTES
	MOVL	R11,ARG2		;BASE ADDRESS
	CALLG	ARG,FREE	;RELEASE MEMORY TO HEAP
	BRB	4$
5$:
;
;	DETERMINE LINE TYPE AND DOUBLE CHECK IT
;
	CALLG	NULL,GET_LINE_TYPE
;
;	PARSE THE LINE AND SAVE RESULTS
;
	CALLG	NULL,EVAL
;
;	IF END- DO OUTPUT OF ACCUMULATED DATA AND STATISTICS
;	AND GO TO NEW MODULE LOOP
;
	TSTL	END_FLAG
	BNEQ	1005$                                                           ;V1.4
	BRW	6$                                                              ;V1.4
;	RESET SYMBOL TABLE AREA                                                 ;V1.4
1005$:	CALLG	NULL,CLEAR_SYMBOL_TABLE                                         ;V1.4
	PUSHAL	TIME_CLEANUP                                                    ;V1.4
	PUSHAL	CODE_1                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+8                                                  ;V1.4
	PUSHAL	CODE_2                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+12                                                 ;V1.4
	PUSHAL	CODE_3                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+16                                                 ;V1.4
	PUSHAL	CODE_4                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	PUSHAL	TIME_CLEANUP+20                                                 ;V1.4
	PUSHAL	CODE_5                                                          ;V1.4
	CALLS	#2,G^LIB$STAT_TIMER                                             ;V1.4
	CALLG	NULL,G^LIB$INIT_TIMER                                           ;V1.4
	CALLG	NULL,DUMP_STATS                                                 ;V1.4
	JMP	NEW_MODULE                                                      ;**-1
6$:
;
;	GET NEW LINE
;
	CALLG	NULL,GET_LINE
	JMP	NEW_LINE
CLOSE_DOWN:
;
;	DO CLOSE PROCESSING
;
	CALLG	NULL,CLOSE
                                                                                ;**-2
;
;	GO GET NEW COMMAND
;
	JMP	NEW_FILE
	.END	INDEX
