A large commit.
[pdp8.git] / sw / os8 / v3d / sources / fortran / all / libra.pa
diff --git a/sw/os8/v3d/sources/fortran/all/libra.pa b/sw/os8/v3d/sources/fortran/all/libra.pa
new file mode 100644 (file)
index 0000000..aad1f39
--- /dev/null
@@ -0,0 +1,1424 @@
+/LIBRA: F4 LIBRARIAN, V24A
+/
+/
+/
+/
+/
+/
+/
+//
+/
+/
+/
+/
+/COPYRIGHT (C) 1974, 1975
+/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
+/
+/
+/
+/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
+/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
+/SION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE, OR ANT OTHER
+/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
+/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
+/AGREES TO THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
+/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
+/
+/
+/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
+/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
+/EQUIPMRNT COROPATION.
+/
+/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
+/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
+/
+/
+/
+/
+/
+/
+\f/LIBRA: FORTRAN IV LIBRARIAN
+/
+/
+/      BORN OF JUD LEONARD, UNDER THE
+/      SIGN FOR WHICH IT IS NAMED.
+/
+/
+/ CHANGES FOR V23
+/ .PRINT VERSION NUMBER
+/ .ACCEPT INPUT FROM CONSOLES WITHOUT PARITY
+/
+/
+/ CHANGES FOR OS/8 V3D BY PAULA TIRAK
+/ .CHANGED VERSION NUMBER TO 24A
+/ .PUT IN NEW DATE ALGORITHM
+/ .NO LONGER MISNAMES THE SECOND OUTPUT FILE
+/
+/
+/      OS/8 CONSTANTS:
+VERS=24
+PATCH="A
+/
+FETCH=1
+LOOKUP=2
+ENTER=3
+CLOSE=4
+DECODE=5
+CHAIN=6
+ERROR=7
+USRIN=10
+USROUT=11
+/
+OUTF1=7600     /LIBRARY
+OUTF2=7605     /CATALOG LISTING
+OUTF3=7612     /UNUSED
+INF=7617
+/
+EQHI=7642
+SWATOL=7643
+SWMTOX=7644
+SWYTO9=7645
+EQLO=7646
+DHRES=7647     /HANDLER RESIDENCY TABLE
+SYSDAT=7666    /SYSTEM DATE
+DCTLW=7760     /DEVICE CONTROL WORD TABLE
+/      DEVICE CONTROL WORDS HAVE THE FORM:
+/      BIT 0   FILE STRUCTURED
+/      BIT 1   READ ONLY
+/      BIT 2   WRITE ONLY
+/      BITS 3-8 DEVICE TYPE
+/      BITS 9-11 DIR BLOCK OF CURRENT TENTATIVE FILE
+/
+/      INTERNAL DEFINITIONS:
+F0=00
+F1=10
+CATBUF=2000    /IN FIELD 1
+CBUFS=1                /NUMBER OF BUFFERS FOR CATALOG
+MODBUF=2400    /LIKEWISE
+MBUFS=12       /BUFFERS FOR MODULE
+ODEVH=7200     /OUTPUT DEVICE HANDLER (ROOM FOR 2-PAGE)
+IDEVH=6600     /INPUT DEVICE HANDLER
+\f/
+/       PAGE 0 FOR LIBRA
+/
+        *1
+TMP1,   0
+TMP2,   0       /SOME TEMPS
+TMP3,   0
+TMP4,   0
+TMP5,   0
+TMP6,   0
+TMP7,   0
+X0,     0       /AUTO-INDEX
+X1,     0
+X2,     0
+X3,     0
+X4,     0
+X5,     0
+X6,     0
+X7,     0
+USR,    200     /CURRENT USR CALL ADDRESS
+                /LIBRA ASSUMES USR ALWAYS PRESENT
+LIBDVH, ODEVH   /ADDRESS OF LIBRARY DEVICE HANDLER
+LIBU,   1       /UNIT CONTAINING LIBRARY; INITIALLY SYS:
+CATLEN, 0       /LENGTH OF CATALOG
+CATBLK, 0       /CURRENT CATALOG BLOCK IN CORE
+LAVAIL, 0       /NEXT AVAILABLE LIBRARY BLOCK
+LIBNAM, TEXT    "FORLIBRL"
+       *.-1
+INFP,   INF     /CURRENT PLACE IN INPUT FILE LIST
+MODU,   0       /UNIT CONTAINING CURRENT MODULE
+MODDVH, IDEVH   /INPUT DEVICE HANDLER ADDRESS
+MODLEN, 0       /LENGTH OF THIS MODULE
+MODBLK, 0       /FIRST BLOCK OF MODULE
+INLSW,  0       /NON-ZERO IF IN LIBRARY INPUT
+INFST,  0       /FIRST BLOCK OF INPUT FILE
+INBLK,  0       /NEXT INPUT BLOCK NUMBER
+THSBLK, 0       /READIN CONTROL
+FULFLG,        0       /-1 IF CAT FULL
+\fENAM1,        0
+ENAM2, 0       /HOLDER FOR ESD NAMES
+ENAM3, 0
+       0       /TEXT STOPPER FOR ENAME
+ESDCTR,        0
+PCAT,  CATBUF  /POINTER TO CURRENT CATALOG BLOCK
+INCLUD,        -1      /SW FOR NAME INCLUDED IN CATALOG
+CHANGD,        1       /0 IF CAT BLOCK MODIFIED
+PMOD,  MODBUF  /POINTER TO CURRENT MODULE BLOCK
+/
+TTFLAG,        0       /NON-ZERO WHEN TTY HAS INITIALIZED
+PCHR,  TTO     /OUTPUT ROUTINE
+TTPOS, 0       /TTY POSITION COUNTER
+CATCNT,        0
+IOERR, 0
+       7421    /ERROR CODE TO MQ
+       JMP I   .+1
+       IOMES   /LOG THE ERROR
+\f/     LIBRA MAIN CONTROL
+/
+       *177            /MAKES IT EASY TO CALL START
+START, CDF     F0
+       JMS     TTWAIT  /ALLOW TTY TO COMPLETE
+       CIF     F1
+       JMS I   USR
+       DECODE
+TXTRL, 2214            /RL DEFAULT EXT
+       TAD     (INF    /RESET INPUT FILE POINTER
+       DCA     INFP
+       TAD     (TTO    /AND IO DEVICE
+       DCA     PCHR
+       DCA     FULFLG
+       CDF     F1
+       TAD I   (OUTF1
+       SNA             /NEW LIBRARY SPECIFIED?
+       JMP     LASTLB  /NO, USE LAST ONE
+       DCA     LIBU    /GET LIBRARY UNIT
+       TAD     (OUTF1
+       DCA     X0
+       TAD I   X0
+       DCA     LIBNAM  /MOVE
+       TAD I   X0      /IN
+       DCA     LIBNAM+1 /NEW
+       TAD I   X0      /NAME
+       DCA     LIBNAM+2
+       TAD I   X0
+       SNA
+       TAD     TXTRL   /IF NO EXT, FORCE .RL
+       DCA     LIBNAM+3
+LASTLB,        TAD     LIBU    /REGET UNIT
+       AND     (17
+       TAD     (DCTLW-1        /ADDRESS DEV CTL TABLE
+       DCA     TMP1
+       TAD I   TMP1
+       CDF     F0
+       SMA CLA         /IS DEVICE FILE-STRUCTURED?
+       JMP     NOTFS   /NO, BOMB
+       TAD     (ODEVH!1
+       DCA     OHADDR  /ALLOW 2-PAGE HANDLER
+       TAD     LIBU
+       AND     (17
+       CIF     F1
+       JMS I   USR     /GET THE HANDLER
+       FETCH
+OHADDR,        ODEVH!1
+       JMS     IOERR   /YOU'RE KIDDING
+       TAD     OHADDR  /NOW THE REAL ADDRESS
+       DCA     LIBDVH
+       JMP     ZTEST
+\fNOTFS,        JMS     TTOTXT
+       FLSTR-1
+       JMS     CRLF
+       JMP     START
+/
+IOMES, CLA
+       TAD     (TTO
+       DCA     PCHR    /ENSURE IT COMES OUT ON TTY
+       JMS     TTOTXT
+       IOMSG-1
+       JMS     CRLF
+       JMP     START
+       PAGE
+\fZTEST,        CDF     F1      /FIND OR CREATE LIB.
+       TAD I   (SWYTO9 /GET SWITCH WORD
+       AND     (2000   /TEST FOR /Z
+       CDF     F0
+       SZA CLA
+       JMP     NEWLIB  /YES, ENTER NEW ONE
+OLDLIB,        JMS     FNDLIB  /LOOKUP THE LIBRARY
+       LOOKUP
+       JMP     NEWLIB  /COULDN'T FIND IT
+/
+       TAD     LIBBLK  /FIRST BLOCK OF LIBRARY
+       DCA     ZCATB
+       TAD     (CBUFS+MBUFS^200!F1
+       DCA     ZCATC   /READ ALL YOU CAN
+       JMS     ZCAT    /DO THE READ
+       CDF     F1
+       TAD I   (CATBUF /LOOK AT CONTROL WORD
+       CLL RAR
+       SZA CLA         /IS IT A LIBRARY?
+       JMP     NOTLIB  /NO, ERROR
+       TAD I   (CATBUF+3
+       CDF     F0
+       DCA     CATLEN  /LENGTH IN BLOCKS
+       TAD     LIBBLK
+       DCA     LAVAIL  /WILL BE UPDATED DURING SCAN
+       TAD     LAVAIL
+       DCA     CATBLK  /CURRENT BLOCK IN BUFFER
+       TAD     CATLEN
+       CIA
+       DCA     TMP2    /COUNTER
+CSLOOP,        TAD     (CBUFS+MBUFS
+       TAD     TMP2
+       SMA             /WILL THE REST FIT IN BUFFER?
+       JMP     CSLAST  /YES
+       DCA     TMP2
+       TAD     (-CBUFS-MBUFS^100
+       DCA     TMP1    /ENTRIES NOW IN CORE
+       JMS     SCAT    /SCAN CATALOG
+       TAD     ZCATB   /NEXT BLOCK WE'LL READ
+       DCA     CATBLK
+       JMS     ZCAT    /READ SOME
+       JMP     CSLOOP
+\fCSLAST,       CIA             /NO OF BLOCKS WE DON'T NEED
+       TAD     (CBUFS+MBUFS
+       JMS     R6L     /NO OF ENTRIES WE CAN LOOK AT
+       CIA
+       DCA     TMP1
+       JMS     SCAT    /LOOK FOR END
+FULCAT,        JMS     TTOTXT  /RAN OFF THE END
+       CATFUL-1
+       JMS     CRLF    /**
+       JMP     LCLOSE
+/
+SCAT,  0
+       TAD     (CATBUF-1
+       DCA     X0
+SCLOOP,        CDF     F1
+       TAD I   X0
+       CMA             /TEST FOR END
+       SNA CLA
+       JMP     GETINF  /THAT'S IT
+       ISZ     X0
+       ISZ     X0      /IGNORE REST OF NAME
+       TAD I   X0      /GET LENGTH
+       TAD     LAVAIL  /ADD TO ST BLOCK OF FREE AREA
+       DCA     LAVAIL
+       ISZ     TMP1
+       JMP     SCLOOP
+       CDF     F0
+       JMP I   SCAT    /GO FOR NEXT BUFFER LOAD
+/
+NOTLIB,        JMS     PRLBNM  /PRINT LIBRARY NAME
+       JMS     TTOTXT
+       UNLIB-1
+       JMS     CRLF
+       JMP     START
+       PAGE
+\fNEWLIB,       JMS     FNDLIB
+       ENTER
+       JMS     IOERR
+       TAD     LIBU
+       AND     (7760
+       CLL RTR
+       RTR
+       SNA             /DID HE GIVE A LENGTH?
+       STL RTL         /NO, USE 2
+       DCA     CATLEN
+       CDF     F1
+       TAD I   (EQLO   /HOW MANY EXTRA BLOCKS WANTED
+       CDF     F0
+       TAD     CATLEN  /PLUS CATALOG REQUIREMENT
+       CLL
+       TAD     LIBLEN  /MINUS AVAILABLE LENGTH
+       SZL CLA         /CHECK FOR ENUF ROOM
+       JMP     LSZERR  /NO ROOM, GIVE MESSAGE
+/
+/      WRITE EMPTY CATALOG
+/
+       TAD     (CATBUF-1
+       DCA     X0
+       TAD     (-MBUFS-CBUFS^400
+       DCA     TMP1
+       CDF     F1
+       DCA I   X0
+       ISZ     TMP1
+       JMP     .-2
+       TAD     (CATBUF-1       /RESET FOR LATER USE
+       DCA     X0
+       CLA CMA
+       TAD     CATLEN
+       SPA SNA         /MORE THAN ONE?
+       JMP     CATB0   /JUST ONE
+       CIA
+       ISZ     ZCATB   /START WITH SECOND CAT BLOCK
+ZCLOOP,        CLL
+       TAD     (MBUFS+CBUFS
+       DCA     TMP1
+       SZL             /FULL WRITE?
+       TAD     TMP1    /NO
+       CIA
+       TAD     (MBUFS+CBUFS
+       JMS     R6R
+       TAD     (4000!F1
+       DCA     ZCATC   /SET CONTROL
+       JMS     ZCAT
+       TAD     TMP1
+       SPA
+       JMP     ZCLOOP  /MORE TO GO
+CATB0, CDF     F1
+       CLA IAC         /1 IS LIBRARY CODE
+       DCA I   X0
+       TAD     (VERS
+       DCA I   X0      /MARK LIBRA VERSION #
+       TAD     LIBLEN  /JUST A GUESS
+       CIA
+       DCA I   X0
+       TAD     CATLEN
+       DCA I   X0
+       CLA CMA         /END OF CAT INDICATOR
+       DCA I   X0      /MARKS FIRST AVAIL SLOT
+       CDF     F0
+       DCA     CHANGD  /FORCE A WRITE ON THIS ONE
+       TAD     ZCATB
+       DCA     LAVAIL
+       TAD     LIBBLK  /LIBRARY START BLOCK
+       DCA     CATBLK  /IS CURRENTLY IN BUFFER
+       JMP     GETINF  /BEGIN
+/
+ZCAT,  0
+       CDF     F0
+       JMS     CCHK    /LOOKOUT FOR CONTROL C
+       JMS I   LIBDVH
+ZCATC, F1
+       CATBUF
+ZCATB, 0
+       JMS     IOERR
+       TAD     ZCATC
+       JMS     R6L
+       AND     (17
+       TAD     ZCATB
+       DCA     ZCATB
+       ISZ     CHANGD  /SET UNMODIFIED SW
+       JMP I   ZCAT
+       JMP     .-2
+/
+FNDLIB,        0
+       TAD I   FNDLIB
+       DCA     USRCOD
+       ISZ     FNDLIB
+       TAD     (LIBNAM
+       DCA     LIBBLK
+       TAD     LIBU
+       AND     (17
+       CIF     F1
+       JMS I   USR
+USRCOD,        0
+LIBBLK,        LIBNAM
+LIBLEN,        0               /NEG, REMEMBER
+       JMP I   FNDLIB  /COULD'T DO IT
+       TAD     LIBBLK  /FIRST BLOCK
+       DCA     ZCATB   /OF CATALOG
+       ISZ     FNDLIB
+       JMP I   FNDLIB
+LSZERR,        JMS     TTOTXT
+       SMALL-1
+       JMS     CRLF
+       JMP     START   /GO FOR MORE
+       PAGE
+\f/
+/      SETUP POINTERS AND THINGS FOR NEXT INPUT MODULE
+/
+GETINF,        CLA CMA
+       DCA     INCLUD  /SET NO-NAME-INCLUDED SW
+       TAD     INLSW   /ARE WE GETTING INPUT FROM A LIBR?
+       SZA CLA
+       JMP     INLIB   /YES-GET NEXT MODULE THEREIN
+NXTINF,        CDF     F1
+       TAD I   INFP    /UNIT AND LEN OF NEXT IN FILE
+       SZA             /IS THERE ONE?
+       JMP     FTCHIN  /YES
+       TAD I   (SWATOL
+       AND     (1000   /TEST FOR /C
+       CDF     F0
+       SNA CLA
+       JMP     LCLOSE  /NO MORE
+       JMS     SAVRES  /PRESERVE DEV HANDLER RESIDENCY
+       JMS     TTWAIT  /FINISH ANY TYPING
+       CIF     F1
+       JMS I   USR     /NEW LINE CONTINUES OLD
+       DECODE
+       2214            /RL DEFAULT EXT
+       0               /DO NOT DELETE TENTATIVE FILES
+       JMS     RSTRES  /RESTORE RESIDENCY TABLE
+       TAD     (INF
+       DCA     INFP    /RESET INPUT FILE POINTER
+       JMP     NXTINF  /TRY AGAIN
+\fFTCHIN, DCA     MODU    /UNIT CONTAINING INPUT MOD
+        ISZ     INFP
+        TAD I   INFP
+        DCA     INFST   /START OF INPUT FILE
+        ISZ     INFP
+        TAD     INFST
+        DCA     MODBLK  /IN THIS CASE, FILE=MODULE
+        TAD     MODU
+        AND     (7760
+        CIA
+        CLL RTR
+        RTR
+        DCA     MODLEN
+        TAD     (IDEVH!1
+        DCA     INDVH   /TENTATIVE HANDLER ADDR
+        CDF     F0
+        TAD     MODU
+        AND     (17
+        CIF     F1
+        JMS I   USR
+        FETCH
+INDVH,  IDEVH!1         /TENTATIVE INPUT HANDLER ADDR
+        JMS     IOERR   /DON'T GIVE ME THAT
+        TAD     INDVH
+        DCA     MODDVH  /DEVICE HANDLER ADDRESS
+        DCA     THSBLK  /FORCE READIN TO READ
+LUKMOD, TAD     MODBLK  /FIRST BLOCK OF MODULE
+        DCA     INBLK   /INITIALIZE READIN
+        JMS     READIN  /GET FIRST BLOCK
+        CDF     F1
+        CLA CMA         /-1
+        TAD I   PMOD    /LOOK AT IDENTIFIER
+        CDF     F0
+        SNA
+        JMP     GOTLIB  /ITS A LIBRARY
+        CLL RTR
+        SZA CLA         /IS IT A MODULE
+        JMP     BADINF  /BAD INPUT
+        TAD     LIBBLK  /MAKE SURE
+       CIA
+        TAD     LIBLEN  /THAT MODULE
+        TAD     LAVAIL  /FITS IN LIBRARY
+        CLL
+       SNA             /CHECK FOR TOO LONG HERE TOO**
+       JMP     OVFLO   /IT IS TOO LONG
+        TAD     MODLEN
+        SNL CLA
+        JMP     NXTEBK  /GO GETTUM
+OVFLO,  JMS     TTOTXT
+        TOOBIG-1
+       JMS     CRLF
+        JMP     GETINF
+\fBADINF,       JMS     TTOTXT
+       NOTMOD-1
+       JMS     CRLF
+       JMP     GETINF
+/
+GOTLIB,        TAD     MODLEN
+       SNA CLA
+       JMP     LB2BIG          /CAN'T DO A LOOKUP IF G. T. 255
+       ISZ     INLSW   /SET IN-LIBRARY SWITCH
+       JMP     INLIB
+LB2BIG,        JMS     TTOTXT
+       L2BMSG-1
+       JMS     CRLF
+       JMP     START
+       PAGE
+\f/     GET NEXT MODULE FROM LIBRARY
+/
+INLIB, TAD     INFST   /START OF INPUT FILE
+       DCA     INBLK   /IS WHAT WE WANT
+       JMS     READIN  /BRING CATALOG INTO MODULE BUFFER
+       TAD     (3
+       TAD     PMOD
+       DCA     TMP1
+       CDF     F1
+       TAD I   TMP1    /GET CATALOG LEN
+       CIA
+       DCA     TMP1    /HOLD COUNTER IN CASE OF FULL CATALOG
+       TAD     INFST
+       DCA     INBLK   /WE WANT THE SAME ONE AGAIN
+       TAD     INFST
+       DCA     TMP3    /INIT ACCUMULATED MODULE START BLOCK
+       DCA     MODLEN  /INITAIL MOD LEN IS ZERO
+INLSC1,        JMS     READIN  /GET CATALOG BLOCK
+       TAD     (-100
+       DCA     TMP2    /COUNT ENTRIES IN CAT BLOCK
+INLSC2,        CDF     F1
+       TAD I   PMOD    /LOOK FOR END-OF-CATALOG WORD
+       CMA
+       SNA CLA
+       JMP     NDLSC   /END OF SCAN
+       TAD     (3
+       TAD     PMOD    /POINT TO LENGTH
+       DCA     TMP5
+       TAD I   TMP5
+       SNA CLA         /FIRST ENTRY FOR A MODULE?
+       JMP     NOLEN   /NO, DO NOT UPDATE
+       TAD     MODLEN
+       TAD     TMP3    /UPDATE MODULE STARTING BLOCK
+       DCA     TMP3
+       TAD I   TMP5    /GET THIS LENGTH
+       DCA     MODLEN  /FOR THIS MODULE
+NOLEN, TAD     MODBLK  /COMPARE LAST MODULE STARTING BLOCK
+       CMA CLL
+       TAD     TMP3    /TO ACCUMULATED START BLOCK
+       SNL CLA         /INTERESTING?
+       JMP     NOTYET  /NO
+       TAD I   PMOD    /YES; WAS NAME DELETED?
+       SZA CLA
+       JMP     GLMOD   /NO, WE'VE GOT A GOOD MODULE
+NOTYET,        TAD     (4
+       TAD     PMOD    /POINT TO NEXT NAME
+       DCA     PMOD
+       ISZ     TMP2    /END OF CAT BLOCK?
+       JMP     INLSC2  /NO
+       ISZ     TMP1    /YES; END OF CATALOG?
+       JMP     INLSC1  /NO, GET NEW BLOCK
+NDLSC, DCA     INLSW   /YES, NO LONGER IN A LIBRARY
+       JMP     NXTINF  /GET ANOTHER FILE
+\fGLMOD,        TAD     TMP3    /GET STARTING BLOCK
+       DCA     MODBLK  /OF MODULE
+       JMP     LUKMOD  /AND GO GET THE MODULE
+L2BMSG,        TEXT    "INPUT LIBRARY TOO BIG";0
+       PAGE
+\f/       PROCESS LOOP FOR ONE MODULE
+/
+NXTEBK, TAD     (3
+        TAD     PMOD    /ADDR OF FIRST ESD-1
+        DCA     X0      /RESET POINTER TO NAMES
+        TAD     (-52    /PER BLOCK COUNT
+        DCA     ESDCTR
+ESDLUP, CDF     F1
+        TAD I   X0
+        DCA     ENAM1
+        TAD I   X0
+        DCA     ENAM2
+        TAD I   X0
+        DCA     ENAM3
+        TAD I   X0      /TYPE CODE
+        CDF     F0
+       TAD     (ESDTAB /DISPATCH FROM TBL
+       DCA     TMP1
+       JMP I   TMP1
+ESDTAB,        JMP     ESDEND  /0=END OF ESD TABLE
+       JMP     DUPLUK  /1=ENTRY=LOOK FOR
+                       /DUPLICATE NAME
+       JMP     ESDLND  /2=EXTERN=IGNORE NAME
+       JMP     ESDLND  /3=FORT COMMON=IGNORE
+       JMP     DUPLUK  /4=PROG SECTION
+       HLT             /5=MUL ENTRY=DOESN'T
+                       /EXIST
+       HLT             /6=MUL SECTION=DITTO
+       JMP     DUPLUK  /7=SECT8
+       JMP     ESDLND  /10=COMMZ
+       JMP     DUPLUK  /11=FIELD1
+\f/
+/       LOOK FOR DUPLICATION OF THIS ESD SYMBOL
+/
+DUPLUK,        TAD     CATLEN
+       CIA
+       DCA     TMP1    /COUNT LENGTH OF CAT
+        TAD     CATBLK
+        CIA
+        TAD     LIBBLK  /ARE WE AT FIRST BLOCK?
+        SZA CLA
+        JMS     CHGCHK  /CHECK FOR BLOCK MODIFIED
+        TAD     LIBBLK
+        DCA     NXTCAT  /SETUP FOR FIRST BLOCK OF CAT
+       TAD CATLEN
+       CIA
+       DCA CATCNT
+GETCB, JMS     GCATB   /GET IT
+       TAD     (CATBUF-1
+       DCA     X1
+       TAD     (-100   /COUNT ENTRIES/BLOCK
+       DCA     TMP2
+       CDF     F1
+CBSRCH,        TAD I   X1      /LOOK AT NAME
+       CMA
+       SNA
+       JMP     CHKI    /END OF CATALOG-LOOK FOR /I
+       IAC             /COMPLETE THE CIA
+       TAD     ENAM1   /COMPARE
+       SZA CLA
+       JMP     NOMTCH
+       TAD I   X1
+       CIA
+       TAD     ENAM2
+       SZA CLA
+       JMP     NOMTCH
+       TAD I   X1      /LAST CHANCE
+       CIA
+       TAD     ENAM3
+       SNA CLA
+       JMP     GOTMAT  /EQUAL!
+NOMTCH,        TAD     X1
+       AND     (-4
+       TAD     (3      /BUMP TO NEXT
+       DCA     X1
+       ISZ     TMP2
+       JMP     CBSRCH
+       JMS     CHGCHK  /CHECK FOR MODIFIED BLOCK
+       ISZ     TMP1    /END OF CATALOG?
+       JMP     GETCB   /NO, GET NEXT
+       JMS     TTOTXT
+       CATFUL-1
+       JMS     CRLF
+       CLA CMA
+       DCA     FULFLG
+       JMP     ESDEND  /PUT THAT, IF POSSIBLE
+\fGOTMAT,       CDF     F0
+       JMS     TTOTXT
+       ENAM1-1         /PRINT THE NAME
+       JMS     TTOTXT
+       NDUP-1          /WHICH TO KEEP?
+       CDF     F1
+       TAD I   (SWATOL
+       CDF     F0
+       AND     (10     /TEST /I
+       SNA CLA
+       JMP     CHKR    /NO, LOOK FOR /R
+GMASK, JMS     TTOTXT
+       KEEP-1
+       JMS     WAITOP
+       JMP     ESDLND  /DEFAULT TO THE OLD ONE
+       TAD     (-"O
+       SNA
+       JMP     ESDLND  /KEEP OLD
+       IAC             /IS IT "N"?
+       SZA CLA
+       JMP     GMASK   /TRY AGAIN
+       JMP     DELTO   /DELETE THE OLD
+       PAGE
+\fCHKR,   JMS     CRLF
+        CDF     F1
+        TAD I   (SWMTOX
+        AND     (100    /TEST /R
+        SNA CLA
+        JMP     ESDLND  /DEFAULT:KEEP THE OLD ONE
+DELTO,  CDF     F1
+        TAD     X1
+        AND     (-4
+        CIA
+        CMA             /BACK UP POINTER
+        DCA     X1
+        DCA I   X1      /CLEAR
+        DCA I   X1      /OLD
+        DCA I   X1      /NAME
+        ISZ     X1      /SKIP OVER LENGTH
+        DCA     CHANGD  /BLOCK HAS BEEN MODIFIED
+        JMP     NXTE    /ENTER AT END OF LOOP
+NDSCN, CDF     F1
+        TAD I   X1      /LOOK AT NEXT
+        CMA
+        SNA CLA
+        JMP     ENDCAT  /NOW WE'RE THERE
+       TAD     X1
+       TAD     (3      /BUMP TO NEXT NAME
+       DCA     X1
+NXTE,   ISZ     TMP2
+        JMP     NDSCN
+        JMS     CHGCHK  /LOOK OUT FOR CHANGES
+       ISZ CATCNT      /END OF CAT ?
+       SKP
+       JMP FULCAT      /NO MORE PUSSY
+        JMS     GCATB
+        TAD     (CATBUF-1
+        DCA     X1
+        TAD     (-100
+        DCA     TMP2
+        JMP     NDSCN
+\fCHKI, TAD I   (SWATOL /LOOK AT /I SW
+       AND     (10
+       SNA CLA
+       JMP     ENDCAT  /NOT SET
+       JMS     TTOTXT
+       ENAM1-1         /TYPE ESD NAME
+       JMS     TTOTXT
+       NCLUD-1         /INCLUDE IT?
+IANS,  JMS     WAITOP
+       JMP     ENDCAT  /DEFAULT TO INCLUDE
+       TAD     (-"Y
+       SNA
+       JMP     ENDCAT  /YES, INCLUDE
+       TAD     ("Y-"N
+       SZA CLA         /IS IT "N"?
+       JMP     IANS    /NO, TRY AGAIN
+       JMP     ESDLND
+ENDCAT,        TAD     X1      /POINT TO EMPTY SLOT
+       AND     (-4
+       CIA
+       CMA
+       DCA     X1
+       JMP     INSERT
+       PAGE
+\f/     THIS ESD GOES IN THE CATALOG
+/
+INSERT,        CDF     F1
+       TAD     ENAM1   /MOVE
+       DCA I   X1      /NAME
+       TAD     ENAM2   /TO
+       DCA I   X1      /LIBRARY
+       TAD     ENAM3   /CATALOG
+       DCA I   X1
+       ISZ     INCLUD  /IS THIS THE FIRST?
+       SKP
+       TAD     MODLEN  /YES, GET THE LENGTH
+       DCA I   X1      /AND STORE 4TH WORD
+       DCA     CHANGD  /SET CAT MODIFIED SW
+       CLA IAC
+       TAD     X1      /CHECK FOR END OF BLOCK
+       AND     (377
+       SZA CLA
+       JMP     MARKND  /NO, MARK END OF CAT
+       JMS     CHGCHK  /WRITE THIS BLOCK
+       CDF     F1
+       TAD     (-400
+       DCA     TMP1    /SET COUNT FOR BLOCK LEN
+       TAD     (CATBUF-1
+       DCA     X1      /SET POINTER
+       CLA CMA
+       DCA I   X1
+       ISZ     TMP1
+       JMP     .-2     /CLEAR THE BLOCK
+       DCA     CHANGD
+       ISZ     CATBLK
+       JMP     ESDLND
+MARKND,        CLA CMA
+       DCA I   X1      /MARK NEW END OF CAT
+ESDLND,        CDF     F0
+       CLA STL RTL     /TWO TO SKIP VALUE
+       TAD     X0
+       DCA     X0
+       ISZ     ESDCTR  /DONE WITH BLOCK?
+       JMP     ESDLUP  /NO, GET NEXT
+       JMS     READIN  /GET NEXT BLOK
+       JMP     NXTEBK  /RESET POINTERS AND CONTINUE
+ESDEND,        ISZ     INCLUD  /CHECK FOR ANY NAMES OUT
+       JMP     CPYMOD  /YES, COPY MODULE INTO LIBRARY
+       JMS     TTOTXT  /SORRY, DIDN'T MAKE IT
+       NONEIN-1
+       JMS     CRLF
+       ISZ     FULFLG
+       JMP     GETINF  /TRY NEXT
+       JMP     LCLOSE
+\fCPYMOD,       TAD     MODBLK  /GET IN FILE STRT BLOCK
+       DCA     INBLK
+       TAD     MODLEN
+       CIA
+       DCA     TMP1
+       TAD     LAVAIL  /FIRST AVAILABLE BLOCK
+       DCA     NXTOBK
+CPYLUP,        JMS     READIN  /READ BLOCK OF INPUT
+       TAD     PMOD
+       DCA     PNXTOB
+       JMS I   LIBDVH  /CALL OUTPUT HANDLER
+       4200!F1
+PNXTOB,        MODBUF
+NXTOBK,        0               /NEXT OUTPUT BLOCK NUMBER
+       JMS     IOERR
+       ISZ     NXTOBK  /BUMP BLOCK NUMBER
+       ISZ     TMP1    /CHECK LENGH
+       JMP     CPYLUP
+       TAD     NXTOBK
+       DCA     LAVAIL  /UPDATE AVAILABLE POINTER
+       JMP     GETINF  /GO FOR NEXT
+       PAGE
+\fCHGCHK,       0
+       CDF     F0      /PRECAUTION
+       TAD     CHANGD  /HAS BLOCK BEEN MODIFIED?
+       SZA CLA
+       JMP I   CHGCHK  /NO, NOTHING TO DO
+       TAD     CATBLK
+       DCA     ZCATB   /WRITE THE BLOCK
+       TAD     (4200!F1
+       DCA     ZCATC
+       JMS     ZCAT
+       JMP I   CHGCHK  /OK
+/
+/
+GCATB, 0
+       CDF     F0
+       TAD     NXTCAT
+       CIA
+       TAD     CATBLK  /IS IT IN CORE?
+       SNA CLA
+       JMP     SOEZ    /YES, ITS EZ
+       TAD     NXTCAT
+       CIA
+       TAD     LIBBLK
+       TAD     CATLEN
+       SPA SNA CLA     /CHECK FOR INTERNAL ERROR
+       JMP     FULCAT  /**
+       TAD     NXTCAT
+       DCA     ZCATB
+       TAD     (200!F1 /SET FOR READ
+       DCA     ZCATC
+       JMS     ZCAT
+       TAD     NXTCAT  /NEXT BLOCK
+       DCA     CATBLK  /IS IN CORE
+SOEZ,  ISZ     NXTCAT
+       JMP I   GCATB
+NXTCAT,        0
+       PAGE
+\fLCLOSE,       JMS     CHGCHK
+       TAD     USRCOD
+       TAD     (-ENTER /DID WE ENTER A NEW FILE?
+       SZA CLA
+       JMP     CATLST  /NO, GO LIST CATALOG
+       TAD     LIBBLK  /GET LEN
+       CIA
+       CDF     F1
+       TAD I   (EQLO   /GET USER EXTENSION REQUEST
+       CDF     F0
+       TAD     LAVAIL  /PLUS CURRENT END
+       DCA     TMP1
+       TAD     TMP1
+       CLL
+       TAD     LIBLEN  /CHECK FOR POSSIBLE
+       SNL CLA
+       JMP     .+4
+       TAD     LIBLEN  /CAN'T GIVE ALL HE WANTS
+       CIA
+       SKP
+       TAD     TMP1
+       DCA     LCLEN   /SET CLOSE LENGTH
+       TAD     CATLEN
+       CMA
+       TAD     LCLEN   /COMPARE CAT LEN TO LIB LEN
+       SPA SNA CLA
+       JMP     NOLIB   /THERE'S NO POINT
+       TAD     LIBBLK  /GET FIRST BLOCK
+       DCA     NXTCAT
+       JMS     GCATB
+       CDF     F1
+       TAD     LCLEN   /ACTUAL LIBRARY LENGTH
+       DCA I   (CATBUF+2
+       CDF     F0
+       DCA     CHANGD
+       JMS     CHGCHK  /WRITE IT
+       TAD     LIBU
+       AND     (17
+       CIF     F1
+       JMS I   USR
+       CLOSE
+       LIBNAM
+LCLEN, 0
+       JMS     IOERR
+       JMP     CATLST  /GO LIST THE CATALOG
+/
+NOLIB, JMS     TTOTXT
+       WHYCLS-1
+       JMS     CRLF
+       JMP     START
+       PAGE
+\f/     LIST THE CATALOG
+/
+CATLST,        JMS     OOPEN   /OPEN LISTING FILE
+       JMP     START   /NONE DESIRED
+       TAD     (OCHAR  /SETUP FOR DEVICE-INDEPENDENT
+       DCA     PCHR    /OUTPUT
+       TAD     (214    /AT TOP OF PAGE
+       JMS I   PCHR
+       JMS     CRLF
+       JMS TTOTXT
+       LBV-1
+       JMS     TTOTXT
+       CATOF-1
+       JMS     PRLBNM  /PRINT THE NAME
+       CDF     F1
+       TAD I   (SYSDAT
+       CDF     F0
+       SNA
+       JMP     NODATE  /DON'T KNOW THE DATE
+       DCA     TMP1
+       JMS     TTOTXT
+       ON-1
+       CLA                     /THE FOLLOWING CODE GETS THE DAY
+       DCA     TMP2
+       TAD     TMP1            /GET THE DATE
+       RTR                     /ROTATE THREE RIGHT AND MASK
+       RAR                     /TO GET THE DAY IN OCTAL
+       AND     (37
+       JMS     MAK8BT          /MAKE IT 8-BIT AND PRINT
+       DCA     TMP2
+       TAD     TMP1            /GET THE DATE BACK
+       AND     (7400           /MASK TO GET THE MONTH BITS
+       JMS     R6R             /MONTH*4 (IN OCTAL)
+       DCA     TMP2            /PUT IN TEMP. VARIABLE TO SAVE IT
+       TAD     TMP2            /GET IT BACK
+\f      RTR                     /MONTH
+       TAD     TMP2
+       TAD     (MONTHS-6
+       DCA     .+2             /ADDRESS OF MONTH FROM TABLE
+       JMS     TTOTXT          /PUT IT IN THE TEXT LINE
+       0
+       TAD     TMP1            /GET THE DATE---TO FIND THE YEAR
+       AND     (7              /MASK TO GET THE YEAR OFFSET BITS
+       DCA     TMP4            /SAVE THEM
+       DCA     TMP2
+       TAD I   (7777           /GET THE DATE EXTENSION BITS
+       AND     (600
+       CLL RTR                 /ROTATE TO GET THEM INTO BIT
+       RTR                     /POSITIONS 7 AND 8
+       TAD     (106            /ADD 70(ORIGINAL BASE YEAR)
+       TAD     TMP4            /ADD IN THE YEAR OFFSET BITS
+       JMS     MAK8BT          /MAKE 8-BIT AND PRINT
+NODATE,        JMS     CRLF
+       JMP     PRCAT   /TITLE IS DONE, PRINT CAT
+MAK8BT, 0                      /ROUTINE TO CONVERT TO 8-BIT AND PRINT
+       CLL                     /FIRST CONVERT TO DECIMAL
+CONVYR, TAD    (-12            /KEEP SUBTRACTING 12
+       SPA                     /HAVE THE YEAR
+       JMP     GETDG1
+       ISZ     TMP2            /HOLDS THE FIRST DIGIT OF YEAR
+       JMP     CONVYR
+GETDG1, TAD    (12             /GET THE SECOND DIGIT
+       DCA     TMP3            /SAVE IT
+       TAD     TMP2            /GET THE FIRST DIGIT
+       SNA                     /FIRST DIGIT IS A ZERO
+       JMP     PRDIG2          /PRINT THE SECOND DIGIT
+       TAD     (260            /MAKE FIRST DIGIT OF YEAR 8-BIT
+       JMS I   PCHR            /PRINT IT
+PRDIG2, TAD    TMP3            /GET THE SECOND DIGIT
+       TAD     (260            /MAKE SECOND DIGIT OF YEAR 8-BIT
+       JMS I   PCHR            /PRINT IT
+       JMP I   MAK8BT          /RETURN
+       PAGE
+\f/     LIST ALL ENTRIES IN THE CATALOG
+/
+PRCAT, TAD     CATLEN
+       CIA
+       DCA     TMP1
+       TAD     LIBBLK
+       DCA     NXTCAT
+       CLA CMA
+       DCA     TMP3    /SET LINE COUNTER
+CATLUP,        JMS     GCATB
+       TAD     (CATBUF-1
+       DCA     X0
+       TAD     (-100
+       DCA     TMP2
+CATLP2,        CDF     F1
+       TAD I   X0      /GET FIRST WORD OF NAME
+       SNA
+       JMP     EMPTY   /NOT AN ESD NAME
+       CMA
+       SNA
+       JMP     NDCATL  /END OF CATALOG
+       CMA             /RESTORE FIRST WORD
+       JMS     TTO2    /PRINT
+       JMP     NDNAM   /A SHORT NAME
+       CDF     F1
+       TAD I   X0
+       JMS     TTO2
+       JMP     NDNAM
+       CDF     F1
+       TAD I   X0
+       JMS     TTO2
+       NOP
+NDNAM, ISZ     TMP3    /MORE ROOM ON THIS LINE?
+       JMP     SAMLIN  /SURE
+       JMS     CRLF
+       TAD     (-10    /SETUP FOR 8 PER LINE
+       DCA     TMP3
+       JMP     EMPTY
+SAMLIN,        JMS     TAB     /SPACE OVER TO NEXT NAME
+EMPTY, TAD     X0
+       AND     (-4
+       TAD     (3
+       DCA     X0      /POINT TO NEXT
+       ISZ     TMP2
+       JMP     CATLP2  /GO FOR NEXT
+       ISZ     TMP1    /MORE BLOCKS?
+       JMP     CATLUP  /YES
+       JMS     CRLF
+       JMS     TTOTXT
+       CATFUL-1
+NDCATL,        JMS     CRLF
+       TAD     (214    /EJECT PAGE
+       JMS I   PCHR
+       JMS     OCLOSE  /CLOSE THE FILE
+       JMP     START
+       PAGE
+\f/     USEFUL OUTPUT THINGS
+/
+TTO,   0
+       DCA     TTOCHR
+       JMS     TTWAIT
+       TAD     (200
+       KRS
+       TAD     (-217   /CRTL/O CHECK
+       SNA CLA
+       KSF
+       SKP
+       JMP I   TTO
+       TAD     TTOCHR
+       TLS
+       DCA     TTFLAG
+       JMP I   TTO
+TTOCHR,        0
+TTWAIT,        0
+       TAD     TTFLAG
+       SNA CLA
+       JMP I   TTWAIT
+       JMS     CCHK    /BEWARE OF CTRL/C
+       TSF
+       JMP     .-2     /WAIT TILL DONE
+       DCA     TTFLAG  /CLEAR BUSY FLAG
+       JMP I   TTWAIT
+CCHK,  0
+       KSF
+       JMP I   CCHK    /NOTHING TO WORRY ABOUT
+       TAD     (200
+       KRS
+       TAD     (-203
+       SNA CLA         /WAS IT CONTROL C?
+       JMP I   (7600   /YES
+       JMP I   CCHK
+TTO2,  0
+       DCA     TMP7
+       TAD     TMP7
+       JMS     R6R
+       JMS     TTO2A
+       TAD     TMP7
+       JMS     TTO2A
+       ISZ     TTO2
+       JMP I   TTO2
+TTO2A, 0
+       AND     (77
+       SNA
+       JMP I   TTO2
+       TAD     (-40
+       SPA
+       TAD     (100
+       TAD     (240
+       JMS I   PCHR
+       ISZ     TTPOS   /BUMP POSITION COUNT
+       JMP I   TTO2A
+\fR6R,  0
+       CLL RTR
+       RTR
+       RTR
+       JMP I   R6R
+R6L,   0
+       CLL RTL
+       RTL
+       RTL
+       JMP I   R6L
+TTOTXT,        0
+       CDF     F0
+       TAD I   TTOTXT
+       DCA     X7
+       ISZ     TTOTXT  /BUMP PAST POINTER
+       TAD I   X7
+       JMS     TTO2
+       JMP I   TTOTXT
+       JMP     .-3
+CRLF,  0
+       DCA     TTPOS   /RESET POSITION
+       TAD     (215
+       JMS I   PCHR
+       TAD     (212
+       JMS I   PCHR
+       JMP I   CRLF
+TAB,   0               /PSEUDO-TAB GENERATOR
+       TAD     (240
+       JMS I   PCHR
+       ISZ     TTPOS
+       TAD     TTPOS
+       AND     (7
+       SNA CLA         /IS POSITION A MULTIPLE OF 8
+       JMP I   TAB
+       JMP     TAB+1   /NO, TRY MORE
+       PAGE
+\fWAITOP,       0
+       TAD     (277    /QUESTION
+       JMS     TTO
+       DCA     RETCHR
+WREP,  JMS     TTI     /WAIT FOR REPLY
+       TAD     (-215
+       SNA
+       JMP     DFALT
+       TAD     (215-240        /PRINTING?
+       SPA
+       JMP     WREP    /NO, TRY AGIAN
+       TAD     (240
+       DCA     RETCHR
+       TAD     RETCHR
+ECHO,  JMS     TTO
+       JMS     TTI
+       TAD     (-215
+       SNA
+       JMP     GOTREP
+       TAD     (215-377        /LOOKOUT FOR RUBOUT!
+       SNA
+       JMP     RUBOUT
+       TAD     (377
+       JMP     ECHO
+RUBOUT,        JMS     CRLF
+       JMP     WAITOP+1
+GOTREP,        ISZ     WAITOP  /GOT A REAL ANSWER
+DFALT, JMS     CRLF
+       TAD     RETCHR
+       JMP I   WAITOP
+RETCHR,        0
+/
+TTI,   0
+       KSF             /WAIT FOR A KEY
+       JMP     .-1
+       KRB
+       AND     (177    /TAKE CARE OF PARITY
+       TAD     (-3     /CTRL C?
+       SNA
+       JMP I   (7600   /YES
+       TAD     (203    /GET ORGINIAL CHAR BACK
+       JMP I   TTI
+PAGE
+\f/
+/      INPUT BUFFERRER AND STUFF
+/
+READIN,        0
+       CDF     F0
+       TAD     INBLK
+       TAD     THSBLK  /-FIRST BLOCK FOLLOWING BUFFER CONTENTS
+       CLL
+       TAD     (MBUFS
+       SNL             /IS IT IN CORE?
+       JMP     MUSTRD  /NO, WE HAVE TO DO A READ
+       CLL RTR
+       RTR
+       RAR             /TIMES 400
+SETP,  TAD     (MODBUF /PLUSS BUFFER ADDR
+       DCA     PMOD    /POINTS TO BLOCK
+       ISZ     INBLK   /READY FOR NEXT
+       JMP I   READIN
+MUSTRD,        CLA             /THIS ONE'S HARDER
+       TAD     INBLK
+       DCA     RDBLK
+       TAD     INBLK
+       TAD     (MBUFS
+       CIA
+       DCA     THSBLK
+       JMS I   MODDVH
+       MBUFS^200!F1
+       MODBUF
+RDBLK, 0
+       JMS     IOERR
+       JMP     SETP    /OK
+\f/     ROUTINES TO SAVE AND RESTORE
+/      DEVICE HANDLER RESIDENCY TABLE
+/
+SAVRES,        0
+       TAD     (DHRES-1
+       DCA     X0
+       TAD     (SVRES-1
+       DCA     X1
+       JMS     MOVRES
+       JMP I   SAVRES
+RSTRES,        0
+       TAD     (SVRES-1
+       DCA     X0
+       TAD     (DHRES-1
+       DCA     X1
+       JMS     MOVRES
+       JMP I   RSTRES
+MOVRES,        0
+       TAD     (-17
+       DCA     TMP1
+       CDF     F1
+       TAD I   X0
+       DCA I   X1
+       ISZ     TMP1
+       JMP     .-3
+       CDF     F0
+       JMP I   MOVRES
+SVRES=7400
+\f/     PRINT THE LIBRARY NAME
+/
+PRLBNM,        0
+       TAD     LIBNAM
+       JMS     TTO2    /FIRST 2 CHARS
+       JMP     PREXT
+       TAD     LIBNAM+1
+       JMS     TTO2
+       JMP     PREXT
+       TAD     LIBNAM+2
+       JMS     TTO2
+       NOP
+PREXT, TAD     (".
+       JMS I   PCHR
+       TAD     LIBNAM+3
+       JMS     TTO2
+       JMP I   PRLBNM
+       JMP I   PRLBNM
+       PAGE
+\f/     OUTPUT HANDLERS STOLEN FROM PIP
+OUFLD=F1
+OUCTL=MBUFS^200!4000!F1
+OUBUF=MODBUF
+/
+/      INITIALIZE FOR OUTPUT
+/
+OUSETP,        0
+       TAD     (OUCTL&3700     /BUFFER SIZE IN DBL WORDS
+       CIA             /NEGATE IT (PAL10 BLOWS)
+       DCA     OUDWCT
+       TAD     (OUBUF
+       DCA     OUPTR   /INITIALIZE WORD POINTER
+       TAD     OUJMPE
+       DCA     OUJMP   /INITIALIZE 3-WAY CHARACTER SWITCH
+       JMP I   OUSETP
+/
+/      STORE CHARACTERS IN OUTPUT BUFFER
+/      IN PS8 FORMAT (YOU KNOW, 3 CHARS
+/      IN 2 WORDS THE WRONG WAY)
+/
+OCHAR, 0
+       AND     (377
+       DCA     OUTEMP
+       CDF     OUFLD   /SET DATA FIELD TO BUFFER'S FIELD
+       ISZ     OUJMP   /BUMP THE CHARACTER SWITCH
+OUJMP, HLT             /THREE WAY CHARACTER SWITCH
+       JMP     OCHAR1
+       JMP     OCHAR2
+       TAD     OUTEMP
+       CLL RTL
+       RTL
+       AND     (7400
+       TAD I   OUPOLD
+       DCA I   OUPOLD  /UPDATE FIRST WORD OF TWO WITH HIGH
+                       /ORDER 4 BITS OF THIRD CHAR
+       TAD     OUTEMP
+       CLL RTR
+       RTR
+       RAR
+       AND     (7400
+       TAD I   OUPTR
+       DCA I   OUPTR   /UPDATE 2ND WORD FROM LO 4 BITS
+       TAD     OUJMPE
+       DCA     OUJMP   /RESET SWITCH
+       ISZ     OUPTR
+       ISZ     OUDWCT  /BUMP COUNTER EVERY 3 CHARS
+       JMP     OUCOMN
+       TAD     (OUCTL  /LOAD CONTROL WORD FOR A FULL WRITE
+       JMS I   (OUTDMP /DUMP THE BUFFER
+       JMS     OUSETP  /RE-INITIALIZE THE POINTERS
+       JMP     OUCOMN
+OCHAR2,        TAD     OUPTR
+       DCA     OUPOLD  /SAVE POINTER TO FIRST WORD OF TWO
+       ISZ     OUPTR   /BUMP WORD POINTER TO SECOND WORD
+OCHAR1,        TAD     OUTEMP
+       DCA I   OUPTR
+OUCOMN,        CDF     F0
+       JMP I   OCHAR
+OUTEMP,        0
+OUPOLD,        0
+OUPTR, 0
+OUJMPE,        JMP     OUJMP
+OUDWCT,        0
+/
+/      MOVE OUTPUT FILE NAME TO FIELD 0
+/
+OFNAME,        0
+       TAD     (OUTF2
+       DCA     X0      /NAME OF CAT LIST FILE
+       CDF     F1
+       TAD I   X0
+       DCA     OUFNAM  /FIRST 2 CHARS
+       TAD I   X0
+       DCA     OUFNAM+1
+       TAD I   X0
+       DCA     OUFNAM+2
+       TAD I   X0
+       SNA
+       TAD     TXTCA   /DEFAULT CAT EXT
+       DCA     OUFNAM+3
+       CDF     F0      /RESTORE FIELD
+       JMP I   OFNAME
+OUFNAM,        ZBLOCK  4
+TXTCA, 301
+       PAGE
+\fOOPEN,        0
+       CDF     F1
+       TAD I   (OUTF2  /GET DEVICE CODE, LEN
+       DCA     OUELEN  /HOLD IT A MO
+       JMS I   (OFNAME /GET FILE NAME INTO FIELD 0
+       TAD     OUELEN  /CHECK FOR NULL FILE
+       SNA CLA
+       JMP I   OOPEN   /NOTHING TO OPEN
+       TAD     OUNAME  /RESET ENTER CALL
+       DCA     OUBLK
+       TAD     (IDEVH!1
+       DCA     OUHNDL
+       TAD     OUELEN  /THE UNIT
+       CIF     F1
+       JMS I   USR
+       FETCH           /ASSIGN, FETCH HANDLER
+OUHNDL,        0               /OUTPUT DEVICE HANDLER ENTRY
+       JMS     IOERR           /HUH?
+       TAD     OUELEN  /UNIT AGAIN
+       CIF     F1
+       JMS I   USR
+       ENTER           /ENTER OUTPUT FILE
+OUBLK, OUFNAM          /REPLACED WITH STARTING BLOCK
+OUELEN,        0               /REPLACED WITH LENGTH OF HOLE
+       JMS     IOERR   /YOU BLEW IT!!!
+       DCA     OUCCNT
+       JMS I   (OUSETP
+       ISZ     OOPEN
+       JMP I   OOPEN
+\fOUTDMP,       0
+       DCA     OUCTLW  /STORE THE CONTROL WORD
+       TAD     OUCCNT
+       SNA
+       ISZ     OUCTLW
+       TAD     OUBLK
+       DCA     OUREC   /COMPUTE STARTING BLOCK
+       TAD     OUCTLW
+       JMS     R6L
+       AND     (17     /COMPUTE THE NUMBER OF RECORDS
+       TAD     OUCCNT  /UPDATE SIZE OF FILE
+       DCA     OUCCNT
+       TAD     OUCCNT
+       CLL CML
+       TAD     OUELEN
+       SNL SZA CLA     /EXCEED GIVEN LENGTH ?
+       JMS     IOERR   /YES - ERROR
+       CDF     F0
+       JMS I   OUHNDL
+OUCTLW,        0
+       OUBUF
+OUREC, 0
+       JMS     IOERR
+       JMP I   OUTDMP
+\fOCLOSE,       0
+       TAD     (232    /OUTPUT A CTRL/Z
+       JMS I   PCHR
+FILLLP,        JMS I   PCHR
+       TAD     (77
+       AND I   (OUDWCT
+       SZA CLA         /UP TO THE BOUNDARY YET?
+       JMP     FILLLP  /NO - FILL WITH ZEROS
+       TAD I   (OUDWCT /GET DOUBLEWORD COUNT LEFT
+       TAD     (OUCTL&3700
+       SNA             /A FULL WRITE LEFT?
+       JMP     NODUMP  /YES DON'T DO IT
+       TAD     (4000!OUFLD /PUT IN FIELD AND WRITE BITS
+       JMS     OUTDMP
+NODUMP,        CIF CDF F1
+       TAD I   (OUTF2
+       CDF     F0
+       JMS I   USR
+       CLOSE           /CLOSE THE OUTPUT FILE
+OUNAME,        OUFNAM          /POINTER TO OUTPUT FILE NAME
+OUCCNT,        0
+       JMS     IOERR   /ERROR WHILE CLOSING - BAD!!
+       JMP I   OCLOSE  /ALL DONE
+       PAGE
+\f/     MESSAGES
+/
+LBV,   TEXT    "LIBRA V "
+*.-1
+VMESG, VERS&70^7+VERS+6060
+       PATCH&77^100+40
+       4000
+NONEIN,        TEXT    "MODULE NOT INCLUDED";0
+FLSTR, TEXT    "LIBRARY MUST BE ON A FILE-STRUCTURED DEVICE";0
+SMALL, TEXT    "INSUFFICIENT SPACE FOR LIBRARY";0
+NOTMOD,        TEXT    "INPUT NOT A MODULE";0
+TOOBIG,        TEXT    "INPUT TOO BIG FOR LIBRARY";0
+UNLIB, TEXT    " IS NOT A LIBRARY";0
+NDUP,  TEXT    " IS DUPLICATE NAME";0
+KEEP,  TEXT    "; KEEP OLD OR NEW";0
+CATFUL,        TEXT    "CATALOG IS FULL";0
+NCLUD, TEXT    ": INCLUDE";0
+WHYCLS,        TEXT    "LIBRARY TOO SMALL FOR USE; START OVER";0
+IOMSG, TEXT    "I/O ERROR";0
+CATOF, TEXT    "CATALOG OF ";0
+ON,    TEXT    " ON ";0
+CS197, TEXT    ", 197";0
+MONTHS, TEXT    "-JAN-@@@@@-FEB-@@@@@-MAR-@@@@"
+       TEXT    "-APR-@@@@@-MAY-@@@@@-JUN-@@@@"
+       TEXT    "-JUL-@@@@@-AUG-@@@@@-SEP-@@@@"
+       TEXT    "-OCT-@@@@@-NOV-@@@@@-DEC-@@@@"
+       $
+\f