~~ I>~~~~~~~~ q~~a ~~a ; ; ; RADIX 50 TO ASCII ; ;  AC0 - B.P. TO RETURNED STRING ;  AC1 - POINTER TO RADIX 50 SYMBOL ; ;  RETURNS A 5 CHARACTER STRING, INCLUDING BLANKS ;  AND TERMINATED BY A CARRIAGE RETURN AT THE ;  PASSED B.P. ; ;  R50-WORD 1 ;   RIGHT SHIFT 5 BITS ;   DIVIDE BY 50 - ;    REMAINDER = B0 ;    QUOTIENT = B1 ;  R50-WORD 0 ;   DIVIDE BY 50 - ;    REMAINDER = B2 ;    QUOTIENT = (B4*50)+B3 ;   DIVIDE BY 50 ;    REMAINDER = B3 ;    QUOTIENT = B4 ; ; ; ; 3 CR50A: LDA 0,@FAC1,2 STA 0,TMP0,3 ;TMP0 = R50 SYMBOL, WORD 0 ISZ FAC1,2 LDA 1,@FAC1,2 ;AC1 = R50 SYMBOL, WORD 1 LDA 0,C5N  ;SHIFT OUT THE 5 FLAG BITS MOVZR 1,1 INC 0,0,SZR JMP .-2 LDA 0,.ITT STA 0,TMP1,3 ;TMP1 = POINTER TO THE ITT LDA 2,C50 FCALL DIVI STA 0,@TMP1,3 ;STORE B0 (FROM DGC, APPENDIX C, ISZ TMP1,3  ; 093-000017-01) STA 1,@TMP1,3 ;STORE B1 ISZ TMP1,3 LDA 1,TMP0,3 ;AC0 = R50 SYMBOL, WORD 0 FCALL DIVI STA 0,@TMP1,3 ;STORE B2 ISZ TMP1,3 FCALL DIVI STA 0,@TMP1,3 ;STORE B3 ISZ TMP1,3 STA 1,@TMP1,3 ;STORE B4 LDA 0,C5N STA 0,TMP0,3 ;TMP0 = CHARACTER COUNT LDA 2,FOSP,3 LDA 0,FAC0,2 STA 0,TMP2,3 ;TMP2 = B.P. TO RETURNED STRING CR5L0: LDA 0,.TRTBP LDA 1,@TMP1,3 ADD 1,0  ;TRANSLATE THE CURRENT BYTE TO A FCALL   ; CHARACTER LDBT LDA 0,TMP2,3 FCALL   ;STORE THE CHARACTER IN THE STBT   ; RETURNED STRING ISZ TMP2,3  ;INC THE B.P. DSZ TMP1,3  ;DEC ITT POINTER ISZ TMP0,3  ;INC THE CHAR. COUNT JMP CR5L0  ;GET NEXT CHAR. SUB 1,1  ;STORE A NULL INC 0,0  ; AT THE END OF STRING FCALL STBT FRET   ;RETURN ITT: .BLK 5  ;INTERMEDIATE TRANSLATE TABLE .ITT: ITT .TRTBP: TRTAB*2 .TXTM 1 TRTAB: .TXT / 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ./ ; ; ; DIVIDE ; ;  IN: ; ;   AC0,AC1 - DIVIDEND ;   AC2 - DIVISOR ; ;  OUT: ; ;   AC0 - REMAINDER ;   AC1 - QUOTIENT ;   AC2 - UNCHANGED ; ; -1 DIVI: SUB 0,0  ;CLEAR AC0 LDA 3,M20  ;16 ITERATIONS MOVZL 1,1  ;SHIFT LOW DIVIDEND LDA 2,FAC2,2 ;DIVISOR DIVI1: MOVL 0,0  ;SHIFT HIGH DIVIDEND SUB# 2,0,SZC  ;DIVISOR GO IN? SUB 2,0  ;YES MOVL 1,1  ;SHIFT LOW DIVIDEND INC 3,3,SZR  ;DONE? JMP DIVI1  ;NO LDA 2,FSP  ;YES - RESTORE, RETURN STA 0,FAC0,2 STA 1,FAC1,2 FQRET M20: -20 ; ; ; COPY UPDATE FILE ; ;  AC0 - BYTE POINTER TO FILE NAME ;  AC2 - POINTER TO THE UFL ENTRY ; ; 0 COPUF: DSZ .FLTYP  ;SET FILE TYPE U.F. STA 0,.IBBP  ; SUB 1,1  ;OPEN THE UPDATE FILE .SYSTM .OPEN UFC JSR @.FERR JSR SWAP  ;SAVE CURRENT AND NEXT BLOCKS LDA 0,.ICC  ;SET THE CURRENT INPUT TO THIS LDA 2,OPNC0 STA 2,.ICC  ; CHANNEL FCALL   ;ADVANCE IT TO THE FIRST BLOCK RDNLR JSR @.EA8  ;CAN'T BE AN END BLOCK FCALL   ;COPY TO THE OUTPUT FILE COPLR STA 0,.ICC  ;RESTORE THE INPUT CHANNEL .SYSTM .CLOSE CPU JSR @.FERR JSR SWAP STA 1,.FLTYP ;FILE TYPE L.R. FRET OPNC0: UFC ;SWAP BUFFER BLOCKS SWAP: LDA 0,.NBP LDA 1,.UNBP STA 0,.UNBP STA 1,.NBP LDA 0,.CBP LDA 1,.UCBP STA 0,.UCBP STA 1,.CBP SUB 1,1 JMP 0,3 ; ; ; UPDATE FILE SEARCH ; ;  AC0 - B.P. TO FILENAME (RETURNED) ;  AC1 - POINTER TO LRL ENTRY ;  AC2 - POINTER TO UFL ENTRY (RETURNED) ; ;  CONDITIONAL RETURNS ; ;   CALLING LOC. + 1 => NO MATCH ;   CALLING LOC. + 2 => MATCH ; ; 1 UFSER: LDA 0,IPTUC  ;STORE THE UFL ENTRY COUNT IN STA 0,TMP0,3 ; TMP0 LDA 2,.UFL  ;AC2 POINTS TO THE UFL UFSL0: LDA 0,UFLLP,2 SUB 1,0,SNR  ;CHECK FOR AN LRL POINTER MATCH JMP UFSL1  ; ....FOUND INC 2,2  ; ....NOT FOUND, CONTINUE THRU INC 2,2  ; THE LIST UNTIL COUNT DSZ TMP0,3  ; EXPIRES JMP UFSL0 FRET   ;RETURN - NO MATCH FOUND UFSL1: LDA 0,UFLBP,2 LDA 3,FOSP,3 ISZ FRTN,3  ;BUMP RETURN LOC. STA 0,FAC0,3 ;STORE B.P. IN CALLER'S AC0 STA 2,FAC2,3 ;STORE ENTRY POINTER IN CALLER'S FRET   ; AC2 ; ; ; ADVANCE LOGICAL RECORD ; ;  ASSUMES THAT CURRENT BLOCK IS A TITLE ;  BLOCK. READS INTO NOTHINGNESS EACH BLOCK ;  OF THE FILE THROUGH THE START BLOCK. ; ; 0 ADVLR: LDA 1,SBLK ADVL0: FCALL   ;READ BLOCKS UNTIL THE CURRENT RDRLB   ; BUFFER CONTAINS A START BLOCK LDA 0,@.CBP SUB# 1,0,SZR JMP ADVL0 FRET ; ; ; COPY LOGICAL RECORD ; ;  ASSUMES THE CURRENT BLOCK IS A TITLE ;  BLOCK AND TRANSFERS TO THE OUTPUT FILE, ;  EACH BLOCK THROUGH THE START BLOCK ; ; 0 COPLR: FCALL   ;WRITE CURRENT BLOCK WRRLB LDA 1,SBLK  ;AC1 CONTAINS START BLOCK CODE LDA 2,ISBLK  ;LOCAL SYMBOL COMPARAND COPL0: FCALL   ;READ A BLOCK RDRLB LDA 0,@.CBP  ;DELETE LOCAL SYMBOLS SUB# 0,2,SNR JMP COPL1 FCALL   ;WRITE WRRLB COPL1: SUB# 1,0,SZR  ;WAS IT A "START" JMP COPL0  ; ....NO FRET   ; ....YES, ALL DONE ; ; ; READ NEXT LOGICAL RECORD ; ;  CONDITIONAL RETURNS ; ;   CALLING LOC. + 1 => LIBRARY END BLOCK ;   CALLING LOC. + 2 => NEXT TITLE BLOCK ; ;  IF THE NEXT BLOCK READ IS NEITHER A "TITLE" ;  OR A "LIB-END" BLOCK, THIS ROUTINE TAKES AN ;  ERROR EXIT. 0 RDNLR: SUB 0,0  ;STORE A 0 IN THE FIRST BUFFER ISZ FRTN,2  ; WORD AND ASSUME SUCCESS STA 0,@.NBP LDA 0,.NBP MOVZL 0,0  ;AC0 = B.P. TO NEXT BLOCK SUBZL 1,1  ;AC1 = BYTE COUNT = 1 LDA 2,.ICC  ;AC2 = INPUT CHANNEL # RDNL0: .SYSTM   ;READ A BYTE .RDS CPU JSR @.FERR LDA 3,@.NBP  ; IF ZERO, KEEPS READING MOV 3,3,SNR JMP RDNL0 INC 0,0  ;THEN READ 3 MORE BYTES MOVOL 1,1 .SYSTM .RDS CPU JSR @.FERR LDA 0,@.NBP  ;CHECK FOR A TITLE BLOCK LDA 1,TBLK LDA 2,LEBLK SUB 0,1,SZR  ;FOUND - JMP RDNL1 FCALL   ;ADVANCE ONE BLOCK AND RETURN RDRLB FRET RDNL1: SUB 0,2,SZR  ;CHECK FOR AN END BLOCK JSR @.E110  ;NOT AN END BLOCK EITHER LDA 3,FOSP,3 ;TAKE THE EOF RETURN DSZ FRTN,3 FRET ; ; ; READ RELOCATABLE BLOCK ; ;  .CBP - CURRENT BUFFER POINTER ;  .NBP - NEXT BUFFER POINTER ;  .ICC - CURRENT CHANNEL # ; ;  THE NEXT SEQUENTIAL RELOCATABLE BLOCK IN ;  THE FILE IS READ, THE CHECK SUM IS VERIFIED, ;  AND THE CURRENT AND NEXT BUFFER POINTERS ARE ;  SWAPPED ; ; 0 RDRLB: LDA 2,.NBP  ;AC2 POINTS TO NEXT BUFFER LDA 0,RLBWC,2 ;LOAD THE POSITIVE BYTE COUNT MOVS 0,0 LDA 1,C5  ; INTO AC1 ADC 0,1 MOVZL 1,1 MOVZL 2,0  ;ADJUST AC2 INTO AC0 TO POINT TO LDA 2,C4  ; THE BEGINNING DATA BYTE ADD 2,0 LDA 2,.ICC  ;AC2 CONTAINS THE INPUT CHAN. # .SYSTM   ;READ IT .RDS CPU JSR @.FERR FCALL   ;VERIFY THE CHECKSUM VERCS LDA 0,@.NBP  ;AC0 CONTAINS THE CURRENT BLOCK LDA 1,SBLK  ;IS IT A START BLOCK? SUB 0,1,SNR  ; NO JMP RDRL1  ; YES - DON'T READ ANOTHER RDRL0: LDA 0,.CBP  ;READ THE NEXT TWO BYTES MOVZL 0,0 LDA 1,C2 .SYSTM .RDS CPU JSR @.FERR LDA 3,@.CBP  ;IF BLOCK IS FOUND.... MOV 3,3,SNR JMP RDRL0  ;IF NULLS...TRY AGAIN INC 0,0  ;READ THE WORD COUNT AS WELL INC 0,0 .SYSTM .RDS CPU JSR @.FERR RDRL1: LDA 0,.CBP LDA 1,.NBP STA 1,.CBP STA 0,.NBP FRET ; ; ; WRITE RELOCATABLE BLOCK ; ;  THE BLOCK RESIDING IN THE CURRENT BUFFER IS ;  WRITTEN TO THE OUTPUT FILE ; ; 0 WRRLB: LDA 3,.CBP  ;AC3 POINTS TO CURRENT BUFFER LDA 1,C7  ;LOAD POSITIVE BYTECOUNT INTO LDA 0,RLBWC,3 ; AC1 MOVS 0,0 ADCZL 0,1 MOVZL 3,0  ;AC0 = BYTE POINTER TO CURRENT LDA 2,.OCC  ;AC2 = OUTPUT CHANNEL CODE .SYSTM .WRS CPU  ;WRITE OUT THE BLOCK JSR @.FERR FRET ; ; ; VERIFY CHECK SUM ; ;  .CBP - POINTER TO THE CURRENT BLOCK ; ;  RETURN TO CALLING LOC. + 1 => THAT THE CHECK- ;  SUM IS VALID. OTHERWISE AN EXIT TO ;  "CSERR" IS TAKEN ; ; 2 VERCS: LDA 2,.NBP  ;AC2 POINTS TO NEXT BLOCK STA 2,TMP0,3 ;TMP0 POINTS TO NEXT BLOCK LDA 1,VERC0 LDA 0,RLBWC,2 MOVS 0,0 ADD 0,1 STA 1,TMP1,3 ;TMP1 CONTAINS NEGATIVE COUNT LDA 1,RLBCS,2 ;AC1 CONTAINS THE CHECKSUM SUB 0,0 STA 0,RLBCS,2 ;ZERO THE CHECKSUM WORD VERL0: LDA 2,@TMP0,3 ;SUM ALL BLOCK WORDS IN AC0 MOVS 2,2 ADD 2,0 ISZ TMP0,3 ISZ TMP1,3 JMP VERL0 MOVS 1,1 ADD 1,0,SZR  ;ADDED TO AC1 SHOULD YEILD ZERO JSR @.E105  ; OR ITS A CHECKSUM ERROR LDA 2,.NBP MOVS 1,1 STA 1,RLBCS,2 ;RESTORE THE CHECKSUM FRET   ;RETURN VERC0: -6  ;NEGATIVE RLB FIXED LENGTH ; ; ; READ/WRITE HEADER RECORD ; ;  READS THE LIBRARY START BLOCK ON THE INPUT ;  CHANNEL (IF IT EXISTS) AND WRITES ONE TO THE ;  OUTPUT CHANNEL (IF IT EXISTS) ; ; 0 RWHDR: LDA 2,.ICC  ;LOAD THE INPUT CHANNEL # MOV 2,2,SNR  ;IF ZERO, SKIP THE READ JMP RWHL1 LDA 0,.CBP  ;READ A BYTE MOVZL 0,0 SUB 1,1 STA 1,@.CBP INC 1,1 RWHL0: .SYSTM .RDS CPU JSR @.E110 LDA 3,@.CBP MOV 3,3,SNR  ;IS IT NONZERO? JMP RWHL0  ; ...NO - READ ANOTHER LDA 1,LSBLK  ; ...YES SUB 3,1,SZR  ;IS IT A "LIB-START" BLOCK? JMP RWHER  ; ...NO LDA 1,C13  ; ...YES INC 0,0 .SYSTM   ;READ THE REST OF THE BLOCK .RDS CPU JSR @.FERR RWHL1: LDA 0,.LSBL  ;NOW WRITE A "LIB-START" BLOCK LDA 1,C14 LDA 2,.OCC  ; TO THE OUTPUT CHANNEL MOV 2,2,SNR JMP RWHL2 .SYSTM .WRS CPU JSR @.FERR RWHL2: FRET   ; AND RETURN RWHER: LDA 0,.LBEBP JSR @.MESS LDA 0,.IBBP JSR @.MESS LDA 0,.CRBP JSR @.MESS JMP @.SYSRT .LBEBP: 2*LBEBP  ;ILLEGAL BLOCK IN INPUT LIBRARY .LSBL: LSBL*2 LSBL: 11*400  ;LIBRARY START BLOCK 0  ;(SWAPPED FOR OUTPUT) 0 0 0 -11*400+377 ; ; ; CLEANUP ; ; FSAV 1 CLNUP: LDA 2,.LRL  ;SEARCH FIRST FOR UNRESOLVED LDA 0,IPTLC  ; LOGICAL RECORDS MOV 0,0,SZR INC# 0,0,SNR JMP CLNL2  ;....UNLESS NONE WRERE SPECIFIED STA 0,TMP0,3 CLNL0: LDA 0,LRLW0,2 ;IF WORD 0 HAS BEEN ZEROED MOV 0,1,SNR JMP CLNL1  ;THEN THE SYMBOL WAS LOCATED LDA 0,.CAUM  ;IF NOT - JSR @.MESS  ; OUTPUT CAUTION MESSAGE MOV 1,0 JSR @.MESS LDA 0,.CRBP JSR @.MESS CLNL1: INC 2,2  ;KEEP LOOKING INC 2,2 DSZ TMP0,3 JMP CLNL0 CLNL2: LDA 0,.LEBL  ;OUTPUT A LIBRARY END BLOCK LDA 1,C14 LDA 2,.OCC MOV 2,2,SNR  ; UNLESS THERE'S NO OUT. MASTER FRET .SYSTM .WRS CPU JMP @.FERR  ;TAKE ERROR RETURN NOW FRET   ;NORMAL RETURN LEBL: 12*400  ;LIBRARY END BLOCK 0  ;(SWAPPED FOR OUTPUT) 0 0 0 -12*400+377 .CAUM: CAUM*2 ; ROUTINE TO CONVERT BINARY TO ASCII CHARACTERS ; INPUT: AC0 BYTE POINTER TO RETURNED STRING ; AC1 NUMBER TO BE CONVERTED ; ; OUTPUT: STRING OF THE FORM NNNNNN(NULL) ; WHERE N IS AN OCTAL DIGIT .NREL TMPX=FTSTR PEND1=TMP1-FTSTR+1 PEND1 .BASC: MOVZL 1,2 ;NUMBER LDA 1,C6 ;SIX STA 1,TMPX,3 ;LOOP CONTROL LDA 1,C30 ;SPECIAL FOR BIT 0 MOVL 1,1 ;MAKE ASCII CHAR. JMP .BST ;PUT OUT .BL1: LDA 1,C3 ;THREE STA 1,TMP1,3 ;LOOP CONTROL LDA 1,C6 ;SIX AGAIN MOVZL 2,2 ;SHIFT MOVL 1,1 ;SHIFT DSZ TMP1,3 ;LOOP JMP .-3  ;THREE TIMES .BST: FCALL  ;STORE BYTE STBT INC 0,0  ;BUMP POINTER DSZ TMPX,3 ;LOOP BACK JMP .BL1 ;SIX TIMES SUB 1,1  ;CLEAR FCALL  ;STORE NULL STBT LDA 2,FOSP,3 STA 0,FAC0,2 FRET  ;RETURN C30: 30 ; CHARACTER MOVE ROUTINE ; AC0 POINTS TO THE FROM STRING TERMINATED BY A NULL ; AC1 POINTS TO THE TO STRING AND IS UPDATED WHEN THE MOVE IS DONE ; THE TERMINATING NULL IS NOT MOVED. .NREL FP=FTSTR TP=FP+1 PEND=TP-FTSTR+1 PEND MOVE: STA 0,FP,3 STA 1,TP,3 FCALL LDBT LDA 0,TP,3 FCALL STBT MOV# 1,1,SNR JMP FIN ISZ FP,3 ISZ TP,3 LDA 0,FP,3 JMP MOVE+2 FIN: STA 0,FAC1,2 FRET ; ; BYTE ROUTINES ; .ZREL .LDBT: LDBT-2 .STBT: STBT-2 .GBYTE: GBYTE-2 .PBYTE: PBYTE-2 .NREL ; ; CHARACTER ROUTINES ; FSAV  ;LOAD A BYTE -1 LDBT: MOVZR 0,3 ;FORM CORE ADDRESS LDA 1,0,3 ;LOAD BYTE WORD MOV# 0,0,SNC ;LEFT OR RIGHT MOVS 1,1 ;LEFT LDA 0,C377 ;MASK AND 0,1  ;... STA 1,FAC1,2 FQRET FSAV  ;STORE A BYTE -1 STBT: LDA 2,C377 ;LOAD MASK AND 2,1  ;MASK CHAR INPUT MOVZR 0,3,SZC ;MAKE CORE ADDRESS MOVS 2,2 ;SWAP MASK LDA 0,0,3 ;LOAD BYTE WORD AND 2,0,SNC ;LEFT OR RIGHT MOVS 1,1 ;SWAP BYTE ADD 0,1  ;OR IN STA 1,0,3 ;SAVE FQRET C377: 377 FSAV 1 PBYTE: SUBZL 0,0 JSR@ .CPYARG LDA@ 0,TMP,3 JSR@ .STBT JMP BCOM FSAV 1 GBYTE: SUBZL 0,0 JSR@ .CPYARG LDA@ 0,TMP,3 JSR@ .LDBT STA 1,FAC1,2 BCOM: ISZ@ TMP,3 FRET ; ; ; DEFINE THE LFE TEXT, BUFFERS, AND TABLES ; ; ; TEXT .TXTM 1 CMFN: .TXT /COM.CM/ TTON: .TXT /$TTO/ LBEBP: .TXT/ILLEGAL BLOCK IN HEADER OF INPUT LIBRARY: / AE1M: .TXT /UPDATE FILE MATCHES INPUT MASTER: / AE2M: .TXT /UNEXPECTED ARGUMENT AT OR FOLLOWING : / AE3M: .TXT /INVALID SWITCH FOR: / AE4M: .TXT /ILLEGAL CHARACTER: / AE5M: .TXT /FILE DOES NOT EXIST, FILE: / AE6M: .TXT /NOT A LFE COMMAND: / AE8M: .TXT/ILLEGAL BLOCK IN UPDATE FILE: / AE9M: .TXT/ILLEGAL BLOCK IN LOGICAL RECORD: / AE10M: .TXT/SYMBOL TABLE OVERFLOW AT LOGICAL RECORD: / AE11M: .TXT/CHECKSUM ERROR IN LOGICAL RECORD: / AE12M: .TXT/CHECKSUM ERROR IN UPDATE FILE: / XSTM: .TXT/FILE ALREADY EXISTS: / NOOMF: .TXT/DEFAULT OUTPUT IN FILE- / CAUM: .TXT /LOGICAL RECORD NOT FOUND - / BLNK: .TXT / / TITL: .TXT /T / ZRM: .TXT /PAGE ZERO RELOCATABLE DATA = / CR: .TXT /<15>/ FF: .TXT /<14>/ NRM: .TXT /NORMAL RELOCATABLE DATA = / TZRLM: .TXT /TOTAL ZREL COUNT = / TNRLM: .TXT /TOTAL NREL COUNT = / ADM: .TXT /ABSOLUTE DATA DEFINED - POSSIBLE ERROR<15>/ HM: .TXT /- - - - - - - - - - - - - - - -<15>/ LB: .TXT /.LB/ RB: .TXT /.RB/ XD: .TXT /D / XN: .TXT /N / EN: .TXT /EN / ED: .TXT /ED / UPFL: .TXT /U / PFL: .TXT /P / MFL: .TXT /M / TAB: .TXT /<11>/ ; BUFFERS IB: .BLK 20 ;INPUT BUFFER OB: .BLK 40 ;OUTPUT BUFFER SB: .BLK 2 ;SWITCH BUFFER UCB: .BLK 25 ;CURRENT BLOCK FOR UPDATE FILE UNB: .BLK 25 ;NEXT BLOCK FOR UPDATE FILE CB: .BLK 25 ;CURRENT BLOCK NB: .BLK 25 ;NEXT BLOCK ;TABLES UFL: .BLK UFLEL*UFLEC LRL: .BLK LRLEL*LRLEC STRGS: .BLK 400  ;STRING STORAGE ESTR= STRGS+400 TTLE: .BLK 5 LFESS: .BLK 300  ;LFE STACK SEND= . .END INIT @ *U*U*U*U[=