.TITLE STORE .GLOBL VARTYP,NAMCTR,ENTCTR,VNM50,PRNFLG,DOFLOW .GLOBL STOLBL,STOVAR,VAR,RAD50P,VRSTPT,LOWPTR .GLOBL HIGPTR,LINENO,DUMP,PNMFLG,PNAME .PSECT STORE,I,RO,GBL .PAGE ; THIS ROUTINE USESES ALL OF MEMOREY AVALABLE-NOT ; OTHERWISE TAKEN UP WITH THIS PROGRAMS CODEING AND OTHER BUFFERS ; HANDLERS THE MONITOR ETC AND USED IT TO STORE VAR NAMES AND ; HOW THEY ARE USED-THERE ARE TWO STACKES HERE-ONR ; STARTING AT THE LOW END OF FREE MEMORY WORKING UP TO ; STORE THE ARRAY OF VARIABLE NAMES AND THE OTHER FROM ; HIGH MEMORY GOING DOWN STOREING LINE NUMBERS AND HOW ; USED ; THE FORMAT FOR THE VAR NAME STORAGE ELEMENT IS ; LOW MEM ADDR- POINTER POINTS HERE VAR NAM(R 50 HIGH) ; VAR NAM(R 50 LOW) ; STORAGE LOCATION OF NEXT VAR IN ALPB ORDER-NEXT VAR ; LOC OF ELEMENT OF HOW USED 1ST TIME 1ST USE ADDR ; LOC OF LAST USE OF VAR ELEMENT LAST USE ADDR ; ; ; THE HOW USED ELEMENTS HAVE THE FOLLOWING FORMAT ; LOWW MEM ADDR LINE NUMBER ; HOW USED ; POINTER PONTS HERE (VALUE=0 IF LAST) NEXT USE OF VAR ELEMNT ; ; NOTE THAT THE HOW USED ELEMENT 'HOW USED' IS A 2 ASCII ; CHARACTER ARRAY. SINCE THE CHARACTERS ARE 7 BITS EACH, THE ; HIGH ORDER BIT OF EACH BYTE IS AVAILABLE FOR FLAG USEAGE. ; THE FIRST HOW USED OF EACH VARIABLE HAS THOSE BITS ASSIGNED ; AS FOLLOWS: 200=>VARIABLE IS AN ENTRY POINT,100000=>VARIABLE ; IS AN ARRAY ; STOLBL: STOVAR: MOV #VAR,R0 ; CONVERT VAR NAME TO RADIX 50 MOV #VNM50,R1 JSR PC,RAD50P ; AND STORE IN ARRAY VNM50 ADD #2,R1 JSR PC,RAD50P TST PNMFLG ; IS THE NEXT VAR NAME A PROGRAM NAME BEQ 1$ ; SKIP IF NOT MOV VNM50,PNAME ; ELSE SAVE IT MOV VNM50+2,PNAME+2 1$: TST VRSTPT ; IS THIS THE FIRST ENTRY??? BEQ FSTIM ; IF YES HANDLE DIFERENTLY MOV #VNM50,R0 ; GET READY TO CHECK IF VAR ALREADY ; ENTERED IN TABLE MOV #VRSTPT-4,R1 ; FOR THIS PART ; R0=ADDR VNM50 ; R1=ADD OF LAST V NAM ELEMENT ; R2=ADD OF CURRENT EXMINED ELEMT ; R3=ADDR OF NEXT EXAMINED ELEMNT MOV VRSTPT,R2 ; SET UP REGISTERS MOV 4(R2),R3 CMPRVR: CMP (R2),(R0) ; COMPARE VARNAME WITH THAT IN ELEMENT BHI ENTRVN ; VARNAME IN ELEMENT HAS NAME ; FURTHER DWN THE ALPHABET THAN THAT IN ; VARNAME-INSERT NEW VARNAME BETWEEN ; ELEMENT CURRENTLY BEING EXAMINED ; AND LAST ONE BLO NXVRLB ; HAVE NOT REACHED END OF SEARCH YET- ; VAR NAME IN CURRENT ELEMNT NOT AS FAR DOWN ; AS THAT BEING SEARCHED FOR CMP 2(R2),2(R0) ; HIGH ORDER PARTS OF NAMES SAME- ; CHECK LOW ORDER BHI ENTRVN BLO NXVRLB BR ETRUSE ; NAMES SAME-ENTER HOWUSED IN USE TABLE FSTIM: MOV #VRSTPT-4,R1 ; SIMULATE VAR NAME ELEMENT ABOUT VRSTPT ENTEND: MOV #VNM50,R0 ; ENTRY POINT FOR HAVEING REACHED ; END OF TABLE AND NO MATCHING NAME FOUND ; SO NEW NAME ATTACHEDTO END MOV LOWPTR,4(R1) ; UPDATE NEXT VAR ADDR ; TO NEXT AVAILALE ELEMENT SPACE AVAILABLE MOV LOWPTR,R2 ; AND SET ADDR OF NEW ELMENT IN R2 MOV (R0)+,(R2) MOV (R0)+,2(R2) ; FILL IN VARNAM CLR 4(R2) ; NO NEXT VAR SO THIS =0 MOV HIGPTR,6(R2) ; FILLIN FIRST USE WITH NEXT AVAIL ; USE ELEMENT ADDR CLR 10(R2) ; SIGNAL THAT NO ACTUAL ENTRY HAS BEEN MADE ADD #12,LOWPTR ; INC NEXT AVAIL POINTER TO POINT TO ; NEXT FREE LOCATION FOR ELEMENT INC NAMCTR BR ETRUSE ; ENTER THE HOW USED ELEMENT IN ITS TABLE NXVRLB: MOV R2,R1 ; SHIFT ADDRESSES TO CHECK NEXT ELEMENT MOV R3,R2 BEQ ENTEND ; IF LAST ELEMENT CHECK WAS LAST ELEMENT ; IN DAISY CHAIN-ENTER VARNAM AT END MOV 4(R2),R3 BR CMPRVR ENTRVN: MOV LOWPTR,R4 ; ENTER A NEW VARNAM BETWEEN ; CURRENT AND LAST ELEMENTS EXAMINED MOV R4,4(R1) ; SET NEXT VAR ADDR OF LAST ELEMENT ; TO NEW VAR ELEMENT MOV R2,4(R4) ; SET ELEMENT ADDR OF CURRENT ELENT ; TO NEXT VAR OF NEW ELEMENT MOV R4,R2 ; SET NEW ELEMENT AS CURRENT ELEMENT MOV #VNM50,R0 MOV (R0)+,(R2) MOV (R0)+,2(R2) ; INSERT VAR NAM MOV HIGPTR,6(R2) ; INSERT ADDR OF ; NEXT USE ELEMENT ADD #12,LOWPTR INC NAMCTR CLR 10(R2) ; SIGAL NO ENTRIES YET ETRUSE: ; THIS IS THE ROUTINE TO ENTER A HOWUSED ELEMENT INTO THE PROPERVTABLE TST 10(R2) ; FIRST ENTRY FOR VARNAM BEQ FSTUSE ; YES MOV 10(R2),R3 ; GET LAST USE ELEMENT ADDR .IF DF,PREPRC .GLOBL FLXNO,PRESW TST PRESW BEQ 111$ CMP FLXNO,-4(R3) BEQ OVFLTS BR 112$ .ENDC 111$: .IF NDF,F4P CMP LINENO,-4(R3);HASE THIS VAR NAME BEEN USED BEFORE ON ; CURRENT LINE??? BEQ OVFLTS ; IF YES DO NOT ENTER-EACH VAR GETS ONLY ; ONE ENTRY PER LINE OF CODE-MAX .IFF ; THE FOLLOWING PATCH IS TO HANDLE THE CASE IN AN F4P PROGRAM ; WHERE A VARIABLE IS USED IN AN IF STATEMENT AND ASSIGNED ; A VALUE IN THE CONDITIONALY EXECUTEDCODE-THIS ALLOWS THE EXCEPTION ; OF A VARIABLE BEING LOGGED TWICE ON THE SAME LINE ONLY WHEN ; IT APPEARS IN AN IF STATEMENT AND IS ALSO ASSIGNED A VALUE AS ; PART OF THE CONDITIONALY EXECUTED CODE. THIS PROBLEM DOES NOT ; OCCOUR IN F4 AS THE CONDITIONALY EXECUTED CODE DOES NOT HAVE THE SAME ; LINE NUMBER. CMP LINENO,-4(R3);HAS THIS VAR NAME BEEN USED BEFORE ON CURRENT LINE BNE 112$ ; NO-PUT IT IN CMP #"= ,VARTYP ; WAS IT ASSIGNED A VALUE BNE OVFLTS ; NO-SKIP IT .ENDC 112$: MOV HIGPTR,R4 ; GET NEW ELENENT MOV R4,10(R2) ; INSERT NEW LAST USE IN VAR ELEMENT MOV R4,(R3) ; INSERT NEXT USE IN LAST USE ELEMENT FNTPT: CLR (R4) ; INDICATE LAST USE ELEMENT-=0 MOV VARTYP,-2(R4) ; FILL IN ELEMENT .IF DF,PREPRC TST PRESW BEQ 1$ MOV FLXNO,-4(R4) BR 2$ .ENDC 1$: MOV LINENO,-4(R4) 2$: SUB #6,HIGPTR ; SET POINTER TO NEXT FREE ELEMENT INC ENTCTR TST PRNFLG ; HAS A TRAILING '(' BEEN FOUND BEQ OVFLTS ; NO-GO TO OVERFLOW CHECK MOV 6(R2),R3 ; GET POINTER TO FIRST HOW USED BIT #100200,-2(R3) ; SEE IF ALREADY FOUND TO BE ARRAY/F(N) BNE OVFLTS ; ALREADY IS-SKIP REST TST PRNFLG ; IF THIS IS A CALL/SUB/FCN/EX/IT-ONLY SET FLAGS BLT 21$ ; SKIP WRITE TO FLOW SCRATCH-HANDLED ELSEWARE MOV #LIST,R0 ; SET UP CHECK OUT TO SEE IF ARRAY DECLARATION MOV #NLIST,R1 20$: CMP (R0)+,VARTYP ; IS IT THIS TYPE OF ARRAY DEC BEQ 30$ ; IT IS ARRAY DEC-GO SET FLAG DEC R1 ; ADVANCE TO NEXT ARRAY DEC TYPE BGT 20$ ; IF THERE IS ONE ; THIS IS A FUNCTION CALL NOT OTHERWISE DECLARED TST DOFLOW ; SEE IF WE ARE DOING AN ENTRY POINT BEQ 21$ ; NOPE-JUST SET THE FLAG MOV VARTYP,-(SP) ; SAVE THE VAR TYPE MOV #"CL,VARTYP ; FAKE A CALL CALL STOFLO ; TELL THE SCRATCH FILE ABOUT IT MOV (SP)+,VARTYP ; RESET IT TO ORIGINAL VALUE 21$: BIS #200,-2(R3) ; SET FLAG-ENTRY POINT BR OVFLTS ; DONE-CHECK FOR OVERFLOW 30$: BIS #100000,-2(R3) ; SET FLAG-ITS AN ARRAY BR OVFLTS ; AND CONTINUE FSTUSE: MOV HIGPTR,R4 ; SET UP FOR 1ST ENTRY MOV R4,10(R2) ; SET LAST USE IN VAR ELEMENT BR FNTPT OVFLTS: MOV LOWPTR,R0 ; CHECT TO SEE IF TABLE FULL ADD #20,R0 ; IF ROOM FOR 1 OF EACH KIND OF ; ELEMENT IS PRESENT-OK CMP R0,HIGPTR BLO NOOVFL JSR PC,DUMP ; OUT OF ROOM-DUMP TABLES NOOVFL: RTS PC LIST: .ASCII /DICMINCHLGRLDPCXBYVI/ NLIST=<.-LIST>/2 .END