.TITLE FLOW CHART AID-CALLING/CALLED BY ; STORES IN THE FLOW SCRATCH FILE THE NAMES OF ALL THE ; ENTRY POINTS FOUND AND ON CALLING 'OUTFLO' DUMPS THE ; CONTENTS OF THE ENTRY POINT DATA COLLECTED .PSECT FLOW,I,GBL,CON,RO .GLOBL VNM50,VARTYP,PNAME,HIGHAV,HIGPTR,LOWAV,LOWPTR,VRSTPT .GLOBL DOFLOW,BLNK,ENDLIN,NOLINE,PRTLIN,RAD50U,CHRWD,LINCTR,OLDR5 .GLOBL PUTCHR,SNAME,SPOOL,SRCSYM,LEVEL,EENT,RECURS,REVTRE,FWDTRE .IF NDF,RSX .GLOBL FLOPTR,FLOBUF,IOARA,FLOBUF,FLOPTR,FLOBLK,SUPBUF,SUPBLK,SUPPTR .GLOBL OTBFPT,OUTBUF,OUTBLK .MCALL .READW,.WRITW,.EXIT,.PRINT,.CLOSE .IFF .GLOBL FLOFIL,SUPFIL,.POINT .MCALL QIOW$S,EXIT$S,GET$,PUT$,PRINT$,EXTK$S .ENDC .PAGE ; THIS MODULE IS USED TO ACCUMULATE GLOBAL ENTRY POINTS ; WHO CALLS THEM AND WHO DO THEY CALL ; ; THE FOLLOWING ROUTINE STORES A GLOBAL ENTRY POINT AND THE ; ROUTINE IT IS DEFINED IN (IF KNOWN). FLIOER: .ASCIZ / INDEX-F-ENTRY POINT BUFFER OVERFLOW-EXIT/ .EVEN ; ONE ENTRY POINT RECORD IS 4 WORDS LONG AND HAS THE FOLLOWING FORMAT ; ; WORD 1 NAME OF ENTRY POINT 1ST 3 CHR IN RADIX 50 ; WORD 2 NAME OF ENTRY POINT 2'ND 3 CHR IN RADIX 50 ; WORD 3 NAME OF ROUTINE DEFINEING ENTRY POINT (IF KNOWN) 1ST 3 CHR IN RADIX 50 ; WORD 4 NAME OF ROUTINE DEFINEING ENTRY POINT (IF KNOWN) 2ND 3 CHR IN RADIX 50 ; .IF NDF,RSX STOFLO::MOV FLOPTR,R0 ;RT-11-GET POINTER TO NEXT ENTRY INTO ;FLOBUF FOR STORAGE OF ENTRY MOV VNM50,(R0)+ ;GET FIRST WORD OF ENTRY POINT NAME BEQ NONAME ;IF ZERO-NO NAME MOV VNM50+2,(R0)+ ;GET 2'ND WORD OF NAME CMP #"CL,VARTYP ;IS IT A CALL (NOT DEFINED IN THIS MODULE ; BUT STILL THE NAME OF A GLOBAL BEQ NOORG ;YES-NOT INVENTED HERE BUT SAY ANYWAY CMP #"IT,VARTYP ;REPEAT FOR INTRINSIC BEQ NOORG ; CMP #"EX,VARTYP ;AND EXTERNAL BEQ NOORG MOV PNAME,(R0)+ ;INVENTED HERE-LOADE NAME OF DEFINEING ROUTINE MOV PNAME+2,(R0)+ ;BOTH RAD-50 WORDS BR CHKBLK ;GO SEE IF BLOCK FULL NOORG: CLR (R0)+ ;FLAG N.I.H. CLR (R0)+ ; IN BOTH WORDS OF DEFINEING RECORD CHKBLK: MOV R0,FLOPTR ;RESTORE POINTER CMP R0,#FLOBUF+512. ;BUFFER FULL? BLO 1$ ;NO .WRITW #IOARA,#15,#FLOBUF,#256.,FLOBLK ;OUTPUT BUFFER BCC 2$ ;IF NO ERROR TAKE BRANCH .PRINT #FLIOER ;GIVE BAD NEWS BISB #10,@#53 ;MONITOR TO .EXIT ;GOOD BYE CRUEL WORLD 2$: INC FLOBLK ;NEXT OUTPUT BLOCK MOV #FLOBUF,FLOPTR ;INIT POINTER MOV #FLOBUF,R0 ;SET UP POINTER TO CLEAR BUFFER MOV #256.,R1 ;AND COUNTER 3$: CLR (R0)+ ;CLEAR WORD DEC R1 BGT 3$ 1$: NONAME: RETURN .IFF ; RSX MODE .PSECT IMPURE,RW,D,GBL,CON FLOREC: .WORD 0,0,0,0 ;TEMP STROAGE OF FLOW RECORD .PSECT FLOW FLOEND: .WORD -1,-1,-1,-1;HOME MADE EOF RECORD STOFLO::MOV VNM50,FLOREC ;GET FIRST WORD OF NAME BEQ NONAME ;TILT-NOTHING THERE MOV VNM50+2,FLOREC+2 ;GET SECOND WORD OF NAME CMP #"CL,VARTYP ;IS IT A CALL (NOT DEFINED IN THIS MODULE ; BUT STILL THE NAME OF A GLOBAL BEQ NOORG ;YES-NOT INVENTED HERE BUT SAY ANYWAY CMP #"IT,VARTYP ;REPEAT FOR INTRINSIC BEQ NOORG ; CMP #"EX,VARTYP ;AND EXTERNAL BEQ NOORG MOV PNAME,FLOREC+4 ;INVENTED HERE-LOADE NAME OF DEFINEING ROUTINE MOV PNAME+2,FLOREC+6;BOTH RAD-50 WORDS BR CHKBLK ;GO SEE IF BLOCK FULL NOORG: CLR FLOREC+4 ;FLAG N.I.H. CLR FLOREC+6 ; IN BOTH WORDS OF DEFINEING RECORD CHKBLK: PUT$ #FLOFIL,#FLOREC,#8.;STORE RECORD BCC NONAME ;BR IF NO ERROR QIOW$S #IO.WLB,#9.,#1,,,,<#FLIOER,#41.,#40>;BAD NEWS EXIT$S NONAME: RETURN .IFTF .PAGE ; ALL THE ACCUMULATION HAS BEEN DONE AND NOW IS THE TIME ; TO GATHER ALL THE DATA FROM THE SCRATCH FILES ; AND MAKE UP THE INTERNAL TABLES OF WHO CALLS WHO. ; TWO TYPES OF RECORDS ARE USED INTERNALY. ONE IS THE RECORD ; OF THE ENTRY POINT'S AND DEFINEING MODULES. IT HAS THE FOLLOWING ; FORMAT ; ; WORD 1 NAME OF ENTRY POINT RAD 50 FIRST WORD ; WORD 2 NAME OF ENTRY POINT RAD 50 SECOND WORD ; WORD 3 NAME OF DEFINEING MODULE RAD 50 FIRST WORD ; WORD 4 NAME OF DEFINEING MODULE RAD 50 SECOND WORD ; WORD 5 POINTER TO FIRST ROUTINE THIS ENTRY POINT IS CALLED BY ; WORD 6 POINTER TO FIRST ROUTINE THIS ENTRY POINT CALLS ; WORD 7 POINTER TO NEXT ENTRY POINT BLOCK ; ; THE CALLED/CALLING ROUTINE NAME BLOCK ARE AS FOLLOWS ; ; WORD 1 NAME OF CALLED/CALLING ROUTINE RAD50 FIRST WORD ; WORD 2 NAME OF CALLED/CALLING ROUTINE RAD 50 2'ND WORD ; WORD 3 POINTER TO NEXT CALLED/CALLING ROUTINE ; ; FOR BOTH BLOCKS-ALL POINTERS POINT TO WORD 1 OF THE BLOCK. OUTFLO::MOV HIGHAV,HIGPTR ;GET LIMITS OF THE BUFFER MOV LOWAV,LOWPTR ;BOTH ENDS CLR VRSTPT ;POINTER TO ENTRY POINT NAME BLOCKS CLR DOFLOW ;ENABLE OUTPUT .IFF PUT$ #SUPFIL,#FLOEND,#8. ;PUT EOF AT END OF SUPER INDEX FILE CLR R1 ;AND REWIND THE FILE MOV #1,R2 CLR R3 CALL .POINT PUT$ #FLOFIL,#FLOEND,#8. ;PUT EOF AT END OF ENTRY POINT FILE CLR R1 ;AND REWIND THE FILE MOV #1,R2 CLR R3 CALL .POINT .IFTF ; WORKING FROM THE ENTRY POINT CRATCH FILE-GENERATE THE ALPHABETICAL ; LINKED LIST OF GLOBAL ENTRY POINTS EPLOOP: CALL OVFTST ;CHECK FOR BUFFER OVERFLOW ON NEXT E.P. ENTRY .IFT SUB #8.,FLOPTR ;GET NEXT RT-11 ENTRY CMP #FLOBUF,FLOPTR ;USED UP THE BUFFER?? BLOS 1$ ;IF NO -SKIP TO GET ENTRY POINT TST FLOBLK ;ALL OF SCRATCH FILE READ YET?? BNE 2$ ;NO-MORE SCRACH TO ITCH JMP LODCAL ;YES ALL ENTRY POINTS GOTTEN-GO TO SUPER SCRATCH 2$: DEC FLOBLK ;NEXT BLOCK UP IN FILE .READW #IOARA,#15,#FLOBUF,#256.,FLOBLK ;GET NEXT BLOCK BACK MOV #FLOBUF+512.-8.,FLOPTR ;RESET POINTER .IFF GET$ #FLOFIL,#FLOREC,#8. ;RSX-GET THE NEXT RECORD BCS 2$ ;TREAT ERROR AS E.O.F. CMP #-1,FLOREC ;IS IT REAL E.O.F. BNE 1$ ;NO-GO LOAD IN TABLE 2$: JMP LODCAL ;GO LOAD CALLS TO TABLE .IFTF 1$: TST VRSTPT ;IS THIS THE FIRST TO BE ENTERED BEQ FSTIM ;JUST GO LOAD IT .IFT MOV FLOPTR,R0 ;LOAD POINTER TO RECORD .IFF MOV #FLOREC,R0 ;LOAD POINTER TO RECORD .IFTF MOV #VRSTPT-14,R1 ;SET UP POINTERS TO STEP ;THROUGH TABLE-FAKE THE FIRST ONE MOV 14(R1),R2 ;PTR TO FIRST TO BE CHECKEK MOV 14(R2),R3 ;AND THE ONE AFTER ; R0=ADDR OF ENTRY POINT TO BE ADDED ; R1=ADDR OF LAST ENTRY POINT EXAMINED ; R2=ADDR OF CURRENT BLOCK TO BE EXAMINED ; R3=ADDR OF NEXT BLOCK TO BE EXAMINED ; ; NOW WE SCAN THROUGH THE LINKED LIST TO SEE IF THE ENTRY POINT ; IS ALREADY ENTERED OR NOT AND TO PUT IT INTO ; ALPHABETICAL ORDER CMPEP: CMP (R2),(R0) ;CHECK FIRST WORD BHI ENTEP ;GONE PAST-ENTRY NOT HERE-PUT IN PROPER SLOT BLO NXTEP ;TO LOW-GET NEXT ENTRY IN TABLE TO CHECK CMP 2(R2),2(R0) ;CHECK THE LOW ORDER 2'ND WORD BHI ENTEP ;GONE PAST-ADD NEW BLO NXTEP ;NOT THERE YET-GET NEXT BR DUPEP ;DUPLICATE ENTRY POINT NXTEP: MOV R2,R1 ;UPDATE POINTERS TO ENTRY POINT TABLE MOV R3,R2 ;IF NUL-HAVE SCANNED ENTIRE TABLE BEQ EPEND ;ADD NEW ENTRY TO END MOV 14(R2),R3 ;NEXT-NEXT ENTRY BR CMPEP ;CHECK NEXT ENTRY POINT TABLE ENTRY DUPEP: TST 4(R2) ;DOES THE ENTRY IN THE TABLE HAVE ;A DEFINEING MODULE ENTRY BNE EPLOOP ;IF YES-IGNORE THE NEW ONE TST 4(R0) ;DOES THE NEW ENTRY DEFINE A DEFINEING MODULE BEQ EPLOOP ;IF NOT THEN DONT UPDATE MOV 4(R0),4(R2) ;LOAD DEFINEING MODULE NAME INTO EP TABLE ENTRY MOV 6(R0),6(R2) ;BOTH WORDS JMP EPLOOP ;GET NEXT ENTRY POINT ENTRY FSTIM: MOV #VRSTPT-14,R1 ;FAKE NORMAL ENTRY TO ADD TO END EPEND: .IFT MOV FLOPTR,R0 ;GET POINTER TO NEW AND FIRST ENTRY POINT .IFF MOV #FLOREC,R0 ;GET POITER TO NEW AND FIRST ENTRY POINT .IFTF MOV LOWPTR,14(R1) ;TELL LAST POINTER WHERE NEW IS MOV LOWPTR,R2 ;SET UP NEW LAST BLOCK MOV (R0),(R2) ;LOAD ENTRY POINT NAME MOV 2(R0),2(R2) MOV 4(R0),4(R2) ;LOAD DEFINEING MODULE NAME MOV 6(R0),6(R2) CLR 10(R2) ;CLEAR POINTERS TO CALLING AND CALLED ROUTINES CLR 12(R2) CLR 14(R2) ;AND POINTER TO NEXT E.P. ENTRY ADD #14.,LOWPTR ;UPDATE POINTER TO LOW MEMEORY AVALILABLE JMP EPLOOP ENTEP: MOV LOWPTR,R4 ;ENTER NEW ENTRY POINT INTO MIDDLE OF TABLE MOV R4,14(R1) ;LOAD POINTER OF LAST E.P. ENTRY TO THE NEW ONE MOV R2,14(R4) ;AND THIS ONE POINTS TO THE NEXT MOV (R0),(R4) MOV 2(R0),2(R4) ;LOAD THE TWO WORD ENTRY POINT NAME MOV 4(R0),4(R4) MOV 6(R0),6(R4) ;SAME FOR TWO WORD DEFINEING MODULE CLR 10(R4) ;CLEAR POINTERS TO ALLING/CALLED ROUTINES CLR 12(R4) ADD #14.,LOWPTR ;UPDATE MEORY ALLOCATION POINTER JMP EPLOOP ;GO TO THE NEXT ENTRY POINT .PAGE ; THE ENTRY POINT TABLE HAS BEEN BUILT. ; NOW IS THE TIME TO SCAN THE SUPER INDEX SCRATCH FILE ; FOR THE CALLING/CALLED NAMES TO BE ADDED TO THE SECOND PART OF THE ; TABLE LODCAL: CALL OVFTST ;CHECK FOR POSSABLE OVERFLOW .IFT SUB #8.,SUPPTR ; GET INTO THE SUPER INDEX FILE-NEXT ENTRY CMP #SUPBUF,SUPPTR ;CURRENT BUFFER EMPTY?? BLOS 1$ ; NO TST SUPBLK ; FILE USED UP?? BNE 2$ ; NO STILL MORE TO READ JMP DMPFLO ;ALL IN-GO DUMP THE OUTPUT 2$: DEC SUPBLK ; BLOCK NUMBER TO RREAD .READW #IOARA,#14,#SUPBUF,#256.,SUPBLK ;REFRESH BLOCK MOV #SUPBUF+512.-8.,SUPPTR ;AND UPDATE POINTER .IFF GET$ #SUPFIL,#FLOREC,#8. ;GET A RECORD BCS 2$ ;E.O.F. OR ERROR IS E.O.F. CMP #-1,FLOREC ;EOF READ BNE 1$ 2$: JMP DMPFLO ;ALL IN-GO DUMP THE OUTPUT .IFTF 1$: ; STEP 1-THE RECORD JUST OBTAINED-IS IT AN ENTRY POINT NAME?? .IFT MOV SUPPTR,R0 ;GET POINTER TO RECORD .IFF MOV #FLOREC,R0 .IFTF ; IS THIS A SELF DEFINITION IF SO IGNORE IT CMP (R0),4(R0) BNE 8$ CMP 2(R0),6(R0) BEQ LODCAL 8$: MOV #VRSTPT-14,R1 ;POINTER TO ENTRY POINT TABLE FINDEP: MOV 14(R1),R1 ;GET NEXT ENTRY BEQ LODCAL ;NUL-END OF TABLE-DID NOT FIND ;CORRESPONDING ENTRY SO NOT ENTRY POINT ;GO TRY NEXT SUPER INDEX SYMBOL CMP (R1),(R0) ;IS FIRST WORD SAME BHI LODCAL ;PASED THE POSSABLE ALPHABETICALLOCATION ;GO TRY NEXT SYMBOL BLO FINDEP ;NOT THERE YET-TRY NEXT E.P. CMP 2(R1),2(R0) ;SECOND WORD BHI LODCAL ; NOT AN E.P. BLO FINDEP ; KEEP GOING ; OK-WE HAVE FOUND A MATCH-THE ENTRY POINT SYMBOL DEFINED ; CONSIDER AN ENTRY DEFINED DEFINED ENTRY POINT CMP 4(R0),4(R1) BNE 5$ CMP 6(R0),6(R1) BEQ LODCAL ;DEFINEING MODULE MATCHES TOO-DEFINEING VALUE-IGNORE 5$: ; IN THE SUPER INDEX RECORD POINTED TO BY R0 ; MATCHES THE ENTRY POINT NAME POINTERD TO BY R1. ; THIS MEANS THAT 2 POSSABLE ENTRIES ARE MADE ; ; ENTRY ONE TO THE ENTRY POINT NAME. THE SECOND NAME IN ; THE SUPER INDEX RECORD IS THE NAME OF THE MODULE THAT ; CALLED THE ENTRY POINT AND GETS ENTERED IN THE CALLED BY ; LINKED LIST OF THE E.P. POINTED TO BY R1. ; ; ENTRY TWO REQUIRES A SECOND SEARCH OF THE E.P. TABLE ; FOR THE ENTRY OF THE CALLING MODULE INTO ITS LINKED LIST ; OF CALLED ROUTINES TST 10(R1) ;ANY CALLING ROUTINES DEFINED YET BEQ FSTCAL ;NUL THIS IS THE FIRST CALL ADD #4,R1 ;FAKE A CALLING BLOCK POINTER MOV 4(R1),R2 ;CURRENT CALLING BLOCK BEING EXAMINED MOV 4(R2),R3 ;NEXT BLOCK TO BE EXAMINED ; R0=POINTER TO SUPER INDEX RECORD ; R1=POINTER TO PREVIOUS CALLING ROUTINE BLOCK ; R2=POINTER TO CURRENT CALLING ROUTINE BLOCK ; R3=POINTER TO NEXT CALLING ROUTINE BLOCK CALLOP: CMP (R2),4(R0) ;ALPHABETICAL ORDER REMEMBER BHI ENTCAL ;PASSED IT BY-NOT HERE BLO NXTCAL ;NOT THERE YET CMP 2(R2),6(R0) ;2'ND WORD BHI ENTCAL BLO NXTCAL BR DOCALB ;DUPLICATE ENTRY-DON'T BOTHER NXTCAL: MOV R2,R1 ;NOT YET-GET NEXT IN LINKED LIST MOV R3,R2 BEQ CALEND ;NAME NOT IN CALLING LIST-ADD NEW ENTRY TO END MOV 4(R2),R3 ;NEW NEXT BR CALLOP ENTCAL: MOV LOWPTR,R4 ;GET POINTER TO NEW ENTRY ADD #6,LOWPTR ;BUMP POINTER TO NEXT EMPTY SLOT MOV 4(R0),(R4) ;LOAD CALLING NAME MOV 6(R0),2(R4) MOV R4,4(R1) ;UPDATE LAST PTR MOV R2,4(R4) ;POUT TO NEXT BR DOCALB ;GO DO CALLING ROUTINE THING FSTCAL: ;FAKE THE LAST CALLING BLOCK ADD #4,R1 CALEND: MOV LOWPTR,R4 ;POINTER TO NEW ENTRY ADD #6,LOWPTR ;BUMP ALLOCATION POINTER TO NEXT EMPTY MOV 4(R0),(R4) ;FILL IN CALLING NAME MOV 6(R0),2(R4) CLR 4(R4) ;NO NEXT CALLING ROUTINE MOV R4,4(R1) ;PTR TO THIS ONE BR DOCALB ;GO TO THE CALLING ROUTINE THING ;BUFFER IS-FULL-TREAT AS FATA ERROR OVFMSG: .ASCIZ / INDEX-F-ENTRY POINT TABLE OVERFLOW-EXIT/ .EVEN ; CHECK FOR BUFFER OVER FLOW OVFTST: MOV R0,-(SP) ;SAVE R0 MOV LOWPTR,R0 ;GET THE POINTER TO THE LOW END OF UN ALLOCATED BUFFER SPACE ADD #14.,R0 ;ADD OFFSET FOR 1 E.P. BLOCK OR 2 HOW USED BLOCKS BCS OVFEXT ;IF OVERFLOW-FULL-FORGET IT CMP R0,HIGPTR ;SEE IF USED UP PRESENT BUFFER SPACE BHI 1$ ;OVER FLOW CURRENT BUFFER SPACE-HANDLE AS NEEDED MOV (SP)+,R0 ;RESTORE R0 RETURN 1$: .IF NDF,RSX ;CONFIGURATION SETS ACTION ;RT-11 ALREADY HAS FULL BUFFER SIZE-QUIT ;FALL THROUGH TO OVERFLOW ERROR ROUTINE .IFF .IF DF,EXTK ;FIXED BUFFER ALREADY DEFINED-FULL-EXIT ;FALL THROUGH TO OVERFLOW ERROR HANDLER .IFF EXTK$S #1 ;EXTEND TASK BY 32 WORDS BCS OVFEXT ;IFNOT POSSABLE-BUFFER OVERFLOW-EXIT ADD #64.,HIGHAV ;BUMP HIGH END OF BUFFER POINTERS ADD #64.,HIGPTR MOV (SP)+,R0 ;RESTORE R0 RETURN .ENDC .ENDC OVFEXT: .IFT .PRINT #OVFMSG ;TELL HIM THE BAAAAAAAAAD NEWS BISB #10,@#53 ;MONITOR TOO .EXIT .IFF QIOW$S #IO.WLB,#9.,#1,,,,<#OVFMSG,#40.,#40> EXIT$S .IFTF DOCALB: MOV #VRSTPT-14,R1 ;POINTER TO E.P. LINKED LIST CBLOOP: MOV 14(R1),R1 ;GET NEXT E.P. ENTRY BEQ NOCB ;NOT FOUND-JUST FORGET CMP (R1),4(R0) ;IN ALPHABETICAL ORDER OF COURSE BHI NOCB ;NOT HERE??? BLO CBLOOP ;NOT THERE YET CMP 2(R1),6(R0) ;2'ND WORD ?? BHI NOCB BLO CBLOOP ;STILL NOT THERE ; THE E.P. OF THE CALLED BY MODULE HAS BEEN FOUND ; NOW TO ENTER IT IN THE CALLED BY LINKED LIST TST 12(R1) ;ANY ENTIES SO FAR BEQ CBFIRST ;NO-FIRST ONE ADD #6,R1 ;FAKE IT AS A CALLED BY NAME BLOCK MOV 4(R1),R2 ;GET FIRST CALLED BY BLOCK MOV 4(R2),R3 ;AND SECOND (IF ANY) CBLOP2: CMP (R2),(R0) ;A..B..C..D....... BLO NXTCB BHI ENTCB CMP 2(R2),2(R0) BLO NXTCB BHI ENTCB ; DUPLICATE ENTRY-IGNORE BR NOCB NXTCB: MOV R2,R1 ;UPDATE CALLED BY POINTERS MOV R3,R2 ;NEW CURR BLOCK BEQ ENDCB ;NOT HERE-TACK ON END MOV 4(R2),R3 BR CBLOP2 ; ENTER NEW NAME IN CALLED BY LINKED LIST ENTCB: MOV LOWPTR,R4 ;PTR TO NEW ENTRY ADD #6,LOWPTR ;NEXT EMPTY MOV (R0),(R4) ;LOAD NAME CALLED MOV 2(R0),2(R4) MOV R4,4(R1) ;LOAD LAST PTR TO THIS ONE MOV R2,4(R4) ;AND THIS ONE TO THE NEXT BR NOCB CBFIRST:ADD #6,R1 ;FAKE THE E.P AS A CALLED BY ENDCB: MOV LOWPTR,R4 ;ADD IT ADD #6,LOWPTR MOV (R0),(R4) MOV 2(R0),2(R4) ;LOAD CALLED NAME MOV R4,4(R1) ;LOAD POINTERS CLR 4(R4) ;THIS IS THE END REMEMBER NOCB: JMP LODCAL .PAGE ; ALL THE TABLES ARE BUILT-NOW IS THE TIME TO OUTPUT THE ; DATA GATHERD DMPFLO: CLR LINCTR ;BEGIN NEW PAGE MOV #-3,SRCSYM MOV #NOLINE,R0 ;FORCE THE TITLE CALL PRTLIN MOV #VRSTPT-14,R4 ;POINTER TO FIRST ENTRY POINT LB: MOV 14(R4),R4 ;GET NEXT BEQ OUTDNE ;IF NULL-COMPLETED MOV #ENDLIN,R0 ;OUTPUT EMPTY LINE FOR READABILITY CALL PRTLIN MOV #SNAME,R0 ;GET ENTRY POINT NAME UNPACKED FOR PRINTING MOV R4,R1 CALL RAD50U ADD #2,R1 CALL RAD50U ;TWO RAD50 WORDS MOV #SNAME,R0 CALL PRTLIN ;PRINT THE ENTRY POINT NAME CMP (R4),4(R4) ;DEFINED AS ENTRY OR IN CALL ONLY BNE 1$ ;DIFFERENT MODULES CMP 2(R4),6(R4) BEQ 2$ ; DEFINEING MODULE NAME DIFFERENT THAN E.P. NAME 1$: MOV #DEFIN,R0 CALL PRTLIN MOV #HUH,R0 TST 4(R4) ;IF NO DEFINEING MODULE BEQ 5$ ;SKIP IT MOV #SNAME,R0 MOV R4,R1 ADD #4,R1 CALL RAD50U ADD #2,R1 CALL RAD50U MOV #SNAME,R0 5$: CALL PRTLIN ; DEFINEING MODULE NAME SAME AS ENTRY POINT NAME 2$: MOV #ENDLIN,R0 CALL PRTLIN ; CHECK FOR ANY CALLIN ROUTINES TST 10(R4) BEQ 3$ ;NO CALLING ROUTINES MOV #CALBY,R0 CALL PRTLIN MOV 10(R4),R5 ;SET UP POINTER FOR PRINT OUT LINKED,LIST CALL PRTLST 3$: TST 12(R4) BEQ 4$ MOV #CALLS,R0 CALL PRTLIN MOV 12(R4),R5 CALL PRTLST 4$: JMP LB ;NEXT E.P. OUTDNE: TST FWDTRE ;HAS THIS CHART BEEN DESELECTED BNE REVERSE CLR LINCTR ;START NEW PAGE FOR INDENTED LISTING MOV #-4,SRCSYM ;SET UP NEW TITLE LINE CLR LEVEL ;SET CALL NESTING LEVEL TO 0 MOV #VRSTPT-14,R5 ;SET POINTER TO START OF EP LIST STEP: MOV 14(R5),R5 ;GET NEXT EP DEFINITION BLOCK TST R5 ;SEE IF DONE BEQ REVERSE ;IF ZERO- THEN DONE WITH CHART TST 10(R5) ;DOES ANY ONE CALL THIS BIRD? BNE STEP ;IF NOT ZERO THEN YES AND THIS ENTRY POINT ;IS NOT A LEVEL 0 (MAIN) PROGRAM CALL PRTLEV ;PRINT OUT THIS TREE BR STEP ;REPEAT UNTILL DONE REVERSE:TST REVTRE ;SEE IF INVERTED TREE WANTED BEQ XITCHT ;IF NULL-NO CLR LINCTR ;START REVERSE INDENTED TREE MOV #-5,SRCSYM ;SET THE PROPER HEADER CLR LEVEL ;LEVEL 0 MOV #VRSTPT-14,R5 ;INIT THE POINTER TO TOP OF LIST RSTEP: MOV 14(R5),R5 ;GET NEXT EP TST R5 ;SEE IF END OF LINKED LIST BEQ XITCHT TST 12(R5) ;SEE IF HE CALLS ANY ONE(BOTTOM OF TREE) BNE RSTEP ;IF NOT-TRY NEXT CALL PRTLEV ;PRINT TREE BR RSTEP ;NEXT TREE XITCHT: MOV #14,R0 ;CLOSE OUT THE LISTING CALL PUTCHR ;WITH A FORM FEED .IFT CMP OTBFPT,#OUTBUF BEQ 1$ .WRITW #IOARA,#0,#OUTBUF,#256.,OUTBLK 1$: .CLOSE #0 MOV #FLOBUF,FLOPTR MOV #SUPBUF,SUPPTR MOV #SUPBUF,R0 MOV #FLOBUF,R2 MOV #256.,R1 2$: CLR (R0)+ CLR (R2)+ DEC R1 BNE 2$ CLR SUPBLK CLR FLOBLK .IFF MOV #15,R0 CALL PUTCHR TST SPOOL BEQ 8$ PRINT$ #LSTFIL BR 9$ 8$: CLOSE$ #LSTFIL 9$: MOV #FLOFIL,R0 CLR R1 MOV #1,R2 CLR R3 CALL .POINT MOV #SUPFIL,R0 CLR R1 MOV #1,R2 CLR R3 CALL .POINT .IFTF MOV LOWAV,LOWPTR MOV HIGHAV,HIGPTR CLR VRSTPT RETURN HUH: .ASCII /??????/<200> DEFIN: .ASCII / IS DEFINED IN MODULE /<200> CALLS: .ASCIZ / CALLS ROUTINES / CALBY: .ASCIZ / IS CALLED BY ROUTINES / .EVEN .PAGE PRTLST: MOV CHRWD,-(SP) ;SYMBOLS PER LINE MOV #BLNK,R0 ;START OFF WITH BLANK SPOT CALL PRTLIN 2$: MOV #SNAME,R0 ;BREAK OUT THE NAME FROM MOV R5,R1 ;2 RADIX 50 WORS INTO ASCII CALL RAD50U ADD #2,R1 CALL RAD50U MOV #SNAME,R0 ;AND PRINT THEM CALL PRTLIN MOV 4(R5),R5 ;NEXT NAME BEQ 1$ ;DONE-DO CLEAN UP AND RETURN DEC (SP) ;NEXT NAME BNE 2$ ;REPEAT CLR (SP)+ ;CLEAN UP STACK MOV #ENDLIN,R0 ;TERMINATE THE CURRENT LINE CALL PRTLIN BR PRTLST ;AND CONTINUE ON THE NEXT LINE 1$: CLR (SP)+ ;CLEAN UP THE STACK MOV #ENDLIN,R0 ;AND TERMINATE THE LINE CALL PRTLIN RETURN .PAGE ; CHART PRINT TREE ROUTINE-QUASI-RECURSIVE IN IMPLIMENTATION ; SO AS TO NOT OVERFLOW THE STACK-LIMIT OF NESTING IS 'INDENT' ; THE EP TO BE PRINTED IS POINTED TO BY R5. ; OLD VALUES OF R5 FOR LOWER LEVELS CALLING TO THIS ONE ; ARE STORED IN IMPURE IN ARRAY 'OLDR5' PRTLEV: MOVB #40,EENT+6 ;CLEAR THE OVERFLOW MOVB #40,EENT+7 ;AND RECURSIVE CALL PRINTOUT FLAGS TST LEVEL ;IS THIS A MAIN PROGRAM BEQ NOSKP ;IF YES-NO BLANK ENTRIES TO BE PRINTED MOV LEVEL,R1 ;GET CURRENT CALLING LEVEL MOV CHRWD,R0 ;CALC NO OF COLS/LINE (2*CHR/LIN +2) ASL R0 INC R0 CMP R0,R1 ;SEE IF WILL OVER FLOW ALLOWED PAGE SIZE BGE 1$ ;NO-SKIP RESET MOV R0,R1 ;RESET-FOR CHART-ALLOWED NUMBER OF ENTRIES ;IS ONE MORE THAN ALLOWED FOR OTHER PRINTOUTS MOVB #'*,EENT+6 ;IF OVERFLOW-SET PRINTOUT CHARACTER 1$: MOV #DOTS,R0 ;PRINT OUT BLANK ENTRY TO INDENT CALL PRTLIN ;TO THE CALLING LEVEL FOR ENTRY POINT DEC R1 ;REPEAT UNTILL DONE BGT 1$ NOSKP: MOV #EENT,R0 ;GET THE STRING TO STORE BROKEN OUT EP NAME MOV R5,R1 ;SET LOC OF RAD50 EP NAME CALL RAD50U ;UNPACK FIRST 3 CHR ADD #2,R1 ;SET UP SECOND HALF OF RAD50 NAME CALL RAD50U ;UNPACK LAST 3 CHARS OF EP NAME CLR RECURS ;CHECK FOR RECURSIVE CALLS-CLEAR FLAG MOV LEVEL,R4 ;SEE HOW MANY LEVELS TO CHECK BACK TST R4 ;IF 0 DON'T BOTHER BEQ NOREC MOV R4,R3 ;SET UP R3 AS POINTER TO OLD R5'S DEC R3 ASL R3 ASL R3 ADD #OLDR5,R3 ; R5 IS THE CURRENT EP DEFINITION BLOCK ; R4 IS THE LEVELS TO CHECK BACK COUNTER ; R3 IS THE PTR TO THE OLD R5'S RECLOP: MOV (R3),R2 ;SET R2 TO OLD R5 PTR TO EP DEF BLOCK CMP (R2),(R5) ;SEE IF FIRST HALF OF NAME MATCHES BNE 1$ ;NO CHECK NEXT LEVEL CMP 2(R2),2(R5) ;CHECK SECOND HALF FOR MATCH BNE 1$ ;NO MATCH-CHECK NEXT LEVEL CMPB #'*,EENT+6 ;SEE IF OVERFLOW FLAG SET BNE 2$ ;NO MOVB #'!,EENT+7 ;YES-PUT RECURSIVE CALL FLAG SECONDD BR 3$ 2$: MOVB #'!,EENT+6 ;NO-PUT RECURSIVE FLAG FIRST 3$: INC RECURS ;SET TESTING FLAG BR NOREC ;AND TERMINATE THIS PART OF THE TREE 1$: SUB #4,R3 ;SET POINTER TO NEXT R5 TO BE CHECKED DEC R4 ;SEE IF DONE BGT RECLOP ;IF NOT CHECK NEXT HIGHER CALLING LEVEL NOREC: TST 4(R5) ;SEE IF THIS IS AN UNDEFINED E.P. BNE 2$ ;NO-IT IS DEFINED SOMEWARE CMPB #40,EENT+6 ;SEE IF OVERFLOW SET BNE 3$ ;YES MOVB #'?,EENT+6 ;SET UNDEFINED FLAG (IF UNDEFINED-CANT BE RECURSIVE) BR 2$ 3$: MOVB #'?,EENT+7 ;SET UNDEFINED FLAG IN #2 LOCATION 2$: MOV #EENT,R0 ;PRINT OUT EP ENTRY CALL PRTLIN TST RECURS ;SEE IF THIS WAS A RECURIVE CALL BNE BAKUP1 ;IF SO-PRUNE THIS BRANCH MOV LEVEL,R0 ;SAVE R5 AND CONTENTS OF CALLED EP POINTER ASL R0 ASL R0 MOV R5,OLDR5(R0) CMP #-4,SRCSYM BNE 1$ MOV 12(R5),OLDR5+2(R0) BR LOPLEV 1$: MOV 10(R5),OLDR5+2(R0) LOPLEV: CMP #-4,SRCSYM BNE 2$ TST 12(R5) ;DOES THIS EP CALL ANY ONE?? BEQ BAKUP ;NO-SKIP REST AND RETURN TO LAST LEVEL BR 3$ 2$: TST 10(R5) BEQ BAKUP 3$: INC LEVEL ;GOING LOWER BY ONE MORE LEVEL CMP #INDENT,LEVEL ;OVERFLOW CHECK ON OLD R5 STACK BGE 1$ ;NO ERROR .IFT .PRINT #OVR5 ;TELL HIM HE OVERFLOWED R5 BISB #4,@#53 ;MONITOR TOO .IFF QIOW$S #IO.WLB,#9.,#1,,,,<#OVR5,#78.,#40> .IFTF MOV #OVR5,R0 CALL PRTLIN DEC LEVEL BR BAKUP 1$: MOV #VRSTPT-14,R4 ;SET UP FOR SEARCH FOR CALLED EP DEF BLOCK CMP #-4,SRCSYM BNE 4$ MOV 12(R5),R3 ;GET NAME OF CALLED BLOCK BR FNDNL 4$: MOV 10(R5),R3 FNDNL: MOV 14(R4),R4 ;CHECK NEXT EP DEF BLOCK FOR MATCH TST R4 ;SEE IF FOUND END OF LIST WITHOUT ;MATCH-SHOULD NOT HAPPEN-BUT JUST IN CASE BEQ NONEXT CMP (R4),(R3) ;CHECK HIGH ORDER PART OF NME BNE FNDNL ;NO-CHECK NEXT CMP 2(R4),2(R3) ;CHECK LOW ORDER PAR OF NAME BNE FNDNL ;CLOSE BUT NO CIGAR MOV R4,R5 ;FOUND THE NEXT LEVEL EP JMP PRTLEV ;PRINT OUT THAT SUB TREE NONEXT: DEC LEVEL ;RESTORE LEVEL MOV LEVEL,R0 ;GET STROAGE LOC ON 'OLDR5' ASL R0 ASL R0 MOV OLDR5(R0),R5 ;RESTORE R5 CMP #-4,SRCSYM BNE 1$ MOV 12(R5),R4 ;GET NEXT LOWER LEVEL JUST PRINTED MOV 4(R4),12(R5) ;POP IT OFF THE LINKED LIST FOR NEXT ONE BR LOPLEV ;SET UP TO NEXT SUB TREE FROM THIS EP 1$: MOV 10(R5),R4 MOV 4(R4),10(R5) BR LOPLEV BAKUP: MOV LEVEL,R0 ASL R0 ASL R0 CMP #-4,SRCSYM BNE 1$ MOV OLDR5+2(R0),12(R5);RESTORE CALLED POINTER BR BAKUP1 1$: MOV OLDR5+2(R0),10(R5) BAKUP1: TST LEVEL ;IF NOT AT LEVEL 0 BNE NONEXT ;CONTINUE TO NEXT SUB TREE AT THAT LEVEL RETURN ;TREE/SUB TREE COMPLETED DOTS: .ASCII /. /<200> OVR5: .ASCII <15><12>/ INDEX-W-SUBROUTINES NESTED OVER LIMIT HAVE BEEN/ .ASCIZ / DELETED ON INDENTED LISTING/ .EVEN .ENDC .END