.TITLE ENTRY_INDEX .SUBTITLE DATA STORAGE AREA .ENABLE DEBUG .PSECT IMPURE_DATA,RD,WRT,NOSHR,NOEXE,CON,GBL,LONG ARG1: .LONG 0 ARG2: .LONG 0 OUTPUT_LINE: .BLKB 132 OUTPUT_STRING: .LONG 0,0 LINE_COUNT: .LONG 0 CHAR_COUNT: .LONG 0 NUMBER: .LONG 0 TREE_QUEUE: .ADDRESS 0,0 LEVEL: .LONG 0 OVERFLOW: .LONG 0 RECURSION: .LONG 0 MULT_DEF_ERROR: ;V1.13 .LONG MULT_END-MULT_START ;V1.13 .ADDRESS MULT_START ;V1.13 MULT_START: ;V1.13 .ASCII /INDEX-W-Multiple Definition of Entry Point / ;V1.13 MULT_SYMBOL: ;V1.13 .ASCII / / ;V1.13 MULT_END: ;V1.13 .PSECT PURE_DATA,RD,NOWRT,SHR,NOEXE,CON,GBL 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 T1: .ASCID / is defined in module / T1A: .ASCID / ??????/ T2: .ASCID / CALLS ROUTINES / T3: .ASCID / CALLED BY ROUTINES / T4: .ASCID / is in file / ;V1.21 VM_ARG: .LONG 2 .ADDRESS ARG1,ARG2 SUPER_REWIND_ERROR: .ASCID /INDEX-F-Rewind Super Index Scratch File Error/ ENTRY_REWIND_ERROR: .ASCID /INDEX-F-Rewind Entry Index Scratch File Error/ ENTRY_READ_ERROR: .ASCID /INDEX-F-Read Entry Scratch File Error/ SUPER_READ_ERROR: .ASCID /INDEX-F-Read Super Scratch File Error/ .PAGE .SUBTITLE INITALIZE ENTRY POINT .PSECT CODE,RD,NOWRT,SHR,EXE,GBL,CON .ENTRY DUMP_ENTRY_INDEX,^M 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 TSTL ENTRY_SAVED_FLAG ;V1.12 BEQL 4$ ;V1.12 BRW DO_ENTRY_OUTPUT ;V1.12 4$: $REWIND RAB=SUPER_INDEX_RAB ;REWIND THE SCRATCH FILES ;V1.12 BLBS R0,1$ PUSHR #^M PUSHAL SUPER_REWIND_ERROR CALLS #1,G^LIB$PUT_OUTPUT POPR #^M $EXIT_S R0 1$: $REWIND RAB=ENTRY_INDEX_RAB BLBS R0,2$ PUSHR #^M PUSHAL ENTRY_REWIND_ERROR CALLS #1,G^LIB$PUT_OUTPUT POPR #^M $EXIT_S R0 2$: ; SYMBOL TABLE IS IN AN EMPTY CONDITION PUSHAL DAY_TIME CALLS #1,G^LIB$DATE_TIME ;GET CURRENT TIME FOR HEADER CLRL LINES_ON_PAGE MOVL #ENTRY_OUTPUT,STATUS_WORD MOVL #132,LINE_COUNT MOVAL OUTPUT_LINE,OUTPUT_STRING+4 BITL #NARROW_FLAG,FLAG_WORD BEQL 3$ MOVL #80,LINE_COUNT ; RESET THE SYMBOL TABLE QUEUE HEADER -USE THE OLD FORM FOR ENTRY POINT ;V1.10 ; TABLE HANDLEING. THE GAINS FROM REWRITEING TO A BINARY TREE STRUCTURE ;V1.10 ; USEING THE SUPPLIED SYSTEM ROUTINES NOT WORTH THE EFFORT FOR THE ;V1.10 ; RELATIVELY SMALL NUMBER OF SYMBOLS THAT ARE PROCESSED ;V1.10 3$: MOVAL SYMBOL_TABLE_QUEUE,SYMBOL_TABLE_QUEUE ;V1.10 MOVL SYMBOL_TABLE_QUEUE,SYMBOL_TABLE_QUEUE+4 ;V1.10 ; ; DATA STORAGE ELEMENT IN THE ENTRY INDEX QUEUE LIST ; IS AS FOLLOWS ; ; SYMBOL_TABLE_QUEUE POINTS TO SYMBOL ELEMENTS ; ; ---------------------------------- ; !POINTER TO NEXT SYMBOL ! 0 ; ---------------------------------- ; !POINTER TO LAST SYMBOL ! 4 ; ---------------------------------- ; !POINTER TO FIRST CALLS ELEMENT! 8 ; ---------------------------------- ; !POINTER TO LAST CALLS ELEMENT !12 ; ---------------------------------- ; !POINTER TO FIRST CALL BY ELEMENT!16 ; ---------------------------------- ; !POINTER TO LAST CALL BY ELEMENT !20 ; ---------------------------------- ; !SYMBOL (NULL PADDED) !LENGTH !<= ONE BYTE 24-25 ; ---------------------------------- ; !31 BYTES LONG ! ; ; ! ! ; ---------------------------------- ; !DEFINEING-MODULE NAME !LENGTH!<=ONE BYTE 56-57 ; ---------------------------------- ; !NULL PADDED-EMPTY IF NOT DEFINED! ; ; ! ! ; ---------------------------------- ; !DEFINEING-FILE NAME !LENGTH! PUSHAL ENTRY_READ_ERROR CALLS #1,G^LIB$PUT_OUTPUT POPR #^M $EXIT_S R0 1$: MOVAL SYMBOL_TABLE_QUEUE,R11 ;GET QUEUE HEADER MOVL R11,R10 ;WORK WITH COPY OF POINTER FIND_SYMBOL_LOOP: MOVL (R10),R10 ;CHECK NEXT SYMBOL CMPL R10,R11 ;SEE IF COMPLETED SCAN AND NOT HERE BNEQ 111$ JMP ADD_SYMBOL_ON_END 111$: CMPC3 #31,25(R10),ENTRY_BUFFER+1 BLSS FIND_SYMBOL_LOOP ;NOT THERE YET BNEQ 1$ ;NOT IN QUEUE-MUST INSERT JMP CHECK_FOUND_SYMBOL ;FOUND SYMBOL IN TABLE ;V1.13 ; SYMBOL NOT IN TABLE-INSERT PRECEEDING CURRENT ELEMENT 1$: MOVL #120,ARG1 ;V1.21 INCL SYMBOLS_PROCESSED ;V1.4 CALLG VM_ARG,ALLOCATE 2$: MOVAL 8(R0),8(R0) ;INIT THE CALL/CALLED BY QUEUES MOVL 8(R0),12(R0) MOVAL 16(R0),16(R0) MOVL 16(R0),20(R0) MOVL 4(R10),R9 ;GET ADDRESS OF PREDISESSOR INSQUE (R0),(R9) ;INSTALL IN QUEUE MOVL R0,R10 ;INSTALL AS SYMBOL BEING EXAMINED MOVC3 #96,ENTRY_BUFFER,24(R0) ;LOAD THE SYMBOL LENGTH AND STRING ;V1.21 BRW FOUND_SYMBOL ;GO HANDLE USED IN BLOCK ADD_SYMBOL_ON_END: ; SYMBOL NOT IN TABLE-ADD ON END MOVL #120,ARG1 ;V1.21 INCL SYMBOLS_PROCESSED ;V1.4 CALLG VM_ARG,ALLOCATE MOVAL 8(R0),8(R0) ;INIT THE CALL/CALLED BY QUEUES MOVL 8(R0),12(R0) MOVAL 16(R0),16(R0) MOVL 16(R0),20(R0) INSQUE (R0),@SYMBOL_TABLE_QUEUE+4;PUT ON END OF QUEUE MOVL R0,R10 MOVC3 #96,ENTRY_BUFFER,24(R0) ;LOAD THE SYMBOL LENGTH AND STRING ;V1.21 BRW FOUND_SYMBOL ;V1.13 CHECK_FOUND_SYMBOL: ;V1.13 TSTB ENTRY_BUFFER+32 ;SEE IF THIS IS THIS A DEFINITION ;V1.13 BEQL FOUND_SYMBOL ;NO ;V1.13 TSTB 56(R10) ;IS SYMBOL DEFINED ;V1.13 BEQL FOUND_SYMBOL ;NO ;V1.13 ; WE HAVE A MULTIPLE DEFINITION OF SYMBOL-TELL SOMEONE ;V1.13 CVTBL ENTRY_BUFFER,R0 ;GET LENGTH OF SYMBOL ;V1.13 MOVC5 R0,ENTRY_BUFFER+1,#0,#32,MULT_SYMBOL ;COPY SYMBOL-NULL FILL ;V1.13 PUSHAL MULT_DEF_ERROR ;V1.13 CALLS #1,G^LIB$PUT_OUTPUT ;V1.13 FOUND_SYMBOL: ; R10 POINTS TO SYMBOL QUEUE ELEMENT ; NOW SEE IF ENTRY POINT HAS BEEN DEFINED YET TSTB 56(R10) BEQL 2$ JMP TABLE_BUILD_LOOP ;YES-DONE ENTERING ENTRY POINT 2$: TSTB ENTRY_BUFFER+32 ;IS NEW ENTRY A DEFINEING ONE?? BNEQ 1$ JMP TABLE_BUILD_LOOP ;NO 1$: MOVC3 #64,ENTRY_BUFFER+32,56(R10);LOAD DEFINEING MODULE NAME ;V1.21 BRW TABLE_BUILD_LOOP ;GET NEXT ENTRY POINT .PAGE .SUBTITLE SCAN LIST OF ENTRY POINTS FOR UNDEFINED NAMES CHECK_UNDEFINED: BITL #NOLIB_FLAG,FLAG_WORD ;SEE IF CHECK HAS TO BE DONE BNEQ 1$ JMP DO_CALL_CALLED_BY 1$: MOVAL SYMBOL_TABLE_QUEUE,R11 MOVL R11,R10 2$: MOVL (R10),R10 ;GET NEXT TEST SYMBOL CMPL R10,R11 ;END TEST BNEQ 3$ JMP DO_CALL_CALLED_BY 3$: TSTB 56(R10) ;CHECK DEFINEING MODULE NAME BNEQ 2$ ;DEFINED-PROCEED TO NEXT LOCC #^A/$/,#31,25(R10) ;FIRST SCANN FOR PRESENCE OF ;DOLLAR SIGN BNEQ 100$ ;FOUND $ DUMP IT ; MUST CHECK LIST OF KNOWN FORTRAN ROUTINES ; SET UP POINTER TO TABLE OF DESCRIPTERS ; AND COUNTER CVTBL 24(R10),R6 ;GET LENGTH OF STRING MOVAL LIBRARY_POINTER_TABLE,R9 MOVL #NUMBER_OF_LIBRARY,R8 ; NOW LOOP 10$: CVTWL (R9),R7 ;GET LENGTH CMPC5 R7,@4(R9),#0,R6,25(R10) ;COMPARE TWO STRINGS BEQL 100$ ;ITS A HIT ADDL2 #8,R9 ;ADVANCE TO NEXT DESCRIPTER SOBGTR R8,10$ ; ITS A MISS BRW 2$ ;CONTINUE TO NEXT SYMBOL 100$: ; REMOVE THIS ELEMENT FROM TABLE REMQUE (R10),ARG2 MOVL 4(R10),R10 ;LOAD PREDISESSOR AS CURRENT ELEMENT ; AND RETURN TO FREE STORAGE MOVL #120,ARG1 ;V1.21 CALLG VM_ARG,FREE BRW 2$ .PAGE .SUBTITLE LOAD CALL/CALLED BY QUEUES DO_CALL_CALLED_BY: $GET RAB=SUPER_INDEX_RAB BLBS R0,1$ CMPL #RMS$_EOF,R0 ;RAN OUT OF DATA-GO OUTPUT IT BNEQ 2$ BITL #TRANSFER_ENTRY_FLAG,FLAG_WORD+4 ;SEE IF NEED TO DELETE ;V1.13 BEQL 7$ ;NO-KEEP E.P. ;V1.13 MOVAL SYMBOL_TABLE_QUEUE,R11 ;SET UP FOR SCAN OF TABLE ;V1.13 MOVL R11,R10 ;V1.13 8$: MOVL (R10),R10 ;V1.13 CMPL R10,R11 ;SEE IF DONE ;V1.13 BEQL 7$ ;YES ;V1.13 TSTB 56(R10) ;SEE IF UNDEFINED ;V1.13 BEQL 8$ ;YES-SKIP ;V1.13 CMPC3 #32,24(R10),56(R10) ;SEE IF E.P. AND MODULE NAME MATCH ;V1.13 BEQL 8$ ;YES-SKIP TO NEXT ;V1.13 ; FOUND E.P. ENTRY NAME-REMOVE IT ;V1.13 REMQUE (R10),ARG2 ;REMOVE FROM QUEUE ;V1.13 MOVL 4(R10),R10 ;LOAD PREDISSESOR AS CURRENT ELEMENT ;V1.13 MOVL #120,ARG1 ;LOAD LENGTH ;V1.21 CALLG VM_ARG,FREE ;RELEASE ELEMENT ;V1.13 BRW 8$ ;GO CHECK NEXT ELEMENT ;V1.13 7$: JMP DO_ENTRY_OUTPUT ;V1.13 2$: PUSHR #^M PUSHAL SUPER_READ_ERROR CALLS #1,G^LIB$PUT_OUTPUT POPR #^M $EXIT_S R0 1$: BITL #NOLIB_FLAG,FLAG_WORD BEQL 4$ ; CHECK TO SEE IF SYMBOL ACTUALLY EXISTS IN E.P. TABLE MOVAL SYMBOL_TABLE_QUEUE,R11 MOVL R11,R10 3$: MOVL (R10),R10 ;CHECK NEXT SYMBOL CMPL R10,R11 ;SEE IF DONE BNEQ 10$ ;V1.13 BRW DO_CALL_CALLED_BY;DONE-NOT HERE-FORGET IT ;V1.13 10$: CMPC3 #32,SUPER_BUFFER,24(R10) ;V1.13 BNEQ 3$ ;NOT YET ; SYMBOL IS LEGAL E.P.-SEE IF TRANSFER_ENTRY WANTED ;V1.13 4$: BITL #TRANSFER_ENTRY_FLAG,FLAG_WORD+4 ;V1.13 BEQL 5$ ;NO ;V1.13 ; FIND E.P. NAME AND DEFINEING MODULE NAME TO REPLACE IT ;V1.13 MOVAL SYMBOL_TABLE_QUEUE,R11 ;V1.13 MOVL R11,R10 ;V1.13 6$: MOVL (R10),R10 ;CHECK NEXT SYMBOL ;V1.13 CMPL R10,R11 ;SEE IF DONE ;V1.13 BNEQ 9$ ;V1.13 BRW DO_CALL_CALLED_BY;DONE_NOT HERE FORGET IT ;V1.13 9$: CMPC3 #32,SUPER_BUFFER,24(R10) ;V1.13 BNEQ 6$ ;NOT YET ;V1.13 TSTB 56(R10) ;SEE IF UNDEFINED E.P. ;V1.13 BEQL 5$ ;YES-NO MOD'S NECESSARY ;V1.13 CMPC3 #32,24(R10),56(R10) ;SEE IF E.P. IS ENTRY ;V1.13 BEQL 5$ ;NO-E.P. IS SAME AS MODULE NAME ;V1.13 MOVC3 #32,56(R10),SUPER_BUFFER;CHANGE E.P. NAME TO THAT OF DEF. MODULE;V1.13 5$: MOVAL SYMBOL_TABLE_QUEUE,R11 ;GET QUEUE HEADER ;V1.13 MOVL R11,R10 ;WORK WITH COPY OF POINTER CLRL R8 ;FLAG FOR GETTING CALLED/CALLING ; NOW SCAN DOWN THROUGH USED IN ELEMENTS FOR THAT SYMBOL LOCATE_SYMBOL_LOOP: MOVL (R10),R10 CMPL R10,R11 BNEQ 60$ ;V1.13 BRW DO_CALL_CALLED_BY ;V1.13 60$: ;V1.13 ; CHECK ON MODULE NAME = SYMBOL TABLE NAME CMPC3 #32,24(R10),SUPER_BUFFER+32 BNEQ 100$ ;NO-NOT CALLS ENTRY ; LOAD SYMBOL ALPHABETICALLY IN CALLS QUEUE FOR THIS SYMBOL MOVAL 8(R10),R6 ;GET CALLS QUEUE HEADER MOVL R6,R7 10$: MOVL (R7),R7 ;GET NEXT CMPL R7,R6 BEQL 50$ ;ADD ON END CMPC3 #31,9(R7),SUPER_BUFFER+1 BLSS 10$ ;NOT THERE YET BEQL 100$ ;ALREADY THERE-DON'T DUPLICATE ;V1.13 ; ADD TO PREDICESSOR MOVL #40,ARG1 INCL HOW_USED_PROCESSED ;V1.4 CALLG VM_ARG,ALLOCATE MOVL 4(R7),R6 ;GET PREDISESSOR INSQUE (R0),(R6) ;AND INSTALL IT MOVC3 #32,SUPER_BUFFER,8(R0) INCL R8 ;BUMP COUNTER BRB 100$ 50$: ;ADD TO END MOVL #40,ARG1 INCL HOW_USED_PROCESSED ;V1.4 CALLG VM_ARG,ALLOCATE INSQUE (R0),@12(R10) ;ADD TO END MOVC3 #32,SUPER_BUFFER,8(R0) INCL R8 100$:; CHECK ON E.P. NAME=SYMBOL CMPC3 #32,24(R10),SUPER_BUFFER BNEQ 200$ ;NO NOT CALLED BY MOVAL 16(R10),R6 ;GET CALLED QUEUE HEADER MOVL R6,R7 110$: MOVL (R7),R7 ;GET NEXT CMPL R7,R6 BEQL 150$ ;ADD ON END CMPC3 #31,9(R7),SUPER_BUFFER+33 BLSS 110$ ;NOT THERE YET BEQL 200$ ;ALREADY THERE-DON'T DUPLICATE ;V1.13 ; ADD TO PREDICESSOR MOVL #40,ARG1 INCL HOW_USED_PROCESSED ;V1.4 CALLG VM_ARG,ALLOCATE MOVL 4(R7),R6 ;GET PREDISESSOR INSQUE (R0),(R6) ;AND INSTALL IT MOVC3 #32,SUPER_BUFFER+32,8(R0) INCL R8 ;BUMP COUNTER BRB 200$ 150$: ;ADD TO END MOVL #40,ARG1 INCL HOW_USED_PROCESSED ;V1.4 CALLG VM_ARG,ALLOCATE INSQUE (R0),@20(R10) ;ADD TO END MOVC3 #32,SUPER_BUFFER+32,8(R0) INCL R8 200$: CMPL #2,R8 ;DONE YET BEQL 210$ JMP LOCATE_SYMBOL_LOOP 210$: JMP DO_CALL_CALLED_BY .PAGE .SUBTITLE BASIC ENTRY POINT CALLS/CALLED BY LISTING DO_ENTRY_OUTPUT: PUSHAL TIME_PARSE ;V1.4 PUSHAL CODE_1 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_PARSE+8 ;V1.4 PUSHAL CODE_2 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_PARSE+12 ;V1.4 PUSHAL CODE_3 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_PARSE+16 ;V1.4 PUSHAL CODE_4 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_PARSE+20 ;V1.4 PUSHAL CODE_5 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 CALLG NULL,G^LIB$INIT_TIMER ;V1.4 BITL #NOENTRY_TABLE_FLAG,FLAG_WORD+4 ;V1.12 BEQL 1$ ;V1.12 BRW TRY_CALLING_TREE ;V1.12 1$: MOVAL SYMBOL_TABLE_QUEUE,R11 ;INIT THE WHOLE PRINTOUT ;V1.12 MOVL R11,R10 BASIC_OUTPUT_LOOP: MOVL (R10),R10 ;NEXT ENTRY POINT CMPL R10,R11 BNEQ 11$ JMP TRY_CALLING_TREE 11$: ; BASIC ENTRY POINT LISTING HAS THE FORM ; LINE 1 symbol [IS DEFINED IN MODULE (xx|??)][ IS IN FILE xxx] ;V1.21 ; LINE 2 CALLS ROUTINES ; LINE 3 list of routines called ; LINE 4 IS CALLED BY ROUTINES ; LINE 5 lis of routines called by ; ; INSERT PRECEEDING BLANK LINE MOVB #^A/ /,OUTPUT_LINE CLRL OUTPUT_LINE+1 MOVL #1,OUTPUT_STRING MOVAL OUTPUT_LINE,OUTPUT_STRING+4 PUSHAL OUTPUT_STRING CALLS #1,PRINT_LINE ; FIRST LINE-GET THE SYMBOL CVTBL 24(R10),R9 ;GET THE LENGTH MOVC3 R9,25(R10),OUTPUT_LINE ;PUT THE SYMBOL MOVAL OUTPUT_LINE,OUTPUT_STRING MOVL R9,OUTPUT_STRING ;INIT THE DESCRIPTER CMPC3 #32,24(R10),56(R10) ;DEFINES SELF BEQL 1$ ;YES ; NO-MUST OUTPUT DEFINEING MODULE NAME MOVL OUTPUT_STRING,R6 CVTWL T1,R7 ;GET TITE LENGTH MOVC3 R7,@T1+4,L^OUTPUT_LINE(R6);STORE THE TITLE ;V1.21 ADDL2 R7,OUTPUT_STRING ADDL2 R7,R6 ;UPDATE CHR COUNTER CVTBL 56(R10),R7 ;GET MODULE NAME LENGTH BEQL 2$ ;EMPTY MODULE NAME-NOT DEFINED MOVC3 R7,57(R10),L^OUTPUT_LINE(R6);COPY DEFINEING MODULE NAME ;V1.21 ADDL2 R7,OUTPUT_STRING BRB 1$ 2$: CVTWL T1A,R7 ;GET THE ????? MOVC3 R7,@T1A+4,L^OUTPUT_LINE(R6) ;V1.21 ADDL2 R7,OUTPUT_STRING ;UDATE STRING LENGTH 1$: ;V1.21 ; SEE ABOUT THE THE FILE NAME DEFINED IN ;V1.21 BITL #FILE_NAME_FLAG,FLAG_WORD+4 ;V1.21 BEQL 3$ ;V1.21 ; SEE IF DEFINED ;V1.21 TSTB 56(R10) ;V1.21 BEQL 3$ ;NO-SKIP THIS OUTPUT ;V1.21 ; NO-MUST OUTPUT DEFINEING FILE NAME ;V1.21 MOVL OUTPUT_STRING,R6 ;V1.21 CVTWL T4,R7 ;GET TITLE LENGTH ;V1.21 MOVC3 R7,@T4+4,L^OUTPUT_LINE(R6);STORE THE TITLE ;V1.21 ADDL2 R7,OUTPUT_STRING ;V1.21 ADDL2 R7,R6 ;ACCOUNT FOR TITLE ;V1.21 CVTBL 88(R10),R7 ;GET FILE NAME LENGTH ;V1.21 MOVC3 R7,89(R10),L^OUTPUT_LINE(R6);COPY DEFINEING FILE NAME ;V1.21 ADDL2 R7,OUTPUT_STRING ;V1.21 3$: PUSHAL OUTPUT_STRING ;V1.21 CALLS #1,PRINT_LINE ;OUTPUT LINE 1 ; SEE IF ANY CALLS MOVAL 8(R10),R0 CMPL 8(R10),R0 BNEQ 1011$ JMP 200$ ;NO-CALLS QUEUE IS EMPTY-SKIP THIS SECT 1011$: PUSHAL T2 ;YES-PRINT SECOND TITLE CALLS #1,PRINT_LINE MOVAL 8(R10),R9 ;GET CALLS QUEUE HEADER MOVL R9,R8 MOVC5 #0,NULL,#0,#132,OUTPUT_LINE MOVC5 #0,NULL,#^A/ /,#12,OUTPUT_LINE ;INIT THE OUTPUT LINE MOVL #12,OUTPUT_STRING MOVAL OUTPUT_LINE,OUTPUT_STRING+4 SUBL3 #12,LINE_COUNT,CHAR_COUNT 101$: MOVL (R8),R8 ;NEXT CALL CMPL R8,R9 BNEQ 111$ JMP 150$ 111$: CVTBL 8(R8),R7 ;GET LENGTH OF CALLS-SYMBOL ADDL3 #3,R7,R6 ;ACCOUNT FOR 3 LEADING BLANKS CMPL R6,CHAR_COUNT ;SEE IF ROOM LEFT BLEQ 102$ ;YES PUSHAL OUTPUT_STRING ;LINE IS FULL-PRINT IT CALLS #1,PRINT_LINE MOVC5 #0,NULL,#0,#132,OUTPUT_LINE MOVC5 #0,NULL,#^A/ /,#12,OUTPUT_LINE MOVL #12,OUTPUT_STRING MOVAL OUTPUT_LINE,OUTPUT_STRING+4 SUBL3 #12,LINE_COUNT,CHAR_COUNT 102$: CVTWL OUTPUT_STRING,R6;GET OFFSET TO START STORE MOVC5 #0,NULL,#^A/ /,#3,L^OUTPUT_LINE(R6) ;INSERT BLANKS ;V1.21 ADDL2 #3,OUTPUT_STRING ADDL2 #3,R6 SUBL2 #3,CHAR_COUNT MOVC3 R7,9(R8),L^OUTPUT_LINE(R6) ;OUTPUT THE SYMBOL ;V1.21 ADDL2 R7,OUTPUT_STRING SUBL2 R7,CHAR_COUNT BRW 101$ ;GET NEXT SYMBOL 150$: PUSHAL OUTPUT_STRING ;LINE IS FULL-PRINT IT CALLS #1,PRINT_LINE ;NOW WORK ON CALLED BY SECTION 200$: MOVAL 16(R10),R0 CMPL 16(R10),R0 BNEQ 211$ JMP BASIC_OUTPUT_LOOP ;NO-CALLS QUEUE IS EMPTY-SKIP THIS SECT 211$: PUSHAL T3 ;YES-PRINT THIRD TITLE CALLS #1,PRINT_LINE MOVAL 16(R10),R9 ;GET CALLS QUEUE HEADER MOVL R9,R8 MOVC5 #0,NULL,#0,#132,OUTPUT_LINE MOVC5 #0,NULL,#^A/ /,#12,OUTPUT_LINE ;INIT THE OUTPUT LINE MOVL #12,OUTPUT_STRING MOVAL OUTPUT_LINE,OUTPUT_STRING+4 SUBL3 #12,LINE_COUNT,CHAR_COUNT 201$: MOVL (R8),R8 ;NEXT CALL CMPL R8,R9 BNEQ 212$ JMP 250$ 212$: CVTBL 8(R8),R7 ;GET LENGTH OF CALLS-SYMBOL ADDL3 #3,R7,R6 ;ACCOUNT FOR 3 LEADING BLANKS CMPL R6,CHAR_COUNT ;SEE IF ROOM LEFT BLEQ 202$ ;YES PUSHAL OUTPUT_STRING ;LINE IS FULL-PRINT IT CALLS #1,PRINT_LINE MOVC5 #0,NULL,#0,#132,OUTPUT_LINE MOVC5 #0,NULL,#^A/ /,#12,OUTPUT_LINE MOVL #12,OUTPUT_STRING MOVAL OUTPUT_LINE,OUTPUT_STRING+4 SUBL3 #12,LINE_COUNT,CHAR_COUNT 202$: CVTWL OUTPUT_STRING,R6;GET OFFSET TO START STORE MOVC5 #0,NULL,#^A/ /,#3,L^OUTPUT_LINE(R6) ;INSERT BLANKS ;V1.21 ADDL2 #3,OUTPUT_STRING ADDL2 #3,R6 SUBL2 #3,CHAR_COUNT MOVC3 R7,9(R8),L^OUTPUT_LINE(R6) ;OUTPUT THE SYMBOL ;V1.21 ADDL2 R7,OUTPUT_STRING SUBL2 R7,CHAR_COUNT BRW 201$ ;GET NEXT SYMBOL 250$: PUSHAL OUTPUT_STRING ;LINE IS FULL-PRINT IT CALLS #1,PRINT_LINE BRW BASIC_OUTPUT_LOOP .PAGE .SUBTITLE GENERATE CALLING TREE TRY_CALLING_TREE: BITL #CALLING_TREE_FLAG,FLAG_WORD ;AS CALLING TREE ASED FOR BNEQ 1$ ;NO JMP TRY_CALLED_TREE 1$: CLRL LINES_ON_PAGE ;SET UP FOR NEW PAGE AND TITLE MOVL #CALLING_OUTPUT,STATUS_WORD CLRL LEVEL ;LEVEL IS ZERO MOVAL TREE_QUEUE,TREE_QUEUE ;INIT TREE RECURSION CHECK QUEUE MOVL TREE_QUEUE,TREE_QUEUE+4 MOVAL SYMBOL_TABLE_QUEUE,R11 ;SET UP FOR SCANN FOR TOP LEVEL ;MODULES MOVL R11,R10 CALLING_TOP_LEVEL_LOOP: MOVL (R10),R10 ;NEXT SYMBOL PLEASE CMPL R10,R11 ;CHECK FOR DONE BNEQ 1$ JMP TRY_CALLED_TREE ;DONE THIS TREE-TRY NEXT 1$: BITL #FLOW_SYMBOL_FLAG,FLAG_WORD+4 ;V1.12 BEQL 2$ ;V1.12 CMPC3 #32,ENTRY_SYMBOL,24(R10) ;FOUND WANTED SYMBOL ;V1.12 BNEQ CALLING_TOP_LEVEL_LOOP ;V1.12 CALLG NULL,SCAN_CALLING_SYMBOL ;V1.12 BRW TRY_CALLED_TREE ;NO NEED TO CONTINUE ;V1.12 2$: MOVAL 16(R10),R9 ;SEE IF ANY CALLED BY ;V1.12 CMPL 16(R10),R9 BNEQ CALLING_TOP_LEVEL_LOOP ;NOT A TOP SYMBOL ; FOUND A ROOT MODULE-START FROM HERE ; CALL RECUSRIVE ROUTINE TO OUTPUT THIS SYMBOL AND ALL BELOW IT CALLG NULL,SCAN_CALLING_SYMBOL BRW CALLING_TOP_LEVEL_LOOP .ENTRY SCAN_CALLING_SYMBOL,^M ; ; ARGUMENTS PASSED ; R10 POINTS TO NEW SYMBOL TO OUTPUT AND WHOS CALLING ROUTINES TO OUTPUT ; LEVEL CURRENT CALLING LEVEL ; TREE_QUEUE QUEUE OF SYMBOLS IN LINE TO MAIN ROUTINE-TO CHECK ; FOR RECURSION ; ; OUTPUT THE SYMBOL WITH LEADING DOTS MOVC5 #0,NULL,#0,#132,OUTPUT_LINE ;CLEAR THE LINE CLRL OUTPUT_STRING MOVAL OUTPUT_LINE,OUTPUT_STRING ;INIT THE DESCRIPTER CLRL OVERFLOW ;CLEAR OVERFLOW FLAG MULL3 #4,LEVEL,R6 ;GET NUMBER OF DOTS ;EACH LEVEL DOWN IN CALLING TREE-INDENT BY 4 LOCATIONS ;FILLING IN WITH DOTS BEQL 1$ ;IF LEVEL ZERO-SKIP NEXT PART CVTBL 24(R10),R7;GET LENGTH OF SYMBOL ADDL2 #3,R7 ;ACCOUNT FOR POSSABLE FLAGS ADDL3 R6,R7,R8;GET TOTAL LENGTH REQUIRED CMPL R8,LINE_COUNT;SEE IF TOO LONG BLEQ 2$ ;NO -LENGTH OK SUBL3 R7,LINE_COUNT,R6 ;GET NUMBER OF DOTS INCL OVERFLOW ;SET THE OVERFLOW FLAG 2$: MOVC5 #0,NULL,#^A/./,R6,OUTPUT_LINE ;FILL IN THE DOTS ; PUT IN VISUAL INDICATION OF NESTING LEVEL ;V2.03 MOVL #4,R0 ;V2.03 1002$: CMPB #^A/./,OUTPUT_LINE[R0] ;V2.03 BNEQ 1$ ;V2.03 MOVB #^A/+/,OUTPUT_LINE[R0] ;V2.03 ADDL2 #4,R0 ;V2.03 BRB 1002$ ;V2.03 1$: CVTBL 24(R10),R7 ;SYMBOLLENGTH MOVC3 R7,25(R10),L^OUTPUT_LINE(R6) ;FILL IN THE SYMBOL ;V1.21 ADDL3 R6,R7,OUTPUT_STRING ;UPDATE THE DESCRIPTER ADDL2 R7,R6 ;UPDATE R6 FOR FLAG INPUTS ; CHECK FOR OVERFLOW TSTL OVERFLOW BEQL 3$ MOVB #^A/*/,L^OUTPUT_LINE(R6) ;V1.21 INCL R6 INCL OUTPUT_STRING 3$: ; CHECK FOR UNDEFINED ENTRY POINT TSTB 56(R10) BNEQ 4$ ;DEFINED 103$: MOVB #^A/?/,L^OUTPUT_LINE(R6) ;V1.21 INCL R6 INCL OUTPUT_STRING 4$: ; CHECK FOR RECURSION CLRL RECURSION MOVAL TREE_QUEUE,R9 ;SCAN TREE QUEUE FOR THIS SYMBOL MOVL R9,R8 5$: MOVL (R8),R8 CMPL R8,R9 BEQL 6$ CMPC3 #32,8(R8),24(R10) BNEQ 5$ INCL RECURSION MOVB #^A/#/,L^OUTPUT_LINE(R6) ;V1.21 INCL OUTPUT_STRING 6$: ;OUTPUT THE COMPLETED LINE PUSHAL OUTPUT_STRING CALLS #1,PRINT_LINE TSTL RECURSION ;WAS THE SYMBOL RECURSIVE ?? BEQL 10$ ;NO RET ;YES-DON'T BOTHER TRYING TO GO DEEPER 10$: ;DOES THIS SYMBOL CALL ANY ONE? MOVAL 8(R10),R6 CMPL 8(R10),R6 BNEQ 11$ ;YES RET ;NO ; PUSH CURRENT SYMBOL ON TREE STACK AND CALL TO GET NEXT LEVEL 11$: BITL #FLOW_DEPTH_FLAG,FLAG_WORD+4 ;V1.12 BEQL 1111$ ;V1.12 CMPL ENTRY_DEPTH,LEVEL ;V1.12 BGTR 1111$ ;V1.12 RET ;V1.12 1111$: MOVL #40,ARG1 ;GET AN ELEMENT FOR TREE ;V1.12 CALLG VM_ARG,ALLOCATE INSQUE (R0),@TREE_QUEUE+4 MOVL R0,R9 ;INSERT IN QUEUE AND COPY SYMBOL MOVC3 #32,24(R10),8(R9) INCL LEVEL MOVL R6,R7 ;SET UP TO SCANN FOR CALLS SYMBOLS 12$: MOVL (R7),R7 ;NEXT SYMBOL CMPL R6,R7 BEQL 100$ MOVAL SYMBOL_TABLE_QUEUE,R11 MOVL R11,R10 13$: MOVL (R10),R10 CMPL R10,R11 BEQL 12$ CMPC3 #32,8(R7),24(R10) BNEQ 13$ CALLG NULL,SCAN_CALLING_SYMBOL BRW 12$ 100$:;DONE AT THIS LEVEL-BACK UP EVERYTHING BY ONE DECL LEVEL REMQUE @TREE_QUEUE+4,R0 MOVL R0,ARG2 MOVL #40,ARG1 CALLG VM_ARG,FREE RET .PAGE .SUBTITLE CALLED BY TREE TRY_CALLED_TREE: BITL #CALLED_BY_TREE_FLAG,FLAG_WORD ;AS CALLING TREE ASED FOR BNEQ 1$ ;NO JMP CLEAN_UP 1$: CLRL LINES_ON_PAGE ;SET UP FOR NEW PAGE AND TITLE MOVL #CALLED_BY_OUTPUT,STATUS_WORD CLRL LEVEL ;LEVEL IS ZERO MOVAL TREE_QUEUE,TREE_QUEUE ;INIT TREE RECURSION CHECK QUEUE MOVL TREE_QUEUE,TREE_QUEUE+4 MOVAL SYMBOL_TABLE_QUEUE,R11 ;SET UP FOR SCANN FOR BOTTOM ;LEVEL MODULES MOVL R11,R10 CALLED_TOP_LEVEL_LOOP: MOVL (R10),R10 ;NEXT SYMBOL PLEASE CMPL R10,R11 ;CHECK FOR DONE BNEQ 1$ JMP CLEAN_UP ;DONE THIS TREE-EXIT 1$: BITL #FLOW_SYMBOL_FLAG,FLAG_WORD+4 ;V1.12 BEQL 2$ ;V1.12 CMPC3 #32,ENTRY_SYMBOL,24(R10) ;FOUND WANTED SYMBOL ;V1.12 BNEQ CALLED_TOP_LEVEL_LOOP ;V1.12 CALLG NULL,SCAN_CALLED_SYMBOL ;V1.12 BRW CLEAN_UP ;NO NEED TO CONTINUE ;V1.12 2$: MOVAL 8(R10),R9 ;SEE IF ANY CALLS ;V1.12 CMPL 8(R10),R9 BNEQ CALLED_TOP_LEVEL_LOOP ;NOT A TOP SYMBOL ; FOUND A BOTTOM MODULE-START FROM HERE ; CALL RECUSRIVE ROUTINE TO OUTPUT THIS SYMBOL AND ALL ABOVE IT CALLG NULL,SCAN_CALLED_SYMBOL BRW CALLED_TOP_LEVEL_LOOP .ENTRY SCAN_CALLED_SYMBOL,^M ; ; ARGUMENTS PASSED ; R10 POINTS TO NEW SYMBOL TO OUTPUT AND WHOS CALLED ROUTINES TO OUTPUT ; LEVEL CURRENT CALLING LEVEL ; TREE_QUEUE QUEUE OF SYMBOLS IN LINE TO MAIN ROUTINE-TO CHECK ; FOR RECURSION ; ; OUTPUT THE SYMBOL WITH LEADING DOTS MOVC5 #0,NULL,#0,#132,OUTPUT_LINE ;CLEAR THE LINE CLRL OUTPUT_STRING MOVAL OUTPUT_LINE,OUTPUT_STRING ;INIT THE DESCRIPTER CLRL OVERFLOW ;CLEAR OVERFLOW FLAG MULL3 #4,LEVEL,R6 ;GET NUMBER OF DOTS ;EACH LEVEL UP IN CALLED TREE-INDENT BY 4 LOCATIONS ;FILLING IN WITH DOTS BEQL 1$ ;IF LEVEL ZERO-SKIP NEXT PART CVTBL 24(R10),R7;GET LENGTH OF SYMBOL ADDL2 #3,R7 ;ACCOUNT FOR POSSABLE FLAGS ADDL3 R6,R7,R8;GET TOTAL LENGTH REQUIRED CMPL R8,LINE_COUNT;SEE IF TOO LONG BLEQ 2$ ;NO -LENGTH OK SUBL3 R7,LINE_COUNT,R6 ;GET NUMBER OF DOTS INCL OVERFLOW ;SET THE OVERFLOW FLAG 2$: MOVC5 #0,NULL,#^A/./,R6,OUTPUT_LINE ;FILL IN THE DOTS ; PUT IN VISUAL INDICATION OF NESTING LEVEL ;V2.03 MOVL #4,R0 ;V2.03 1002$: CMPB #^A/./,OUTPUT_LINE[R0] ;V2.03 BNEQ 1$ ;V2.03 MOVB #^A/+/,OUTPUT_LINE[R0] ;V2.03 ADDL2 #4,R0 ;V2.03 BRB 1002$ ;V2.03 1$: CVTBL 24(R10),R7 ;SYMBOLLENGTH MOVC3 R7,25(R10),L^OUTPUT_LINE(R6) ;FILL IN THE SYMBOL ;V1.21 ADDL3 R6,R7,OUTPUT_STRING ;UPDATE THE DESCRIPTER ADDL2 R7,R6 ;UPDATE R6 FOR FLAG INPUTS ; CHECK FOR OVERFLOW TSTL OVERFLOW BEQL 3$ MOVB #^A/*/,L^OUTPUT_LINE(R6) ;V1.21 INCL R6 INCL OUTPUT_STRING 3$: ; CHECK FOR UNDEFINED ENTRY POINT TSTB 56(R10) BNEQ 4$ ;DEFINED 103$: MOVB #^A/?/,L^OUTPUT_LINE(R6) ;V1.21 INCL R6 INCL OUTPUT_STRING 4$: ; CHECK FOR RECURSION CLRL RECURSION MOVAL TREE_QUEUE,R9 ;SCAN TREE QUEUE FOR THIS SYMBOL MOVL R9,R8 5$: MOVL (R8),R8 CMPL R8,R9 BEQL 6$ CMPC3 #32,8(R8),24(R10) BNEQ 5$ INCL RECURSION MOVB #^A/#/,L^OUTPUT_LINE(R6) ;V1.21 INCL OUTPUT_STRING 6$: ;OUTPUT THE COMPLETED LINE PUSHAL OUTPUT_STRING CALLS #1,PRINT_LINE TSTL RECURSION ;WAS THE SYMBOL RECURSIVE ?? BEQL 10$ ;NO RET ;YES-DON'T BOTHER TRYING TO GO DEEPER 10$: ;DOES THIS SYMBOL CALLED BY ANY ONE? MOVAL 16(R10),R6 CMPL 16(R10),R6 BNEQ 11$ ;YES RET ;NO ; PUSH CURRENT SYMBOL ON TREE STACK AND CALL TO GET NEXT LEVEL 11$: BITL #FLOW_DEPTH_FLAG,FLAG_WORD+4 ;V1.12 BEQL 1111$ ;V1.12 CMPL ENTRY_DEPTH,LEVEL ;V1.12 BGTR 1111$ ;V1.12 RET ;V1.12 1111$: MOVL #40,ARG1 ;GET AN ELEMENT FOR TREE ;V1.12 CALLG VM_ARG,ALLOCATE INSQUE (R0),@TREE_QUEUE+4 MOVL R0,R9 ;INSERT IN QUEUE AND COPY SYMBOL MOVC3 #32,24(R10),8(R9) INCL LEVEL MOVL R6,R7 ;SET UP TO SCANN FOR CALLED BY SYMBOLS 12$: MOVL (R7),R7 ;NEXT SYMBOL CMPL R6,R7 BEQL 100$ MOVAL SYMBOL_TABLE_QUEUE,R11 MOVL R11,R10 13$: MOVL (R10),R10 CMPL R10,R11 BEQL 12$ CMPC3 #32,8(R7),24(R10) BNEQ 13$ CALLG NULL,SCAN_CALLED_SYMBOL BRW 12$ 100$:;DONE AT THIS LEVEL-BACK UP EVERYTHING BY ONE DECL LEVEL REMQUE @TREE_QUEUE+4,R0 MOVL R0,ARG2 MOVL #40,ARG1 CALLG VM_ARG,FREE RET .PAGE .SUBTITLE CLEAN UP SYMBOL TABLE CLEAN_UP: PUSHAL TIME_OUTPUT ;V1.4 PUSHAL CODE_1 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_OUTPUT+8 ;V1.4 PUSHAL CODE_2 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_OUTPUT+12 ;V1.4 PUSHAL CODE_3 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_OUTPUT+16 ;V1.4 PUSHAL CODE_4 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 PUSHAL TIME_OUTPUT+20 ;V1.4 PUSHAL CODE_5 ;V1.4 CALLS #2,G^LIB$STAT_TIMER ;V1.4 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 BITL #FLOW_SAVE_FLAG,FLAG_WORD+4 ;V1.12 BEQL 1$ ;V1.12 MOVL #1,ENTRY_SAVED_FLAG ;V1.12 BRW DONE_CLEAN_UP ;V1.12 1$: CALLG NULL,CLEAR_FLOW_TABLE ;V1.12 BRW DONE_CLEAN_UP ;V1.12 .ENTRY CLEAR_FLOW_TABLE,^M ;V1.12 OUTTER_LOOP: REMQUE @SYMBOL_TABLE_QUEUE,R11 BVS TABLE_EMPTY ; REMOVE ALL CALL ELEMENTS CALLS_LOOP: REMQUE @8(R11),R10 BVS CALLS_EMPTY MOVL #40,ARG1 MOVL R10,ARG2 CALLG VM_ARG,FREE BRB CALLS_LOOP CALLS_EMPTY: CALLED_LOOP: REMQUE @16(R11),R10 BVS CALLED_EMPTY MOVL #40,ARG1 MOVL R10,ARG2 CALLG VM_ARG,FREE BRB CALLED_LOOP CALLED_EMPTY: MOVL #120,ARG1 ;V1.21 MOVL R11,ARG2 CALLG VM_ARG,FREE BRB OUTTER_LOOP .PAGE .SUBTITLE RESET SCRATCH FILES TABLE_EMPTY: CLRQ SYMBOL_TABLE_QUEUE ;V1.10 CLRL ENTRY_SAVED_FLAG ;V1.12 RET ;V1.12 DONE_CLEAN_UP: ;V1.12 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,DUMP_STATS ;V1.4 CALLG NULL,G^LIB$INIT_TIMER ;V1.4 CALLG NULL,CLOSE_SCRATCH CALLG NULL,OPEN_SCRATCH RET .END