.TITLE ADDREF ;+ ;ADDREF---ADD REFERENCE ; ;THIS ROUTINE IS CALLED TO ADD A REFERENCE TO THE SYMBOL TABLE ; ;THE ENTRY IS COMPAIRED TO THE MOST RECENT. IF THEY ARE EQUAL,THE ;REFERENCE IS REDUNANT-AND IGNORED.IF THE REFERENCE REQUIRES AN ;ADDITIONAL ELEMENT OF MEMORY,'NELM'IS DECREMENTED TO INDICATE ;THAT MEMORY ELEMENT IS IN USE. ; ;CALL: ; CALL ADDREF(BASE,ICODE,NELM,IADR) ; ;WHERE: ; BASE=2 ;BASE OF SYMBOL TABLE IADR=10 ;ADDRESS OF ITEM IN SYMBOL TABLE CODE=4 ;CODE TO ENTER IN SYMBOL TABLE NELM=6 ;FIRST SLOT OPEN IN SYMBOL TABLE. ; .MCALL RETURN SIZ=10 ADDREF::MOV @IADR(R5),R0 ;GET ENTRY ADR MOV @CODE(R5),R2 ;GET CODE MOV R2,R3 ;COPY ENTRY BIC #174000,R3 ;REDUCE TO STMT NUM BR 20$ ;+ ;THIS ROUTINE ATTEMPTS TO ALLOCATE AN ELLEMENT ;AND LINK IT WITH THE CURRENT DEFINITION ELEMENT ;AS THE NELM(FIRST)REFERENCE ELEMENT ; ;IF THERE IS NONE LEFT(NSYM+1=NELM)-NELM IS CLEARED ;- 10$: MOV NELM(R5),R1 ;GET POINTER TO ELEM COUNTER DEC (R1) ;COUNT ONE MORE USED CMP -2(R1),(R1) ;DID WE OVER-FLOW BLOS 15$ ;NO--- CLR (R1) ;YES---THAT'S A SHAME BR 60$ 15$: MOV (R1),R1 ;GET ELEMENT NUMBER ALLOCATED ASL R1 ;MULT ASL R1 ;BY ASL R1 ;10(8.) ADD BASE(R5),R1 ;FIX UP WITH BASE ADR MOV R1,(R0) ;LINK WITH PREVIOUS MOV R1,R0 ;SET AS CURRENT CLR (R1)+ ;ZERO CLR (R1)+ ;.OUT CLR (R1)+ ;..THE CLR (R1)+ ;...BLOCK 20$: MOV (R0),R1 ;COPY ADR OF NELM BLOCK BEQ 25$ ;BR WHEN END MOV R1,R0 ;COPY THAT BR 20$ ;...AND GO AGAIN 25$: MOV R0,R1 ;COPY ADR OF CURRENT BLOCK ADD #SIZ,R1 ;POINT AT LAST ENTRY+2 MOV R1,R4 ;SAVE THAT 30$: TST -(R1) ;ANYTHING HERE? BNE 40$ CMP R1,R0 ;BACK TO TOP BNE 30$ ;NO KEEP LOOK 40$: MOV (R1),-(SP) ;PUSH LAST CODE ENTERED BIC #174000,(SP) ;REDUCE TO STMT NUM CMP (SP)+,R3 ;WATCH FOR REDUNENT ENTRY BEQ 60$ ;IF YES-REDUNDENT-FORGET IT. TST (R1)+ ;NO-ADVANCE POINTER CMP R1,R4 ;IS THIS ELEMENT FULL? BEQ 10$ ;YES-GO ALLOCATE ANOTHER MOV R2,(R1) ;INSERT ENTRY 60$: RETURN .END