~~ I>~~~~~~~~ q~~~~a ; ; ; ACTION PROGRAMS ; ;  INSERT ;  EXTRACT ;  REPLACE ;  ANALYZE ; ; ; ; 1 INSRT: FCALL   ;TRANSFER THE HEADER RECORD RWHDR LDA 0,IPTIM  ;IF NO INPUT MASTER LDA 1,IPTLC  ; OR SPECIFIED LOGICAL RECORDS SUB# 0,1,SNR JMP QUIKI  ;MAKE A "QUICK" INSERT ;  THIS CODE CHECKS THE UFL FOR ALL ENTRIES WITH LRL ; POINTERS WHICH POINT BELOW THE LRL. THIS CONDITION ; INDICATES AN UPDATE FILE(S) WHICH IS TO BE INSERTED ; AT THE BEGINNING OF THE OUTPUT FILE. LDA 0,IPTUC STA 0,TMP0,3 LDA 2,.UFL INSL5: LDA 0,.LRL LDA 1,UFLLP,2 SUBZ# 0,1,SZC  ;SKIP IF 1 < 0 JMP INSL4 LDA 0,UFLBP,2 FCALL COPUF SUB 0,0 STA 0,UFLLP,2 STA 0,UFLBP,2 INSL4: INC 2,2 INC 2,2 DSZ TMP0,3 JMP INSL5 INSL0: FCALL   ;READ THE NEXT TITLE BLOCK RDNLR FRET   ;EOF => DONE JSR @.SVTTL  ;SAVE TITLE FOR ERROR MESS. FCALL   ;SEARCH FOR AN LR MATCH LRSER JMP INSL3 MOV 1,3 LDA 0,LRLW1,3 MOV 0,0,SZR  ;TEST FOR 'B' SWITCH JMP INSL1 FCALL   ;FOUND - COPY THIS L. RECORD COPLR INSL1: FCALL   ;SEARCH THE UFL FOR APPROPRIATE UFSER   ; ENTRY(S) JMP INSL2  ;NO MORE, THEN THIS LR IS SATIS-    ; FIED FCALL   ;FOUND - COPY THIS UPDATE F. TO COPUF   ; THE OUTPUT MASTER SUB 0,0 STA 0,UFLBP,2 STA 0,UFLLP,2 JMP INSL1  ;LOOK FOR ANOTHER INSL2: SUB 0,0  ;DELETE THIS LRL ENTRY MOV 1,2 LDA 1,LRLW1,2 MOV 1,1,SNR JMP .+3 FCALL COPLR   ;COPY L.R. IF 'B' SWITCH IS SET STA 0,LRLW0,2 STA 0,LRLW1,2 JMP INSL0  ;CONTINUE INSL3: FCALL   ;COPY THIS LOGICAL RECORD AND COPLR   ; CONTINUE JMP INSL0 QUIKI: LDA 2,.UFL  ;QUICK INSERT QUIK0: LDA 0,UFLBP,2 ;COPY EACH UFL ENTRY TO THE FCALL   ; OUTPUT MASTER COPUF INC 2,2 INC 2,2 DSZ IPTUC  ; ....UNTIL THE ENTRY EXPIRES JMP QUIK0 LDA 0,IPTIM  ;IF THE INPUT MASTER DOES NOT MOV 0,0,SNR  ; EXIST ... FRET   ;THEN YOU'RE DONE QUIK1: FCALL   ; OTHERWISE... RDNLR   ;READ AND COPY LOGICAL RECORDS FRET   ;UNTIL AN EOF FCALL COPLR JMP QUIK1 .SVTTL: SVTTL ;SAVE TITLE ; ; 1 DLETE: FCALL   ;TRANSFER THE HEADER RECORD RWHDR DLET0: FCALL   ;READ NEXT LOGICAL RECORD RDNLR FRET   ;EOF => DONE JSR @.SVTTL  ;SAVE TITLE FOR ERROR MESS FCALL   ;SEARCH FOR AN LRL MATCH LRSER JMP DLET1  ;NOT FOUND FCALL   ;FOUND - ADVANCE THE INPUT MAS- ADVLR   ; TER ONE LOGICAL RECORD SUB 0,0  ;ZERO THIS LRL ENTRY MOV 1,2 STA 0,LRLW0,2 STA 0,LRLW1,2 JMP DLET0  ;CONTINUE DLET1: FCALL   ;DOESN'T MATCH, THEN COPY IT COPLR JMP DLET0 ;MERGE LIBRARIES AND OUTPUT A SINGLE MASTER 2 MRGE: FCALL RWHDR   ;COPY HEADER ISZ IPTUC LDA 1,.UFL STA 1,TMP,3 SUBZL 1,1 STA 1,TMP1,3 MRG0: FCALL RDNLR   ;READ NEXT LOGICAL RECORD JMP MRG1  ;LIBRARY END JSR @.SVTTL  ;SAVE TITLE OF L.R LDA 0,TTLFLG MOV# 0,0,SZR JMP MRG2  ;LIST TITLES FCALL COPLR   ;COPY L.R JMP MRG0  ;GOTO NEXT L.R. MRG1: LDA 0,IPTUC DSZ IPTUC  ;ANY MORE? MOV 0,0,SNR FRET   ;DONE, CLEAN-UP .SYSTM .CLOSE IMC  ;CLOSE INPUT FILE JSR @.FERR LDA 2,TMP,3 LDA 0,UFLBP,2 STA 0,.IBBP  ;ERROR POINTER SUB 1,1 .SYSTM .OPEN IMC JSR @.FERR ISZ TMP,3 ISZ TMP,3 LDA 0,.OCC  ;SAVE OUTPUT CHANNEL STA 1,.OCC  ;CLEAR OUTPUT CHANNEL FCALL RWHDR   ;READ PAST HEADRE STA 0,.OCC  ;RESTORE OUTPUT CHANNEL JMP MRG0  ;NEXT L.R. MRG2: LDA 3,FSP DSZ TMP1,3 JMP .+6 LDA 0,.CRBP  ;EXTRA CR EVERY 10TH TITLE JSR @.WRSM LDA 0,C12 STA 0,TMP1,3 JMP .+3  ;NO SPACES LDA 0,.BLBP JSR @.WRSM LDA 0,.TTLP  ;TITLE POINTER JSR @.WRSM LDA 0,.CRBP JSR @.WRSM FCALL ADVLR   ;ADVANCE A RECORD JMP MRG0  ;GO TO NEXT RECORD C12: 12 ;CREATE FILES OF THE SAME NAME S ;AS IN THE L.R.LIST AND COPY THEM 1 XTRCT: FCALL RWHDR   ;TRANSFER HEADER XTRL0: FCALL RDNLR   ;READ NEXT L.R FRET   ;DONE, CLEAN-UP JSR SVTTL FCALL LRSER   ;SEARCH FOR MATCH JMP XTRL1  ;NOT FOUND LDA 2,OFILE  ;OUTPUT FILE STA 2,.OCC STA 1,TMP,3 LDA 0,.IBBP  ;CREATE FILE INC 0,0 JSR @.LDBT MOV 1,1,SZR JMP .-3 MOV 0,1 LDA 0,.RBBP  ;WITH NAME TITLE.RB FCALL MOVE LDA 0,.IBBP SUB 1,1 .SYSTM .CREAT JMP XTRL2  ;FILE ALREADY EXISTS .SYSTM .OPEN OMC JSR @.FERR FCALL COPLR   ;COPY L.R .SYSTM .CLOSE OMC JSR @.FERR SUB 0,0 XTRL3: LDA 2,TMP,3 SUB 3,3 STA 3,LRLW0,2 STA 3,LRLW1,2 STA 3,.OCC MOV 0,0,SNR JMP XTRL0  ;CLOSE OUTPUT FILE,GOTO NEXT L.R XTRL1: FCALL ADVLR   ;ADVANCE TO NEXT L.R. JMP XTRL0  ;REPEAT XTRL2: LDA 0,XSTBP JSR @.MESS LDA 0,.IBBP JSR @.MESS LDA 0,.CRBP JSR @.MESS ADC 0,0 JMP XTRL3 XSTBP: XSTM*2 ;FILE ALREADY EXISTS OFILE: OMC ; ; 1 REPLC: FCALL   ;TRANSFER THE HEADER RECORD RWHDR REPL0: FCALL   ;READ NEXT LOGICAL RECORD RDNLR FRET   ;EOF => DONE JSR SVTTL  ;SAVE TITLE FOR ERROR MESS. FCALL   ;SEARCH FOR AN LRL MATCH LRSER JMP REPL1  ;NOT FOUND STA 1,TMP0,3 ;TMP0 = POINTER TO THE LRL ENTRY FCALL   ;FIND THE ASSOCIATED UPDATE FILE UFSER JSR @.E110  ;THIS ONE SHOULDN'T HAPPEN FCALL   ;COPY THE UPDATE FILE TH THE COPUF   ; OUTPUT FILE FCALL   ;ADVANCE THE INPUT MASTE ONE ADVLR   ; LOGICAL RECORD SUB 0,0 STA 0,@TMP0,3 ;ZERO THE LRL ENTRY ISZ TMP0,3 STA 0,@TMP0,3 JMP REPL0 REPL1: FCALL   ;COPY THE INPUT MASTER ONE LOGI- COPLR   ; CAL RECORD JMP REPL0 ;SAVE TITLE STRING SVTTL: STA 3,@.SB LDA 2,.CBP LDA 0,RLBW0,2 MOVS 0,0 LDA 3,.OBBP MOVZR 3,3 STA 0,0,3 LDA 0,RLBW1,2 MOVS 0,0 STA 0,1,3 MOV 3,1 LDA 0,.TTLP STA 0,.IBBP FCALL CR50A LDA 2,SPCE SVT0: FCALL LDBT MOV# 1,1,SZR SUB 2,1,SNR JMP SVT1 INC 0,0 JMP SVT0 SVT1: SUB 1,1 FCALL STBT LDA 3,@.SB JMP 0,3 SPCE: " .TTLP: TTLE*2 ;TITLE POINTER ;COMPARE UPTO FIVE NONZERO CHARACTERS OF TWO STRINGS ;RETURN NEXT TO CALL IF THEY MATCH ;SKIP A LINE IF THEY DO NOT ;BYTE POINTERS IN AC0 AND AC1 ;ENTRY AT COMT RESRICTS COMPARISON TO 5 CHARACTERS 3 COMT: LDA 2,C5 JMP COMP+1 FSAV 3 COMP: SUB 2,2 STA 0,TMP,3  ;SAVE BYTE POINTERS STA 1,TMP+1,3 STA 2,TMP+2,3 LDA 2,FOSP,3 LOOP: DSZ TMP+2,3 JMP .+2 FRET JSR @.GBYTE  ;LOAD A BYTE FROM 1. TMP-FZD MOVZ 1,0,SNR  ;CHECK FOR NULL MOVO 0,0  ;YES,SET CARRY JSR @.GBYTE  ;LOAD A BYTE FROM 2. TMP+1-FZD MOV# 1,1,SNR  ;CHECK FOR NULL JMP NULL SUB# 0,1,SNR  ;CHAR.S MATCH? JMP LOOP JMP NOMAT NULL: MOV 0,0,SNC NOMAT: ISZ FRTN,2 FRET ; ; ; LOGICAL RECORD SEARCH ; ;  AC1 - LRL ENTRY POINTER (RETURNED) ; ;  CONDITIONAL ; ;H  FCALLING LOC. + 1 => NO MATCH ;   FCALLING LOC. + 2 => MATCH ; ;  SEARCHES FOR A MATCH ON THE TITLE BLOCK ;  POINTED TO BY ".CBP" ; ; 3 LRSER: LDA 0,IPTLC  ;STORE THE LRL E. C. IN TMP0 STA 0,TMP0,3 INC# 0,0,SNR  ;MATCH ANYTHING? JMP LRSL2  ;YES MOV 0,0,SNR FRET   ;RETURN QUICKLY IF EXPIRED LDA 1,.IBBP LDA 2,.LRL  ;AC2 POINTS TO THE LRL LRSL0: LDA 0,0,2 FCALL   ;COMPARE TITLES COMT JMP LRSL2  ;MATCHED INC 2,2  ;NO MATCH INC 2,2 DSZ TMP0,3 JMP LRSL0  ;CONTINUE SEARCHING FRET   ;RETURN WITH NO MATCH LRSL2: LDA 3,FOSP,3 ISZ FRTN,3  ;BUMP RETURN LOC. STA 2,FAC1,3 ;STORE LRL E. P. IN CALLER'S FRET   ; AC1 ; ; 5 ANALZ: .SYSTM   ;GET NMAX AND HMA .MEM JSR @.FERR STA 1,.SYM  ;STORE NMAX IN .SYM STA 1,SYMCE  ;AND IN CURRENT ENTRY POINTER DSZ SYMCE  ;(INITIALIZED) SUB 1,0 .SYSTM   ;BUMP ADDRESS SPACE TO HMA .MEMI JSR @.FERR MOVZR 0,0  ;DIVIDE DIFFERENCE BY 2 STA 0,SYMEC  ;STORE IN THE ENTRY COUNT STA 0,SYMRC  ;AND IN RUNNING COUNT FCALL   ;ADVANCE PAST THE LIB HEADER RWHDR   ; RECORD LDA 0,.FFBP  ;OUTPUT A FORM FEED TO THE JSR @.WRSM  ; LISTING FILE LDA 0,IPTLC MOV 0,0,SNR  ;IF LRLEC IS 0 COM 0,0  ; MAKE IT -1 (TO MATCH ALL) STA 0,IPTLC  ; AND RESTORE IT LDA 1,.UFL STA 1,TMP3,3 ;TMP3 = UFL ENTRY POINTER ANAL0: FCALL   ;READ NEXT L. RECORD RDNLR JMP ANAL8  ;LIB END JSR SVTTL FCALL   ;SEARCH FOR AN LRL MATCH LRSER JMP @ANL9D  ;NOT FOUND STA 1,TMP2,3 ;FOUND - STOR THE ENTRY POINTER FCALL   ;STORE TITLE IN SYM. TAB. STSYM ANAL1: FCALL   ;READ NEXT BLOCK RDRLB LDA 0,@.CBP LDA 1,SBLK SUB# 0,1,SNR  ;IF START BLOCK - JMP ANAL2  ; TALLY DATA COUNTS SUBZ# 0,1,SNC  ;IF GREATER THAN START BLOCK - JMP ANAL1  ; KEEP READING MOVS 0,0  ;OTHERWISE, DISPATCH THE LDA 2,.ANDT  ; INFORMATION IN THIS BLOCK ADD 0,2 LDA 2,0,2 FRCAL JMP ANAL1 ANAL2: FCALL   ;STORE THE ZREL, NREL, AND ABS STLRC   ; DATA COUNTS IN SYM. TAB. SUB 0,0  ;ZERO THE LRL ENTRY STA 0,@TMP2,3 ISZ TMP2,3 STA 0,@TMP2,3 JMP ANAL0  ;READ NEXT L. RECORD ANL9D: ANAL9 ANAL8: ADC 0,0 LDA 2,SYMCE STA 0,0,2  ;STORE HASH MARK INDICATOR LDA 0,IPTUC DSZ IPTUC MOV 0,0,SNR JMP ANAL3  ;GO PROCESS THE SYMBOL TABLE .SYSTM .CLOSE IMC JSR @.FERR LDA 2,TMP3,3 LDA 0,UFLBP,2 ;OPEN IT ON THE NEXT UFL ENTRY STA 0,.IBBP SUB 1,1 .SYSTM .OPEN IMC JSR @.FERR ISZ TMP3,3  ;BUMP UFL ENTRY POINTER ISZ TMP3,3 FCALL   ;READ PAST THE HEADER RECORD RWHDR JMP ANAL0 ANAL3: LDA 0,SYMRC  ;AC0 = SYM. TAB. RUNNING COUNT LDA 1,SYMEC  ;AC1 = SYM. TAB. ELEMENT COUNT SUB 0,1,SNR  ;CHECK FOR NO SYMBOLS FRET STA 1,TMP2,3 ;TMP2 = RUNNING ELEMENT COUNT STA 1,SYMTC  ;SYMTC = TOTAL ELEMENT COUNT LDA 2,.SYM  ;AC2 POINTS TO SYM. TAB. 0TH SUB 0,0 STA 0,ZRELC  ;CLEAR TOTAL COUNTS STA 0,NRELC ANAL4: LDA 0,.OBBP  ; ELEMENT STA 0,.IBBP MOV 2,1  ;CONVERT THE R50 SYMBOL TO ASCII FCALL CR50A LDA 0,.BLBP  ;SET FLAGS TO BLANKS STA 0,PRM0,3 LDA 0,.TBP  ;SET TYPE TO "TITLE" STA 0,PRM1,3 FCALL   ;WRITE THE SYMBOL WRSYM LDA 0,.CRBP JSR @.WRSM INC 2,2  ;BUMP AC2 DSZ TMP2,3  ;DEC THE COUNT (CAN'T BE 0 HERE) INC 2,2,SKP ; ; JSR @.E110 ANAL5: LDA 0,C5  ;CHECK NEXT ELEMENT FOR LDA 1,SYMW1,2 ; ZREL COUNT - SUB 1,0,SNR  ;NO JMP ANAL6  ;YES - END OF LOGICAL RECORD FCALL   ;RESOLVE THE SYMBOL RSSYM LDA 0,.OBBP  ;CONVERT THE R50 SYMBOL TO ASCII MOV 2,1 FCALL CR50A FCALL   ;WRITE THE SYMBOL WRSYM FCALL RFRNC INC 2,2  ;BUMP AC2 INC 2,2 DSZ TMP2,3  ;DEC THE COUNT JMP ANAL5  ;CONTINUE JMP @.E110  ;DONE ANAL6: LDA 1,C2 STA 1,TMP3,3 ;2 TIMES THRU THIS LOOP LDA 1,.SMT STA 1,TMP4,3 ;TMP4 = B.P. TO SUMMARY MESSAGE LDA 0,ZRELC LDA 1,SYMW0,2 ADD 1,0 STA 0,ZRELC  ;UPDATE ZREL COUNT ANAL7: LDA 0,@TMP4,3 JSR @.WRSM  ;CALL "WRITE SUMMARY MESSAGE" LDA 0,.OBBP LDA 1,SYMW0,2 ;CONVERT THE DATA COUNT FCALL   ; TO ASCII .BASC LDA 0,.OBBP JSR @.WRSM  ;CALL "WRITE SUMMARY MESSAGE" LDA 0,.CRBP  ;OUTPUT CARRIAGE RETURN JSR @.WRSM DSZ TMP2,3  ;DEC THE SYM. TAB. COUNTER INC 2,2,SKP  ;BUMP THE SYM. TAB. POINTER JSR @.E110  ;SHOULDN'T GO TO ZERO HERE INC 2,2 ISZ TMP4,3  ;BUMP THE SUMMARY MESSAGE PNTR DSZ TMP3,3 JMP ANAL7 LDA 0,NRELC ADD 1,0 STA 0,NRELC  ;UPDATE NREL COUNT LDA 1,SYMW1,2 ;CHECK FOR HASH MARK INC# 1,1,SNR JSR @.TOTAL LDA 1,SYMW0,2 ;LOAD ABS DATA INDICATOR LDA 0,.ADM MOV 1,1,SZR  ;SKIP IF ZERO ABS DATA JSR @.WRSM  ;CALL "WRITE SUMMARY MESSAGE" LDA 0,.CRBP  ;OUTPUT CARRIAGE RETURN JSR @.WRSM INC 2,2  ;BUMP SYM. TAB. POINTER DSZ TMP2,3  ;DEC THE SYM. TAB. COUNTER INC 2,2,SKP FRET   ;NOW IT MEANS YOU'RE FINISHED JMP ANAL4  ;PROCESS ANOTHER L. RECORD ANAL9: FCALL ADVLR JMP @.ANL0 .SMT: .ZRM .ANDT: ANDT-2 ANDT: PDB STSYM STSYM STSYM .ANL0: ANAL0 .ZREL .TOTAL: TOTAL-2 .NREL FSAV 0 TOTAL: LDA 0,.CRBP JSR @.WRSM LDA 0,TZRLP  ;TOTAL ZREL MESSAGE JSR @.WRSM LDA 0,.OBBP LDA 1,ZRELC  ;CONVERT COUNT TO ASCII FCALL .BASC LDA 0,.OBBP  ;OUTPUT COUNT JSR @.WRSM LDA 0,.CRBP JSR @.WRSM LDA 0,TNRLP  ;NREL TOTAL MESSAGE JSR @.WRSM LDA 0,.OBBP LDA 1,NRELC  ;CONVERT COUNT TO FCALL .BASC   ;ASCII LDA 0,.OBBP JSR @.WRSM  ;OUTPUT COUNT LDA 0,.CRBP JSR @.WRSM LDA 0,.HMBP  ;OUTPUT HASH MARK JSR @.WRSM SUB 0,0 STA 0,NRELC STA 0,ZRELC FRET TZRLP: 2*TZRLM TNRLP: 2*TNRLM ; ; FSAV 0 WRSM: .SYSTM   ;WRITE THE LINE AND RETURN .WRL LFC JSR @.FERR FRET ;OUTPUT REFERENCES 0 RFRNC: LDA 2,.UFL LDA 0,C5N STA 0,IPTUC  ;WORD COUNT DSZ IPTUC  ;FIVE PER LINE RFR1: LDA 0,0,2 MOV 0,3,SNR  ;ANY REFERENCES? JMP RFR2  ;NONE ISZ IPTUC  ;CHECK FOR LINE END JMP RFR3 LDA 0,C5N STA 0,IPTUC LDA 0,.CRBP JSR @.WRSM  ;CARRIAGE RETURN LDA 0,.TABP  ;EXTRA TAB JSR @.WRSM LDA 3,0,2 RFR3: LDA 1,C4  ;YES,GET TITLE MOVZR 1,0 SUB 0,3  ;BACK UP TWO WORDS LDA 0,1,3  ;CHECK FOR TITLE AND# 1,0,SNR JMP .-4  ;NO MOV 3,1  ;YES,TITLE POINTER LDA 0,.TABP  ;GET A TAB JSR @.WRSM  ;OUTPUT IT LDA 0,.OBBP FCALL CR50A   ;IN ASCII LDA 0,.OBBP JSR @.WRSM INC 2,2  ;RAISE POINTER ON JMP RFR1  ;REFERENCE LIST RFR2: LDA 0,.CRBP JSR @.WRSM FRET .TABP: TAB*2 ; ; ; RESOLVE SYMBOL ; ;  AC1 - WORD ONE OF R50 SYMBOL ;  AC2 - SYM. TAB. ELEMENT POINTER ;  PRM0 - RETURNED B.P. TO FLAGS ;  PRM1 - RETURNED B.P. TO SYMBOL TYPE ; ;  TMP0 - WORD 0 ;  TMP1 - WORD 1 ;  TMP2 - RUNNING COUNT ;  TMP3 - EXTERNAL SEARCH PASS INDICATOR ;   2 => 1ST ;   1 => 2ND ;  TMP4 - COPY OF CALLER'S AC2 ; ; 5 RSSYM: LDA 0,.UFL STA 0,IPTUF  ;SECOND USE OF UFL AND IPTUF LDA 0,C37 COM 0,2 AND 1,0  ;AC0 = TYPE INDICATOR AND 2,1  ;AC1 = R50 WORD 1 SANS FLAGS STA 1,TMP1,3 ;TMP1 = R50 WORD 1 LDA 2,FOSP,3 LDA 1,@FAC2,2 STA 1,TMP0,3 ;TMP0 = R50 WORD 0 LDA 1,.ENBP  ;ASSUME NORMAL ENTRY MOV 0,0,SNR  ;TRUE? JMP .+10  ;YES LDA 1,.XNBP  ;NO,TRY EXTERNAL NORMAL MOVZR 0,0,SNR JMP RSSL0  ;YES LDA 1,.XDBP  ;NO,TRY EXTERNAL DISP. MOVZR 0,0,SNR JMP RSSL0  ;YES LDA 1,.EDBP  ;SET DISPLACEMENT ENTRY STA 1,PRM1,2 JMP RSSL5  ;PROCESS ENTRY RSSL0: STA 1,PRM1,2 ;STORE TYPE B.P. LDA 0,TMP2,2 ;EXTERNAL SEARCH STA 0,TMP2,3 ;TMP2 = SEARCH COUNT LDA 0,C2 STA 0,TMP3,3 ;TMP3 = SEARCH PASS INDICATOR LDA 2,FAC2,2 ;START AT THE CURRENT ELEMENT RSSL1: LDA 0,TMP0,3 LDA 1,SYMW0,2 SUB 0,1,SZR JMP RSSL2 LDA 0,EDFLG LDA 1,SYMW1,2 COMS 0,0 AND 0,1 LDA 0,TMP1,3 SUB# 0,1,SZR JMP RSSL2 LDA 3,FOSP,3 LDA 0,FAC2,3 LDA 3,FSP SUB# 2,0,SZR JMP RSSL3  ;MATCH RSSL2: INC 2,2  ;NO MATCH INC 2,2  ;BUMP AC2 TO NEXT TABLE ELEMENT DSZ TMP2,3  ;DECREMENT COUNT JMP RSSL1  ;CONTINUE LDA 0,SYMTC  ;RESET TO SEARCH FROM TOP LDA 2,FOSP,3 ; OF THE SYMBOL TABLE LDA 1,TMP2,2 SUB 1,0 STA 0,TMP2,3 LDA 2,.SYM DSZ TMP3,3 JMP RSSL1  ;AND DO IT AGAIN LDA 0,.UPBP  ;UNLESS YOU HAVE ALREADY JMP RSSL4  ;RETURN UNDEFINED FLAGS RSSL3: LDA 0,.PBP  ;RETURN EITHER PHASE.... DSZ TMP3,3 LDA 0,.BLBP  ; OR BLANK FLAGS STA 2,@IPTUF ISZ IPTUF RSSL4: SUB 1,1 STA 1,@IPTUF LDA 3,FOSP,3 STA 0,PRM0,3 FRET RSSL5: LDA 0,SYMTC  ;ENTRY SEARCH STA 0,TMP2,3 ;TMP2 = COUNT = TOTAL EL. COUNT LDA 0,FAC2,2 STA 0,TMP4,3 ;TMP4 = COPY OF CURRENT ELEMENT LDA 2,.SYM  ; POINTER RSSL6: LDA 0,TMP0,3 LDA 1,SYMW0,2 SUB 0,1,SZR JMP RSSL7 LDA 0,TMP1,3 LDA 1,SYMW1,2 SUB 0,1,SNR JMP RSSL8  ;MATCH MOVZR 1,1 MOVZR 1,1,SZR  ;REFERENCE? JMP RSSL7  ;NO STA 2,@IPTUF ISZ IPTUF  ;YES ENTER IN LIST RSSL7: INC 2,2  ;NO MATCH INC 2,2  ;BUMP ACr TO NEXT ELEMENT DSZ TMP2,3  ;CONTINUE JMP RSSL6  ;DONE - NO MATCH FOUND LDA 0,.BLBP  ;RETURN BLANK FLAGS JMP RSSL4 RSSL8: LDA 0,TMP4,3 SUB#I0,2,SNR JMP RSSLwI ;FALSE ALARM - FOUND ITSELF LDA 0,.MBP  ;RETURN "MULTIPLE" FLAGS JMP RSSL4 ; ; 3 STSYM: LDA 2,.CBP  ;AC2 POINTS`TO RRENT BLOCK LDA 0,RLBWC,2 ;AC0 = NEGATIVE WORD COUNT MOVS 0,0 LDA 1,RLBW1,2 MOVS 1,1  ;CHECK FOR ENTRY LDA 3,C37 AND# 3,1,SNR JMP STSL1  ;YES CHECK FOR DISPLACEMENT STSL0: LDA 1,RLBW0,2 ;STORE WORD 0 IN SYMBOL TABLE MOVS 1,1 STA 1,@SYMCE LDA 1,RLBW1,2 ;STORE WORD 1 IN SYMBOL TABLE MOVS 1,1 STA 1,@SYMCE DSZ SYMRC INCZR 2,2,SKP  ;BUMP AC2 BY 3 JSR @.E26  ;SYMBOL TAB MAX LENGTH EXCEEDED INCL 2,2 INCZR 0,0  ;INC THE WORD COUNT BY 3 INCL 0,0,SZR JMP STSL0  ; IF NONZERO - CONTINUE FRET   ; OTHERWISE RETURN EDFLG: 10000 ;IF EQUIVALENCE WORD HAS ZERO LEFT BYTE ;AND RELOCATABLE FLAG IS NOT SET ;SET DISPLACEMENT FLAG 20 IN SYMBOL WORD 2 STSL1: LDA 3,FSP LDA 1,.RLBRF ADD 2,1 STA 1,TMP0,3 ;RELOC. FLAG ADDRESS-1 JMP STSL6 STSL2: DSZ TMP1,3  ;DECREMENT FLAG COUNT JMP STSL4 STSL6: LDA 1,C5  ;RESET FLAG COUNT STA 1,TMP1,3 ISZ TMP0,3  ;NEXT FLAG WORD LDA 1,NRFLG  ;NORM. RELOC. FLAG 010 JMP STSL5 STSL4: LDA 1,TMP2,3 ;GET CURRENT FLAG MASK MOVZR 1,1 MOVZR 1,1 MOVZR 1,1 STSL5: STA 1,TMP2,3 ;SAVE FLAG MASK LDA 1,RLBEQ,2 ;EQUIVALENCE WORD LDA 3,ENMSK  ;NORMAL MASK AND# 1,3,SZR  ;NORMAL ENTRY? JMP STSL3  ;YES LEAVE SYMBOL ALONE LDA 3,FSP LDA 1,TMP2,3 ;FLAG MASK MOVS 1,1 LDA 3,@TMP0,3 ;RELOC. FLAG AND# 3,1,SZR  ;RELOC. NORMAL? JMP STSL3  ;YES,LEAVE SYMBOL ALONE LDA 1,RLBW1,2 ;NO,SET DISPLACEMENT LDA 3,EDFLG  ;ENTRY FLAG ADD 3,1  ;IN SYMBOL WORD 2 STA 1,RLBW1,2 ; STSL3: LDA 3,FSP INCZR 2,2 INCL 2,2  ;RAISE SYMBOL POINTER INCZR 0,0 INCL 0,0,SZR  ;DONE? JMP STSL2  ;NO, MORE TO DO LDA 2,.CBP  ;YES,RESTORE ENTRY LDA 0,RLBWC,2 ;POINTER,COUNT MOVS 0,0  ;AND GO TO JMP STSL0  ;STORE SYMBOLS .RLBRF:RLBRF-1 NRFLG: 40000 ;NORMAL RELOCATABLE FLAG 010 ENMSK: 177 ;NORMAL MASK(SWAPPED LEFT BYTE) ; ; 0 STLRC: LDA 0,ZRDWC  ;STORE ZREL WORD COUNT SYM. TAB STA 0,@SYMCE LDA 0,C5  ;STORE ZREL FLAGS IN SYM. TAB. STA 0,@SYMCE DSZ SYMRC  ;DECREMENT RUNNING ENTRY COUNT SUB 1,1,SKP JSR @.E26  ;TABLE LENGTH EXCEEDED!!! LDA 0,NRDWC  ;STORE NREL W. C. IN SYM. TAB STA 0,@SYMCE STA 1,NRDWC  ;ZERO NREL AND ZREL WORD COUNTS STA 1,ZRDWC LDA 0,ABDC  ;AC0 = ABS. DATA INDICATOR STA 1,ABDC  ;ZERO IT LDA 1,C2 STA 1,@SYMCE DSZ SYMRC  ;DEC THE RUNNING ENTRY COUNT JMP .+2 JSR @.E26  ;TABLE LENGTH EXCEEDED!!! STA 0,@SYMCE ;STORE ABS DATA INDICATOR LDA 0,C6 STA 0,@SYMCE ;STORE ABS. DATA FLAGS DSZ SYMRC  ;DECREMENT RUNNING ENTRY COUNT FRET   ;RETURN JSR @.E26  ;TABLE LENGTH EXCEEDED!!! ; ; 0 PDB: LDA 2,.CBP  ;AC2 = CURRENT BLOCK POINTER LDA 0,RLBDA,2 ;AC0 = DATA ADDRESS LDA 1,RLBWC,2 ;AC1 = NEGATIVE WORD COUNT MOVS 0,0 MOVS 1,1 ADC 1,0  ;AC0 = ENDING DATA ADDRESS LDA 1,RLBRF,2 +AC1 = RELOCATABLE DATA FLAGS MOVS 1,1 MOVL 1,1,SZC JMP ZRINC  ; => ZREL DATA MOVL 1,1,SZC J]P NRINC  ; => NREL DATA MOVL 1,1,SNC JSR @.E110  ;ILLEGAL DATA BLOCK???? LDA 1,RLBWC,2 INC 1,1,SZR ISZ ABDC  ; => ABSOLUTE DATA FRET ZRINC: MOVL 1,1,SZC JMP PDBL0 LDA 1,ZRDWC SUBZ 0,1,SNC STA 0,ZRDWC  ;STORE ZREL DATA WORD COUNT FRET PDBL0: MOVL 1,1,SZC  ; => EXTERNAL DISPLACEMENT JSR @.E110  ;ILLEGAL BLOCK TYPE???? FRET NRINC: LDA 1,NRDWC  ;STORE NREL DATA WORD COUNT SUBZ 0,1,SNC STA 0,NRDWC FRET ; ; ; WRITE SYMBOL ; ;  PRM0 - B.P. TO FLAGS ;  PRM1 - B.P. TO SYMBOL TYPE ;  .OBBP - B.P. TO ASCII SYMBOL ; ; 0 WRSYM: LDA 0,PRM0,2 ;OUTPUT FLAGS .SYSTM .WRL LFC JSR @.FERR LDA 0,PRM1,2 ;OUTPUT SYMBOL TYPE .SYSTM .WRL LFC JSR @.FERR LDA 0,.OBBP  ;OUTPUT SYMBOL .SYSTM .WRL LFC JSR @.FERR FRET .EOT ;END OF TAPE 2 OF 3 *U*U*U*UtzV