software: Added more and more
[pdp8.git] / sw / f4 / FRTSRC / rts.pa
diff --git a/sw/f4/FRTSRC/rts.pa b/sw/f4/FRTSRC/rts.pa
new file mode 100644 (file)
index 0000000..7fd43cf
--- /dev/null
@@ -0,0 +1,3789 @@
+/FORTRAN IV RUNTIME SYSTEM, V5A
+/
+/
+/
+/
+/
+/
+/
+//
+/
+/
+/
+/
+/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/FORTRAN 4 RUNTIME SYSTEM - R.LARY
+/AND NOW WITH DOUBLE PRECISION! - MKH
+/RTS-8 SUPPORT ADDED 5/20/74 - RL
+/LAST EDITED 5/19/74
+
+XVERSN=5               /UPDATE WITH EVERY RELEASE!
+XPATCH="A              /PATCH LEVEL A
+
+/NOTES TO MAINTAINERS:
+
+/THIS PROGRAM IS DESIGNED TO SUPPORT MANY DIFFERENT HARDWARE
+/CONFIGURATIONS IN A MINIMAL AMOUNT OF SPACE.  IT ACHIEVES THIS GOAL
+/BY "TAILORING" ITSELF AT INITIALIZATION TIME
+/BASED ON A SURVEY OF ITS HARDWARE/SOFTWARE ENVIRONMENT.  THIS MAKES
+/THIS PROGRAM DIFFICULT TO MODIFY UNLESS THE MODIFYING PROGRAMMER
+/KNOWS WHAT IS GOING ON.  IT IS THEREFORE SUGGESTED THAT YOU READ THIS
+/LISTING THOROUGHLY AND UNDERSTAND THE MAJOR ROUTINES BEFORE
+/MAKING EVEN "TRIVIAL" CHANGES.
+
+/ALL SYMBOLS BEGINNING WITH THE LETTER "Q" ARE ENTRIES IN THE
+/HEADER BLOCK OF THE LOADER-IMAGE (.LD) FILE.
+
+/ALL SYMBOLS BEGINNING WITH THE LETTER "Y" DENOTE THE BEGINNING OF
+/A BLOCK OF CODE WHICH WILL BE REPLACED BY DIFFERENT CODE IF FRTS
+/IS RUNNING IN THE BACKGROUND UNDER RTS-8.  THE REPLACEMENT CODE
+/CAN BE FOUND IN THE TABLE "BKRLST".
+
+/ALL SYMBOLS BEGINNING WITH THE LETTER "V" ARE DEFINED IN THE LOADER
+/SYMBOL TABLE AND CANNOT BE MOVED WITHOUT CHANGING THE LOADER. ONLY
+/A VERY FEW OF THESE SYMBOLS OCCUR IN PLACES OTHER THAN
+/PAGE 200 OR THE FIRST LOCATION OF OTHER PAGES.
+
+/CODE WHICH CONTAINS THE CHARACTER SEQUENCE "*K*" IN THE COMMENT FIELD
+/IS PARTICULARLY SUBTLE/OBSCURE (THE "K" IS FOR "KLUDGE").  THE REST OF THE
+/COMMENT SHOULD INDICATE WHAT IS GOING ON.
+/
+/
+/ FIXES FOR V4 J.K.    1975
+/
+/ .SCALE FACTOR PRINTED BY P FORMAT OPERATOR
+/ .FRTS /P
+/ .RK8E HANDLER TO RUN WITH INTERRUPTS ON
+/ .SLASH AT END OF FORMAT STATEMENT
+/
+/
+/      CHANGES FOR OS/78 AND OS/8 V3D BY P.T.
+/      .CHANGED THE VERSION NUMBER TO 5A
+/      .FIXED THE FIELD OVERFLOW PROBLEM
+/      .FIXED THE "K=K+1" PROBLEM
+\f/DEFINITIONS:
+
+AC7775=        STA CLL RTL
+AC7776=        STA CLL RAL
+AC4000=        CLA STL RAR
+AC3777=        STA CLL RAR
+AC2000=        CLA STL RTR
+AC0002=        CLA STL RTL
+
+/DEFINITIONS OF KE-8/E INSTRUCTIONS
+
+MQL=   7421
+MQA=   7501
+CAM=   CLA MQL
+SWP=   MQA MQL
+SWAB=  7431
+SCA=   7441
+MUY=   7405
+DVI=   7407
+NMI=   7411
+SHL=   7413
+ASR=   7415
+LSR=   7417
+ACS=   7403
+SAM=   7457
+DAD=   7443
+DLD=   7663
+DST=   7445
+DPIC=  7573
+DCM=   7575
+DPSZ=  7451
+SGT=   6006
+
+/DEFINITIONS OF FPP IOT'S
+
+FPINT= 6551
+FPICL= 6552
+FPCOM= 6553
+FPHLT= 6554
+FPST=  6555
+FPRST= 6556
+\f/FPP OPCODES:
+
+FLDA=  0000
+FADD=  1000
+FSUB=  2000
+FDIV=  3000
+FMUL=  4000
+FADDM= 5000
+FSTA=  6000
+FMULM= 7000
+               LONG=   400     /TWO-WORD ADDRESSING
+               BASE=   200     /BASEPAGE ADDRESSING
+               IND=    600     /INDIRECT ADDRESSING
+
+FEXIT= 0000
+FNORM= 0004
+STARTF=        0005
+STARTD=        0006
+JAC=   0007
+XTA=   0030
+STARTE=        0050
+LDX=   0100
+
+JA=    1030
+JNE=   1040
+TRAP3= 3000
+
+/OS8 EQUIVALENCES:
+
+OS8SWS=        7643
+OSJSWD=        7746
+OS8DVT=        7647
+OS8DCB=        7760
+OS8DAT=        7666
+
+/VARIOUS OTHER IOT'S:
+
+LSF=   6661
+LCF=   6662
+LSE=   6663
+LIE=   6665
+LLS=   6666
+LIF=   6667
+\f/PAGE ZERO FOR FORTRAN IV RTS
+
+       *0              /INTERRUPT STUFF
+       0
+       JMP I   .+1
+       INTRPT
+LPGET, LPBUFR          /LINE PRINTER RING BUFFER FETCH POINTER
+TOCHR, 0               /TELETYPE STATUS WORD
+KBDCHR,        0               /KEYBOARD INPUT CHARACTER
+POCHR, 0               /P.T. PUNCH COMPLETION FLAG
+RDRCHR,        0               /P.T. READER STATUS
+FMTPXR,        0               /XR USED TO INDEX FORMAT PARENTHESIS ARRAY
+INXR,  INBUFR-1        /XR USED TO GET CHARS FROM INPUT LINE
+XR,    0
+XR1,   0
+
+*16
+VEOFSW,        0               /USED BY "EOFCHK" TO STORE VARIABLE ADDRESS
+       0               /*K* MUST BE IN AUTO - XR
+T,     0               /TEMPORARY
+DFLG,  0               /0 = F.P., 1 = D.P.
+INST,  0               /CURRENT INSTRUCTION WORD
+
+/IOH PAGE ZERO LOCATIONS
+
+RWFLAG,        0               /READ/WRITE FLAG
+FMTTYP,        0               /TYPE OF CONVERSION BEING DONE
+EOLSW, 0               /EOL SW ON INPUT - CHAR POS ON OUTPUT
+N,     0               /REPEAT FACTOR
+W,     0               /FIELD WIDTH
+D,     0               /NUMBER OF PLACES AFTER DECIMAL POINT
+
+DATCDF,        0               /SUBROUTINE TO CHANGE DATA FIELD
+DATAF, 0               /CONTAINS VARIOUS CDF'S
+       JMP I   DATCDF  /RETURN
+
+ERR,   ERROR           /POINTER TO ERROR ROUTINE
+FATAL, 0               /FATAL ERROR FLAG - 0=FATAL
+MCDF,  MAKCDF
+
+/FPP PARAMETER TABLE LOCATIONS:
+
+APT,   0               /VARIOUS FIELD BITS FOR FPP
+PC,    DPTEST          /FPP PROGRAM COUNTER
+XRBASE,        0               /FPP INDEX REGISTER ARRAY ADDRESS
+BASADR,        0               /FPP BASE PAGE ADDRESS
+ADR,   0               /ADDRESS TEMPORARY
+ACX,   0
+ACH,   0               /*** FLOATING ACCUMULATOR ***
+ACL,   0
+EAC1,  0
+EAC2,  0               /** FOR EXTENDED PRECISION OPTION **
+EAC3,  0
+\f/FLOATING POINT PACKAGE LOCATIONS
+
+AC0,   0
+AC1,   0               /FLOATING AC OVERFLOW WORD
+AC2,   0               /OPERAND OVFLOW WORD
+OPX,   0
+OPH,   0               /*** FLOATING OPERAND REGISTER ***
+OPL,   0
+
+/RTS I/O CONVERSION SYSTEM LOCATIONS
+
+FMTBYT,        0               /FORMAT BYTE POINTER
+IFLG,  0               /I FOEMAT FLAG
+GFLG,  0               /G FORMAT FLAG
+EFLG,  0               /E FORMAT FLAG - SOMETIMES ON FOR G FMT
+OD,    0
+SCALE, 0
+PFACT, 0               /P-SCALE FACTOR
+PFACTX,        0               /TEMP FOR PFACT
+ACI,   0               /INTEGERIZED FAC FROM "FFIX" SUBR
+CHCH,  0
+FMTNUM,        0               /CONTAINS ACCUMULATED NUMERIC VALUE
+CTCINH,        0               /^C INHIBIT FLAG
+LOGUNT,        0               /DSRN POINTER - ONLY USED FROM ONE PAGE!
+PTTY,  TTY             /POINTER TO TTY HANDLER - USED BY LDDSRN
+       0               / SO FORMS CONTROL WILL WORK ON UNIT 0
+FPNXT, ICYCLE          /USED AS INTERPRETER ADDRESS IF NO FPP
+
+/DSRN IMAGE
+
+HAND,  0               /HANDLER ENTRY POINT
+HCODEW,        0               /HANDLER LOAD ADDR & FIELD + IOFFLG + FORMS CTL FLG
+BADFLD,        0               /BUFFER ADDRESS AND FIELD
+CHRPTR,        0               /ACTUALLY A WORD POINTER
+CHRCTR,        0               /COUNTER - RANGES FROM -3 TO -1
+STBLK, 0               /STARTING BLOCK OF FILE
+RELBLK,        0               /CURRENT RELATIVE BLOCK NUMBER
+TOTBLK,        0               /LENGTH OF FILE
+FFLAGS,        0               /FILE FLAGS:
+                       /BIT 0 - "HAS BEEN WRITTEN" FLAG
+                       /BITS 1-2 - FORMATTED/UNFORMATTED FLAGS
+                       /BIT 11 - "END-FILED" FLAG
+
+BUFFLD,        0               /ROUTINE TO SET DF TO BUFFER FIELD
+BUFCDF,        HLT
+       JMP I   BUFFLD
+
+FADD1, FADD+LONG       /FPP CODE TO ADD 1.0 TO FAC
+       ONE             /AND FALL INTO STORE CODE
+FGPBF, 0               /THESE THREE WORDS ARE USED
+BIOPTR,        0               /TO FETCH AND STORE FLOATING POINT NUMBERS
+       FEXIT           /FROM RANDOM MEMORY
+       PAGE
+\f/STARTUP CODE
+
+FTEMP2,        ISZ     .+3     /ALSO USED AS I/O F.P. TEMPORARY
+       CDF CIF 10
+       JMP I   .+1
+VDATE, RTSLDR          /USED TO STORE OS/8 DATE
+
+/RTS ENTRY POINTS - "VERSION INDEPENDENT"
+
+VUERR, JMP I   (USRERR /USER ERROR
+                       /** LOADER MUST DEFINE #ARGER AS VARGER-1 **
+VARGER,        JMS I   ERR     /LIBRARY ARGUMENT ERROR
+VRENDO,        ISZ     RWFLAG  /END OF I/O LIST
+VRFSV, JMP I   GETLMN  /I/O LIST ARG ENTRY - COROUTINE WITH GETLMN
+VBAK,  JMP I   (BKSPC  /"BACKSPACE" ROUTINE
+VENDF, JMP I   (ENDFL  /"END FILE" ROUTINE
+VREW,  JMP I   (RWIND  /"REWIND" ROUTINE
+VDEF,  JMP I   (DFINE  /"DEFINE FILE" ROUTINE
+VWUO,  AC4000          /UNFORMATTED WRITE
+VRUO,  JMP I   (RWUNF  /UNFORMATTED READ
+VWDAO, AC4000          /DIRECT ACCESS WRITE
+VRDAO, JMP I   (RWDACC /DIRECT ACCESS READ
+VWRITO,        AC4000          /FORMATTED (ASCII) WRITE
+VREADO,        JMP I   (RWASCI /FORMATTED (ASCII) READ
+VSWAP, JMP I   (SWAP   /OVERLAY PROCESSOR
+VEXIT, TRAP3;  CALXIT  /"STOP" ROUTINE - ENTERED IN FPP MODE
+V8OR12,        0;0             /0;1 IF CPU IS A PDP-12
+VBACKG,        JMP I   (NULLJB /BACKGROUND JOB DISPATCHER
+       0
+       CDF CIF 0       /USED BY ROUTINE "ONQB" IN LIBRARY
+       JMS I   .-2
+       JMP     VBACKG
+
+/IOH GET VARIABLE ROUTINE.
+/THIS ROUTINE MAKES THE FORMATTED I/O PROCESSOR AND THE USER'S
+/PROGRAM CO-ROUTINES (DEF(COROUTINE)= 2 ROUTINES EACH THINKING THE OTHER
+/ IS A SUBROUTINE).  ON ENTRY FAC=INPUT NUMBER
+/IF I/O IS A READ, ON RETURN FAC=OUTPUT NUMBER IF I/O IS A WRITE.
+
+GETLMN,        0
+VRETRN,        JMP I   [RETURN /SHORT ROUTINE FOR ALL THOSE COMMENTS, NO?
+\f/INTERRUPT DRIVEN I/O HANDLERS
+
+LPT,   0               /RING-BUFFERED - LP08 OR LS8E
+       AND     [377    /JUST IN CASE
+LPTSNA,        SNA
+       JMP I   (IOERR  /CANNOT BE USED FOR INPUT
+YLPT,  IOF
+       DCA I   LPPUT
+       TAD     LPGET
+       CIA
+       TAD     LPPUT
+       SZA CLA         /IS LPT QUIET?
+       JMP     .+3     /NO
+       TAD I   LPPUT
+       LLS             /YES - START 'ER UP
+       CLA IAC
+       LIE             /ENABLE LPT INTERRUPTS
+       TAD     LPPUT   /1 IN AC, REMEMBER?
+       DCA     LPPUT
+       TAD I   LPPUT
+       SPA
+       JMP     .-3     /NEGATIVE NUMBERS ARE BUFFER LINKS
+       SZA CLA         /ANY ROOM LEFT IN BUFFER?
+       JMS I   (HANG
+       LPUHNG          /WAIT FOR LINE PRINTER
+       ION             /TURN INTERRUPTS BACK ON
+       JMP I   LPT     /RETURN
+
+LPPUT, LPBUFR
+
+PTP,   0               /PAPER TAPE PUNCH HANDLER
+YPTP,  SNA
+       JMP I   (IOERR  /INPUT IS ERROR
+       DCA     LPT     /SAVE CHAR
+       IOF
+       TAD     POCHR   /IF PUNCH IS NOT IDLE,
+       SZA CLA         /WE DISMISS JOB
+       JMS I   (HANG
+       PPUHNG          /WAIT FOR PUNCH INTERRUPT
+       TAD     LPT
+       PLS             /OUTPUT CHAR
+       DCA     POCHR   /SET FLAG NON-ZERO
+       ION
+       JMP I   PTP
+
+/*K* THE FOLLOWING ADDRESSES GET FALLEN INTO & MUST BE SMALL
+
+       IFNZRO  PPUHNG&7000     <__ERROR__>
+       IFNZRO  TTUHNG&7000     <__ERROR__>
+       IFNZRO  KBUHNG&7000     <__ERROR__>
+       IFNZRO  RDUHNG&7000     <__ERROR__>
+       IFNZRO  LPUHNG&7000     <__ERROR__>
+\f/INTERRUPT-DRIVEN PTR AND TELETYPE HANDLER
+
+PTR,   0               /CRUDE READER HANDLER
+YPTR,  SZA CLA
+       JMP I   (IOERR  /OUTPUT ILLEGAL TO PTR
+       IOF
+       RFC             /START READER
+       JMS I   (HANG
+       RDUHNG          /HANG UNTIL COMPLETE
+       TAD     RDRCHR  /GET CHARACTER
+       ION
+       JMP I   PTR     /RETURN
+
+TTY,   0               /BUFFERS 2 CHARS ON OUTPUT, 1 ON INPUT
+YTTY,  IOF             /DELICATE CODE AHEAD
+       SNA             /INPUT OR OUTPUT?
+       JMP     KBD     /INPUT
+       DCA     LPT     /OUTPUT - SAVE CHAR
+       TAD     TOCHR   /GET TTY STATUS
+       SMA SZA CLA     /G.T. 0 MEANS A CHAR IS BACKED UP
+       JMS I   (HANG
+       TTUHNG          /WAIT FOR LOG JAM TO CLEAR
+       TAD     TOCHR   /NO CHAR BACKED UP - SEE IF TTY BUSY
+       CLL RAL         /"BUSY" FLAG IN LINK - INTERRUPTS ARE OFF!
+       CLA CML RAR     /COMPLEMENT OF BUSY IN SIGN
+       TAD     LPT     /GET CHAR
+       SPA             /IF TTY NOT BUSY,
+       TLS             /OUTPUT CHAR
+       DCA     TOCHR   /STORE POS OR NEG, BACKED UP OR BUSY
+TTYRET,        ION             /TURN INTERRUPTS BACK ON
+       JMP I   TTY     /AND LEAVE
+\fKBD,  TAD     KBDCHR  /HAS A CHARACTER BEEN INPUT?
+       SNA CLA
+       JMS I   (HANG
+       KBUHNG          /NO - RUN BACKGROUND UNTIL ONE IS
+       TAD     KBDCHR  /GET CHARACTER
+       DCA     LPT
+       DCA     KBDCHR  /CHEAR CHARACTER BUFFER
+       TAD     LPT
+       JMP     TTYRET  /RETURN WITH INTERRUPTS ON
+
+KILFPP,        FPHLT           /BRING FPP TO A SCREECHING HALT
+       ISZ     .-1
+       JMP     .-1     /WAIT FOR IT TO STOP
+       FPICL           /CLEAN UP MESS HALT HAS MADE IN FPP
+BEEORC,        SZL             /^C OR ^B?
+       JMP I   (7600   /^C - HIYO SILVER, AWAY!
+       KCC             /CLEAR KBD FLAG ON ^B
+CTLBER,        JMS I   ERR     /*** THIS MAY BE DANGEROUS! **
+       PAGE
+\f/INTERRUPT SERVICE ROUTINES
+
+INTRPT,        DCA     INTAC
+       RAR
+       DCA     INTLNK
+VINT,  JMP     .+4     /** MUST BE AT 403 **
+       IFNZRO  VINT-403        <___ CHANGE LOADER!!!>
+       0
+       CDF CIF 0       /USER INTERRUPT ROUTINE GOES HERE
+       JMS I   .-2
+
+       FPINT           /CHECK FOR FPP DONE
+       JMP     LPTEST
+FPUHNG,        JMP     DISMIS  /ALWAYS GOES TO RESTRT
+
+VDISMS,        JMP     DISMIS  /FOR USE BY USERS
+       JMP     DISMIS
+       JMP     DISMIS
+
+LPTEST,        LSF
+       JMP     NOTLPT
+LPTLCF,        LCF             /CLEAR FLAG
+       TAD I   LPGET
+       SNA CLA         /CHECK FOR SPURIOUS INTERRUPT
+JMPDIS,        JMP     DISMIS  /GO AWAY IF SO
+       DCA I   LPGET   /ZERO CHAR JUST OUTPUT
+       ISZ     LPGET
+       TAD I   LPGET
+       SPA
+       DCA     LPGET   /TAKE CARE OF BUFFER LINKS
+       SNA
+       TAD I   LPGET   /MAKE SURE CHAR IS IN AC
+       SZA             /IS THERE A CHARACTER?
+       LLS             /YES - PRINT IT
+       CLA
+       LSF             /CHECK FOR IMMEDIATE FLAG
+LPUHNG,        JMP     DISMIS  /NO - MAYBE RESTART PROGRAM
+       JMP     LPTLCF  /YES - LOOP
+
+NOTLPT,        TSF             /CHECK TTY
+       JMP     NOTTTY
+       TCF             /CLEAR FLAG
+       TAD     TOCHR   /GET TTY STATUS
+       SMA SZA         /IF THERE IS A CHARACTER WAITING,
+       TLS             /OUTPUT IT.
+       SMA SZA CLA     /CHANGE "WAITING" TO "BUSY",
+       STL RAR         /"BUSY" TO "IDLE".
+       DCA     TOCHR
+TTUHNG,        JMP     DISMIS
+\f/KBD AND PTP INTERRUPTS
+
+NOTTTY,        KSF
+       JMP     NOTKBD
+       TAD     [200
+       KRS             /USE KRS TO FORCE PARITY BIT
+       DCA     KBDCHR  /AND ALSO SO THAT ^C WILL STILL BE IN BUFFER IN OS/8
+       TAD     KBDCHR
+       TAD     (-202   /CHECK FOR ^C OR ^B
+       CLL RAR
+       SNA CLA
+       JMP     CTCCTB  /YUP - TAKE SOME DRASTIC ACTION
+       KCC             /DATA CHARACTER - CLEAR FLAG
+KBUHNG,        JMP     DISMIS
+
+CTCCTB,        TAD     CTCINH
+       SNA CLA         /ARE WE IN A HANDLER?
+       JMP     NOTINH  /NO
+       TAD     INTLNK
+       CLL RAL         /YES - RETURN WITH INTERRUPTS OFF
+       TAD     INTAC   /TRUST IN GOD AND RTS
+       RMF
+       JMP I   0
+
+NOTKBD,        PSF
+       JMP     NOTPTP
+       PCF             /P.T. PUNCH INTERRUPT - CLEAR FLAG
+       DCA     POCHR   /CLEAR SOFTWARE FLAG
+PPUHNG,        JMP     DISMIS
+
+NOTPTP,        RSF
+       JMP     LPTERR
+       TAD     [200
+       RRB             /GET RDR CHAR
+       DCA     RDRCHR
+RDUHNG,        JMP     DISMIS
+
+LPTERR,        LSE             /TEST FOR LP08 ERROR FLAG
+       SKP
+       LIF             /DISABLE LP08 INTERRUPTS IF ERROR FLAG ON
+DISMIS,        TAD     INTLNK
+       CLL RAL
+       TAD     INTAC   /RESTORE AC AND LINK
+       RMF
+       ION
+       JMP I   0       /RETURN FROM THE INTERRUPT
+
+INTAC, 0
+INTLNK,        0
+\f/BACKGROUND INITIATE/TERMINATE ROUTINE
+
+HANG,  0               /ALWAYS CALLED WITH INTERRUPTS OFF!
+       TAD I   HANG    /GET POINTER TO UNHANGING LOCATION
+       DCA     UNHANG
+       RDF             /GET FIELD CALLED FROM
+       TAD     HCIDF0
+       DCA     HNGCDF  /SAVE FOR RETURN
+HCIDF0,        CDF CIF 0
+       TAD     (JMP RESTRT     /CHANGE THE "JMP DISMIS" AT THAT LOC
+       DCA I   UNHANG  /TO A "JMP RESTRT"
+       TAD     BACKLK
+       CLL RAL
+       TAD     BACKAC  /SET UP BACKGROUND AC AND LINK
+BAKCIF,        CIF 0
+BAKCDF,        CDF 0
+       ION
+       JMP I   BACKPC  /INITIATE BACKGROUND
+
+/      COME HERE WHEN THE HANG CONDITION HAS GONE AWAY
+
+RESTRT,        TAD     JMPDIS  /RESTORE THE UNHANG LOCATION
+       DCA I   UNHANG
+       TAD     INTAC   /SUSPEND THE BACKGROUND
+       DCA     BACKAC
+       TAD     INTLNK
+       DCA     BACKLK
+       TAD     0
+       DCA     BACKPC
+       RIB
+       AND     [70
+       TAD     HCIDF0
+       DCA     BAKCIF
+       RIB
+       JMS I   MCDF    /*K* OK SINCE BACKGROUND DOESN'T USE MAKCDF
+       DCA     BAKCDF
+       ISZ     HANG
+HNGCDF,        HLT
+       JMP I   HANG    /INTERRUPTS ARE OFF - RETURN
+
+NOTINH,        TAD     JMPDIS  /IN CASE WE WERE HUNG, WE DON'T WANT
+       DCA I   UNHANG  /TO GET "UNHUNG" OUT OF THE ERROR ROUTINE!
+       JMP I   (KILFPP /KILL FPP AND GO TO EXIT OR ERROR
+
+UNHANG,        0
+BACKAC,        0
+BACKLK,        0
+BACKPC,        VBACKG
+VHANG= HANG
+       IFNZRO  VHANG-0524      <__ CHANGE LOADER!>
+       PAGE
+\f/I-O CONVERSION ROUTINES - STARTUP CODE
+
+RWASCI,        JMS I   [RWINIT /"READ(N,FMT)" OR "WRITE(N,FMT)"
+       2000            /"FORMATTED" BIT
+       JMS I   [FETPC  /GET ADDRESS OF FORMAT STMT
+       DCA     FMTDF
+       JMS I   [FETPC
+       DCA     FMTADR
+       DCA     FMTTYP
+       DCA     PFACT   /CLEAR SCALE FACTOR
+       JMS I   [GETLMN /EXIT TO MAIN PROGRAM TO GET 1ST VARIABLE
+
+       TAD     (FMTPDL-1
+FMTSET,        DCA     FMTPXR  /STORE NEW FORMAT PUSHDOWN POINTER
+       TAD I   FMTPXR
+       DCA     FMTBYT  /GET NEW BYTE POINTER (NOTE-FMTPDL CONTAINS A 0)
+\f/MAIN FORMAT DECODING LOOP
+
+FMTFLP,        TAD     FMTBYT
+       DCA     FMPBYT  /SAVE CURRENT BYTE PTR FOR PARENTHESES HACK
+FMTDLP,        DCA     FMTNUM  /ZERO ACCUMULATED NUMBER
+FMTCLP,        JMS     FMTGCH  /GET A CHARACTER
+       ISZ     FMTBYT  /BUMP BYTE POINTER
+       JMS I   [CHTYPE /CLASSIFY CHAR
+       1234;   FMTDIG  /DIGIT
+       -42;    DBLQOT  /"
+       -44;    ABORTO  /$
+       -55;    FMINUS  /-
+       -56;    FMTPER  /.
+       -57;    SLASH   //
+       -54;    COMMA   /,
+       -50;    LPAREN  /(
+       -51;    RPAREN  /)
+       -47;    KWOTE   /'
+       -40;    FMTCLP  /SPACE
+       0               /ANYTHING ELSE
+
+       TAD     FMTTYP
+       SZA CLA         /CHECK THAT WE DO NOT HAVE A FIELD OUTSTANDING
+       JMP I   (FMTERR /IF WE DO - ERROR
+       TAD     CHCH    /GET FIELD CHARACTER
+       DCA     FMTTYP
+       TAD     FMTNUM
+       SNA             /IF REPEAT COUNT WAS MISSING OR ZERO
+       IAC             /MAKE IT ONE
+       CMA
+       DCA     N       /STORE -(REPEAT COUNT +1)
+       DCA     W       /CLEAR WIDTH INITIALLY
+       ISZ     FMTNUM  /PRECLUDE "FORMAT ERROR" ON X,P, OR H FORMATS
+       TAD     FMTTYP
+       AND     [7      /IS THE CHARACTER P, X, OR H?
+       SNA CLA         /IF SO, DON'T WAIT
+COMMA, JMS I   (DOFMT  /EXECUTE THE STORED FIELD SPECIFICATION
+       JMP     FMTFLP  /BACK FOR MORE
+
+FMTADR,        0               /ADDRESS OF FORMAT
+\fFMTGCH,       0               /GET CHARACTER FROM FORMAT
+       JMS     FMTGAD  /GET WORD CONTAINING CHAR AND L/R SWITCH
+       CDF 0
+       JMS I   (FMTGLR /EXTRACT CHARACTER
+       JMP I   FMTGCH
+
+FMTGAD,        0               /SUBR TO GET A WORD FROM A CHARACTER OFFSET
+       TAD     FMTBYT  /GET OFFSET
+       CLL RAR
+       CLL
+       TAD     FMTADR  /COMPUTE BASE ADDR + [OFFSET/2]
+       DCA     D
+       RAL
+       TAD     FMTDF
+       JMS I   MCDF    /SET UP PROPER DATA FIELD
+       DCA     .+1
+       HLT
+       TAD     FMTBYT
+       RAR
+       CLA             /LEAVE L/R SWITCH IN LINK
+       TAD I   D
+       JMP I   FMTGAD  /RETURN WITH WORD IN AC
+
+FMTDF, 0               /FIELD OF 1ST CHAR OF FORMAT IN BITS 9-11
+
+FMTDIG,        TAD     FMTNUM  /DIGIT PROCESSOR
+       CLL RTL
+       TAD     FMTNUM
+       CLL RAL         /MULTIPLY FMTNUM BY 10
+       TAD     CHCH    /ADD IN THE DIGIT
+       JMP     FMTDLP  /STORE IT BACK AND CONTINUE
+\f/PARENTHESIS AND DIGIT ROUTINES
+
+LPAREN,        TAD     FMTPXR
+       TAD     (2-FMTPDL
+       SZA             /ARE WE AT PARENTHESIS LEVEL 1?
+       JMP     .+3     /NO
+       TAD     FMPBYT  /YES - STORE A POINTER TO THE FIRST DIGIT OF THE
+       DCA I   (FMTPDL-2       /GROUP COUNT PRECEDING THIS PAREN
+                       /AS THE LOOP POINTER FOR LEVEL 1
+       TAD     [7
+       SPA CLA         /PUSHDOWN OVERFLOW?
+FPOERR,        JMS I   ERR     /YES
+       AC7775
+       TAD     FMTPXR
+       DCA     FMTPXR  /BUMP PARENTHESIS PUSHDOWN POINTER
+       TAD     FMTBYT
+       DCA I   FMTPXR  /SAVE BYTE POINTER
+       TAD     FMTNUM
+       SNA
+       IAC             /NO GROUP COUNT MEANS COUNT = 1
+       CIA
+       DCA I   FMTPXR  /SAVE LOOP COUNT
+       DCA I   (FMTPDL-1       /INITIAL GROUP COUNT IS INFINITE!
+RPLOOP,        AC7776  /COME HERE ON RIGHT PAREN ALSO
+       TAD     FMTPXR  /BACK UP FORMAT PDL POINTER
+       JMP     FMTSET  /RESTORE FMTBYT FROM TOP OF LIST
+
+FMPBYT,        0
+
+RPAREN,        JMS I   (DOFMT  /EXECUTE PREVIOUS SPEC IF ANY
+       TAD     FMTPXR
+       TAD     (2-FMTPDL       /IS THIS THE FINAL RIGHT PAREN?
+       SNA CLA
+       JMS I   [ENDREC /YES - CHECK FOR END OF FORMAT
+       ISZ I   FMTPXR  /BUMP COUNT
+       JMP     RPLOOP  /DIDN'T OVERFLOW - LOOP TO BYTE AFTER (
+       ISZ     FMTPXR  /POP UP PARENTHESES STACK
+       JMP     FMTFLP  /CONTINUE PAST RIGHT PAREN
+       PAGE
+\f/QUOTE AND HOLLERITH FORMAT PROCESSORS
+
+KWOTE, TAD     MINUS5  /APOSTROPHE PROCESSOR
+DBLQOT,        TAD     (-42    /QUOTE PROCESSOR
+       DCA     KWODEL  /SAVE TERMINATOR
+       JMS     DOFMT   /PROCESS PRECEDING FIELD , IF ANY
+       SKP
+KWOTLP,        JMS     FMTHCV  /PROCESS ONE CHARACTER
+       JMS I   [FMTGCH /GET THE NEXT FORMAT CHAR
+       TAD     KWODEL
+       SZA CLA         /IS IT THE TERMINATOR?
+       JMP     KWOTLP  /NO - PROCESS IT AND CONTINUE
+       ISZ     FMTBYT  /BUMP OVER TERMINATOR
+       JMS I   [FMTGCH
+       TAD     KWODEL
+       SNA CLA         /IS THIS ANOTHER TERMINATOR?
+       JMP     KWOTLP  /TWO TERMINATORS PRINT AS ONE
+       JMP I   (FMTFLP /OTHERWISE GO BACK TO FORMAT LOOP
+
+HFMT,  JMS     MORE    /MORE CHARACTERS?
+       JMS     FMTHCV  /YES - PROCESS ONE
+       JMP     HFMT    /AND LOOP
+
+FMTHCV,        0               /ROUTINE COMMON TO H AND QUOTED FORMATS
+       TAD     RWFLAG  /PROCESSES ONE CHAR IN OR OUT OF THE FORMAT
+H7700, SMA CLA         /IN OR OUT?
+       JMP     FMTHIN  /IN
+       JMS I   [FMTGCH /OUT - GET THE CHAR
+       JMS I   [FMTOUT /PRINT IT
+       JMP     FMTHCR  /RETURN
+FMTHIN,        JMS I   [FMTIN  /INPUT - GET THE CHAR FROM THE INPUT LINE
+       DCA     W       /SAVE IT
+       JMS I   (FMTGAD
+       SZL             /WHICH SIDE?
+       JMP     FHRGHT  /RIGHT SIDE
+       AND     [77     /LEFT - KEEP RIGHT CHAR
+       DCA     MORE
+       TAD     W
+       CLL RTL
+       RTL
+       RTL
+       TAD     MORE    /ADD NEW CHAR IN ON THE LEFT
+       JMP     .+3
+FHRGHT,        AND     H7700   /KEEP THE CHAR ON THE LEFT
+       TAD     W       /ADD NEW CHAR IN ON THE RIGHT
+       DCA I   D       /RESTORE ALTERED WORD
+       CDF 0
+FMTHCR,        ISZ     FMTBYT  /BUMP BYTE POINTER
+       JMP I   FMTHCV
+
+KWODEL,        0               /MUST BE UNIQUE!
+\fMORE, 0               /SUBR TO BUMP REPEAT COUNT AND EXIT ON OVFLO
+       ISZ     N
+       JMP I   MORE
+DOFRTN,        DCA     FMTTYP  /INDICATE NO SPECIFICATION COLLECTED
+       JMP I   DOFMT   /RETURN FROM "DOFMT"
+
+DOFMT, 0               /ROUTINE TO PROCESS A FORMAT SPECIFICATION
+       TAD     FMTNUM  /GET THE CURRENT NUMBER
+       DCA     D       /STORE IT AS DECIMAL POINT SPEC
+       DCA     IFLG
+       DCA     EFLG
+       DCA     GFLG    /ZERO CONVERSION FLAGS
+       TAD     FMTTYP
+       SNA CLA         /ANY SPECIFICATION WAITING?
+       JMP I   DOFMT   /NO - JUST RETURN
+       TAD     W
+       TAD     D       /IF THERE WAS NO W OR D SPECIFICATION,
+       SNA CLA
+       JMP     FMTERR  /ITS AN ERROR
+       TAD     FMTTYP
+       JMS I   [CHTYPE /YES - WHICH ONE?
+       -30;    XFMT    /X
+       -24;    TFMT    /T
+       -20;    PFMT    /P
+       -14;    LFMT    /L
+       -11;    IFMT    /I
+       -10;    HFMT    /H
+       -7;     GFMT    /G
+       -6;     FFMT    /F
+MINUS5,        -5;     EFMT    /E
+       -4;DF,  EFMT    /D - EQUIVALENT TO E IF NO D.P. FPP
+       -2;BF,  FFMT    /B - EQUIVALENT TO F IF NO D.P. FPP
+       -1;     AFMT    /A
+       0               /NONE OF THE ABOVE - ERROR
+FMTERR,        JMS I   ERR
+\fENDREC,       0               /ROUTINE TO END A LINE AND MAYBE THE I/O
+       JMS I   [EOLINE
+       CLA IAC
+       AND     RWFLAG  /LO BIT OF RWFLAG IS "I/O LIST EXHAUSTED" FLAG
+       SNA CLA         /SKIP IF NO MORE ELEMENTS IN I/O LIST
+       JMP I   ENDREC
+       JMP I   [ENDIO  /NOW FINISH UP AND LEAVE
+
+SLASH, JMS     DOFMT   /EXECUTE THE FIELD SPEC IF ANY
+       JMS I   [EOLINE /TERMINATE CURRENT LINE
+       JMP I   (FMTFLP
+
+PFMT,  CLA CMA
+       TAD     FMTNUM
+       ISZ     MINFLG  /P FORMAT - CHECK FOR NEGATIVE SCALE
+       CIA
+       DCA     PFACT
+       STA             /FALL INTO CODE TO CLEAR MINFLG
+       DCA     MINFLG  /SET FLAG ON MINUS
+       JMP     DOFRTN
+
+FMINUS,        JMS     DOFMT   /EXECUTE PRECEDING SPEC
+       DCA     MINFLG  /CLEAR MINUS FLAG
+       JMP I   (FMTFLP
+
+MINFLG,        -1
+
+FMTPER,        TAD     FMTNUM  /PERIOD PROCESSOR
+       DCA     W       /STORE WIDTH
+       JMP I   (FMTFLP
+
+ABORTO,        JMS     DOFMT   /$ - SPECIAL HACK TO ALLOW PROMPTS
+       DCA     EOLSW   /FAKE BEGINNING OF LINE
+       DCA I   (TTYLF  /INHIBIT LF BEFORE NEXT TTY INPUT
+       JMP I   [ENDIO  /GO AWAY
+       PAGE
+\fCHTYPE,       0               /ROUTINE TO CLASSIFY CHARACTERS
+       DCA     CHCH    /SAVE CHAR
+       JMP     CHLOOP+1
+CDIGIT,        TAD     CHCH    /CHECK FOR DIGIT
+       TAD     (-72
+       CLL
+       TAD     [12
+       SZL             /IS CHAR A DIGIT?
+       JMP     JMPOUT  /YES
+CHLOOP,        ISZ     CHTYPE  /SKIP OVER ADDRESS
+       CLA
+       TAD I   CHTYPE
+       ISZ     CHTYPE
+       SMA             /END OF LIST?
+       JMP     JMPOTX  /MAYBE - JUMP WITH CODE IN AC
+       TAD     CHCH
+       SZA CLA         /DOES CHAR MATCH CHAR ON LIST?
+       JMP     CHLOOP  /NO - KEEP LOOKING
+JMPOUT,        DCA     CHCH    /ZERO CHAR
+       TAD I   CHTYPE
+       DCA     CHTYPE  /SET UP TO RETURN INDIRECTLY
+JMPOTX,        SZA CLA         /IS THIS THE END?
+       JMP     CDIGIT  /NO - GO CHECK FOR DIGIT
+       JMP I   CHTYPE  /GO TO SPECIFIED ADDRESS
+
+
+SKPOUT,        0               /ROUTINE USED BY DATA-HANDLING SPECIFICATIONS
+       JMS I   [MORE   /CHECK FOR REPEAT COUNT EXHAUSTED
+       TAD     RWFLAG
+       CLL RAR
+       SZA CLA         /IF OUTPUT,
+       ISZ     SKPOUT  /SKIP RETURN
+       SZL CLA         /IF END OF I/O LIST,
+       JMS I   [ENDREC /DON'T RETURN AT ALL - GO AWAY
+       JMP I   SKPOUT
+\f/A FORMAT PROCESSOR
+
+AINPUT,        TAD     (4040
+       DCA     ACH
+       TAD     (4040
+       DCA     ACL     /INITIALIZE LOW-ORDER WORDS TO BLANKS
+AINPTL,        JMS     GADR
+       SZL             /LEFT OR RIGHT?
+       JMP     AINPTR  /RIGHT
+       JMS I   [FMTIN
+       STL RTL         /INPUT CHAR GOES IN HIGH-ORDER
+       RTL             /WITH BLANK IN LOW-ORDER
+       RTL
+       JMP     AINPTC
+AINPTR,        JMS I   [FMTIN
+       TAD I   FMTGLR  /COMBINE INPUT CHAR AND OLD LEFT HALF
+       TAD     [-40    /DELETE PREVIOUS RIGHT-HALF SPACE
+AINPTC,        DCA I   FMTGLR  /STORE WORD
+       ISZ     W
+       JMP     AINPTL  /LOOP AROUND WIDTH
+ANXT,  JMS I   [GETLMN /GET NEXT ELEMENT
+AFMT,  TAD     D
+       CIA
+       DCA     W       /SAVE FIELD WODTH AS A COUNT
+       JMS I   [SKPOUT /CHECK FOR REPEAT COUNT OVFLO AND I/O DIR
+       JMP     AINPUT
+AOTPUT,        JMS     GADR    /OUTPUT - GET ADDRESS OF BYTE
+       TAD I   FMTGLR
+       JMS     FMTGLR  /GET BYTE
+       JMS I   [FMTOUT /PRINT IT
+       ISZ     W
+       JMP     AOTPUT  /LOOP ON WIDTH
+       JMP     ANXT
+
+FMTGLR,        0               /SUBR TO EXTRACT A CHAR FROM A WORD
+       SZL
+       JMP     .+4     /RIGHT HALF
+       RTR
+       RTR
+       RTR             /LEFT HALF - ROTATE INTO RIGHT HALF
+       AND     [77
+       JMP I   FMTGLR
+
+GADR,  0               /BYTE ADDRESS ROUTINE FOR A FORMAT PROCESSOR
+       TAD     D
+       TAD     W       /FORM BYTE OFFSET IN THE RANGE 0 THRU D-1
+       CLL RAR
+       TAD     (ACX
+       DCA     FMTGLR
+       JMP I   GADR    /LEAVE WITH L/R FLAG IN LINK
+\f/"STOP" ROUTINE - TERMINATES JOB
+
+CALXIT,        TAD     EXDVNO
+       CIA
+       DCA     ACI     /GO THROUGH THE FORTRAN UNIT NUMBERS.
+       DCA I   (ENDFLS /*K* TURN "ENDFL" INTO A SUBROUTINE
+       JMS I   (LDDSRN /IF WE FIND A UNIT WHICH IS BEING USED
+       SNA CLA         /AND HAS NOT BEEN ENDFILED,
+       JMP     XITISZ  /WE WILL DUMP THE CURRENT BUFFER (IF IT
+       CLA IAC         /IS A FORMATTED OUTPUT FILE) AND
+       AND     FFLAGS  /END-FILE IT
+       SNA CLA
+       JMS I   (ENDFL
+XITISZ,        ISZ     EXDVNO
+       JMP     CALXIT
+LPTTWT,        TAD I   LPGET   /WAIT FOR LINE PRINTER AND TELETYPE TO
+       TAD     TOCHR   /GO QUIET.
+       SZA CLA
+       JMP     LPTTWT
+       ISZ     CLNADR  /SET UP TO CLOSE OUTPUT FILES
+PDPXIT,        IOF             /ENTER HERE FROM 7605
+       CDF 0           /TO PROTECT CLODS WITH PDP 8/E'S
+       JMS I   (7607
+       0210
+       7400            /READ IN CLEANUP ROUTINE
+       37              /AND OS/8 PAGE 17600
+       JMP     .-5     /AYEEEE!! SYSTEM DEVICE GONZO!
+       CDF CIF 10
+       JMP I   CLNADR  /CLOSE TENTATIVE FILES AND EXIT
+CLNADR,        CLNUP
+EXDVNO,        -11
+
+ARGLD, 0               /ROUTINE TO GET VALUE OF AN ARG
+       JMS I   [FETPC
+       AND     [7      /THROW AWAY OPCODE (JA)
+       TAD     FLDTM2
+       DCA     FGPBF
+       JMS I   [FETPC  /CONSTRUCT AN FPP INSTRUCTION
+       DCA     BIOPTR
+       JMS I   [FPGO
+       FGPBF
+       JMP I   ARGLD
+
+FLDTM2,        FLDA+LONG
+       FTEMP2
+       FEXIT
+       PAGE
+\f/SUBROUTINE TO OPEN A UNIT FOR I/O
+
+RWINIT,        0
+       DCA     RWFLAG  /DIRECTION IN AC ON ENTRY
+       AC7776
+       AND I   RWINIT  /IF CALLED FROM BACKSPACE, REWIND OR ENDFILE
+       SZA CLA         /UNIT NUMBER IS IN FAC
+       JMS I   [ARGLD  /OTHERWISE, GET UNIT NUMBER
+       JMS I   [FFIX
+       TAD     ACI
+       CLL CMA
+       TAD     [12
+       SZL CLA         /CHECK DEVICE NUMBER IN RANGE 0-9
+       JMS     LDDSRN  /LOAD DSRN ENTRY INTO PAGE 0
+       SNA CLA         /IS UNIT INITIALIZED?
+UNTERR,        JMS I   ERR     /NO - ERROR
+       TAD     RWFLAG
+       SPA             /IF WE ARE WRITEING FOR THE FIRST TIME
+       TAD     FFLAGS  /ON A UNIT WHICH WAS BEING READ,
+       CMA RAL         /WE MUST BUMP THE RELATIVE BLOCK NUMBER DOWN
+       SNL SMA CLA     /ONE BECAUSE OF A PHILOSOPHICAL DIFFERENCE
+       JMS I   (RD2WR  /BETWEEN READ AND WRITE
+       TAD I   RWINIT
+       TAD     RWFLAG  /OR THE I/O TYPE AND
+       CMA
+       AND     FFLAGS  /DIRECTION BITS INTO THE FLAG WORD
+       TAD I   RWINIT
+       TAD     RWFLAG
+       DCA     FFLAGS
+       TAD     FFLAGS
+       CMA RTL
+       SNL SMA CLA     /IT IS ILLEGAL TO ACCESS A FILE IN
+       JMP     UNTERR  /FORMATTED AND UNFORMATTED MODES
+       ISZ     RWINIT
+       TAD     ACI
+       CLL RAL
+       TAD     ACI
+       TAD     (DATABL-4
+       DCA     XR      /STORE POINTER INTO DIRECT-ACCESS TABLE
+       JMP I   RWINIT
+\f/REWIND AND END FILE
+
+RWIND, JMS     RWINIT  /GET THE DSRN ENTRY
+       0               /DON'T PLAY WITH MODES
+       AC2000
+       TAD     FFLAGS
+       SNA CLA         /IF FORMATTED OUTPUT FILE AND NOT EOF'D
+       JMS     DMPBUF  /DUMP LAST BUFFER AS A FAVOR
+ATLDMK,        CLA IAC
+       AND     FFLAGS  /KILL ALL FLAG BITS
+       DCA     FFLAGS  /EXCEPT "END-FILED" BIT
+       TAD     BADFLD
+       AND     [7400
+       DCA     CHRPTR
+       AC7775
+       DCA     CHRCTR  /INITIALIZE BUFFER POINTERS
+       DCA     RELBLK  /AND RELATIVE BLOCK #
+       JMP I   [ENDIO  /RESTORE DSRN AND EXIT
+
+ENDFL, JMS     RWINIT  /*K* USED AS A SUBROUTINE BY CALXIT
+       1               /GET DSRN, SET "END FILE" FLAG
+       TAD     FFLAGS  /IF THE FILE IS UNFORMATTED,
+       CMA RAL         /OR WAS NOT OUTPUT ONTO,
+       SNL SMA CLA     /THEN ENDFILE DOES NOTHING.
+       JMS     DMPBUF  /ELSE DUMP THE FINAL BUFFER
+       AC3777
+       AND     FFLAGS  /CLEAR WRITE BIT SO WE WILL NOT TRY
+SETTOT,        DCA     FFLAGS  /ANYTHING ON A SUBSEQUENT ENDFILE
+       TAD     RELBLK  /SET NEW LENGTH OF FILE IN CASE ITS TENTATIVE,
+       DCA     TOTBLK  /AND SO WE WON'T READ PAST EOF.
+ENDIO, JMS     INITMV  /SET UP DSRN POINTERS
+       TAD I   XR1
+       DCA I   XR      /STORE BACK THE DSRN ENTRY
+       ISZ     T       /FOR THIS LOGICAL UNIT
+       JMP     .-3
+       DCA     VEOFSW  /CLEAR EOFSW AT END OF EVERY READ
+ENDFLS,        JMP I   [RETURN /RETURN TO THE CALLING PROGRAM
+       JMP I   ENDFL   /*K* OR RETURN TO CALXIT
+
+INITMV,        0               /ROUTINE TO SET UP STUFF
+ICDF0, CDF 0
+       TAD     LOGUNT
+       DCA     XR
+       TAD     (HAND-1
+       DCA     XR1
+       TAD     (-11
+       DCA     T
+       JMP I   INITMV
+\f/ROUTINE TO DUMP CURRENT OUTPUT BUFFER WITH ^Z AT THE END
+
+DMPBUF,        0
+       ISZ     EOLSW   /FORCE COLUMN 1 SWITCH OFF
+       TAD     (7712   /OUTPUT A LINE FEED
+       JMS I   [FMTOUT
+       TAD     HAND    /IF THE FILE IS BEING OUTPUT VIA
+       SMA CLA         /AN OS/8 HANDLER,
+       JMP     CLREOL  /WE MUST TERMINATE THE BUFFER PROPERLY.
+       TAD     (32
+CTZLP, TAD     Z7700   /OUTPUT A ^Z AND FILL BUFFER WITH ZEROES.
+       JMS I   [FMTOUT /NEGATIVE NUMBERS TURN INTO CONTROL CHARS
+       TAD     CHRPTR
+       AND     [377
+       TAD     CHRCTR  /FILL THE BUFFER UNTIL CHRPTR POINTS TO
+       IAC             /A BLOCK BOUNDARY AND CHRCTR = -3
+Z7700, SMA CLA         /WE ARE THEN AT BUFFER-END
+       JMP     CTZLP
+CLREOL,        DCA     EOLSW   /RESET TO BEGINNING OF LINE
+       JMP I   DMPBUF  /RETURN
+
+/ROUTINE TO MOVE THE PROPER DSRN ENTRY INTO PAGE 0
+
+LDDSRN,        0
+       TAD     ACI     / READ/WRITE INIT SINGS THIS SONG,
+       CLL RTL         / (DOO DAH, DOO DAH,)
+       RAL             / DSRN ENTRIES 9 WORDS LONG
+       TAD     ACI     / (OH, DEE DOO DAH DAY).
+
+       SNA                     /DEVICE NUMBER 0 IS SPECIAL -
+       TAD     (PTTY+11-DSRN   /IT'S ALWAYS THE TELETYPE
+       TAD     (DSRN-12
+       DCA     LOGUNT
+       JMS     INITMV  /SET UP FOR MOVE
+       TAD I   XR
+       DCA I   XR1     /PUT DSRN ENTRY IN PAGE 0
+       ISZ     T
+       JMP     .-3
+       TAD     BADFLD
+       AND     [70
+       TAD     ICDF0
+       DCA     BUFCDF  /SAVE BUFFER FIELD AS A CDF
+       TAD     HAND
+       JMP I   LDDSRN
+       PAGE
+\f/BACKSPACE ROUTINE - WORKS ON BINARY OR ASCII FILES
+
+BKSPC, JMS I   [RWINIT
+       0               /GET THE DSRN ENTRY WITHOUT ALTERING MODE
+       TAD     HAND
+       SMA CLA
+       JMP I   [UNTERR /UNIT MUST BE BLOCK ORIENTED
+       AC2000
+       AND     FFLAGS
+       SZA CLA         /IS FILE FORMATTED?
+       JMP     BKASCI  /YES - PAIN IN NECK
+       JMS     BMPBLK  /UNFORMATTED FILE - REREAD LAST BLOCK
+       TAD     CHRPTR
+       TAD     [377
+       DCA     T
+       JMS     BUFFLD  /SET DATA FIELD TO FIELD OF BUFFER
+       TAD I   T       /LOOK AT LAST WORD IN BUFFER
+       CIA             /REGARD IT AS THE NUMBER OF BLOCKS/RECORD
+       TAD     RELBLK
+       DCA     RELBLK  /RELBLK POINTS TO FIRST BLOCK OF PREV. REC
+       JMP I   [ENDIO
+
+BMPBLK,        0               /SUBR TO BUMP BLOCK # BACK AND READ
+       CMA CLL         /AC MAY NOT BE 0 ON ENTRY
+       TAD     RELBLK
+       DCA     RELBLK  /BUMP BLOCK BACK
+       SNL
+       JMP I   (ATLDMK /BACKSPACED TOO FAR - CALL IT QUITS
+       DCA     CHRPTR  /ZERO CHRPTR TO FORCE A READ FROM MASSIO
+       JMS I   [MASSIO /READ A BLOCK
+       JMP I   BMPBLK
+
+/****  NULL JOB GOES HERE FOR LACK OF A BETTER PLACE ****
+
+NULLJB,        TAD     N2525
+NULLLP,        ISZ     N2525   /PUT THE FAMOUS "POLY BASIC PATTERN"
+       JMP     NULLLP  /IN THE AC LIGHTS
+       ISZ     NUMISZ
+       JMP     NULLLP
+       CML CMA RAR
+       DCA     N2525
+       TAD     [-4
+       DCA     NUMISZ
+       JMP I   (VBACKG /GOT SOMETHING MORE USEFUL TO DO?
+N2525, 2525
+NUMISZ,        -4
+\f/BACKSPACE FOR FORMATTED FILES
+
+BKLORD,        TAD I   CHRPTR
+       ISZ     CHRPTR
+       NOP
+       AND     [177    /GET 7 BITS
+       TAD     (-15    /COMPARE WITH C.R. - SINCE WE SKIPPED
+       SNA CLA         /THE FIRST ONE THIS WILL BELONG TO THE PREVIOUS
+       JMP I   [ENDIO  /LINE AND WE WILL BE DONE (HAH!)
+BKASCI,        JMS I   (MASBMP /A COMPLICATED MESS - FIRST BUMP THE 
+       SKP             /CHARACTER POINTER BACK TWO PLACES
+       JMP     BKGTCH  /AND THEN FETCH A CHARACTER.  THIS WILL IGNORE
+       TAD     BADFLD  /THE LAST CHAR READ/WRITTEN (WHICH SHOULD
+       AND     [7400   /BE A CARRIAGE RETURN).
+       CIA
+       TAD     CHRPTR
+       CLL RAR
+       SZA CLA         /TEST WHETHER WE HAVE TO READ AN OLD BUFFER
+       JMP     BKNORD  /NO
+       TAD     CHRCTR  /SAVE POSITION IN CURRENT DOUBLEWORD
+       DCA     GETCH3
+       DCA     CHRPTR
+       AC4000          /IF WE ARE BACKSPACING AN OUTPUT FILE,
+       TAD     FFLAGS  /WE MUST SAVE THE INFORMATION IN THE
+       SPA             /CURRENT BUFFER BY WRITING IT OUT.
+       JMP     .+4
+       DCA     FFLAGS  /ALSO CHANGE THE UNIT TO AN INPUT FILE
+       AC4000          /(RWINIT TAKES CARE OF SWITCHING BACK TO OUTPUT)
+       JMS I   [MASSIO
+       CLA IAC         /WE DON'T WANT THE LAST BLOCK READ/WRITTEN,
+       JMS     BMPBLK  /THAT'S IN CORE - WE WANT THE ONE
+       TAD     GETCH3  /BEFORE THAT.
+       DCA     CHRCTR
+       TAD     CHRCTR
+       TAD     (401
+       SKP             /COMPUTE WORD POINTER FROM CHAR POINTER
+BKNORD,        STA
+       TAD     CHRPTR
+       DCA     CHRPTR  /BUMP WD PTR BACK 1
+BKGTCH,        JMS I   (MASBMP /NOW GET A CHARACTER - THIS LOOKS A LOT
+       JMP     BKLORD  /LIKE THE INPUT ROUTINE
+       JMS     GETCH3
+       JMP     BKLORD+1
+\fGETCH3,       0               /COMMON CODE BETWEEN BACKSPACE AND INPUT
+       TAD I   CHRPTR
+       AND     [7400
+       DCA     BMPBLK  /HANDY TEMPORARY
+       ISZ     CHRPTR
+       TAD I   CHRPTR
+       AND     [7400
+       CLL RTR
+       RTR             /COMBINE TWO 4-BIT QUANTITIES
+       TAD     BMPBLK  /INTO A CHARACTER
+       CLL RTR
+       RTR
+       JMP I   GETCH3
+
+DATABL,        ZBLOCK  33      /DIRECT ACCESS TABLE
+       PAGE
+\f/I,E,F,AND G FORMAT CONVERSIONS
+
+IFMT,  TAD     D
+       DCA     W       /SET WIDTH PROPERLY
+       DCA     D       /FOR SCALING PURPOSES
+       STA
+       DCA     IFLG
+       JMP     FFMT
+
+GFMT,  STA
+       DCA     GFLG    /SET G AND E FLAGS
+
+EFMT,  STA
+       DCA     EFLG    /SET E FLAG
+       JMP     FFMT
+
+IGEF,  JMS I   [GETLMN /MAIN LOOP FOR CONVERSIONS - SKIPPED 1ST TIME
+FFMT,  TAD     D
+       DCA     OD      /SAVE COUNT OF POST-D.P. DIGITS
+       TAD     IFLG
+       SNA CLA         /APPLY THE P-SCALE FACTOR
+       TAD     PFACT   /ONLY IF THE FORMAT IS NOT I
+       DCA     PFACTX
+       DCA     SCALE   /DON'T LOOK FOR TROUBLE
+       JMS I   [SKPOUT /CHECK IF MORE AND TEST DIRECTION
+       JMP I   (IGEFIN /INPUT
+       STA
+       DCA I   [FFNEG  /USE NEGATE ROUTINE HEADER AS SIGN FLAG
+       TAD     EFLG
+       CLL RAL
+       CLL RAL         /0 IF NOT E, -4 IF E
+       TAD     W       /THIS PROVIDES FOR THE EXP. FIELD (IF E FMT)
+       DCA     OW      /OR THE 4 TRAILING SPACES (IF G FMT)
+       TAD     ACH
+       SNA
+       JMP     SKPSHT  /AC IS ZERO - SKP A LOT OF SHT
+       SPA CLA
+       JMS I   [FFNEG  /AC<0 - NEGATE IT AND SET FLAG (CLEVER)
+SCALUP,        DCA     SCALE
+       TAD     ACX
+       SMA SZA CLA     /AC<1.0?
+       JMP     GT1     /NO
+       JMS I   [FPGO   /YES - MULTIPLY BY 10.0
+       FMUL10
+       STA
+       TAD     SCALE   /BUMP POWER OF TEN
+       JMP     SCALUP
+\f/I,G,E,F, OUTPUT CONVERSIONS - NUMBER IS NOW =>1.0
+
+GT1,   JMS I   (SCALDN /NOW DECREASE IT TO THE INTERVAL [0,1)
+       JMS I   [FPGO   /SAVE IT AWAY
+       FSTTMP
+       TAD     [7
+       JMS     OSCALE
+       JMS I   [FPGO   /USE IT TO ROUND THE NUMBER TO BE OUTPUT
+       FADTMP
+       JMS I   (SCALDN /WE COULD HAVE ROUNDED FROM .999... TO 1.000...
+SKPSHT,        TAD     GFLG    /ENTER HERE IF NUM WAS 0 - SCALE=0
+       SNA CLA
+       JMP     NOTG    /NOT G FORMAT
+       TAD     SCALE   /G FORMAT - TEST FOR OUT OF F FORMAT RANGE
+       TAD     PFACTX
+       CIA CLL         /F FORMAT RANGE IS [.1,10**(D VALUE))
+       TAD     OD
+       SNL
+       JMP     USEE    /IF OUT OF BOUNDS USE E FORMAT (FLAG IS SET)
+       DCA     OD      /REDUCE D VALUE BY SCALE FACTOR
+       DCA     EFLG    /TO RETAIN CORRECT # OF SIG. DIGITS
+USEE,  CLA
+       JMP     NOTG
+
+/SET UP TO PRINT DIGITS
+
+
+DIGCNT,        0
+       TAD     PFACTX  /COMPUTE EXPONENT JUST IN CASE E FORMAT
+       CIA
+       TAD     SCALE
+       DCA     FMTNUM
+       TAD     EFLG
+       SNA CLA         /NOW COMPUTE THE NUMBER OF DIGITS BEFORE THE D.P.
+       TAD     SCALE   /TAKE SCALE FACTOR INTO ACCOUNT IF NOT E FORMAT
+       TAD     PFACTX  /TAKE P FACTOR INTO ACCOUNT IF NOT I OR F/G
+       DCA     SCALE   /STORE THE NUMBER OF DIGITS BEFORE THE D.P.
+       TAD I   [FFNEG  /INCREASE NUMBER OF LEADING BLANKS BY 1
+       SPA CLA         /IF THE NUMBER IS POSITIVE. THIS DEPENDS ON
+       ISZ     OW      /THIS LOCATION BEING BELOW 4000.
+       TAD     SCALE   /GET THE NUMBER OF PRE-D.P. DIGITS (AS NEGATIVE #)
+       SPA SNA
+       CLA IAC         /IF NONE, PRINT A 0 SO COUNT AS 1
+       TAD     OD      /REDUCE THE WIDTH BY THIS NUMBER
+       CMA
+       TAD     OW      /REDUCE IT AGAIN BY THE POST-D.P. DIGIT COUNT
+       CIA
+       TAD     IFLG    /AND AGAIN BY 1 FOR THE D.P. (IF NOT I FORMAT)
+       JMP I   DIGCNT
+OW,    0
+\f/I,G,E,F FORMAT - ROUTINE TO SCALE ROUNDING FACTOR
+
+OSCALE,        0               /SUBR TO SCALE .5 THE CORRECT # OF TIMES
+       DCA     NPLCS   /MAX IN AC ON ENTRY
+       DCA     ACX
+       AC2000          /FORM A FLOATING 0.5 IN ORDER
+       DCA     ACH     /TO ROUND THE NUMBER BEFORE PRINTING.
+       DCA     ACL
+       TAD     EFLG    /FIGURE OUT HOW TO SCALE IT -
+       SNA CLA         /THE THEORY IS THAT IT SHOULD BE SCALED
+       TAD     SCALE   /DOWN BY THE NUMBER OF SIGNIFICANT
+       DCA     T       /PRINTING DIGITS.  THIS CAN BE
+       TAD     SCALE   /EXPRESSED AS:
+       CIA CLL         /(P FACTOR) * (NOT (G FMT PRINTING AS F))
+       TAD     OD      / + (SCALE FACTOR) * (NOT E FMT) + (D VALUE).
+       SZL CLA         /THE SCALE FACTOR IS < 0 FOR
+       TAD     GFLG    /NUMBERS < .1, WHICH REDUCES
+       SNA CLA         /THE # OF SIG. DIGITS VIA LEADING ZEROS.
+       TAD     PFACTX  /IF THERE ARE < 0 SIG. DIGITS
+       TAD     T       /IT DOESN'T MATTER WHAT WE DO
+       TAD     OD      /SINCE THE NUMBER WILL PRINT AS
+       SMA             /0.00000 ANYWAY.
+       CMA             /IF THERE ARE >NPLCS SIG. PRINTING DIGITS
+       TAD     NPLCS   /THE ROUNDING GETS MEANINGLESS SO MAKE
+       SPA             /THE EXCESS DIVISIONS DIVIDES BY 2 INSTEAD
+       DCA     ACX     / OF BY 10.  THIS FUDGE WORKS QUITE WELL
+       CIA             /FOR NUMBERS OF UP TO NPLCS+2
+       TAD     NPLCS   /SIGNIFICANT DIGITS.
+       CIA
+       DCA     T
+       JMP     .+3
+FDIVLP,        JMS I   [FPGO   /SCALE THE .5 DOWN THE CORRECT NUMBER OF TIMES
+       FDIV10
+       ISZ     T
+       JMP     FDIVLP
+       JMP I   OSCALE
+NPLCS, 0
+ONE,   1;2000;0
+       PAGE
+\f/I,G,E,F OUTPUT CONVERSION - ACTUAL OUTPUT SECTION
+
+OUTNUM,        SMA             /CHECK FOR FIELD OVERFLOW
+       JMP     ASTSK1  /YES - PRINT *******
+       JMS     OBLNKS  /PRINT LEADING BLANKS - AC IS NOT 0!
+                       /***IMPORTANT - OBLNKS CLEARS AC1 ***
+       AC7775
+       ISZ I   [FFNEG  /IF SIGN IS NEGATIVE,
+       JMS     DIGIT   /OUTPUT A MINUS SIGN
+       CLA             /OTHERWISE OUTPUT NOTHING
+       TAD     ACX
+       SNA             /ALIGN THE FAC MANTISSA INTO A DOUBLEWORD
+       JMS I   [AL1    /FRACTION IN THE RANGE [.1,1)
+       IAC             /THIS INVOLVES SHIFTING THE MANTISSA
+       CMA             /RIGHT BY (-ACX-1) PLACES
+       SMA             /WHERE A NEGATIVE NUMBER MEANS A LEFT SHIFT.
+       JMS I   [ACSR
+       CLA
+       TAD     ACL     /NOW MOVE THE FAC DOWN A WORD SO THAT
+       DCA     AC1     /WHEN WE MULTIPLY BY 10 THE OVERFLOW APPEARS
+       TAD     ACH     /IN THE HIGH-ORDER WORD
+       DCA     ACL
+       TAD     SCALE
+       SPA SNA         /DO WE HAVE DIGITS TO THE LEFT OF THE D.P.?
+       JMP     PRZERO  /NO - PRINT A ZERO THERE
+       JMS     DIGITS  /YES - PRINT THEM
+PRDCPT,        TAD     IFLG
+       SZA CLA
+       JMP I   (IGEF   /IF I FORMAT, WE'RE DONE NOW
+       AC7776
+       JMS     DIGIT   /OTHERWISE PRINT DECIMAL POINT
+       TAD     SCALE
+       SMA CLA         /CHECK WHETHER WE NEED TO PRINT LEADING ZEROS
+       JMP     NOLZRO  /NO
+       TAD     SCALE
+       DCA     T
+LZLOOP,        STA CLL
+       TAD     OD      /BUMP D VALUE DOWN BY ONE
+       SNL             /IF IT GOES NEGATIVE,
+       JMP     NOMOAC  /WE'VE RUN OUT OF FIELD WIDTH
+       DCA     OD      
+       JMS     DIGIT   /PRINT A ZERO
+       ISZ     T       /UNTIL THE COUNT (OR THE WIDTH) RUNS OUT
+       JMP     LZLOOP
+NOLZRO,        TAD     OD
+       SZA             /IF THERE ARE ANY DIGITS YET TO BE PRINTED,
+       JMS     DIGITS  /PRINT THEM
+\f/I,G,E,F OUTPUT CONVERSION - FINISH UP
+
+NOMOAC,        CLA
+       TAD     EFLG
+       SNA CLA         /E FORMAT?
+       JMP     CHKG    /NO - CHECK FOR G FORMAT OUTPUT AS F
+       JMS     EXPFLD
+       JMP I   (IGEF
+EXPFLD,        0
+       TAD     (5
+       JMS I   [FMTOUT /OUTPUT "E"
+       TAD     FMTNUM  /GET EXPONENT
+       CLL
+       SPA
+       CML CIA         /SEPARATE INTO MAGNITUDE AND SIGN
+       DCA     FMTNUM  /SAVE MAGNITUDE
+       RTL
+       TAD     (-5     /PRINT + OR -
+       JMS     DIGIT
+       DCA     T       /INITIALIZE QUOTIENT OF DIVISION
+DVELP, TAD     FMTNUM  /SUBTRACT 10 FROM EXPONENT
+       TAD     [-12
+       SPA             /DID IT GO NEGATIVE?
+       JMP     PRNTXP  /YES - DONE
+       DCA     FMTNUM  /NO - STORE IT BACK
+       ISZ     T       /BUMP QUOTIENT
+       JMP     DVELP   /LOOP
+PRNTXP,        CLA
+       TAD     T
+       TAD     [-12
+       SMA CLA
+       JMP     ASTSK3
+       TAD     T
+       JMS     DIGIT
+       TAD     FMTNUM
+       JMS     DIGIT   /PRINT TWO DIGITS OF EXPONENT
+       JMP I   EXPFLD
+
+CHKG,  TAD     GFLG
+       SNA             /WAS IT G FORMAT?
+       JMP I   (IGEF   /NO - F OR I - DONE
+       DCA     EFLG    /RE-SET EFLG SINCE WE ZEROED IT BEFORE
+       TAD     (-5
+       JMS     OBLNKS  /OUTPUT 4 BLANKS
+       JMP I   (IGEF   /DONE WITH G FORMAT OUTPUT
+
+PRZERO,        CLA             /COME HERE IF NO SIG. DIGITS LEFT OF D.P.
+       JMS     DIGIT   /PRINT A ZERO
+       JMP     PRDCPT  /CONTINUE
+
+ASTSK3,        AC0002
+       JMP     .+3
+ASTSK1,        CLA             /CLEAR THE AC
+       TAD     W       /GET THE FIELD WIDTH
+       JMS I   [ASTRSK
+       JMP I   (IGEF
+\f/I,G,E,F OUTPUT CONVERSION - OUTPUT SUBROUTINES
+
+OBLNKS,        0               /SUBROUTINE TO PRINT A STRING OF BLANKS
+       DCA     AC1     /MUST LEAVE AC1 ZERO ON EXIT SO THAT
+       JMP     .+3     /FAC LEFT SHIFT WON'T SHIFT IN GARBAGE LATER ON
+       TAD     [40
+       JMS I   [FMTOUT /OUTPUT A BLANK
+       ISZ     AC1
+       JMP     .-3     /LOOP
+       JMP I   OBLNKS  /RETURN
+
+DIGITS,        0               /ROUTINE TO OUTPUT A STRING OF DECIMAL DIGITS
+       CIA
+       DCA     T
+DGLOOP,        TAD     AC1
+       DCA     AC2     /COPY AC INTO OPERAND FOR ADDITION LATER ON
+       TAD     ACL
+       DCA     OPL
+       DCA     ACH     /CLEAR "OVERFLOW WORD"
+       JMS I   [AL1
+       JMS I   [AL1    /FAC=FAC*4
+       DCA     OPH
+       JMS I   [OADD
+       JMS I   [AL1    /FAC=ORIGINAL FAC*10
+       TAD     ACH     /GET OVERFLOW
+       JMS     DIGIT   /PRINT IT
+       ISZ     T       /LOOP FOR SPECIFIED NUMBER
+       JMP     DGLOOP
+       JMP I   DIGITS  /RETURN
+
+DIGIT, 0               /ROUTINE TO OUTPUT A DIGIT
+       TAD     [60
+       JMS I   [FMTOUT /TRIVIAL, ISN'T IT?
+       JMP I   DIGIT
+       PAGE
+\f/I,G,E,F INPUT CONVERSION
+
+IGEFIN,        STA             /OD CONTAINS SCALING IF NO D.P. IN INPUT
+       DCA     DPSW    /INITIALIZE D.P. SW
+       STA
+       DCA     INESW   /DITTO EXPONENT SWITCH
+       TAD     W
+       CMA
+       DCA     FMTNUM  /GET CHAR COUNT
+INERSM,        DCA     ACX     /RE-ENTER HERE AFTER SEEING "E"
+       DCA     ACH     /CLEAR FLOATING AC
+       DCA     ACL
+       STA
+       JMP     INMINS  /SET SIGN PLUS
+
+INGCH, JMS I   [FMTIN  /GET A CHAR
+       JMS I   [CHTYPE /CLASSIFY IT
+       1234;   IDIGIT  /DIGIT
+       -56;    INDCPT  /.
+       -53;    INLOOP  /+
+       -55;    INMINS  /-
+       -5;     INE     /E
+       -40;    IBLDIG  /BLANK - TREAT LIKE 0 IN FORTRAN STANDARD
+       -54;    INEONM  /,
+       0               /OTHER - ERROR
+INER,  JMS I   ERR
+
+INDCPT,        DCA     OD      /ZERO COUNT OF DIGITS AFTER D.P.
+       ISZ     DPSW    /TEST AND SET D.P. SWITCH
+       JMP     INER    /WHOOPS - TWO D.P.S IN A NUMBER
+       JMP     INLOOP  /KEEP GOING
+
+IBLDIG,        TAD     EOLSW   /SINCE THE BLEEPING STANDARD DOESN'T COVER
+       SZA CLA         /TELETYPE I/O, WE KEEP SOME COOL BY IGNORING
+       JMP     INLOOP  /BLANKS CREATED BY EARLY LINE TERMINATION.
+
+IDIGIT,        TAD     CHCH
+       DCA     DGT+1   /SAVE THE DIGIT
+       JMS I   [FPGO   /FORM 10*FAC + DIGIT IN FAC
+       ACMDGT
+       TAD     DPSW
+       SNA CLA
+       ISZ     OD      /BUMP DIGIT COUNT IF D.P. SEEN
+       JMP     INLOOP
+\fINMINS,       DCA I   [FFNEG  /SET SIGN NEGATIVE
+
+INLOOP,        ISZ     FMTNUM
+       JMP     INGCH   /LOOP UNTIL WIDTH EXHAUSTED
+INEONM,        ISZ I   [FFNEG  /CHECK IF SIGN NEGATIVE
+       JMS I   [FFNEG  /YES - NEGATE
+       ISZ     INESW   /SEE IF "E" SEEN
+       JMP     FIXUPE  /YES - WE HAVE EXPONENT, NOT NUMBER
+       TAD     PFACTX  /NO "E" SEEN - SCALE USING P FACTOR
+
+SCALIN,        TAD     OD      /GET SCALING FACTOR
+       STL
+       SNA
+       JMP I   (IGEF   /NO SCALING NECESSARY
+       SMA
+       CIA CLL         /AC CONTAINS MAGNITUDE, LINK CONTAINS SIGN
+       DCA     OD
+       RTL
+       RAL             /AC CONTAINS 0 IF DIVIDE, 4 IF MULTIPLY
+       TAD     (FDIV10
+       DCA     IGEFOP
+       JMS I   [FPGO   /MULTIPLY OR DIVIDE BY 10.0
+IGEFOP,        0
+       ISZ     OD
+       JMP     IGEFOP-1/MULT OR DIV APPROPRIATE NUMBER OF TIMES
+       JMP I   (IGEF   /RETURN FOR MORE
+
+INE,   ISZ     INESW   /SEE IF THIS IS THE SECOND "E"
+       JMP     INER    /YES - ERROR
+       ISZ     DPSW    /FORCE DP SW ON (TO INHIBIT D.P. AFTER E)
+       TAD     OD      /USE SCALE FACTOR ONLY IF D.P. SEEN
+       DCA     SCALE   /SAVE SCALE FACTOR
+       ISZ I   [FFNEG
+       JMS I   [FFNEG  /GET SIGN OF NUMBER CORRECT
+       JMS I   [FPGO   /SAVE IT TEMPORARILY
+       FSTTM2
+       JMP     INERSM  /GO COLLECT EXPONENT
+
+FIXUPE,        JMS I   [FFIX
+       TAD     ACI     /GET EXPONENT
+       CIA
+       TAD     SCALE   /ADD IN EXPONENT TO D.P. SCALE FACTOR
+       DCA     OD
+       JMS I   [FPGO   /GET NUMBER BACK IN FAC
+       FLDTM2
+       JMP     SCALIN
+
+DPSW,  0
+DGT,   13;0;0;0;0;0
+NOTG,  JMS I   (DIGCNT
+       DCA     SCALDN
+       TAD     IFLG
+       SNA CLA
+       JMP     NOTI
+       TAD     SCALE
+       TAD     (-7
+       SPA CLA
+NOTI,  TAD     SCALDN
+       JMP I   (OUTNUM
+\fSCALDN,       0               /SUBROUTINE TO SCALE THE FAC LESS THAN 1.0
+       TAD     ACX
+       SPA SNA CLA     /IS THE FAC => 1.0?
+       JMP I   SCALDN  /NO - WE'RE DONE
+       JMS I   [FPGO   /DIVIDE BY TEN
+       FDIV10
+       ISZ     SCALE   /BUMP POWER OF TEN
+       0               /BACKUP FOR WIDTH
+       JMP     SCALDN+1        /LOOP
+
+ASTRSK,        0
+       CIA
+       DCA     T
+       TAD     (52
+       JMS I   [FMTOUT
+       ISZ     T
+       JMP     .-3
+       JMP I   ASTRSK  /GET NEXT ELEMENT
+
+INESW, 0               /"E SEEN" SWITCH ON INPUT
+       PAGE
+\f/L AND X FORMATS , T FORMAT INPUT
+
+TFMTIN,        JMS I   [FMTIN  /FORCE INPUT BUFFER NON-EMPTY
+       CLA             /BY FETCHING AND WASTING A CHARACTER
+       TAD     (INBUFR
+       DCA     INXR
+       DCA     EOLSW   /SET TO BEGINNING OF LINE
+       JMP     XFMT
+XFMTIN,        JMS I   [FMTIN
+H7600, 7600            /WASTE AN INPUT CHAR
+XFMT,  JMS I   [MORE   /ANY MORE CHARS?
+       TAD     RWFLAG  /YES - IN OR OUT?
+       SMA CLA
+       JMP     XFMTIN  /IN
+TPPLBL,        TAD     [40     /HERE WITH AC=13 TO OVERPRINT ON T OUTPUT
+       JMS I   [FMTOUT /OUT
+       JMP     XFMT
+
+LINGCH,        JMS I   [FMTIN
+       JMS I   [CHTYPE /GET AND CLASSIFY CHARACTER
+       -40;    LINLP   /BLANK
+       -24;    LINTRU  /T
+       -6;     LINFLS  /F
+       0               /OTHER - ERROR
+       JMP I   (INER
+
+LINTRU,        TAD     (4001
+LINFLS,        CLL RAR         /PUT EITHER 0.0 OR 1.0 IN THE FAC
+       DCA     ACH
+       DCA     ACL
+       RAL
+       DCA     ACX
+LINLP, ISZ     W
+       JMP     LINGCH  /LOOP ON FIELD WIDTH
+
+LNXT,  JMS I   [GETLMN /GET NEXT ELEMENT FOR I/O
+LFMT,  TAD     D
+       CMA
+       DCA     W       /SAVE WIDTH AS A COUNT
+       JMS I   [SKPOUT /IN OR OUT?
+       JMP     LINFLS  /IN
+       CLA IAC
+       TAD     W
+       JMS I   (OBLNKS /OUTPUT W-1 BLANKS
+       TAD     ACH
+       SZA CLA
+       TAD     (16
+       TAD     (6      /NON-ZERO IS TRUE, ZERO FALSE
+       JMS I   [FMTOUT /OUTPUT T OR F
+       JMP     LNXT    /NEXT VICTIM
+\f/T FORMAT OUTPUT AND RANDOM SUBROUTINES
+
+TFMT,  TAD     D
+       CIA
+       DCA     N       /USE N TO FAKE OUT "X" FMT ROUTINE
+       TAD     RWFLAG
+       SMA CLA
+       JMP     TFMTIN  /INPUT
+       TAD     N
+       TAD     EOLSW   /COMPARE DESIRED POSITION WITH CURRENT ONE
+       SPA
+       JMP     TPBLNK  /AFTER - SPACE TO IT
+       JMS     EOLINE  /OUTPUT CR AND ZERO EOLSW
+       JMS I   [MORE   /KLUDGE FOR "T1" FORMAT
+       TAD     (13     /FAKE X FORMAT INTO PRINTING
+       JMP     TPPLBL  /A + AND (N-1) SPACES
+TPBLNK,        DCA     N       /SAVE DIFFERENCE BETWEEN POSITIONS
+       JMP     XFMT    /GO SPACE OUT
+
+EOLINE,        0               /SUBROUTINE TO TERMINATE I/O LINE
+       TAD     RWFLAG  /CAUTION - AC LO-ORDER BITS MAY NOT BE 0
+       SPA CLA         /INPUT OR OUTPUT?
+       JMP     EOOUTL  /OUTPUT
+       JMS I   [FMTIN  /FORCE INPUT BUFFER NON-EMPTY
+       CLA
+       TAD     (INBUFR-1
+       DCA     INXR    /SET XR TO NEGATIVE WORD AT THE
+       JMP     .+3     /BEGINNING OF THE INPUT BUFFER
+EOOUTL,        TAD     (7715
+       JMS I   [FMTOUT /OUTPUT A CARRIAGE RETURN
+       DCA     EOLSW   /CLEAR EOLSW FOR INPUT AND OUTPUT
+       JMP I   EOLINE
+\f/ROUTINE TO MOVE A HANDLER INTO FIELD 0
+
+GETHND,        0               /HANDLER CODE WORD IN AC ON ENTRY
+       DCA     HCW     /SAVE HANDLER CODE WORD
+       TAD     [7774
+       AND     HCW     /KNOCK OUT ION AND FORMS CTL BITS
+       CIA
+       SZA             /IF HANDLER IS NOT RESIDENT,
+       TAD     HKEY    /SEE IF THE HANDLER IS ALREADY
+       SNA CLA         /IN THE HANDLER AREA IN FIELD 0
+       JMP     HINF0   /YES
+       TAD     HCW     /NO - PUT IT THERE
+       AND     [70
+       TAD     HCDF0
+       DCA     HNDCDF  /GET CDF TO FIELD IN WHICH HANDLER RESIDES
+       TAD     HCW
+       AND     H7600
+       TAD     (-1     /GET POINTER TO HANDLER ADDRESS
+       DCA     XR1     /IN THAT FIELD
+       TAD     (HPLACE-1
+       DCA     XR      /ALSO TO HANDLER AREA IN FIELD 0
+       TAD     [7400   /SET UP COUNT OF 7400
+       DCA     HKEY    /INDEPENDENT OF HANDLER SIZE
+HNDCDF,        HLT
+       TAD I   XR1
+HCDF0, CDF 0
+       DCA I   XR      /MOVE HANDLER INTO HANDLER AREA
+       ISZ     HKEY
+       JMP     HNDCDF
+       TAD     [7774
+       AND     HCW
+       DCA     HKEY    /SET NEW KEY CODE WORD
+HINF0, CLA IAC
+       AND     HCW
+       SNA CLA         /INTERRUPTS ALLOWED?
+YHIOF, IOF             /NO - TOO BAD
+       ISZ     CTCINH  /INHIBIT ^C DURING HANDLER CALL
+       JMP I   GETHND
+HKEY,  0
+HCW,   0
+       PAGE
+\f/CHARACTER INPUT ROUTINE - LINE AT A TIME
+
+FMTIN, 0
+       TAD     EOLSW
+       SNA             /END OF LINE ALREADY FOUND?
+       TAD I   INXR    /NO - GET CHAR FROM LINE BUFFER
+       SPA             /TIME TO READ A NEW LINE?
+       JMP     READLN  /YES
+       SNA             /END OF LINE?
+       JMP     INEOL   /YES - SET INDICATOR
+       AND     [77     /CONVERT TO SIXBIT
+       JMP I   FMTIN   /RETURN WITH IT
+INEOL, TAD     [40
+UNPKLN,        DCA     EOLSW   /SET EOL INDICATOR TO A BLANK
+       JMP     FMTIN+1 /AND RETURN BLANKS FROM HERE ON IN
+READLN,        DCA     EOLSW   /USE EOLSW AS A COUNT SO IT WINDS UP 0
+       TAD     HAND
+       TAD     (-TTY
+       SNA CLA         /IS IT TELETYPE INPUT?
+       STA             /YES - SET TTY FLAG
+       DCA     TTYFLG
+       JMS     ECHO
+TTYLF, 12              /ECHO LF IF TTY INPUT
+       TAD     [12     /TTYLF IS ZEROED BY ABORTO
+       DCA     TTYLF
+
+READLP,        CLA
+       TAD     HAND
+       SPA CLA         /CHARACTER ORIENTED DEVICE?
+       JMP     MASSIN  /NO - UNPACK CHAR FROM BUFFER
+       JMS I   HAND    /GET A CHARACTER
+GOTCHR,        AND     [177    /STRIP OFF PARITY
+       JMS I   [CHTYPE /CLASSIFY IT
+       -15;    INCRET  /CARRIAGE RETURN
+       -177;   RUBOUT  /RUBOUT
+       -11;    INTAB   /TAB
+       -25;    CTRLU   /^U
+       -32;    INEOF   /^Z
+       0               /ANYTHING ELSE
+       TAD     CHCH
+       TAD     [-40
+       SMA             /IF CHARACTER IS >37,
+       JMS     INPUTC  /STORE IT AND ECHO IT IF TTY
+       JMP     READLP
+\f/CHARACTER INPUT ROUTINE - SPECIAL CHARACTER HANDLERS
+
+INTAB, JMS     INPUTC  /TAB - INSERT (AND ECHO) BLANKS
+       TAD     INXR
+       AND     [7
+       SZA CLA         /UNTIL A COLUMN MULTIPLE OF 8 IS REACHED
+       JMP     INTAB
+       JMP     READLP
+
+RUBOUT,        TAD     EOLSW
+       CIA
+       TAD I   (INBUFR /IGNORE RUBOUTS IF LINE EMPTY
+       AND     TTYFLG
+       SNA CLA
+       JMP     READLP  /OR IF NON-TTY INPUT
+       JMS     ECHO
+       134             /ECHO A BACKSLASH
+IBAKUP,        STA
+       TAD     INXR
+       DCA     INXR    /BACK UP LINE POINTER
+       STA
+       TAD     EOLSW
+       DCA     EOLSW   /AND CHAR COUNTER
+       JMP     READLP
+
+INEOF, TAD     VEOFSW  /CHECK SWITCH SET BY "CHKEOF" LIBRARY ROUTINE
+       SNA             /WAS HE EXPECTING AN EOF?
+EOFERR,        JMS I   ERR     /NO
+       JMS I   MCDF
+       DCA     .+1
+       HLT             /CDF TO FIELD OF INDICATOR VARIABLE
+       AC2000
+       DCA I   VEOFSW+1        /SET VARIABLE TO .5
+       CDF 0           /FALL INTO CARRIAGE RETURN CODE
+
+INCRET,        DCA I   INXR    /CARRIAGE RETURN - ZERO OUT REST OF LINE
+       SKP
+CTRLU, STA             /SNEAKY, SNEAKY!
+       TAD     (INBUFR
+       DCA     INXR    /RESET XR TO FETCH LINE CHARS
+       JMS     ECHO
+       15              /ECHO THE C.R.
+       JMP     UNPKLN  /BACK TO FETCH FIRST CHAR
+
+INPUTC,        0               /ROUTINE TO STORE AND ECHO A CHAR
+       TAD     [40
+       DCA     INTMP
+       JMS     ECHO
+INTMP, 0               /ECHO CHAR IF TTY INPUT
+       TAD     INTMP
+       DCA I   INXR    /STORE CHAR IN LINE BUFFER
+       ISZ     EOLSW
+       JMP I   INPUTC  /RETURN IF NO OVERFLOW
+       JMP     IBAKUP  /IGNORE CHAR IF OVERFLOW
+\fECHO, 0               /ROUTINE TO ECHO CHAR IF TTY INPUT
+       TAD I   ECHO    /GET CHAR
+       AND     TTYFLG
+       SZA             /SHOULD WE ECHO?
+       JMS I   HAND    /YES
+       JMP I   ECHO    /RETURN TO CHARACTER - ITS SMALL
+TTYFLG,        0
+
+/CHARACTER INPUT ROUTINE - MASS STORAGE SECTION
+
+MASSIN,        JMS     MASBMP  /GET BUFFER FIELD AND CHAR NUMBER
+       JMP     INLORD  /CHAR 1 OR 2 - STRAIGHTFORWARD
+       JMS I   (GETCH3 /USE COMMON SUBROUTINE
+       JMP     MASICM  /GO TO COMMON CODE
+
+INLORD,        JMS I   [MASSIO /CHECK IF WE SHOULD READ IN A BUFFERLOAD
+       JMS     BUFFLD  /SET FIELD OF BUFFER
+       TAD I   CHRPTR
+MASICM,        ISZ     CHRPTR  /GET THE CHAR (IN LOW 8 BITS) AND BUMP PTR
+       NOP             /WATCH END OF FIELD FUNNYBUSINESS!
+       CDF 0           /RESET DATA FIELD
+       JMP     GOTCHR  /GO EXTRACT SEVEN BIT CHARACTER
+
+MASBMP,        0
+       JMS     BUFFLD  /SET TO BUFFER'S DATA FIELD
+       ISZ     CHRCTR  /BUMP CHAR COUNTER
+       JMP I   MASBMP  /CHAR 1 OR 2 - NO SWEAT
+       AC7775
+       DCA     CHRCTR  /CHAR 3 - RESET CHAR CTR
+       AC7776
+       TAD     CHRPTR  /BUMP BACK CHAR PTR
+       DCA     CHRPTR
+       ISZ     MASBMP
+       JMP I   MASBMP  /SKIP RETURN
+       PAGE
+\f/CHARACTER OUTPUT ROUTINE
+
+FMTOUT,        0
+       TAD     [40     /FIRST CONVERT SIXBIT TO ASCII
+       SMA             /CTL CHARS COME IN NEGATIVE
+       AND     [77
+       TAD     (240
+       DCA     OCHAR   /SAVE ASCII CHAR (WITHOUT PARITY BIT)
+       TAD     EOLSW
+       SZA CLA
+       JMP     NOT1ST  /FIRST CHAR IS DECODED FOR FORMS CONTROL
+       AC0002          /CHECK TO SEE IF THIS UNIT
+       AND     HCODEW  /SHOULD RECEIVE FORMS CONTROL
+       SZA CLA
+       JMP     LFPLCH  /NO - JUST PRINT A LINE FEED AND THE CHAR
+       TAD     OCHAR
+       JMS I   [CHTYPE /CLASSIFY CONTROL CHAR
+       -261;   OUTFFX  /1 - TOP OF FORM
+       -260;   OUT2LF  /0 - DOUBLE SPACE
+       -253;   NOLF    /+ - OVERPRINT
+       0               /ANYTHING ELSE - SINGLE SPACE
+       JMP     OUTLF
+
+OUTFFX,        TAD     HAND
+       TAD     (-TTY   /IF HANDLER IS TTY OUTPUT TWO LINE FEEDS
+       SZA CLA         /INSTEAD OF A FORM FEED
+       JMP     OUTFF
+OUT2LF,        TAD     [12
+       DCA     OCHAR   /SET 2ND CHAR TO LINE FEED
+LFPLCH,        STA
+       DCA     EOLSW   /SET SWITCH FOR 2ND CHAR
+       TAD     OCHAR
+       DCA     CHCH    /SAVE CHARACTER AWAY
+OUTLF, AC7776
+OUTFF, TAD     F214    /SUBSTITUTE THE APPROPRIATE FORM CONTROL
+       DCA     OCHAR   /FOR THE CHARACTER
+NOT1ST,        TAD     HAND
+       SPA CLA         /CHARACTER ORIENTED DEVICE?
+       JMP     MASOUT  /NO - PACK CHAR INTO BUFFER
+       TAD     OCHAR
+       JMS I   HAND    /OUTPUT CHAR
+NOLF,  ISZ     EOLSW   /BUMP CHAR CTR
+       JMP I   FMTOUT  /NO - RETURN
+       TAD     CHCH    /AHA - ANOTHER CHARACTER SHOULD BE OUTPUT
+       JMP     OUTFF+1 /GO TO IT
+\f/CHARACTER OUTPUT - MASS STORAGE OUTPUT
+
+MASOUT,        JMS I   (MASBMP /GET BUFFER FIELD AND CHAR NUMBER
+       JMP     OULORD  /CHAR 1 OR 2 - STRAIGHTFORWARD
+       JMS     OSUBR   /CHAR 3 - PACK FIRST HALFBYTE
+       JMS     OSUBR   /PACK SECOND HALFBYTE
+       AC4000
+       JMS     MASSIO  /CHECK IF WE SHOULD DUMP THE BUFFER
+MASOCM,        CDF 0
+       JMP     NOLF    /GO RETURN OR REENTER
+
+OULORD,        TAD     OCHAR
+       DCA I   CHRPTR  /STORE CHAR, ZAPPING HIGH-ORDER BITS
+       ISZ     CHRPTR  /BUMP CHAR PTR
+F214,  214             /GUARD AGAINST OVFLO
+       JMP     MASOCM  /RETURN
+
+OSUBR, 0               /ROUTINE TO PACK A HALFBYTE
+       TAD     OCHAR
+       CLL RTL
+       RTL             /SHIFT CHAR 4 LEFT
+       DCA     OCHAR
+       TAD I   CHRPTR  /CLEAR OUT ANY RESIDUE
+       AND     [377    /FROM HIGH-ORDER OF BUFFER WORD
+       DCA I   CHRPTR  /IN CASE WE ARE WRITING AFTER A BACKSPACE.
+       TAD     OCHAR
+       AND     [7400   /GET 4 BITS
+       TAD I   CHRPTR
+       DCA I   CHRPTR  /ADD INTO HIGH-ORDER OF BUFFER WORD
+       ISZ     CHRPTR  /BUMP POINTER
+       200             /OVERFLOW!
+       JMP I   OSUBR
+
+MASSIO,        0               /SUBROUTINE TO READ/WRITE BUFFER IF NECESSARY
+       CDF 0
+       TAD     BUFCDF  /ADD BUFFER CDF TO R/W BIT IN AC
+       TAD     (-6001  /TAKE AWAY CDF, LEAVE BIT 4 ON
+       DCA     IOCTL   /STORE I/O CONTROL WORD
+       TAD     CHRPTR
+       AND     [377
+       SZA CLA         /SEE IF POINTER IS AT BUFFER BOUNDARY
+       JMP I   MASSIO  /YES - RETURN DOING NOTHING
+       TAD     RELBLK
+       TAD     STBLK   /STORE BLOCK # IN HANDLER CALL
+       DCA     BLOCK
+       TAD     BADFLD
+       AND     [7400
+       DCA     BUFFER  /STORE BUFFER ADDRESS IN HANDLER CALL
+\f/CHARACTER OUTPUT - BUFFER I/O ROUTINE CONTINUED
+
+       TAD     TOTBLK
+       CIA CLL
+       TAD     RELBLK
+       SZL CLA         /CHECK FOR FILE OVERFLOW
+IOVFLO,        JMS I   ERR     /YES - ERROR
+       TAD     HCODEW
+       JMS I   (GETHND /GET HANDLER INTO FIELD 0
+       JMS I   HAND    /CALL HANDLER
+IOCTL, 0
+BUFFER,        0
+BLOCK, 0
+       SMA CLA         /HANDLER ERROR - ABORT
+       SKP             /IF NOT EOF
+IOERR, JMS I   ERR
+       JMS I   (RECOVR /CLEAR ANY FLAGS SET BY OS8 HANDLER
+       ISZ     RELBLK  /BUMP RELATIVE BLOCK NUMBER
+       TAD     BUFFER
+       DCA     CHRPTR  /RESET CHAR PTR
+       JMP I   MASSIO  /RETURN
+/FPP CODE FOR I/O CONVERSION
+
+FDIV10,        FDIV+LONG
+       TEN
+       FEXIT
+OCHAR, 0               /*** NEEDED FOR PADDING ***
+FMUL10,        FMUL+LONG       /FMUL10 MUST BE AT FDIV10+4
+       TEN
+       FEXIT
+
+FWTOBL,        FSUB+LONG
+       ONE
+       FDIV+LONG
+       FLTG85
+       FEXIT
+       PAGE
+\f/UNFORMATTED (BINARY) INPUT-OUTPUT
+
+RWUNF, JMS I   [RWINIT /"READ(N)" OR "WRITE(N)"
+       1000            /"UNFORMATTED" BIT
+       TAD     SZLCLA  /ENABLE SEQUENCE CHECKING
+UNFIO, DCA     SEQCHK  /*** SET SEQCHK TO "SZL CLA" OR "CLA"
+       DCA     RECCTR  /ENTER HERE FROM DIRECT ACCESS
+       TAD     HAND
+       SMA CLA         /CHECK FOR MASS-STORAGE HANDLER
+       JMP I   [UNTERR /NO - ERROR
+       JMS I   [GETLMN /GET FIRST VARIABLE
+       TAD     RWFLAG
+       SPA CLA
+RSETBP,        TAD     (125    /INITIALIZE COUNT TO -86 FOR WRITE,
+       CMA             /-1 FOR READ
+       DCA     CHRCTR
+       TAD     BADFLD
+       AND     [7400
+       DCA     BIOPTR  /INITIALIZE BUFFER POINTER
+       TAD     BADFLD
+       AND     [70
+       IAC
+       CLL RTR         /AC BIT 0 NOW ON
+       TAD     RWFLAG  /AC BIT 0 CONTAINS COMP. OF R/W FLAG
+       CLL RAR         /AC=(.NOT.RW)*2000+BUFFER FIELD
+       TAD     (FSTA+LONG      /AC=(FSTA OR FLDA) + BUFFLD
+       DCA     FGPBF
+       JMP     UIOVLP  /SKIP FIRST VARIABLE FETCH/STORE
+BFINCR,        JMS I   [FPGO
+       FGPBF           /LOAD OR STORE A BUFFER ENTRY
+       ISZ     BIOPTR
+       ISZ     BIOPTR  /INCREASE BUFFER POINTER
+       ISZ     BIOPTR
+       JMS I   [GETLMN /GET A VARIABLE FROM THE CALLING PROGRAM
+UIOVLP,        TAD     RWFLAG
+       CLL RAR         /LOWORDER BIT OF RWFLAG = END LIST FLAG
+       SZL CLA
+       JMP     ENDUIO  /NO MORE VARIABLES - TERMINATE
+       ISZ     CHRCTR  /BUMP COUNTER
+       JMP     BFINCR  /ROOM IN BUFFER - MOVE VARIABLE
+       JMS     UDOIO   /GET A NEW BUFFER
+       JMP     RSETBP  /RESET BUFFER POINTERS AND COUNTERS
+
+ENDUIO,        TAD     RWFLAG  /COME HERE WHEN I/O LIST EXHAUSTED
+       SPA CLA         /WRITE?
+       JMS     UDOIO   /YES - WRITE OUT THE LAST BUFFER
+       JMP I   [ENDIO  /RESTORE DSRN ENTRY AND QUIT
+
+RECCTR,        0
+\f/DIRECT-ACCESS I/O
+
+RWDACC,        JMS I   [RWINIT /"READ(N'R)" OR "WRITE(N'R)"
+       1000            /DIRECT ACCESS IS UNFORMATTED I/O
+       TAD I   XR
+       DCA     T       /GET BLOCKS/RECORD FACTOR FROM D.A. TABLE
+       JMS I   [ARGLD  /GET RECORD NUMBER
+       JMS I   [FFIX   /CONVERT TO INTEGER
+       TAD     T
+       TAD     ACI
+       ISZ     T       /MULTIPLY RECORD NUMBER BY BLOCKS/RECORD
+       JMP     .-2     /TO GET RELATIVE BLOCK NUMBER
+       DCA     RELBLK
+       TAD I   XR
+       SNA             /THIS LOC SHOULD NOT BE ZERO!
+DAERR, JMS I   ERR
+       DCA     FGPBF   /IT SHOULD BE AN FSTA + THE FIELD
+       TAD I   XR      /IN WHICH THE CONTROL VARIABLE IS
+       DCA     BIOPTR  /STORED. THE NEXT WORD IS THE ADDRESS
+       JMS I   [FPGO   /OF THE CONTROL VARIABLE IN THAT FIELD
+       FADD1           /ADD 1 TO RECORD # AND STORE IN CONTROL VAR
+       TAD     DUMPIT  /*K* "DCA T" SAME AS "CLA" HERE
+       JMP     UNFIO   /NOW GO DO A REGULAR BINARY READ/WRITE
+
+UDOIO, 0
+       ISZ     RECCTR  /BUMP NUMBER OF RECORDS TRANSFERRED
+       TAD     BADFLD
+       AND     [7400
+       TAD     [377    /FORM POINTER TO LAST WORD IN BUFFER
+       DCA     BIOPTR
+       TAD     RECCTR
+       JMS     BUFFLD
+       DCA I   BIOPTR  /FOR WRITE, PUT RECORD NUMBER IN 256TH WORD
+UDOIOL,        DCA     CHRPTR
+       AC4000
+       AND     RWFLAG
+       JMS I   [MASSIO /DO I/O (CHRPTR=0 TO FORCE I/O)
+       JMS     BUFFLD
+       TAD     RECCTR
+       CMA STL         /FOR READ, CHECK THE INPUT
+       TAD I   BIOPTR  /SEQUENCE NUMBER TO MAKE SURE IT IS
+       CDF 0           /NO LARGER THAN THE ONE WE EXPECT.
+SEQCHK,        SZL CLA         /*K* IF IT IS LARGER THIS IMPLIES THAT WE
+       JMP I   UDOIO   /ARE STILL IN THE MIDDLE OF THE LAST
+       JMP     UDOIOL  /RECORD AND SO WE READ AGAIN.
+\f/DEFINE FILE PROCESSOR
+
+DFINE, JMS I   [RWINIT /SET UP A POINTER INTO THE D.A. TABLE
+       1000            /DIRECT ACCESS I/O IS UNFORMATTED
+       JMS I   [ARGLD  /GET NUMBER OF RECORDS
+       JMS I   [FFIX
+       TAD     ACI
+       CIA
+DUMPIT,        DCA     T       /SAVE IT FOR MULTIPLY
+       JMS I   [ARGLD  /GET THE NUMBER OF WORDS/RECORD
+       JMS I   [FPGO   /CONVERT WORDS TO BLOCKS
+       FWTOBL
+       JMS I   [FFIX   /CONVERT TO INTEGER
+       ISZ     ACI
+       TAD     ACI     /MULTIPLY THE NUMBER OF BLOCKS/RECORD
+       ISZ     T       /BY THE NUMBER OF RECORDS
+       JMP     .-2
+       DCA     RELBLK  /TO GET THE FILE LENGTH IN BLOCKS
+       TAD     ACI
+       CIA
+       DCA I   XR      /STORE NUMBER OF BLOCKS/RECORD
+       JMS I   [ARGLD  /GET POINTER TO CONTROL VARIABLE
+       TAD     FGPBF
+       TAD     (FSTA-FLDA      /CHANGE A LOAD TO A STORE
+       DCA I   XR      /SAVE "FSTA CONTROL-VARIABLE"
+       TAD     BIOPTR
+       DCA I   XR
+       TAD     TOTBLK
+       CMA CLL
+       TAD     RELBLK  /MAKE SURE WE HAVE ROOM FOR THE FILE
+SZLCLA,        SZL CLA
+DFERR, JMS I   ERR     /WE DON'T
+       AC7776
+       AND     FFLAGS
+       IAC             /FORCE "END-FILED" BIT FOR CLOSE
+       JMP I   (SETTOT /SET LENGTH AND EXIT
+       PAGE
+\f/SWAPPER AND ERROR ROUTINE
+
+SWAP,  JMS I   [FETPC  /SWAPPER CALLING SEQUENCE:
+       DCA     T       /       TRAP3 SWAP
+       TAD     T       /       ADDR OVLY*4000000+LVL*100000+ENTRYADR
+       AND     [7
+       TAD     (JA
+       DCA     STRTUP  /STORE JA TO ENTRY POINT
+       JMS I   [FETPC
+       DCA     STRTUP+1
+       TAD     T
+       AND     [70
+       CLL RAR         /FORM 4*LVL
+       TAD     (OVLYTB /INDEX INTO LEVEL TABLE
+       DCA     ADR
+       TAD     T
+       AND     [7400
+       DCA     T       /T CONTAINS OVERLAY NUMBER IN BITS 0-3
+       CDF 0           /WATCH D.F.!
+       TAD I   ADR
+       TAD     T       /SEE IF THIS OVERLAY IS IN CORE
+       SNA CLA
+       JMP     ITSIN   /YES - DON'T LOAD
+       TAD     T
+       CIA
+       DCA I   ADR     /MARK THIS OVERLAY IN CORE (OPTIMIST)
+       ISZ     ADR
+       TAD I   ADR
+       AND     [7400
+       DCA     OVADR   /SAVE INITIAL OVERLAY LOAD ADDRESS
+       TAD I   ADR
+       AND     [70
+       DCA     OVIOW   /AND FIELD
+       ISZ     ADR
+       TAD I   ADR     /GET STARTING BLOCK OF THIS LEVEL
+       DCA     OVBLK
+       ISZ     ADR
+       TAD I   ADR
+       DCA     OVLEN   /STORE LENGTH OF OVERLAY IN BLOCKS
+OVADLP,        TAD     T       /LEVEL STARTING BLOCK +
+       SNA             /(OVERLAY #) * (OVERLAY LENGTH)
+       JMP     LOADOV  /= OVERLAY STARTING BLOCK
+       TAD     [7400
+       DCA     T
+       TAD     OVBLK
+       TAD     OVLEN
+       DCA     OVBLK
+       JMP     OVADLP
+\f/SWAPPER - CONTINUED
+
+LOADLP,        DCA     OVLEN   /STORE UPDATED OVERLAY LENGTH
+       TAD     OVIOW   /GET LAST READ CONTROL WORD
+       RAL
+       AND     [7400   /CONVERT BLOCK COUNT TO WORD COUNT
+       TAD     OVADR   /INCREMENT OVERLAY LOAD ADDRESS (LINK = 0)
+       DCA     OVADR
+       RTL
+       RTL             /USE THE CARRY
+       TAD     OVIOW   /TO INCREMENT THE LOAD FIELD IF NECESSARY
+       AND     [70
+       DCA     OVIOW   /OVIOW CONTAINS ONLY THE LOAD FIELD NOW
+
+LOADOV,        TAD     OVADR
+       CIA             /LOTSA CALCULATIONS HERE - OS/8 HANDLERS
+       SNA             /CAN'T READ MORE THAN 15 BLOCKS AT A TIME
+       TAD     [7400   /AND CANNOT READ OVER FIELD BOUNDARIES
+       CLL RTL
+       RTL             /SO WE MUST BREAK UP THE OVERLAY READ
+       CMA CML RAL     /INTO SEVERAL SMALL READS OF MAXIMAL LENGTH.
+       TAD     OVLEN   /THE NUMBER OF BLOCKS TO READ IS GIVEN BY:
+       CMA             /MINIMUM(B,L,15)
+       SMA             /WHERE B IS THE # OF BLOCKS LEFT IN THIS FIELD
+       CLA             /AND L IS THE # OF BLOCKS LEFT IN THE OVERLAY
+       TAD     OVLEN   /AND 15 IS THE # OF BLOCKS A HANDLER CAN READ
+       DCA     T       /       ANSWER IN T
+       TAD     T
+       CLL RTR
+       RTR
+       RTR             /TURN NUMBER OF BLOCKS INTO 0S/8 BLOCK COUNT
+       TAD     OVIOW
+       DCA     OVIOW   /ADD FIELD BITS AND STORE AS I/O CONTROL WD
+       TAD     OVHCDW  /GET OVERLAY HANDLER CODE WORD
+       JMS I   (GETHND /LOAD HANDLER INTO FIELD 0
+       JMS I   OVHND
+OVIOW, 0
+OVADR, 0
+OVBLK, 0
+OVERR, JMS I   ERR     /WHOOPS - OVERLAY READ ERROR
+       JMS     RECOVR  /CLEAR ANY NASTY FLAGS LEFT BY HANDLER
+       TAD     T
+       TAD     OVBLK
+       DCA     OVBLK   /UPDATE BLOCK NUMBER
+       TAD     T
+       CIA
+       TAD     OVLEN   /BUMP DOWN RECORD COUNT
+       SZA             /SEE IF WE ARE DONE
+       JMP     LOADLP  /NO - PREPARE FOR NEXT READ
+\f/OVERLAY IN CORE - EXECUTE IT
+
+ITSIN, JMS I   [FPGO   /START UP FPP
+       STRTUP          /AND JA TO ENTRY POINT
+
+TRAP5I,
+TRAP6I,
+TRAP7I,
+FPAUSE,
+FPPERR,        JMS I   ERR     /SHOULD NEVER GET HERE
+
+STRTUP,        0;0             /JA ENTRY
+OVLEN, 0
+OVHND, 0               /SET BY LOADER
+OVHCDW,        0               /SET BY LOADER
+
+RECOVR,        0               /ROUTINE TO CLEAN UP ANY FLAGS
+       DCA     CTCINH  /LEFT ON BY SLOPPY OS/8 HANDLERS.
+YRCOVR,        NOP
+       NOP
+       NOP
+       NOP             /RIGHT NOW I DON'T KNOW OF ANY.
+       NOP
+       NOP
+       NOP
+       NOP
+       ION
+       JMP I   RECOVR
+
+FSTTMP,        FSTA+LONG
+       FTEMP
+       FEXIT
+
+TEN,   4;2400;0;0;0;0  /10.0D0
+FLTG85,        7;2520;0        /85.0
+       PAGE
+\f/INPUT BUFFER - CONTAINS STARTUP CODE
+
+INBUFR,        -206            /LENGTH
+       0               /INPUT LINE BUFFER - FIRST A LITTLE PADDING,
+
+/RTS EXECUTION INITIALIZATION - IN INPUT BUFFER
+
+FPSTRT,        6601            /CLEAR DF32 FLAG
+       PCF             /HSP FLAG
+       RRB             /HSR FLAG
+PP7600,        7600            /CLEAR READER CHAR
+       6135            /CLEAR KW12 OR DK8-EP EVENT FLAGS
+       CLA
+       6132            /STOP KW12 CLOCKS
+       6134            /DISABLE KW12 INTERRUPTS
+       6530            /CLEAR AD8-EA FLAGS
+       6050            /CLEAR VC8/E FLAG
+       6500            /DISABLE XY8/E INTERRUPTS
+       STA
+       6130            /DISABLE DK8-EP INTERRUPTS
+       CLA             /LEAVE SPACE FOR ADDITIONAL CLEARS
+       NOP
+       NOP
+       NOP
+       NOP
+       NOP
+       NOP
+       NOP
+       NOP
+       NOP
+       NOP
+       NOP
+       DCA     EOLSW
+LDPROG,        JMS I   [FPGO   /START UP FPP OR PSEUDO-FPP
+       STSWAP
+HLTNOP,        NOP             /SET TO HLT IF /H SPECIFIED,
+       JMP     PRTCR   /SKP IF /P SPECIFIED
+       TAD     .-1
+       DCA     LDPROG  /BYPASS LOADING ON STARTUP
+       TAD     PCHWD   /HLT
+       DCA I   (PDPXIT+1
+\f/ROUTINE TO PUNCH RTS+PROGRAM ON FORTRAN UNIT 9 (UNCOMMENTED)
+
+PPTR,  TAD     P11
+PCKSUM,        DCA     ACI
+       JMS I   (LDDSRN
+       SMA CLA
+       JMP I   [UNTERR
+       JMP     LDRTLR
+FLDLP, DCA     PPTR
+       DCA     PCKSUM
+       TAD     (100
+       JMS     SIXOUT
+       JMS     SIXOUT
+       TAD     FLD
+       AND     [70
+JFMOUT,        JMS I   [FMTOUT /*K* ONLY WORKS FOR FIELD 0-3
+       TAD     (100
+       JMS     SIXOUT
+       JMS     SIXOUT
+FLD,   CDF 0
+       TAD I   PPTR
+       CDF 0
+       JMS     PCHWD
+       ISZ     PPTR
+P11,   11
+       ISZ     PCTR
+       JMP     FLD
+       TAD     PCKSUM
+       JMS     PCHWD
+       TAD     FLD
+       TAD     (10
+       DCA     FLD
+LDRTLR,        TAD     PP7600
+       DCA     ACH
+       TAD     [200
+       JMS     SIXOUT
+       ISZ     ACH
+       JMP     .-3
+       ISZ     FCNT
+       JMP     FLDLP
+       TAD     (6000
+       DCA     FFLAGS
+       DCA I   (ENDFLS /*K* SAME KLUDGE AS CALXIT
+       JMS I   (ENDFL
+       DCA I   (PDPXIT+1       /WIPE HALT SO WE CAN RETURN TO OS/8
+       JMP I   (PDPXIT-1
+\fPCHWD,        HLT
+       DCA     ACH
+       TAD     ACH
+       RTR
+       RTR
+       RTR
+       AND     [77
+       JMS     SIXOUT
+       TAD     ACH
+       AND     [77
+       JMS     SIXOUT
+       JMP I   PCHWD
+
+SIXOUT,        0
+       DCA     T
+       CLA IAC
+       DCA     EOLSW
+       TAD     PCKSUM
+       TAD     T
+       DCA     PCKSUM
+       TAD     T
+       TAD     (-300
+       JMS I   [FMTOUT
+       JMP I   SIXOUT
+
+PCTR,  200             /DON'T PUNCH 07600!
+FCNT,  0
+\fPRTCR,        TAD     (215
+       JMS I   PTTY    /PRINT CARRIAGE RETURN
+       TAD     JFMOUT
+       DCA I   (ERRENB /ENABLE ERROR TRACEBACK
+       JMS I   [FPGO
+       STJUMP          /NOW JUMP TO THE NEWLY-LOADED CODE
+STSWAP,        TRAP3           /TRAP3
+       SWAP
+       0
+       .+1
+       TRAP3
+       HLTNOP
+       PAGE
+STJUMP,        0
+       0
+       ZBLOCK  INBUFR+210-.    /PAD OUT TO END OF BUFFER
+\f/OVERLAY AND DSRN TABLES
+
+       *.-4    /FIRST ENTRY IN OVLYTB ONLY NEEDED TO LOAD MAIN PGM
+
+OVLYTB,        ZBLOCK  40      /OVERLAY TABLE
+
+DSRN,  PTR;    ZBLOCK  10
+       PTP;    ZBLOCK  10
+       LPT;    ZBLOCK  10
+       TTY;    0;0
+       1234            /*K* PREVENT PROBLEM IN
+       ZBLOCK  5       /RWINIT INVOLVING WRITE
+                       /AFTER READ ON TELETYPE
+       ZBLOCK  55
+
+       ZBLOCK  12      /FORMAT PARENTHESIS PUSHDOWN LIST
+FMTPDL,        0               /GUARD WORD
+       PAGE
+\f/SOFTWARE FLOATING POINT ROUTINES WHICH ARE USED
+/EVEN IF FLOATING HARDWARE IS PRESENT
+
+/** MUST NOT DESTROY FAC! **
+
+FFIX,  0               /ROUTINE TO FIX FAC
+       STA             /ANSWER IS RETURNED IN ACI
+TADACX,        TAD     ACX     /ABS(FAC) MUST BE LESS THAN 2048
+       CLL             /DETERMINE IF FAC EXPONENT IS
+       TAD     (-13    /BETWEEN 1 AND 14
+       SNA
+       JMP     FIXBIG  /14 IS A SPECIAL CASE
+EAEFIX,        DCA     ACI
+       SZL
+       JMP     FIXDNE  /EXP GT 14 OR LT 1 - RETURN 0
+       TAD     ACH
+       JMP     FIXISZ
+FIXLP, CLL             /0 IN LINK
+       SPA             /IS IT LESS THAN 0?
+       CML             /YES-PUT A 1 IN LINK
+       RAR             /SCALE RIGHT
+FIXISZ,        ISZ     ACI     /DONE YET?
+       JMP     FIXLP   /NO
+FIXDNE,        DCA     ACI     /RETURN WITH ANSWER IN ACI
+       JMP I   FFIX    /RETURN
+
+FIXBIG,        TAD     ACL     /IF EXP IS 14 WE MUST SHIFT AC FRACTION
+       RAL             /LEFT ONE PLACE TO INTEGERIZE IT.
+       CLA
+       TAD     ACH
+       RAL
+       JMP     FIXDNE  /STORE ANSWER AND RETURN
+
+SETB,  TAD     DATAF
+       DCA I   (BASCDF /SET BASE PAGE LOCATION
+       TAD     ADR
+       DCA     BASADR
+       JMP I   FPNXT
+\f/
+/SHIFT FAC LEFT 1 BIT
+/
+AL1,   0
+       TAD     AC1     /GET OVERFLOW BIT
+       CLL     RAL     /SHIFT LEFT
+       DCA     AC1     /STORE BACK
+       TAD     ACL     /GET LOW ORDER MANTISSA
+       RAL             /SHIFT LEFT
+       DCA     ACL     /STORE BACK
+       TAD     ACH     /GET HI ORDER
+       RAL
+       DCA     ACH     /STORE BACK
+       JMP I   AL1     /RETN.
+/
+/SHIFT FAC RIGHT-ENTER WITH COUNT-1 IN AC (POSITIVE)
+/
+ACSR,  0
+       CMA             /AC CONTAINS COUNT-1
+       DCA     AC0     /STORE COUNT
+LOP1,  TAD     ACH     /GET HIGH ORDER MANTISSA
+       CLL
+       SPA             /PROPAGATE SIGN
+       CML
+       RAR             /SHIFT RIGHT 1, PROPAGATING SIGN
+       DCA     ACH     /STORE BACK
+       TAD     ACL     /GET LOW ORDER
+       RAR             /SHIFT IT
+       DCA     ACL     /STORE BACK
+       ISZ     ACX     /INCREMENT EXPONENT
+       NOP
+       ISZ     AC0     /DONE?
+       JMP     LOP1    /NO-LOOP
+       RAR
+       DCA     AC1     /SAVE 1 BIT OF OVERFLOW
+       JMP I   ACSR    /YES-RETN-AC=L=0
+/
+/FLOATING NEGATE
+/
+FFNEG, 0               /(USED AS A TEM. BY OUTPUT ROUTINE)
+       TAD     ACL     /GET LOW ORDER FAC
+       CLL CMA IAC     /NEGATE IT
+       DCA     ACL     /STORE BACK
+       CML     RAL     /ADJUST OVERFLOW BIT AND
+       TAD     ACH     /PROPAGATE CARRY-GET HI ORD
+       CLL CMA IAC     /NEGATE IT
+       DCA     ACH     /STORE BACK
+       JMP I   FFNEG
+\fOADD, 0               /ADD OPERAND TO FAC
+       CLL
+       TAD     AC2     /ADD OVERFLOW WORDS
+       TAD     AC1
+       DCA     AC1
+       RAL             /ROTATE CARRY
+       TAD     OPL     /ADD LOW ORDER MANTISSAS
+       TAD     ACL
+       DCA     ACL
+       RAL
+       TAD     OPH     /ADD HI ORDER MANTISSAS
+       TAD     ACH
+       DCA     ACH
+       JMP I   OADD    /RETN.
+
+FETPC, 0
+       ISZ     PC
+       JMP     PCCDF   /NO FIELD BUMP
+       ISZ     APT     /BUMP FIELD FOR FPP RESTART (IN CASE FPP EXISTS)
+FPC10, 10              /PROTECTION FOR ISZ
+       TAD     PCCDF
+       TAD     FPC10
+       DCA     PCCDF
+PCCDF, HLT
+       TAD I   PC
+       JMP I   FETPC
+
+EEPUT, STL             /EXTENDED PRECISION STORE
+EEGET, DCA     ADR     /EXTENDED PRCISION FETCH
+       TAD     [-6
+       DCA     DATCDF
+       SNL
+       AC2000          /SET UP "TAD ACX" OR "DCA ACX"
+       TAD     TADACX
+       DCA     EEINST
+EELOOP,        SNL             /LINK=1 MEANS STORE
+       TAD I   ADR
+EEINST,        HLT
+       SZL
+       DCA I   ADR
+       ISZ     ADR
+       SKP
+       JMS I   (DFBUMP
+       ISZ     EEINST
+       ISZ     DATCDF
+       JMP     EELOOP
+       JMP I   FPNXT
+
+FSTTM2,        FSTA+LONG
+       FTEMP2
+       FEXIT
+/
+FTEMP, ZBLOCK  6
+/
+       PAGE
+\f/RUN-TIME SYSTEM ERROR LIST
+
+ERRLST,        VARGER; ARGMSG
+       UERR;   UMSG
+       FPOERR; FPOMSG
+       FMTERR; FMTMSG
+       UNTERR; UNTMSG
+       CTLBER; CTLBMS
+       INER;   INMSG
+       IOVFLO; IOVMSG
+       IOERR;  IOMSG
+       DAERR;  DAMSG
+       FPPERR; FPPMSG
+       OVERR;  OVMSG
+       EOFERR; INEMSG
+       FPOVER; OFLMSG
+       DFERR;  DFMSG
+       -1;     DV0MSG  /BY ELIMINATION
+\f/RTS ERROR MESSAGES
+
+ARGMSG,        TEXT    /BAD ARG/
+UMSG,  TEXT    /USER ERROR/
+FPOMSG,        TEXT    /PARENS TOO DEEP/
+FMTMSG,        TEXT    /FORMAT ERROR/
+UNTMSG,        TEXT    /UNIT ERROR/
+INMSG, TEXT    /INPUT ERROR/
+OVMSG, TEXT    /OVERLAY /
+       *.-1
+IOMSG, TEXT    %I/O ERROR%
+DAMSG, TEXT    /NO DEFINE FILE/
+FPPMSG,        TEXT    /FPP ERROR/
+INEMSG,        TEXT    /EOF ERROR/
+DV0MSG,        TEXT    /DIVIDE BY 0/
+DFMSG, TEXT    /D.F. TOO BIG/
+IOVMSG,        TEXT    /FILE  /
+       *.-1
+OFLMSG,        TEXT    /OVERFLOW/
+CTLBMS,        TEXT    /^B/
+
+USRERR,        TAD     ERRFLG  /USER ERROR - OPTIONALLY NON-FATAL
+       DCA     FATAL
+UERR,  JMS I   ERR     /PRINT MESSAGE
+       JMP I   [RETURN /IF NON-FATAL, CONTINUE PROCESSING
+ERRFLG,        0               /SET TO NON-ZERO IF /E SWITCH SPECIFIED
+
+TRPPRT,        TRAP3           /CODE WHICH IS LOADED INTO PROGRAM PROLOGUES
+       PRTNAM          /BY THE ERROR TRACEBACK ROUTINE
+       PAGE
+\fMAKCDF,       0               /ROUTINE TO MAKE A CDF FROM AC9-11
+       RTL
+       RAL
+       AND     [70
+       TAD     ERCDF   /STRAIGHTFORWARD ENOUGH, ISN'T IT?
+       JMP I   MAKCDF
+
+RD2WR, 0               /ROUTINE CALLED WHEN SWITCHING
+       STA             /FROM READ TO WRITE. (CALLED ONLY ONCE!)
+       TAD     RELBLK  /BUMP BLOCK # BACK FROM "NEXT BUFFER'S BLOCK #"
+       DCA     RELBLK  /TO "THIS BUFFER'S BLOCK #".
+       TAD     CHRCTR  /HOWEVER, IF WE ARE AT THE VERY END OF A
+       IAC             /BUFFER, WRITE ROUTINE EXPECTS US TO
+       SZA CLA         /BE AT THE BEGINNING OF THE NEXT BUFFER,
+       JMS I   [MASSIO /SO RE-READ THIS BUFFER AND SET POINTERS
+       JMP I   RD2WR
+
+/RUN-TIME-SYSTEM ERROR ROUTINE
+
+ERROR, 0
+ERCDF, CDF 0
+       CLA
+       TAD     (ERRLST-2
+       DCA     XR
+ERRLP, ISZ     XR      /SEARCH ERROR LIST FOR CALLING ADDRESS
+       TAD I   XR      /ERROR LIST CONTAINS
+       CMA
+       SZA             /CALLING ADDRESSES AND
+       TAD     ERROR   /CORRESPONDING MESSAGES
+       SZA CLA
+       JMP     ERRLP
+       TAD I   XR
+       DCA I   (FMTADR
+       DCA I   (FMTDF
+       TAD     PTTY
+       DCA     HAND    /QUICK FUDGE FOR TTY OUTPUT
+       DCA     HCODEW  /TO SET CARRIAGE CONTROL
+       AC4000
+       DCA     RWFLAG
+       JMS I   [EOLINE /TYPE CARRET AND SET EOLSW
+       DCA     FMTBYT  /INITIALIZE MESSAGE PTR
+ERPTLP,        JMS I   [FMTOUT /OUTPUTS LF FIRST TIME
+       JMS I   [FMTGCH /GET CHAR USING FORMAT ROUTINES
+       ISZ     FMTBYT
+       SZA
+       JMP     ERPTLP  /LOOP UNTIL 0 CHAR
+\f/PRINT ROUTINE NAME AND LINE NUMBER
+
+PRTNAM,        TAD     [40
+ERRENB,        JMP I   E7605   /*K* IN CASE INITIALIZATION OR /P GET ERRORS
+/              PREVIOUS LINE REPLACED WITH:
+/      JMS I   [FMTOUT /OUTPUT A BLANK(LF ON EXTRA LINES)
+       JMS I   [FPGO   /START UP FPP
+       GTNMPT          /GET POINTER TO NAME IN FAC
+       TAD     ACH
+       DCA I   (FMTDF  /SET UP FORMAT GET CHARACTER ROUTINE
+       TAD     ACL     /TO GET CHARACTERS OF ROUTINE NAME
+       DCA I   (FMTADR
+       DCA     FMTBYT
+       TAD     [-6
+       DCA     ISN     /6 CHARACTER NAME
+PRTNML,        JMS I   [FMTGCH
+       SNA
+       TAD     [40     /AVOID PRINTING RANDOM @S
+       JMS I   [FMTOUT /GET AND PRINT A CHARACTER
+       ISZ     FMTBYT
+       ISZ     ISN
+       JMP     PRTNML
+       TAD     [40
+       JMS I   [FMTOUT /SEPARATE THE NAME BY A SPACE
+       TAD     [-4     /FROM THE LINE NUMBER.
+       DCA     ISN
+PTLNLP,        TAD     ISN+1
+       CLL RTL
+       RAL
+       DCA     ISN+1   /PRINT LINE NUMBER IN OCTAL
+       TAD     ISN+1   /BECAUSE THAT IS THE WAY IT APPEARS
+       RAL             /IN THE FORTRAN PROGRAM LISTING
+       AND     [7
+       JMS I   (DIGIT
+       ISZ     ISN
+       JMP     PTLNLP
+
+       JMS I   [EOLINE /OUTPUT FINAL CR
+       TAD     FATAL
+       SNA CLA         /FATAL ERROR?
+       JMP     TRCBAK  /YES - GIVE FULL TRACEBACK
+       DCA     FATAL   /"NON-FATAL" FLAG MUST BE SET EACH TIME
+       JMP I   ERROR
+TRCBAK,        JMS I   [FPGO   /START UP FPP
+       UP1LEV          /MOVE UP TO CALLING ROUTINE
+                       /FPP CODE DOES A "TRAP3 PRTNAM"
+ISN,   0;0
+\f/FPP CODE FOR ERROR ROUTINE
+
+GTNMPT,        STARTD
+       XTA     0       /LOAD LINE NUMBER FROM XR 0
+       FSTA+LONG
+       ISN             /STORE AWAY
+       FLDA+BASE 10    /LOAD POINTER TO PROLOGUE
+       FSUB+LONG
+       THREE           /NAME IS 3 LOCATIONS BEFORE PROLOGUE
+       STARTF          /FOR NON-FPP VERSION
+THREE, FEXIT;3         /*K* DEPENDS ON FACT THAT FEXIT=0
+
+UP1LEV,        STARTD
+       FLDA+BASE 11    /GET THE UPWARD POINTER
+       JNE
+       NOTMN           /ZERO MEANS MAIN PROGRAM
+       TRAP3
+E7605, 7605            /GO AWAY IF MAIN PROGRAM
+NOTMN, FSTA+BASE 0
+       LDX     1
+       2               /WE WILL STORE A "TRAP3 PRTNAM"
+       FLDA+LONG       /IN THE FIFTH LOCATION OF THE PROLOGUE,
+       TRPPRT
+       FSTA+IND 0+10   /WHERE THE FIRST 4 LOCS WERE A SETX AND SETB.
+       FLDA+BASE 0     /GET THE PROLOGUE ADDRESS AGAIN
+       JAC             /JUMP TO IT.
+
+ACMDGT,        FMUL+LONG
+       TEN
+       FSTA+LONG
+       FTEMP
+       FLDA+LONG
+       DGT             /GET UNNORMALIZED DIGIT INTO AC
+       FNORM           /NORMALIZE IT
+FADTMP,        FADD+LONG
+       FTEMP
+       FEXIT
+LPBUFR,        ZBLOCK  4
+       LPBUF2
+       PAGE
+\fHPLACE,       /ZBLOCK 400     /HANDLER SWAP AREA
+
+/VARIOUS INITIALIZATION STUFF OVERLAYING THE RTS HANDLER AREA
+
+QLHDR, 0               /SHOULD BE A 2 FOR A LOADER IMAGE
+QRTSWP,        ZBLOCK  2       /INITIAL SWAP ARGS TO LOAD USER MAIN
+QHGHAD,        ZBLOCK  2       /HIGHEST ADDRESS USED
+QVERNO,        0               /LOADER VERSION #
+QDPFLG,        0               /"PROGRAM USES D.P." FLAG
+QUSRLV,        ZBLOCK  40      /USER OVERLAY INFO
+
+/EAE OVERLAY TO FIX AND FLOAT
+
+EFXFLT,        RELOC   EAEFIX
+
+FIXEAE,        CMA
+       DCA     FIXSH   /SHIFT COUNT BETWEEN 0 AND 12
+       SZL
+       JMP     FIX0    /NOT INTEGERIZABLE
+       TAD     ACH
+       ASR
+FIXSH, 0
+FIX0,  DCA     ACI
+       JMP I   FFIX
+
+FXFLTC=        .-FIXEAE
+       RELOC
+\f/SUBR TO DETERMINE MACHINE SIZE - RETURNS NUMBER OF
+/BANKS IN AC.
+/MUST RUN IN FIELD 0.
+
+CORE,  0
+       TAD     C6203
+       RDF
+       DCA     CORRET
+CORELP,        CDF 0           /NEEDED FOR PDP-8L
+       TAD I   C7777
+       AND     COR70   /IF BITS 6-8 OF LOCATION 7777 ARE NOT ZERO,
+       CLL RTR         /THEY SPECIFY THE LAST FIELD OF CORE
+       RAR             /WHICH WE SHOULD USE.
+       SZA
+       JMP     CORRET  /SO RETURN THAT AMOUNT
+       TAD TRYFLD      /GET FLD TO TST
+       CLL RTL
+       RAL
+       AND     COR70   /MASK USEFUL BITS
+       TAD     CORELP
+       DCA     COR706  /SET UP CDF TO FLD
+COR706,        0
+       TAD I   CORLOC  /SAV CURRENT CONTENTS
+       NOP             /HACK FOR PDP-8
+       DCA     .-3
+       TAD     .-2     /7000 IS A GOOD PATTERN
+       DCA I   CORLOC
+COR70, 70              /HACK FOR PDP-8.,NO-OP
+       TAD I   CORLOC  /TRY TO READ BK 7000
+CO7400,        7400            /HACK FOR PDP-8,.NO-OP
+       TAD     CO7400  /GUARD AGAINST WRAP AROUND
+       TAD     CORLOC+1        /TAD 1400
+       SZA CLA
+       JMP     .+5     /NON EXISTENT FLD EXIT
+       TAD     COR706  /RESTORE CONTENS DESTROYED
+       DCA I   CORLOC
+       ISZ     TRYFLD /TRY NXT HIGHER FLD
+       JMP     CORELP
+       STA
+       TAD     TRYFLD
+CORRET,        0
+       JMP I   CORE
+CORLOC,        CO7400          /ADR TO TST IN EACH FLD
+       1400            /7000+7400+1400=0
+TRYFLD,        1               /CURRENT FLD TO TST
+C6203, 6203
+C7777, 7777
+
+DPTEST,        STARTE          /EXECUTED BY FPP DURING INITIALIZATION
+       FEXIT           /CHECK WHETHER DOUBLE PRECISION ENABLED
+\f/TABLE OF MODIFICATIONS TO MAKE TO FRTS FOR BACKGROUND OPERATION
+/UNDER RTS-8.  FORMAT OF TABLE IS: POINTER TO FIRST WORD OF BLOCK - 1
+/ (0 TERMINATES) FOLLOWED BY LIST OF REPLACEMENT WORDS (0 TERMINATES).
+
+BKRLST,        YLPT-1          /LINE PRINTER OUTPUT ROUTINE
+       RELOC   YLPT
+       LLS
+       CLA             /DON'T DO RING-BUFFERING - JUST "OUTPUT" CHAR.
+       JMS     CTCBCK  /CHECK FOR ^C OR ^B
+       JMP I   LPT
+FJCTCT,        JMS     CTCBCK  /COME HERE FROM INTERPRETED FPP JUMPS
+       JMP I   FPNXT   /CHECK FOR ^C,^B AND RETURN TO INTERPRETER
+       RELOC
+       0
+
+       YPTP-1          /PAPER-TAPE PUNCH ROUTINE
+       CLA             /ALL PAPER-TAPE I/O ILLEGAL
+       0
+       YPTR-1          /PAPER TAPE READER ROUTINE
+       CLA             /ALL PAPER-TAPE I/O ILLEGAL
+       0
+
+       YTTY-1          /TELETYPE INPUT/OUTPUT ROUTINE
+       RELOC   YTTY
+       SNA
+       JMP     KBDRTS  /AC=0 MEANS INPUT
+       TSF
+       JMP     .-1     /HANG UNTIL OUTPUT BUFFER NOT FULL
+       TLS
+       CLA
+       JMS     CTCBCK  /CHECK FOR ^C OR ^B TYPED
+       JMP I   TTY
+KBDRTS,        KSF
+       JMP     .-1     /HANG UNTIL CHAR RECEIVED
+       JMS     CTCBCK  /CHECK FOR ^C OR ^B
+       KRB
+       AND     KB177   /STRIP PARITY
+       TAD     KB177
+       IAC             /NOW FORCE PARITY BIT ON (177+1=200)
+       JMP I   TTY
+
+CTCBCK,        .               /*K* CAN'T BE 0!
+       KRS             /PEEK AT NEXT CHAR IN BUFFER
+       AND     KB177
+       TAD     KBM2
+       CLL RAR
+       SNA CLA         /IS IT ^C OR ^B?
+       KSF             /AND IS IT REALLY PENDING?
+       JMP I   CTCBCK  /NO - JUST RETURN WITH AC=0
+       JMP     BEEORC  /TERMINATE JOB - LINK HAS ^C/^B FLAG
+KB177, 177
+KBM2,  -2
+       RELOC
+       0
+\f/CONTINUATION OF TABLE OF RTS-8 OVERLAYS TO FRTS
+
+       YHIOF-1         /"GET OS/8 HANDLER" ROUTINE
+       NOP             /ELIMINATE "IOF" INSTRUCTION
+       0
+
+       YRCOVR-1        /"RECOVER FROM OS/8 HANDLER" ROUTINE
+       RELOC   YRCOVR
+       JMP I   RECOVR  /SHORT-CIRCUIT PORTION OF ROUTINE WHICH DOES
+       RELOC           /AN "ION"
+       0
+
+       YFJMP-1         /FPP INTERPRETER - SUCCESSFUL JUMP SECTION
+       FJCTCT          /TEST FOR ^C OR ^B TYPED BEFORE
+       0               /RETURNING TO THE INTERPRETER
+
+       0               /** LIST TERMINATOR **
+\f/ERROR MESSAGES FOR RUN-TIME LOADER - IN HANDLER BUFFER
+/*K* CANNOT LOAD BELOW HPLACE+200 AS HPLACE-HPLACE+177 ARE DESTROYED BY HEADER!
+
+       IFNZRO  .-HPLACE-200&4000       <__ERROR__>
+
+NOLI,  TEXT    /NOT A LOADER IMAGE/
+NONMSG,        TEXT    /NO NUMERIC SWITCH/
+FILMSG,        TEXT    /FILE ERROR/
+SYSMSG,        TEXT    /SYSTEM DEVICE ERROR/
+TOOMCH,        TEXT    /MORE CORE REQUIRED/
+TOMNYH,        TEXT    /TOO MANY HANDLERS/
+LIOEMS,        TEXT    /CAN'T READ IT!/
+NODPMS,        TEXT    /CAUTION - NO DP/
+XVERMS,        TEXT    /FRTS V/
+       *.-1
+       XVERSN&70^7+XVERSN+4060         /VERSION NUMBER IN SIXBIT
+       XPATCH&77^100+40                /PATCH LEVEL
+       TEXT    /     /
+       PAGE
+\f/FPP INTERPRETER STARTUP ROUTINE
+
+FPPINT=        .               /FOR FPP OVERLAY
+RETURN,        JMP I   FPNXT   /RETURN DOES SOMETHING DIFFERENT IF FPP PRESENT
+
+FPGO,  0
+FPGCDF,        CDF 0           /NECESSARY?
+       CLA
+       TAD     PC
+       DCA     SAVPC   /ALLOW ONE LEVEL OF RECURSIVENESS
+       TAD I   (PCCDF
+       DCA     SPCCDF
+       STA
+       TAD I   FPGO
+       DCA     PC
+       ISZ     FPGO
+       TAD     FPGCDF  /FPGO STARTS UP THE FPP FROM FIELD 0 ONLY
+       DCA I   (PCCDF
+       JMP I   FPNXT
+
+EXIT,  TAD     SAVPC
+       DCA     PC
+       TAD     SPCCDF
+       DCA I   (PCCDF  /RESTORE OLD PC
+       JMP I   FPGO    /RETURN TO PDP-8 CODE
+SAVPC, 0
+SPCCDF,        0
+
+FPXTA, TAD     [27     /XR TO AC - NORMALIZE IF FLOATING MODE
+       DCA     ACX
+       JMS     DATCDF
+       TAD I   ADR
+CLFAC, DCA     ACL
+       TAD     ACL
+       SPA CLA         /SIGN-EXTEND 12-BIT WORD
+       STA             /INTO FAC FRACTION
+       DCA     ACH
+NRMFAC,        DCA     AC1     /CLEAR OVERFLOW WORD
+       TAD     DFLG
+       SPA SNA CLA     /UNLESS WE ARE IN D.P.I. MODE,
+       JMS I   NORMX   /NORMALIZE THE FAC
+       JMP I   FPNXT
+\f/MISCELLANEOUS JUMP CLASS INSTRUCTIONS
+
+JSA,   TAD     ADR
+       DCA     PUTM
+       TAD     DATAF
+       DCA     JSCDF   /SET UP LOC TO SAVE PC IN
+       AC0002
+       TAD     ADR
+       DCA     ADR     /BUMP ADDRESS BY 2
+       RTL
+       RTL
+       TAD     DATAF
+       DCA     DATAF   /INCLUDING DATA FIELD
+JSAR,  TAD I   (PCCDF  /JSA/JSR COMMON CODE
+       CLL RTR
+       RAR
+       ISZ     PC      /BUMP PC BEFORE STORING
+       SKP
+       IAC             /INCLUDING FIELD BITS
+       TAD     (JA-2620        /FORM "JA" INSTRUCTION
+JSCDF, HLT
+       DCA I   PUTM
+       ISZ     PUTM
+       SKP
+       JMS I   (DFBUMP /BUMP TARGET ADDRESS
+       TAD     PC
+       DCA I   PUTM
+       JMP I   (DOJMP  /NOW JUMP TO DESTINATION
+
+JSR,   CLA CLL IAC
+       TAD     BASADR
+       DCA     PUTM
+       RTL
+       RTL
+       TAD I   (BASCDF /SET JSCDF&PUTM TO BASE PAGE LOC +1
+       DCA     JSCDF
+       JMP     JSAR
+
+FPJAC, TAD     ACL
+       DCA     ADR
+       TAD     ACH
+       JMS I   MCDF
+       DCA     DATAF
+       JMP I   (DOJMP
+
+SPCATX,        TAD     ACL
+       SKP
+FPLDX, JMS I   [FETPC
+       JMS     DATCDF
+       DCA I   ADR     /SET XR TO NEXT INST WD
+       JMP I   FPNXT
+\f/MORE INDEX REGISTER & AC-TO-MEMORY INSTRUCTIONS
+
+ADDX,  JMS I   [FETPC
+       JMS     DATCDF
+       TAD I   ADR     /ADD NEXT INST WD TO XR
+       JMP     FPLDX+1
+
+ATX,   TAD     DFLG    /ATX WORKS DIFFERENTLY IN D.P.I. MODE
+       SMA SZA CLA
+       JMP     SPCATX
+       JMS I   NORMX   /FAC MAY NOT BE NORMALIZED
+       JMS I   [FFIX
+       TAD     ACI
+       JMP     FPLDX+1
+
+OPMEM, DCA     AD1     /GENERAL AC-TO-MEMORY INTERPRETER
+       TAD     AD1
+       DCA     AD2
+       RDF
+       CLL RTR
+       RAR
+       TAD     KLUDGM  /FORM FSTA X INSTRUCTION
+       DCA     PUTM
+       AC2000
+       AND     INST    /TURN OP 5 TO OP 1,
+       SZA CLA
+       TAD     [3000   /     OP 7 TO OP 4.
+       TAD     [3000
+       TAD     PUTM    /STICK IN FIELD BITS
+       DCA     OPM
+       JMS I   [FPGO
+       KLUDGM
+       JMP I   FPNXT
+
+KLUDGM,        FSTA+LONG
+       FTEMP           /SAVE AC
+OPM,   0
+AD1,   0               /PERFORM OP
+PUTM,  0
+AD2,   0               /STORE RESULT
+       FLDA+LONG
+       FTEMP           /RESTORE AC
+       FEXIT
+
+NORMX, FFNOR           /*K* CHANGED TO EFFNOR IF EAE
+       PAGE
+\f/MAIN INTERPRETER LOOP
+
+NEGFAC,        JMS I   [FFNEG
+
+ICYCLE,        CLA
+       JMS I   [FETPC  /GET INST
+       DCA     INST
+       TAD     INST
+       CLL RTL
+       RTL
+       SMA             /SKIP IF BASEPAGE ADDRESSING
+       JMP     LONGI
+       AND     [7
+       TAD     BASJMP
+       DCA     OPJMP   /SAVE OPCODE CALL ADDRESS
+       TAD     INST    /DATA FIELD IS STILL SET UP
+       SZL             /SO IS LINK (WITH INSTRUCTION BIT 3)
+       JMP     BPAGEI  /INDIRECT ADDRESSING
+       CLL RAL
+       TAD     INST    /MULTIPLY BASE OFFSET BY 3
+       TAD     [200    /ELIMINATE ANY
+       AND     (777    /HIGH ORDER BITS
+IMFUDJ,        CLL             /CLL IAC IF D.P. INTEGER MODE
+       TAD     BASADR  /ADD IN BASE PAGE ORIGIN
+BASCDF,        HLT             /CDF TO BASE PAGE FIELD
+       SZL
+       JMS     DFBUMP  /BUMP DF IF ADDITION OVERFLOWED
+OPJCLL,        CLL
+OPJMP, HLT             /JMP I EXECUTIONROUTINE
+
+BPAGEI,        AND     [7
+       DCA     ADR
+       TAD     ADR
+       CLL CML RAL
+       TAD     ADR     /FORM 3*OFFSET+1
+       TAD     BASADR
+       DCA     ADR
+       RTL
+       RTL
+       TAD     BASCDF  /FORM PROPER CDF
+       DCA     ADDRLO
+ADDRLO,        HLT             /EXECUTE IT
+       TAD I   ADR     /GET FIELD BITS OF REAL ADDRESS
+       DCA     ADDRHI  /FROM 2D WORD OF BASE PAGE LOC
+       ISZ     ADR
+       SKP
+       JMS     DFBUMP  /WATCH FOR FIELD OVERFLOW
+       TAD I   ADR     /GET LOW-ORDER ADDRESS FROM 3D WORD
+       JMP     INDEX   /NOW GO DO INDEXING (IF ANY)
+\f/COME HERE IF BIT 4 OF INSTRUCTION IS OFF
+
+LONGI, AND     [7
+       SNL             /TEST BIT 3 OF INSTRUCTION
+       JMP I   (SPECAL /SPECIAL INSTRUCTION
+       TAD     BASJMP
+       DCA     OPJMP
+       TAD     INST
+       DCA     ADDRHI  /HIGH-ORDER ADDRESS BITS IN INST WD
+       JMS I   [FETPC  /NEXT INST WORD CONTAINS LOW-ORDER ADDRESS
+INDEX, DCA     ADDRLO
+       TAD     INST
+       AND     [70
+       SNA             /IS XR NUMBER 0?
+       JMP     NOINDX  /YES - NO INDEXING
+       JMS     DCDIDX  /GET XR VALUE (MAYBE INCREMENTED)
+       AC7775
+       TAD     DFLG    /GET -3 IF F, -2 IF D, -6 IF E MODE
+       DCA     DCDIDX
+       TAD     ADDRLO
+XRADLP,        CLL
+       TAD I   T
+       SZL
+       ISZ     ADDRHI
+       ISZ     DCDIDX  /ADD THE XR IN THE PROPER NUMBER OF TIMES
+       JMP     XRADLP
+       DCA     ADDRLO
+NOINDX,        TAD     ADDRHI
+       JMS I   MCDF
+       DCA     ADDRHI  /TURN HIGH-ORDER ADDRESS INTO A CDF
+ADDRHI,        HLT             /AND EXECUTE IT
+       TAD     ADDRLO
+       JMP     OPJCLL  /GO EXECUTE THE INSTRUCTION
+
+DFBUMP,        0               /BUMP DATA FIELD
+       DCA     DFTMP   /SAVE AC
+       RDF
+       TAD     (CDF 10
+       DCA     .+1
+       HLT
+       TAD     DFTMP   /RESTORE AC
+       JMP I   DFBUMP
+DFTMP, 0
+\fDCDIDX,       0
+       CLL RTR
+       RAR
+       TAD     XRBASE  /ADD IN BASE ADDRESS OF XR ARRAY
+XRCDF, HLT             /CDF TO XR ARRAY FIELD
+       SZL
+       JMS     DFBUMP  /OR MAYBE NEXT FIELD
+       DCA     T       /SAVE POINTER TO XR
+       TAD     INST
+       AND     DCD100
+       SZA CLA         /INCREMENT BIT ON?
+       ISZ I   T       /YES - BUMP XR
+DCD100,        100             /** PROTECTION
+       JMP I   DCDIDX
+
+BASJMP,        JMP I   JMPTB1  /JMP I JMPTB2 FOR D.P. MODE
+
+JMPTB1,        FFGET           / F MODE (FLOATING POINT)
+       FFADD
+       FFSUB
+       FFDIV
+       FFMPY
+       OPMEM   /FADDM
+       FFPUT
+       OPMEM   /FMULM
+
+       DDGET           / D MODE ( DOUBLE PRECISION INTEGER)
+       DDADD
+       DDSUB
+       DDDIV
+       DDMPY
+       OPMEM   /DADDM
+       DDPUT
+       OPMEM   /DMULM
+
+       EEGET           / E MODE ( 6 WD FLOATING POINT)
+       FFADD
+       FFSUB
+       FFDIV
+       FFMPY
+       OPMEM
+       EEPUT
+       OPMEM
+       PAGE
+\f/MORE I CYCLE
+
+SPECAL,        SNA
+       JMP     XRINST  /OPCODE 0 HAS MANY MANSIONS
+       TAD     SPECOP
+       DCA     SPCJMP  /GET OPCODE JUMP ADDRESS
+       JMS I   [FETPC
+       DCA     ADR
+       TAD     INST    /ALL OF THESE ARE TWO-WORD INSTRUCTIONS
+       JMS I   MCDF    /SO FORM THE ADDRESS NOW
+       DCA     DATAF
+       CDF 0
+       TAD     INST
+SPCJMP,        HLT
+
+XRINST,        TAD     INST
+       AND     (7770
+       CDF 0
+       SNA CLA         /IF SUB-OPCODE IS ZERO,
+       JMP     OPERAT  /DECODE SUB-SUB-OPCODE
+       TAD     INST
+       AND     [7
+       CLL
+       TAD     XRBASE
+       DCA     ADR     /COMPUTE INDEX REGISTER ADDRESS
+       RTL
+       RTL
+       TAD I   (XRCDF
+       DCA     DATAF
+XJCOMN,        TAD     INST
+       CLL RTR
+       RAR
+       AND     [77     /GET OPCODE - HIGH ORDER 2 BITS ARE 0
+OXCOMN,        TAD     (JMP I SP2
+       DCA     .+1     /EXECUTE APPROPRIATE JUMP
+       HLT
+
+OPERAT,        TAD     INST
+       CIA
+       JMP     OXCOMN
+
+SETX,  TAD     DATAF   /SET XR0 LOC
+       DCA I   (XRCDF
+       TAD     ADR
+       DCA     XRBASE
+       JMP I   FPNXT
+\f/JUMP DECODER
+
+JUMPS, AND     (100    /INSTRUCTION IN AC
+       CLL RTR         /20 IN AC IF NOT COND. JUMP
+       SZA             /IF NOT COND. JUMP, DECODE FURTHER
+       JMP     XJCOMN
+       TAD     INST
+       AND     [70
+       CLL RTR
+       RAR
+       TAD     (CNDSKT
+       DCA     T       /INDEX INTO CONDITIONAL SKIP TABLE
+       TAD I   T
+       DCA     CNDSKP
+       TAD     ACH
+       SZA
+       JMP     CNDSKP
+       TAD     ACL
+       SZA CLA         /IF HIGH ORDER ZERO, AC MIGHT BE UNNORMALIZED.
+       IAC             /USE LOW ORDER ON 0/NOT 0 BASIS
+CNDSKP,        HLT             /TEST AC
+       JMP I   FPNXT   /FAILED - DON'T JUMP
+
+DOJMP, STA CLL
+       TAD     ADR
+       DCA     PC
+       SNL
+       TAD     (-10
+       TAD     DATAF
+       CDF 0
+       DCA I   (PCCDF  /ADDRESS-1 TO PC
+       JMP I   .+1
+YFJMP, ICYCLE          /** CHANGED IF RUNNING UNDER RTS-8
+
+JXN,   AND     [70     /GET XR FIELD
+       JMS I   (DCDIDX /GET XR VALUE WITH INCREMENTING
+       TAD I   T
+       SNA CLA         /ZERO?
+       JMP I   FPNXT   /YES
+       JMP     DOJMP   /JUMP ON INDEX NON-ZERO, RIGHT?
+
+CNDSKT,        SZA CLA         /JEQ
+       SPA CLA         /JGE
+       SMA SZA CLA     /JLE
+       SKP CLA         /JA
+       SNA CLA         /JNE
+       SMA CLA         /JLT
+       SPA SNA CLA     /JGT
+       JMP     TSTALN  /JAL
+
+TSTALN,        CLA
+       TAD     ACX
+       TAD     (-27
+       SPA SNA CLA
+       JMP I   FPNXT
+       JMP     DOJMP
+\f/OPCODE TABLES
+
+SPECOP,        JMP I   SPECOP  /SPECIAL OPCODE TABLE
+       JUMPS
+       JXN
+       TRAP3I
+       TRAP4I
+       TRAP5I
+       TRAP6I
+       TRAP7I
+
+       FPJAC
+       STRTD
+       STRTF
+       NRMFAC
+       NEGFAC
+       CLFAC
+       FPAUSE
+SP2,   EXIT
+       ALN
+       ATX
+       FPXTA
+       ICYCLE  /NOP
+       STRTE
+       ICYCLE  /UNDEF OP
+       ICYCLE  /"
+       FPLDX
+       ADDX
+       SETX
+       SETB
+       JSA
+       JSR
+       PAGE
+\f/MISCELLANEOUS OPCODE ROUTINES
+
+TRAP3I,
+TRAP4I,        AC0002
+       TAD     DATAF
+       DCA     .+1     /FORM CDF CIF N
+       HLT             /EXECUTE IT
+       TAD     INST
+       SMA CLA         /TRAP4 JMS'S TO ITS TARGET ADDRESS,
+       JMP I   ADR     /TRAP3 JMP'S TO IT
+       JMS I   ADR
+       JMP I   FPNXT
+
+ALN,   TAD     ACX     /ALIGN SIMULATOR
+       DCA     OPX     /SAVE EXPONENT IN CASE WE'RE IN D.I. MODE
+       TAD     DFLG
+       SMA SZA CLA
+       DCA     ACX     /ZERO EXP IF D.I. MODE
+       JMS     DATCDF  /SET TO XR FIELD
+       TAD     INST
+       AND     [7
+       TAD     DFLG    /IF WE'RE IN FLOATING POINT MODE,
+       SNA CLA         /AND DOING AN "ALN 0",
+       TAD     [27     /ALIGN UNTIL EXPONENT = 23
+       SNA
+       TAD I   ADR     /OTHERWISE ALIGN UNTIL EXPONENT = XR VALUE
+       CDF 0
+       CIA
+       TAD     ACX
+       CMA             /FORM DIFFERENCE - 1
+       SPA             /IF EXPONENT IS LARGER THEN DESIRED EXPONENT,
+       JMP     ALNSHL  /SHIFT LEFT
+       JMS I   [ACSR   /OTHERWISE SHIFT RIGHT
+ALNXIT,        TAD     DFLG
+       SPA SNA CLA     /IF DOUBLE INTEGER MODE,
+       JMP I   FPNXT
+       TAD     OPX     /ALIGNMENT LEAVES THE EXPONENT UNCHANGED
+       DCA     ACX
+       JMP I   FPNXT
+ALNSHL,        DCA     T       /STORE SHIFT COUNT
+       SKP             /SHIFT LEFT ONE LESS THAN COUNT
+       JMS I   [AL1BMP
+       ISZ     T
+       JMP     .-2
+       JMP     ALNXIT  /GO TO COMMON CODE
+\f/ARG FETCH SUBROUTINES AND MODE CHANGE OPERATORS
+
+DARGET,        0
+       DCA     ADR
+       TAD     DARGET
+       DCA     ARGET
+       DCA     ACX
+       JMP     ARGET2  /FAKE OUT FLOATING POINT ROUTINE
+
+ARGET, 0               /SUBROUTINE TO FETCH ARG FOR ADD, SUBT, ETC.
+       DCA     ADR     /STORE ADDRESS OF OPERAND
+       TAD I   ADR     /PICK UP EXPONENT
+       ISZ     ADR     /MOVE POINTER TO HI MANTISSA WD
+       SKP
+       JMS I   (DFBUMP
+ARGET2,        DCA     OPX
+       TAD I   ADR     /PICK IT UP
+       DCA     OPH     /STORE
+       ISZ     ADR     /MOVE PTR. TO LO MANTISSA WD.
+       SKP
+       JMS I   (DFBUMP /WATCH THOSE FIELD TRANSITIONS!
+       TAD I   ADR     /PICK IT UP
+       DCA     OPL     /STORE IT
+       CDF 0
+       JMP I   ARGET   /RETURN
+
+STRTE, TAD     DFLG    /START EXTENDED PRECISION MODE
+       SPA CLA
+       JMP     .+4     /CLEAR EXTENDED FAC
+       DCA     EAC1    /IF NOT ALREADY IN E MODE
+       DCA     EAC2
+       DCA     EAC3
+       AC7775
+       DCA     DFLG
+       JMP     DFECMN
+
+STRTD, CLA IAC         /START DOUBLE PRECISION INTEGER MODE
+STRTF, DCA     DFLG    /START FLOATING POINT MODE
+       TAD     DFLG
+DFECMN,        TAD     (CLL
+       DCA I   (IMFUDJ /SET D.P.I FUDGE TO "CLL" OR "CLL IAC"
+       TAD     DFLG
+       SPA
+       CMA             /CHANGE -3 FOR E MODE TO +2
+       CLL RTL
+       RAL
+       TAD     (JMPTB1&177+5600
+       DCA I   (BASJMP
+       JMP I   FPNXT
+\f/DOUBLE PRECISION INTEGER OPERATORS
+
+DDSUB, JMS     DARGET
+       JMS I   (OPNEG
+       SKP
+DDADD, JMS     DARGET
+       DCA     AC1     /CLEAR OVERFLOW JUSTINCASE
+       JMS I   [OADD
+       JMP I   FPNXT
+
+FFGET, DCA     ADR     /GET A FLOATING POINT NUMBER
+       TAD I   ADR
+       DCA     ACX     /SAVE EXPONENT
+       ISZ     ADR
+       JMP     .+3     /NO FIELD OVERFLOW
+       JMS I   (DFBUMP /BUMP DATA FIELD
+DDGET, DCA     ADR     /SUAVE - ENTRY POINT FOR D.P. INTEGER GET
+       TAD I   ADR
+       DCA     ACH
+       ISZ     ADR
+       SKP
+       JMS I   (DFBUMP
+       TAD I   ADR
+       DCA     ACL
+       JMP I   FPNXT
+
+FFPUT, DCA     ADR     /STORE A FLOATING POINT NUMBER
+       TAD     ACX     /GET FAC AND STORE IT
+       DCA I   ADR     /AT SPECIFIED ADDRESS
+       ISZ     ADR
+       JMP     .+3
+       JMS I   (DFBUMP
+DDPUT, DCA     ADR     /ENTRY FOR D.P. INTEGER PUT
+       TAD     ACH
+       DCA I   ADR
+       ISZ     ADR
+       SKP
+       JMS I   (DFBUMP
+       TAD     ACL
+       DCA I   ADR
+       JMP I   FPNXT
+       PAGE
+\fFPPKG=        .               /FOR EAE OVERLAY
+
+/23-BIT FLOATING PT INTERPRETER
+/W.J. CLOGHER, MODIFIED BY R.LARY FOR FORTRAN
+
+LPBUF2,        ZBLOCK  16
+       LPBUF3
+
+AL1BMP,        0               /*K* UTILITY SUBROUTINE - USED BY INTERPRETER
+       STA
+       TAD     ACX
+       DCA     ACX
+       JMS I   [AL1
+       JMP I   AL1BMP
+
+/FLOATING MULTIPLY-DOES 2 24X12 BIT MULTIPLIES
+DDMPY, JMS I   (DARGET
+       SKP
+FFMPY, JMS I   (ARGET  /GET OPERAND
+       JMS     MDSET   /SET UP FOR MPY-OPX IN AC ON RETN.
+       TAD     ACX     /DO EXPONENT ADDITION
+       DCA     ACX     /STORE FINAL EXPONENT
+       DCA     MDSET   /ZERO TEM STORAGE FOR MPY ROUTINE
+       DCA     AC2
+       TAD     ACH     /IS FAC=0?
+       SNA     CLA
+       DCA     ACX     /YES-ZERO EXPONENT
+       JMS     MP24    /NO-MULTIPLY FAC BY LOW ORDER OPR.
+       TAD     OPH     /NOW MULTIPLY FAC BY HI ORDER MULTIPLIER
+       DCA     OPL
+       JMS     MP24
+       TAD     AC2     /STORE RESULT BACK IN FAC
+       DCA     ACL     /LOW ORDER
+       TAD     MDSET   /HIGH ORDER
+       DCA     ACH
+       TAD     ACH     /DO WE NEED TO NORMALIZE?
+       RAL
+       SMA     CLA
+       JMS     AL1BMP  /YES-DO IT FAST
+       TAD     AC1
+       SPA CLA         /CHECK OVERFLOW WORD
+       ISZ     ACL     /HIGH BIT ON - ROUND RESULT
+       JMP     MDONE
+       ISZ     ACH     /LOW ORDER OVERFLOWED - INCREMENT HIGH ORDER
+       TAD     ACH
+       SPA             /CHECK FOR OVERFLOW TO 4000 0000
+       JMP I   (SHR1   /WE HANDLE A SIMILIAR CASE IN FLOATING DIVIDE
+       CLA
+\fMDONE,        DCA     AC1     /ZERO OVERFLOW WD(DO I NEED THIS???)
+       ISZ     MSIGN   /SHOULD RESULT BE NEGATIVE?
+       SKP             /NO
+       JMS I   [FFNEG  /YES-NEGATE IT
+       TAD     ACH
+       SNA CLA         /A ZERO AC MEANS A ZERO EXPONENT
+       DCA     ACX
+       TAD     DFLG
+       SMA SZA CLA     /D.P. INTEGER MODE?
+       TAD     ACX     /WITH ACX LESS THAN 0?
+       SNA
+       JMP I   FPNXT   /NO - RETURN
+       CMA
+       JMS I   [ACSR   /UN-NORMALIZE RESULT
+       JMP I   FPNXT   /RETURN
+\f/MDSET-SETS UP SIGNS FOR MULTIPLY AND DIVIDE
+/ALSO SHIFTS OPERAND ONE BIT TO THE LEFT.
+/EXIT WITH EXPONENT OF OPERAND IN AC FOR EXPONENT
+/CALCULATION-CALLED WITH ADDRESS OF OPERAND IN AC AND
+/DATA FIELD SET PROPERLY FOR OPERAND.
+
+MDSET, 0
+       CLA CLL CMA RAL /SET SIGN CHECK TO -2
+       DCA     MSIGN
+       TAD     OPH     /IS OPERAND NEGATIVE?
+       SMA     CLA
+       JMP     .+3     /NO
+       JMS I   (OPNEG  /YES-NEGATE IT
+       ISZ     MSIGN   /BUMP SIGN CHECK
+       TAD     OPL     /AND SHIFT OPERAND LEFT ONE BIT
+       CLL     RAL
+       DCA     OPL
+       TAD     OPH
+       RAL
+       DCA     OPH
+       DCA     AC1     /CLR. OVERFLOW WORF OF FAC
+       TAD     ACH     /IS FAC NEGATIVE
+       SMA     CLA
+       JMP     LEV     /NO-GO ON
+       JMS I   [FFNEG  /YES-NEGATE IT
+       ISZ     MSIGN   /BUMP SIGN CHECK
+       NOP             /MAY SKIP
+LEV,   TAD     OPX     /EXIT WITH OPERAND EXPONENT IN AC
+       JMP I   MDSET
+MSIGN, 0
+\f/24 BIT BY 12 BIT MULTIPLY.  MULTIPLIER IS IN OPL
+/MULTIPLICAND IS IN ACH AND ACL
+/RESULT LEFT IN MDSET,AC2, AND AC1
+
+MP24,  0
+       TAD     (-14    /SET UP 12 BIT COUNTER
+       DCA     OPX
+       TAD     OPL     /IS MULTIPLIER=0?
+       SZA
+       JMP     MPLP1   /NO-GO ON
+       DCA     AC1     /YES-INSURE RESULT=0
+       JMP I   MP24    /RETURN
+MPLP,  TAD     OPL     /SHIFT A BIT OUT OF LOW ORDER
+MPLP1, RAR             /OF MULTIPLIER AND INTO LINK
+       DCA     OPL
+       SNL             /WAS IT A 1?
+       JMP     MPLP2   /NO - 0 - JUST SHIFT PARTIAL PRODUCT
+       TAD     AC2     /YES-ADD MULTIPLICAND TO PARTIAL PRODUCT
+       TAD     ACL     /LOW ORDER
+       DCA     AC2
+       CML RAL         /*K* NOTE THE "SNL" 5 WORDS BACK!
+       TAD     ACH     /HI ORDER
+MPLP2, TAD     MDSET
+       RAR             /NOW SHIFT PARTIAL PROD. RIGHT 1 BIT
+       DCA     MDSET
+       TAD     AC2
+       RAR
+       DCA     AC2
+       TAD     AC1
+       RAR             /OVERFLOW TO AC1
+       DCA     AC1
+       ISZ     OPX     /DONE ALL 12 MULTIPLIER BITS?
+       JMP     MPLP    /NO-GO ON
+       JMP I   MP24    /YES-RETURN
+       PAGE
+\f/DIVIDE-BY-ZERO ROUTINE - MUST BE AT BEGINNING OF PAGE
+
+DBAD,  ISZ     FATAL   /DIVIDE BY 0 NON-FATAL
+       JMS I   ERR     /GIVE ERROR MSG
+       TAD     DBAD
+       DCA     ACX     /RETURN A VERY LARGE POSITIVE NUMBER
+       AC2000
+       JMP     FD
+
+/FLOATING DIVIDE - USES DIVIDE-AND-CORRECT METHOD
+
+DDDIV, JMS I   (DARGET
+       SKP
+FFDIV, JMS I   (ARGET  /GET OPERAND
+       JMS I   (MDSET  /GO SET UP FOR DIVIDE-OPX IN AC ON RETN.
+       CMA     IAC     /NEGATE EXP. OF OPERAND
+       TAD     ACX     /ADD EXP OF FAC
+       DCA     ACX     /STORE AS FINAL EXPONENT
+       TAD     OPH     /NEGATE HI ORDER OP. FOR USE
+       CLL CMA IAC     /AS DIVISOR
+       DCA     OPH
+       JMS     DV24    /CALL DIV.--(ACH+ACL)/OPH
+       TAD     ACL     /SAVE QUOT. FOR LATER
+       DCA     AC1
+       TAD     OPL
+       SNA CLA
+       JMP     DVL2    /AVOID MULTIPLYING BY 0
+       TAD     (-15    /SET COUNTER FOR 12 BIT MULTIPLY
+       DCA     DV24    /TO MULTIPLY QUOT. OF DIV. BY 
+       JMP     DVLP1   /LOW ORDER OF OPERAND (OPL)
+
+/DIVIDE ROUTINE - (ACH,ACL)/OPH = ACL REMAINDER REM  (AC2=0)
+
+DV24,  0
+       TAD     ACH     /CHECK THAT DIVISOR IS .GT. DIVIDEND
+       TAD     OPH     /DIVISOR IN OPH (NEGATIVE)
+       SZL     CLA     /IS IT?
+       JMP     DBAD    /NO-DIVIDE OVERFLOW
+       TAD     (-15    /YES-SET UP 12 BIT LOOP
+       DCA     AC2
+       JMP     DV1     /GO BEGIN DIVIDE
+DV2,   TAD     ACH     /CONTINUE SHIFT OF FAC LEFT
+       RAL
+       DCA     ACH     /RESTORE HI ORDER
+       TAD     ACH     /NOW SUBTRACT DIVISOR FROM HI ORDER
+       TAD     OPH     /DIVIDEND
+       SZL             /GOOD SUBTRACT?
+       DCA     ACH     /YES-RESTORE HI DIVIDEND
+       CLA             /NO-DON'T RESTORE--OPH.GT.ACH
+DV1,   TAD     ACL     /SHIFT FAC LEFT 1 BIT-ALSO SHIFT
+       RAL             /1 BIT OF QUOT. INTO LOW ORD OF ACL
+       DCA     ACL
+       ISZ     AC2     /DONE 12 BITS OF QUOT?
+       JMP     DV2     /NO-GO ON
+       JMP I   DV24    /YES-RETN W/AC2=0
+\f/DIVIDE ROUTINE CONTINUED
+
+MP12L, DCA     OPL     /STORE BACK MULTIPLIET
+       TAD     AC2     /GET PRODUCT SO FAR
+       SNL             /WAS MULTIPLIER BIT A 1?
+       JMP     .+3     /NO-JUST SHIFT THE PARTIAL PRODUCT
+       CLL             /YES-CLEAR LINK AND ADD MULTIPLICAND
+       TAD     ACL     /TO PARTIAL PRODUCT
+       RAR             /SHIFT PARTIAL PRODUCT-THIS IS HI ORDER
+       DCA     AC2     /RESULT-STORE BACK
+DVLP1, TAD     OPL     /SHIFT A BIT OUT OF MULTIPLIER
+       RAR             /AND A BIT OR RESLT. INTO IT (LO ORD. PROD.)
+       ISZ     DV24    /DONE ALL BITS?
+       JMP     MP12L   /NO-LOOP BACK
+       CLL CIA         /YES-LOW ORDER PROD. OF QUOT. X OPL IN AC
+       DCA     ACL     /NEGATE AND STORE
+       CML     RAL     /PROPAGATE CARRY
+       TAD     AC2     /NEGATE HI ORDER PRODUCT
+       STL CIA 
+       TAD     ACH     /COMPARE WITH REMAINDER OF FIRST DIV.
+       SZL             /WELL?
+       JMP     DVOPS   /GREATER THAN REM.-ADJUST QUOT OF 1ST DIV.
+       DCA     ACH     /OK - DO (REM - (Q*OPL)) / OPH
+DVL3,  JMS     DV24    /DIVIDE BY OPH (HI ORDER OPERAND)
+DVL1,  TAD     AC1     /GET QUOT. OF FIRST DIV.
+       SMA             /IF HI ORDER BIT SET-MUST SHIFT 1 RIGHT
+       JMP     FD      /NO-ITS NORMALIZED-DONE
+SHR1,  CLL
+       ISZ     ACL     /ROUND AND SHIFT RIGHT ONE
+       SKP
+       IAC             /DOUBLE PRECISION INCREMENT
+       RAR
+       DCA     ACH     /STORE IN FAC
+       TAD     ACL     /SHIFT LOW ORDER RIGHT
+       RAR
+       DCA     ACL     /STORE BACK
+       ISZ     ACX     /BUMP EXPONENT
+       NOP
+       TAD     ACH
+       JMP     DVL1+1  /IF FRACT WAS 77777777 WE MUST SHIFT AGAIN
+FD,    DCA     ACH     /STORE HIGH ORDER RESULT
+       JMP I   (MDONE  /GO LEAVE DIVIDE
+
+DVL2,  DCA     ACL     /COME HERE IF LOW-ORDER QUO=0
+       JMP     DVL3    /SAVE SOME TIME
+\f/ROUTINE TO ADJUST QUOTINET OF FIRST DIVIDE (MAYBE) WHEN THE
+/REMAINDER OF THE FIRST DIVIDE IS LESS THAN QUOT*OPL
+
+DVOPS, CMA     IAC     /NEGATE AND STORE REVISED REMAINDER
+       DCA     ACH     
+       CLL
+       TAD     OPH
+       TAD     ACH     /WATCH FOR OVERFLOW
+       SNL
+       JMP     DVOP1   /OVERFLOW-DON'T ADJUST QUOT. OF 1ST DIV.
+       DCA     ACH     /NO OVERFLOW-STORE NEW REM.
+       CMA             /SUBTRACT 1 FROM QUOT OF
+       TAD     AC1     /FIRST DIVIDE
+       DCA     AC1
+DVOP1, CLA     CLL
+       TAD     ACH     /GET HI ORD OF REMAINDER
+       SNA             /IS IT ZERO?
+DVOP2, DCA     ACL     /YES-MAKE WHOLE THING ZERO
+       DCA     ACH
+       JMS     DV24    /DIVIDE EXTENDED REM. BY HI DIVISOR
+       TAD     ACL     /NEGATE THE RESULT
+       CLL CMA IAC
+       DCA     ACL
+       SNL             /IF QUOT. IS NON-ZERO, SUBTRACT
+       CMA             /ONE FROM HIGH ORDER QUOT.
+       JMP     DVL1    /GO TO IT
+
+LPBUF3,        ZBLOCK  12
+       LPBUF4
+       PAGE
+\f/"OPNEG" MUST BE AT 0 ON PAGE
+
+OPNEG, 0               /ROUTINE TO NEGATE OPERAND
+       TAD     OPL     /GET LOW ORDER
+       CLL CIA         /NEGATE AND STORE BACK
+       DCA     OPL
+       CML     RAL     /PROPAGATE CARRY
+       TAD     OPH     /GET HI ORDER
+       CLL CIA         /NEGATE AND STORE BACK
+       DCA     OPH
+       JMP I   OPNEG
+/
+/FLOATING SUBTRACT AND ADD
+/
+FFSUB, JMS I   (ARGET  /PICK UO THE OP.
+       JMS     OPNEG   /NEGATE OPERAND
+       SKP
+FFADD, JMS I   (ARGET  /PICK UP OPERAND
+       TAD     OPH     /IS OPERAND = 0
+       SNA     CLA
+       JMP I   FPNXT   /YES-DONE
+       TAD     ACH     /NO-IS FAC=0?
+       SNA     CLA
+       JMP     CLROFL  /CLEAR OUT THE OVERFLOW BITS
+       TAD     ACX     /NO-DO EXPONENT CALCULATION
+       CLL CIA
+       TAD     OPX
+       SMA     SZA     /WHICH EXP. GREATER?
+       JMP     FACR    /OPERANDS-SHIFT FAC
+       CIA             /FAC'S-SHIFT OPERAND=DIFFRNCE+1
+       TAD     (-30
+       SMA             /TEST FOR INSIGNIFICANCE
+       JMP     OPINSG  /YES - ANSWER IS FAC
+       TAD     (30
+       JMS     OPSR
+       JMS I   [ACSR   /SHIFT FAC ONE PLACE RIGHT
+DOADD, TAD     OPX     /SET EXPONENT OF RESULT
+       DCA     ACX
+       JMS I   [OADD   /DO THE ADDITION
+       JMS     FFNOR   /NORMALIZE RESULT
+       JMP I   FPNXT   /RETURN
+FACR,  TAD     (-30
+       SMA             /TEST FOR INSIGNIFICANCE
+       JMP     ACINSG  /YES - ANSWER IS OPR
+       TAD     (30
+       JMS  I  [ACSR   /SHIFT FAC = DIFF.+1
+       JMS     OPSR    /SHIFT OPR. 1 PLACE
+       JMP     DOADD   /DO ADDITION
+
+OPINSG,        CLA
+       JMP I   FPNXT
+\f/OPERAND SHIFT RIGHT-ENTER WITH POSITIVE COUNT-1 IN AC
+
+OPSR,  0
+       CMA             /- (COUNT+1) TO SHIFT COUNTER
+       DCA     AC0
+LOP2,  TAD     OPH     /GET SIGN BIT
+       CLL             /TO LINK
+       SPA
+       CML             /WITH HI MANTISSA IN AC
+       RAR             /SHIFT IT RIGHT, PROPAGATING SIGN
+       DCA     OPH     /STORE BACK
+       TAD     OPL
+       RAR
+       DCA     OPL     /STORE LO ORDER BACK
+       ISZ     OPX     /INCREMENT EXPONENT
+       NOP     
+       ISZ     AC0     /DONE ALL SHIFTS?
+       JMP     LOP2    /NO-LOOP
+       RAR             /SAVE 1 BIT OF OVERFLOW
+       DCA     AC2     /IN AC2
+       JMP I   OPSR    /YES-RETN.
+
+FFNOR, 0               /ROUTINE TO NORMALIZE THE FAC
+       TAD     ACH     /GET THE HI ORDER MANTISSA
+       SNA             /ZERO?
+       TAD     ACL     /YES-HOW ABOUT LOW?
+       SNA
+       TAD     AC1     /LOW=0, IS OVRFLO BIT ON?
+       SNA     CLA
+       JMP     ZEXP    /#=0-ZERO EXPONENT
+NORMLP,        CLA CLL CML RTR /NOT 0-MAKE A 2000 IN AC
+       TAD     ACH     /ADD HI ORDER MANTISSA
+       SZA             /HI ORDER = 6000
+       JMP     .+3     /NO-CHECK LEFT MOST DIGIT
+       TAD     ACL     /YES-6000 OK IF LOW=0
+       SZA     CLA     
+       SPA     CLA     /2,3,4,5,ARE LEGAL LEFT MOST DIGS.
+       JMP     FFNORR  /FOR NORMALIZED #-(+2000=4,5,6,7)
+       JMS I   [AL1BMP /SHIFT AC LEFT AND BUMP ACX DOWN
+       JMP     NORMLP  /GO BACK AND SEE IF NORMALIZED
+ZEXP,  DCA     ACX
+FFNORR,        DCA     AC1     /DONE W/NORMALIZE - CLEAR AC1
+       JMP I   FFNOR   /RETURN
+
+ACINSG,        CLA             /COME HERE IF AC IS INSIGNIFICANT ON ADDITION
+       DCA     ACH
+       DCA     ACL
+       JMP     DOADD-1 /FAKE AN ADD WITH OPR=0
+
+LPBUF4,        ZBLOCK  40
+       LPBUFE
+CLROFL,        DCA     AC1     /CLEAR  THE FLOATING AC OVERFLOW WORD
+       DCA     AC2     /CLEAR THE OPERAND OVERFLOW WORD
+       JMP     DOADD   /FAC=0;   DO THE ADD
+       PAGE
+\f/PAGE 7400 UNUSED RIGHT NOW
+
+LPBUFE,        ZBLOCK  177
+       LPBUFR
+       FIELD 1
+\f