.TITLE STORE .GLOBL VARTYP,NAMCTR,ENTCTR,VNM50 .GLOBL STOLBL,STOVAR,VAR,RAD50P,VRSTPT,LOWPTR .GLOBL HIGPTR,LINENO,DUMP,PNMFLG,PNAME .PSECT STORE,I,RO,GBL ; ; ;+002 R B FRENCH APRIL 1981 ;+002 ;+002 - MODIFICATIONS TO DIFFERENTIATE BETWEEN ARRAY REFERENCES AND CALLS ;+002 - TO FUNCTIONS-TYPE SUBROUTINES. GENERATES LINKED LISTS FOR ARRAYS ;+002 - AND FUNCTION REFERENCES. ; ; .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 ; ; 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 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 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: SUB #6,HIGPTR ; SET POINTER TO NEXT FREE ELEMENT TST PRNFLG ;+002 - PAREN FLAG SET ? BEQ 40$ ;+002 - BR IF NOT MOV #LIST,R0 ;+002 - POINT TO LIST MOV #NLIST,R1 ;+002 - GET NUMBER OF ENTRIES 10$: CMP (R0)+,VARTYP ;+002 - MATCH ? BEQ 30$ ;+002 - IF SO, GO ADD TO ARRAY LIST SOB R1,10$ ;+002 MOV ARRAY,R0 ;+002 - GET ARRAY POINTER BEQ 21$ ;+002 - LOOK NO FURTHER IF NONE 20$: CMP (R0),R2 ;+002 - CHECK IF THAN IS ARRAY BEQ 40$ ;+002 - IF SO, IGNORE MOV -2(R0),R0 ;+002 - GET NEXT ARRAY ENTRY BNE 20$ ;+002 - ZERO MEANS END OF ARRAYS ;+002 ;+002 - NOW MAKE A FUNCTION CALL ENTRY 21$: MOV HIGPTR,R3 ;+002 - GET NEXT AVAILABLE WORDS MOV R2,(R3) ;+002 - STORE POINTER TO NAME CLR -2(R3) ;+002 - ZERO POINTER TO NEXT TST FNCALL ;+002 - FIRST ENTRY ? BNE 25$ ;+002 - BR IF NOT MOV R3,FNCALL ;+002 - MAKE THIS FIRST ENTRY BR 26$ ;+002 25$: MOV LSTFNC,R0 ;+002 - GET LAST POINTER MOV R3,-2(R0) ;+002 - MAKE IT POINT TO THIS ONE 26$: MOV R3,LSTFNC ;+002 - MAKE THIS ONE LAST FUNCTION SUB #4,HIGPTR ;+002 MOV VARTYP,-(SP) ;+002 - SAVE VARIABLE TYPE MOV #"CL,VARTYP ;+002 - FAKE IT AS A CALL JSR PC,STOFLO ;+002 - AND STORE IT AS AN ENTRY POINT MOV (SP)+,VARTYP ;+002 - RESET THE REAL TYPE BR 40$ ;+002 ;+002 ;+002 - MAKE AN ARRAY ENTRY 30$: MOV HIGPTR,R3 ;+002 - GET NEXT AVAILABLE WORDS MOV R2,(R3) ;+002 - STORE POINTER TO NAME CLR -2(R3) ;+002 - ZERO POINTER TO NEXT TST ARRAY ;+002 - FIRST ENTRY ? BNE 35$ ;+002 - BR IF NOT MOV R3,ARRAY ;+002 - MAKE THIS FIRST ENTRY BR 36$ ;+002 35$: MOV LSTARR,R0 ;+002 - GET LAST POINTER MOV R3,-2(R0) ;+002 - MAKE IT POINT TO THIS ONE 36$: MOV R3,LSTARR ;+002 - MAKE THIS ONE LAST ARRAY SUB #4,HIGPTR ;+002 40$: ;+002 CLR (R4) ; INDICATE LAST USE ELEMENT-=0 MOV VARTYP,-2(R4) ; FILL IN ELEMENT MOV LINENO,-4(R4) INC ENTCTR BR OVFLTS ; DONE-CHECK FOR OVERFLOW 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 ; ;+002 LIST: .ASCII /DICMINCHLGRLDPCXBYCSCT/ NLIST=<.-LIST>/2 ARRAY:: .WORD 0 LSTARR::.WORD 0 ; FNCALL::.WORD 0 LSTFNC::.WORD 0 ;+002 .END