A large commit.
[pdp8.git] / sw / os8 / v3d / sources / extensions / dectapes / dectape1 / brts.pa
diff --git a/sw/os8/v3d/sources/extensions/dectapes/dectape1/brts.pa b/sw/os8/v3d/sources/extensions/dectapes/dectape1/brts.pa
new file mode 100644 (file)
index 0000000..05b6f3b
--- /dev/null
@@ -0,0 +1,5985 @@
+/OS8 BASIC RUNTIME SYSTEM, V5A
+/
+/
+/
+/
+/
+/
+/
+/
+/
+/
+/
+/COPYRIGHT (C) 1972, 1973, 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/AUGUST 19, 1972
+/
+/R.G. BEAN, 1972
+/SHAWN SPILMAN, 1973
+/ J.K.,1975
+/JR    21-APR-77       ADDED EXTENDED DATE CODE, CLEANED UP LISTING
+/JR    26-APR-77       TIGHTENED UP STRING ROUTINES
+/JR    28-APR-77       ADD SOURCE FIX FOR SEVERAL KNOWN BUGS
+/JR    4-MAY-77        REWROTE FLOATING POINT OUTPUT ROUTINE TO INCREASE ACCURACY
+/
+/
+       VERSON= 5       /VERSION OF BRTS
+                       /VERSION LOCATED AT TAG "VERLOC" AND VERLOC+1
+                       /VERLOC = 260+VERSON
+                       /VERLOC+1 = 300+SUBVER (01 = A)
+       SUBVER= 01      /SUBVERSION OF BRTS
+       SUBVAF= 01      /SUBVERSION OF BASIC.AF OVERLAY
+       SUBVSF= 01      /SUBVERSION OF BASIC.SF OVERLAY
+       SUBVFF= 01      /SUBVERSION OF BASIC.FF OVERLAY
+                       /FIRST WORD OF EACH OVERLAY CONTAINS
+                       /60+VERSON IN LEFT HALF AND SUBVERSION OF OVERLAY
+                       /IN RIGHT HALF.
+       MDATE=  7666    /CONTAINS OS/8 DATE IN FIELD 1
+       BIPCCL= 7777    /CONTAINS YEAR EXTENSION BITS
+       SCOPWD= 7726    /WORD CONTAINING SCOPE FLAG IN 200 BIT
+       EDBLK=  7604    /CONTAINS BLOCK NUMBER OF EDITOR
+       WIDTH=  120     /WIDTH OF PRINTER
+       COLWID= 16      /WIDTH OF ONE PRINT COLUMN
+       SACLIM= 120     /DEFINE WIDTH OF STRING ACCUMULATOR
+       OVERLAY=3400    /ADDRESS OF START OF 5 PAGE OVERLAY BUFFER
+
+
+
+/ASSEMBLY INSTRUCTIONS
+/      .R PAL8
+/      *BRTS<BRTS.PA/W
+/      .R ABSLDR
+/      *BRTS$                  (THEN SAVE AS SHOWN BELOW)
+/
+
+/WHEN ASSEMBLED AND LOADED VIA THE ABS. LOADER,THE
+/CORE LAYOUT IS AS FOLLOWS:
+/
+/BRTS IS AT 0-6777
+/OVERLAY BASIC.AF IS AT 3400-4577
+/OVERLAY BASIC.SF IA AT 12000-13177
+/OVERLAY BASIC.FF IS AT 13400-14577
+/
+/TO CREATE SAVE IMAGE FILES PRIOR TO RUNNING BASIC,
+/ASSEMBLE THIS SOURCE IN A 12K OR MORE MACHINE,THEN
+/PERFORM THE FOLLOWING SEQUENCE OF OS/8 COMMANDS
+/
+/.R ABSLDR
+/*BRTS$
+/.SAVE SYS:BRTS 0-6777
+/
+/.SAVE SYS:BASIC.AF 3400-4577
+/
+/.SAVE SYS:BASIC.SF 12000-13177
+/
+/.SAVE SYS:BASIC.FF 13400-14577
+/
+/THE BASIC RUN-TIME SYSTEM IS CONDITIONALIZED TO TAKE ADVANTAGE
+/OF THE PDP-8/E KE8/E EAE OPTION.
+/NORMALLY,THE SYSTEM IS ASSEMBLED SUCH THAT IT WILL RUN ON ANY
+/PDP-8 OR PDP-12. TO TAKE ADVANTAGE OF THE ADDITIONAL HARDWARE,SET
+/THE SWITCH EAE=1 IF THE SYSTEM INCLUDES A KE8/E EAE.
+/YOU MAY DO THIS BY CONCATENATING TTY: ONTO BRTS.PA AS FOLLOWS
+/.PAL EABRTS<TTY:,SYS:BRTS.PA/W
+/EAE=1
+/^Z
+/^Z
+/.   BINARY IS CREATED...
+/NOW EABRTS IS LOADED INSTEAD OF BRTS
+/TO GET A LISTING, USE THE /J SWITCH TO INHIBIT THE FPP CODE YOU
+/ARE NOT USING (EAE ON A NON EAE ASSEMBLY FOR EXAMPLE)
+
+/EAE=0         /USE STANDARD FLOATING POINT PACKAGE
+/EAE=1         /USE EAE FLOATING POINT PACKAGE
+/
+/V4 FIXES
+/.EAE ADD FOR NUMS <.00001 TO 0
+/.FILE INPUT FROM TTY
+/.OUTPUT OF NUMS > 80,000
+/.STRING FETCH WHEN COUNT IS IN ONE FLD &
+/   TEXT IS IN THE NEXT
+\f      AC4000= CLA STL RAR
+       AC2000= CLA STL RTR
+       AC0002= CLA STL RTL
+       AC7775= CLL STA RTL
+       AC7776= CLL STA RAL
+       AC3777= CLL STA RAR
+       AC5777= CLL STA RTR
+
+       IFNDEF EAE <EAE=0>
+
+       /PAGE 0 LOCATIONS
+
+       *6
+USECON,        0               /USE CONSTANT GENERATED BY "USE" STATEMENT
+FSTOP1,        FSTOPI          /POINTER TO RTS EXIT ROUTINE USED
+                       /BY ^C HOOKS IN SYSTEM HANDLER.
+                       /IF THIS IS MOVED, BLOAD MUST BE ALTERED
+
+       *10
+SACXR, 15              /INDEX REGISTER FOR STRING ROUTINES
+XR1,   VCHECK
+XR2,   0
+XR3,   0
+XR4,   4               /INDEX REGISTERS
+XR5,   0
+DATAXR,        0               /POINTER FOR IN-CORE DATA LIST
+SPINNR,        2713            /AT RUNTIME,THIS LOCATION IS SPUN FOR RND SEED
+
+       *20
+
+/COMPILER-INTERPRETER CONTROL BLOCK. LOCATIONS MARKED BY
+/A /* ARE EXPECTED TO CONTAIN VALUES SUPPLIED BY THE COMPILER PRIOR
+/TO THE BRTS LOAD
+
+CDFIO, 6211            /* CDF FOR I/O TABLE AND SYMBOL TABLES
+SCSTRT,        0               /* POINTER TO START OF SCALAR SYMBOL TABLE
+ARSTRT,        0               /* POINTER TO START OF ARRAY SYMBOL TABLE-1
+STSTRT,        0               /* POINTER TO START OF STRING SYMBOL TABLE-1
+SASTRT,        0               /* POINTER TO START OF STRING ARRAY TABLE-1
+CDFPS, 0               /* CDF FOR START OF PSEUDO-CODE
+PSSTRT,        0               /* POINTER TO START OF PSEUDO CODE-1
+DLSTOP,        0               /* POINTER TO TOP OF DATA LIST
+DLSTRT,        0               /* POINTER TO BOTTOM OF INCORE DATA LIST-1
+PSFLAG,        0               /* OS/8 SWAPPING FLAGS WORD
+                       /BIT 0 SET IF OS/8 SAVED IN N7400 INSTEAD OF N7600 (TD8E)
+                       /BIT 1 SET IF ROM TD8E HANDLER NOT NEEDING CDF CHANGES
+                       /BIT 11 SET IF 17600 IS IN 17600. BIT 11 TOGGLED BY
+                       /PSWAP ROUTINE
+
+\f/SYSTEM REGISTERS
+
+SACLEN,        0               /LENGTH OF STRING IN SAC
+S1,    0               /SUBSCRIPT 1 (MUST BE FOLLOWED BY S2!)
+S2,    0               /SUBSCRIPT 2 (MUST BE PRECEEDED BY S1!)
+DMAP,  0               /MAP OF DRIVER PAGES
+BMAP,  0               /MAP OF FILE BUFFERS
+
+       *37
+/FLOATING POINT PACKAGE LOCATIONS. THE FOLLOWING 21 LOCATIONS ARE USED
+/FOR VARIOUS PURPOSES BY THE FLOATING POINT PACKAGE. THOSE WITH DOUBLE
+/LABELS ARE USED BY BRTS AS TEMPORARIES WHEN NOT CALLING THE PACKAGE.
+/THE SECOND TAG IS THE ONE USED BY THE FLOATING POINT PACKAGE,THE FIRST
+/IS USED BY BRTS.
+
+FF,    0               /SPECIAL MODE FLIP-FLOP
+TEMP1,
+AC0,   0
+AC1,   0
+TEMP3,
+AC2,   0       
+TM,
+TEMP4, 6201
+ACX,   0               /FAC-EXPONENT
+ACH,   0               /FAC-HIGH ORDER MANTISSA
+ACL,   0               /FAC-MANTISSA LOW
+TEMP5,
+OPX,   0
+TEMP6,
+OPH,   0
+TEMP7,
+OPL,   0
+DSWIT, 0               /SWITCH USED BY INPUT ROUTINE
+CHAR,  215             /TERMINATOR OF LAST INPUT
+TEMP10,        0               /LOC NEEDED BY FPP
+
+       DECEXP= TEMP10
+
+       /SYSTEM REGISTERS USED OFTEN BY INTERPRETER CODE
+
+MODESW,        0               /0 FOR ARTHIMETIC MODE,1 FOR STRING MODE
+INSAV, 0               /CURRENT PSEUDO-INSTRUCTION BEING EXECUTED
+LINEHI,        0               /HI ORDER BITS OF LINE # CURRENTLY BEING EXECUTED
+LINELO,        0               /LOW ORDER BITS OF CURRENT LINE NUMBER
+STRMAX,        0               /MAXIMUM # OF CHARS ALLOWED IN CURRENT STRING
+STRCNT,        0               /- # OF CHARACTERS IN CURRENT STRING
+STRPTR,        0               /POINTER TO SIZE WORD OF CURRENT OPERAND STRING
+TEMP2, 0
+
+\f/I/O TABLE POINTER AREA-THIS BLOCK HOLDS POINTERS TO THE I/O TABLE
+/ENTRY FOR THE CURRENT FILE.THE POINTERS ARE CHANGED EVERY TIME AN
+/SFN IS EXECUTED. A TAD I OFF ONE OF THE POINTERS WILL GET THE INFORMATION
+/NOTED IN THE COMMENT FOR THE CURRENT I/O DEVICE
+/THIS BLOCK IS INITIALIZED FOR TTY
+
+       IOTSIZ= 15      /CURRENT SIZE OF IO TABLE
+
+       /THE FORMAT OF THE HEADER WORD IS AS FOLLOWS
+       /BITS   USAGE
+       /0-3    OS/8 DEVICE NUMBER
+       /4-5    3 FOR 2 CHARACTER UNPACKING COUNT
+       /6      SET IF BUFFER HAS BEEN MODIFIED AND NEEDS TO BE WRITTEN
+       /7      SET IF NOT FILE STRUCTURED DEVICE
+       /8      SET IF HANDLER IS 2 PAGES LONG
+       /9      SET IF VARIABLE LENGTH (OUTPUT) FILE
+       /10     SET IF EOF
+       /11     SET IF ASCII FILE, CLEAR IF NUMERIC IMAGE FILE
+
+
+ENTNO, 0               /ENTRY NUMBER NOW IN AREA 
+IOTHDR,        TTYF            /HEADER WORD
+IOTBUF,        TTYF+1          /BUFFER ADDRESS
+IOTBLK,        TTYF+2          /CURRENT BLOCK IN BUFFER
+IOTPTR,        TTYF+3          /READ\WRITE POINTER
+IOTHND,        TTYF+4          /HANDLER ENTRY POINT
+IOTLOC,        TTYF+5          /FILE STARTING BLOCK #
+IOTLEN,        TTYF+6          /ACTUAL FILE LENGTH
+IOTMAX,        TTYF+7          /       DEVICE / (FILE MAXIMUM LENGTH)
+IOTPOS,        TTYF+10         /       NAME / (POSITION OF PRINT HEAD)
+IOTFIL,        TTYF+11         /
+/      TTYF+12         /       FILE
+/      TTYF+13         /       NAME
+/      TTYF+14         /       .EX
+
+IOTDEV=        IOTMAX
+\f      *200
+
+       /FETCH NEXT PSEUDO WORD
+
+PWFECH,        JMP     START1  /START ONCE ONLY CODE IN TTY BUFFER
+       ISZ     INTPC   /BUMP PSEUDO-CODE PROGRAM COUNTER
+       JMP     CDFPSU  /NO-SKIP;JUST GET NEXT PSEUDO-CODE WORD
+       TAD     CDFPSU  /SKIP MEANS WE HAVE TO INCREMENT PS-CODE FIELD
+       TAD     [10
+       DCA     CDFPSU
+CDFPSU,        VCHECK          /SET DF TO FIELD OF PSEUDO-CODE
+       TAD I   INTPC   /GET NEXT WORD OF CODE
+       CDF 0           /SET DATA FIELD BACK TO INTERPRETER FIELD
+       JMP I   PWFECH  /RETURN
+O7770, 7770
+
+SSMODE,        IAC             /SET INTERPRETER TO STRING MODE
+AMODE, DCA     MODESW  /SET INTERPRETER TO ARITH MODE
+                       /FALL BACK INTO I-LOOP
+
+       /BRTS I-LOOP
+
+ILOOP, CLA CLL         /FLUSH
+       DCA     FF      /PUT FPP IN SI MODE
+       JMS     PWFECH  /GET NEXT PSEUDO-INSTRUCTION
+       DCA     INSAV   /SAVE FOR LATER
+       JMS I   [XPRINT /CALL TO TTY DRIVER
+       NOP
+       TAD     INSAV
+       AND     [7400   /STRIP TO OPCODE BITS
+       CLL RTL
+       RTL
+       RAL             /OPCODE NOW IN BITS 8-11
+       TAD     O7770   /SUBTRACT 10
+       SMA             /IS OPCODE <10?
+       JMP     SCASE   /CALL TO INSTRUCTION COMMON TO SMODE AND AMODE
+       DCA     TEMP1   /YES-SAVE THE OFFSET
+       TAD     MODESW  /WHICH MODE?
+       SZA CLA
+       JMP     SMODE   /STRING MODE
+       TAD     TEMP1   /ARITHMETIC MODE-GET OFFSET
+       TAD     JMSI    /MAKE JMS TO FP PACKAGE ROUTINE
+       DCA     .+2             /PUT IN LINE
+       JMS     ARGPRE  /SET UP ARGUMENT FROM SYMBOL TABLE
+ILOOPF,        .               /JMS TO THE FLOATING POINT PACKAGE ROUTINE
+       NOP             /FPP SOMETIMES RETURNS TO CALL+2
+       JMP     ILOOP   /DONE
+
+SCASE, TAD     JMPI    /JUST DISPATCH TO ROUTINE CALLED FOR
+       DCA     .+1
+       .               /JUMP TO APPROPRIATE ROUTINE
+
+JMSI,  JMS I   SEP1    /JMS USED FOR CALLS TO FPP BY AMODE INST
+JMPI,  JMP I   SEP1    /JMP USED TO CALL ROUTINES COMMON TO AMODE AND SMODE
+\f      /JUMP TABLE FOR AMODE INSTRUCTIONS
+
+       FFADD           /FAC_C(A)+FAC           OPCODE 0
+       FFSUB           /FAC_FAC-C(A)           OPCODE 1
+       FFMPY           /FAC_FAC*C(A)           OPCODE 2
+       FFDIV           /FAC_FAC/C(A)           OPCODE 3
+       FFGET           /FAC_C(A)               OPCODE 4
+       FFPUT           /C(A)_FAC               OPCODE 5
+       FFSUB1          /FAC_C(A)-FAC           OPCODE 6
+       FFDIV1          /FAC_C(A)/FAC           OPCODE 7
+/ALL INSTRUCTIONS BEYOND THIS POINT ARE COMMON TO AMODE AND SMODE
+SEP1,  LS1I            /S1_C(A)                OPCODE 10
+       LS2I            /S2_C(A)                OPCODE 11
+       FJOCI           /IF TRUE,PC_C(PC,PC+1)  OPCODE 12
+       JEOFI           /IF EOF,PC_C(PC,PC+1)   OPCODE 13
+       LINEI           /LINE NUMBER            OPCODE 14
+       ARRAYI          /ARRAY INST             OPCODE 15
+       ILOOP           /NOP                    OPCODE 16
+       OPERI           /OPERATE INST           OPCODE 17
+
+
+SMODE, TAD     TEMP1   /INST OFFSET
+       TAD     JMSSI   /BUILD JMP OFF STRING TABLE
+       DCA     SDIS    /PUT IN LINE
+       CLL             /STRING SCALAR TABLE
+       JMS I   STFINL  /SET UP ARGUMENT ADDRESS
+SDIS,  .               /CALL STRING ROUTINE REQUESTED
+
+
+/JUMP TABLE FOR SMODE INSTRUCTIONS
+/ A "/*" IN THE COMMENT MEANS THAT THAT OPCODE IS NOT USED,SO WE
+/USE THE SLOT FOR REGULAR STORAGE
+
+       SCON1           /SAC_SAC&C(A$)          
+       SCOMP           /IF SAC .NE. C(A$),PC_PC+2
+       SREAD           /C(A$)_DEVICE
+INTPC, .               /* INTERPRETER PC
+       SLOAD           /SAC_C(A$)
+       SSTORE          /C(A$)_SAC
+STFINL,        STFIND          /* LINK TO STRING FINDING ROUTINE
+JMSSI, JMP I   .+1     /* DISPATCH JUMP FOR SMODE INSTRUCTIONS
+\f/ARGPRE-ROUTINE TO TRANSLATE OPERAND FIELD INTO 12 BIT POINTER
+/INTO SCALAR TABLE FOR USE IN FPP CALLS.
+
+ARGPRE,        0
+       TAD     INSAV   /GET INSTRUCTION
+       AND     [377    /STRIP TO OPERAND FIELD
+       DCA     TEMP1   /SAVE
+       TAD     TEMP1
+       CLL RAL         /*2
+       TAD     TEMP1   /PTR*3
+       TAD     SCSTRT  /MAKE 12 BIT ADDR
+SCALDF,        1000            /DF TO SCALAR FIELD (CDF INITIALIZED BY LOADER)
+       JMP I   ARGPRE  /RETURN
+
+/ROUTINE TO ZERO FAC
+
+FACCLR,        -4
+L7600, 7600            /CLA
+       DCA     ACX     /ZERO EXPONENT
+       DCA     ACL     /ZERO LOW MANTISSA
+       DCA     ACH     /ZERO HIGH MANTISSA
+       JMP I   FACCLR
+
+       /STRING ACCUMULATOR USED BY STRING OPCODES AND FUNCTIONS
+       /CONTAINS ONE 6BIT CHAR PER WORD
+
+START1,
+SAC,   OSR
+       SZA CLA
+       NOP             /A HLT PLACED HERE WILL ALLOW YOU TO STOP
+                       /MACHINE BEFORE RUNTIME SYSTEM STARTS BY 
+                       /SETTING SWITCH REGISTER
+       TLS             /SET TTY FLAG
+       ISZ     SPINNR  /SPIN RANDOM NUMBER SEED
+       NOP             /WHILE WAITING FOR INITIALIZING TLS
+       TSF             /FLAG UP YET?
+       JMP     .-3     /NO
+       TAD     CDFIO
+       DCA I   PS1L    /SET UP CDFS IN PSWAP
+       TAD     CDFIO
+       DCA I   PS2L
+       JMS I   PFUDSC  /SWAP 17600 IN IF NOT ALREADY IN AND SAVE SCOPE FLAG
+       JMS I   CDFPSU
+       TAD     SCALDF  /SET PROG NOT RESTARTABLE BIT
+       DCA I   L7746   /TELL USR TO SAVE 1000-1777
+       TAD     PINFO   /POINTER TO INFO TABLE IN 17600
+       DCA     XR1
+       TAD     POVTAB  /POINTER TO BLOCK TABLE IN OVERLAY DRIVER
+       DCA     XR2
+       TAD     FACCLR  /WE HAVE TO GET 4 BLOCK NUMBERS
+       DCA     TEMP1
+OVML,  CDF 10
+       TAD I   XR1     /GET BLOCK NUMBER FOR THIS OVERLAY FROM INFO AREA
+       CDF
+       DCA I   XR2     /PUT IN TABLE IN OVERLAY DRIVER
+       ISZ     TEMP1   /DONE?
+       JMP     OVML    /NO
+       JMS I   [PSWAP  /SWAP 17600 BACK TO HIGH CORE NOW
+       JMP I   .+1
+       START3          /CONTINUE THE INITIALIZING CODE IN INTERMEDIATE BUFFER
+L7746, 7746
+PINFO, 7607
+POVTAB,        ARITHA-1
+PS1L,  P1CDF
+PS2L,  P1CDF1
+PFUDSC,        FUDSC
+
+       PAGE
+
+FUDSC, 0
+       TAD     PSFLAG  /TEST WHERE 17600 IS LOCATED
+       SMA CLA
+       TAD     [200    /IF NOT TD8E USE 7600
+       TAD     [7400   /IF TD8E USE 7400
+       DCA I   PHICORE /STORE FOR SWAPPER
+       CLA IAC
+       AND     PSFLAG
+       SNA CLA         /SKP IF PAGE 17600 IS ALREADY IN
+       JMS I   [PSWAP  /ELSE BRING IT IN
+       CDF     10
+       TAD I   PSCOPW
+       CDF
+       AND     [200    /GET SCOPE BIT FROM RES MONITOR
+       DCA I   PSCOPF
+       TAD I   PHEIGHT
+       DCA I   PHCTR   /NOW INITIALIZE THE SCREEN HEIGHT COUNTER
+       JMP I   FUDSC   /RETURN
+PHEIGHT,HEIGHT
+PHCTR, HCTR
+PSCOPW,        SCOPWD
+PSCOPF,        SCOPFG
+PHICOR,        HICORE
+\f      *SAC+SACLIM+1   /ORIGIN PAST SAC+ONE GUARD CHAR
+
+       /JUMP ON CONDITION
+
+FJOCI, TAD     INSAV   /GET JUMP INSTRUCTION
+       AND     [17     /MASK OFF JUMP CONDITION
+       SNA             /IS IT GOSUB?
+       JMP I   (GOSUB  /YES-PUSH PC ON STACK THEN JUMP
+       TAD     FSTOPI  /BASE TAD FOR BUILD OF TAD INSTRUCTION
+       DCA     .+1             /PUT IN LINE
+       .               /GET PROPER SKIP
+       DCA     .+2             /PUT IN LINE
+       TAD     ACH     /GET HIGH ORDER FAC
+       .               /SKIP INSTRUCTION
+       JMP     SUCJMP  /CONDITION TRUE-JUMP
+JFAIL, JMS I   [PWFECH /CONDITION FALSE-DON'T JUMP,BUT BUMP PC
+       JMP I   [ILOOP  /DONE
+
+/JUMP ON END OF FILE
+
+JEOFI, JMS I   [IDLE   /SEE IF FILE OPEN
+       TAD I   IOTHDR  /1ST WORD OF I/O TABLE ENTRY
+       CLL RTR         /GET EOF BIT IN LINK
+       SNL CLA         /EOF?
+       JMP     JFAIL   /NO-DON'T JUMP
+                       /YES, FALL INTO JUMP ROUTINE
+
+SUCJMP,        JMS I   [PWFECH /GET WORD FOLLOWING JUMP INS.
+       DCA I   INTPCL  /STORE AS NEW PC
+       TAD     INSAV   /GET JUMP INSTRUCTION
+       AND     [340    /MASK OFF DESTINATION FIELD
+       CLL RTR         /SLIDE OVER
+       TAD     CDFINL  /MAKE A CDF INSTRUCTION
+       DCA I   [CDFPSU /AND SET NEW PC INSTRUCTION FIELD
+       JMP I   [ILOOP  /NEXT INSTUCTION
+
+K7554, 7554            /MUST PRECEDE SKIP TABLE
+
+/SKIP TABLE USED TO HOLD TESTS FOR VARIOUS CONDITIONS
+
+K7600, 7600            /UNCONDITIONAL (CLA)
+       SMA CLA         /JPA
+       SZA CLA         /JNA
+       SMA SZA CLA     /JPA JNA
+       SPA CLA         /JMA
+       SNA CLA         /JZA
+       SPA SNA CLA     /JMA JZA
+       JMP I   JFORL   /FORLOOP JUMP ROUTINE
+
+JFORL, JFOR
+INTPCL,        INTPC
+       0000;0          /MARK BEGINNING OF GOSUB STACK
+GSTCK, 6000;0
+       6000;0
+       6000;0
+       6000;0
+       6000;0
+       6000;0
+       6000;0
+       6000;0
+       6000;0
+       0               /MARK THE END OF THE GOSUB STACK
+\f/CALL TO DEVICE DRIVER FOR FILE I/O. ASSUMES ARGS HAVE BEEN SET UP
+
+DRCALL,        0
+       DCA     DRARG1  /FUNCTION WORD INTO DRIVER CALL
+CDFINL,        CDF             /DF TO CURRENT FIELD
+       TAD I   IOTBUF  /GET BUFFER ADDRE FROM I/O TABLE ENTRY
+       DCA     DRARG2  /PUT IN DRIVER CALL
+       TAD I   IOTBLK  /GET BLOCK NUMBER FROM I/O TABLE
+       DCA     DRARG3  /PUT IN DRIVER CALL
+       TAD I   IOTHND  /GET DRIVER ENTRY
+       DCA     DRIVER  /SAVE
+       JMS I   DRIVER  /CALL DRIVER
+DRARG1,        0               /FUNCTION CONTROL WORD
+DRARG2,        0               /BUFFER ADDRESS
+DRARG3,        0               /BLOCK #
+       SMA CLA         /DEVICE ERROR-IS IT FATAL?
+       JMP I   DRCALL  /ALLS WELL
+DE,    JMS I   [ERROR  /FATAL
+DRIVER,        0
+
+/CALL TO INTERPRETER EXITING ROUTINE
+
+FSTOPN,        JMS I   [XPRINT /ON NORMAL EXITS,WE MUST EMPTY RING BUFFER
+       JMP     .-1     /FIRST
+FSTOPI,        TAD     K7554
+       DCA     INSAV   /FAKE A CALL TO BASIC.FF FUNCTION 6
+       JMP I   .+1     /CALL OVERLAY
+       FUNC5I
+
+/USE FUNCTION-TAKES WORD FOLLOWING CALL AND STUFFS IT IN USECON FOR
+/USE A BUFFER POINTER FOR USER SUBROUTINE
+
+USE,   JMS I   [PWFECH /GET NEXT WORD FROM PSEUDO-CODE STREAM
+       DCA     USECON  /STORE IN PAGE 0 SLOT
+       JMP I   [ILOOP  /RETURN
+
+       PAGE
+\f/ARRAY INSTRUCTIONS
+/ARRAY INSTRUCTIONS WORK BY FINDING THE ADDRESS OF THE ARGUMENT FROM THE ARRAY SYMBOL
+/TABLE,THEN CALLING THE APPROPRIATE FLOATING POIN PACKAGE ROUTINE.
+
+ARRAYI,        TAD     MODESW  /WHICH MODE?
+       SZA CLA
+       JMP     SARRAY  /SMODE
+       TAD     INSAV   /GET ARRAY INSTRUCTION
+       AND     K0037   /MASK OFF ARRAY OPERAND
+       CLL RTL         /MULTIPLY BY 4 (ENTRY LENGTH)
+       TAD     ARSTRT  /MAKE POINTER INTO ARRAY TABLE
+       DCA     XR1     /POINTS TO ARRAY FOR THIS OPERATION
+ATABDF,        .               /CHANGE DF TO ARRAY TABLE FIELD (SET BY START)
+       TAD I   XR1     /GET POINTER TO FIRST ARRAY ELEMENT
+       DCA     TEMP2   /SAVE FOR LATER
+       TAD I   XR1     /GET DF FOR VARIABLE
+       DCA     ADFC    /PUT IN LINE AT END OF ROUTINE
+       TAD I   XR1     /GET ARRAY DIMENSION 1
+       DCA     TEMP3   /SAVE
+       TAD     S1      /GET SUBSCRIPT 1
+       CLL CMA         /SET UP 12 BIT COMPARE
+       TAD     TEMP3   /DIMENSION 1 +1
+       SNL CLA         /S1 TOO BIG?
+SU,    JMS I   [ERROR  /YES-SUBSCRIPT OUT OF BOUNDS ERROR
+       DCA     TEMP6   /CLEAR TEMPORARY
+       TAD I   XR1     /GET DIMENSION 2
+       SNA             /IS SECOND DIMENSION 0?(ARRAY UNIDIMENSIONAL)
+       JMP     ADCALC  /YES-DON'T CHECK S2 FOR OUT OF BOUNDS
+       DCA     ARJMP   /SAVE DIM2+1
+       TAD     S2      /GET SUBSCRIPT 2
+       CLL CMA         /SAVE 12 BIT COMPARE
+       TAD     ARJMP
+       SNL CLA         /S2 BIGGER THAN DIM2?
+       JMP     SU      /YES
+       TAD     S2      /MULTIPLY DIM1+1 BY S2
+       JMS I   [MPY    /12 BY 12 MULTIPLY ROUTINE
+ADCALC,        CLL
+       TAD     S1      /LORD OF S1+(DIM1+1)*S2
+       DCA     TEMP5   /SAVE
+       RAL             /CARRY TO BIT 11
+       TAD     TEMP6   /HORD OF S1+(DIM1+1)*S2
+       DCA     TEMP6   /SAVE
+       TAD     TEMP5   /LORD OF S1+(DIM1+1)*S2
+       CLL RAL         /*2
+       DCA     TEMP7   /LORD OF [S1+(DIM1+1)*S2]*2
+       TAD     TEMP6   /HORD OF S1+(DIM1+1)*S2
+       RAL             /*2
+       DCA     TEMP3   /HORD OF [S1+(DIM1+1)*S2]*2
+       CLL
+       TAD     TEMP5   /LORD OF S1+(DIM1+1)
+       TAD     TEMP7   /LORD OF [S1+(DIM1+1)*S2]
+       DCA     TEMP7   /LORD OF 3*[S1+(DIM1+1)*S2]
+       RAL             /CARRY TO BIT 11
+       TAD     TEMP6   /HORD OF [S1+(DIM1+1)*S2)*2
+       TAD     TEMP3   /HORD OF S1+(DIM1+1)*S2
+       DCA     TEMP6   /HORD OF 3*[S1+(DIM1+1)*S2]
+       CLL
+       TAD     TEMP7   /INDEX TO ELEMENT
+       TAD     TEMP2   /AC POINTS TO CORRECT ARRAY ELEMENT
+       DCA     XR1     /SAVE POINTER
+       RAL             /CARRY TO BIT 11
+       TAD     TEMP6   /COMBINE TO MAKE TOTAL # OF FIELD OVERLAPS
+       CLL RTL
+       RAL             /SLIDE OVERLAPS TO FIELD BITS (6-8)
+       TAD     ADFC    /ADD ANY CHANGE IN DATA FIELD TO CDF
+       DCA     ADFC    /PUT ABSOLUTE CDF IN LINE
+       TAD     INSAV   /GET ARRAY INSTRUCTION AGAIN
+       AND     [340    /MASK OFF ARRAY OPCODE
+       CLL RTR
+       RTR
+       RAR             /SLIDE TO BITS 9-11
+       TAD     JMPI2   /AND USE AS INDEX INTO JUMP TABLE
+       DCA     ARJMP   /PUT JUMP IN LINE OF CODE
+       IAC
+       DCA     FF      /PUT FPP IN "SPECIAL MODE"
+ADFC,  .               /CHANGE DF TO DF OF ARRAY ELEMNT
+       TAD     XR1     /AC POINTS TO ARRAY ELEMENT
+ARJMP, .               /PERFORM THE REQUIRED OPERATION
+       NOP             /FPP SOMETIMES RETURNS TO CALL+2
+       JMP I   [ILOOP  /DONE
+
+/ARRAY JUMP TABLE
+
+AJT,   FFSUB1          /FAC=A(S1,S2)-FAC               OPCODE 0
+       FFADD           /FAC=FAC+A(S1,S2)               OPCODE 1
+       FFSUB           /FAC=FAC-A(S1,S2)               OPCODE 2
+       FFMPY           /FAC=FAC*A(S1,S2)               OPCODE 3
+       FFDIV           /FAC=FAC/A(S1,S2)               OPCODE 4
+       FFGET           /FAC=C(A(S1,S2)                 OPCODE 5
+FPUTLL,        FFPUT           /C(A(S1,S2)=FAC                 OPCODE 6
+       FFDIV1          /FAC=A(S1,S2)/FAC               OPCODE 7
+\f      /STRING ARRAY DISPATCH
+
+SARRAY,        TAD     INSAV   /GET INSTRUCTION
+       AND     [340    /ISOLATE ARRAY OPCODE
+       CLL RTR
+       RTR             /AND SLIDE IT OVER FOR AN OFFSET
+       RAR
+       TAD     JMPISA  /BUILD A JUMP TO STRING INSTRCUTION
+       DCA     SAD     /AND PUT IN LINE
+       STL             /TELL SFIND TO USE ARRAY TABLE
+       JMS I   STFILK  /SET UP ARGUMENT ADDRESS
+SAD,   .               /EXECUTE INSTRCUTION
+
+/STRING ARRAY JUMP TABLE
+/USED WHEN ARRAYI CALLED IN SMODE
+/ A "/*" IN THE COMMENT MEANS THAT OPCODE IS UNDEFINED AND THE SLOT
+/IN THE TABLES IS USED FOR NORMAL STORAGE
+
+JMPISA,        JMP I   .+1     /DISPATCH JUMP FOR STRING ARRAY INSTRUCTIONS
+
+       SCON1           /SAC_SAC&C(A$(S1))
+       SCOMP           /SKIP IF SAC=C(A$(S1))
+       SREAD           /A$(S1)_DEVICE
+K0037, 37              /*
+STFILK,        STFIND          /* LINK TO STRING FINDING ROUTINE
+       SLOAD           /SAC_C(A$(S1))
+       SSTORE          /C(A$(S1))_SAC
+JMPI2, JMS I   AJT     /* DISPATCH JUMP FOR ARRAY INST
+\f/ROUTINE TO PUT ONE WORD IN FILE BUFFER IN FIELD 1
+
+BCPUT, 0
+       DCA     TEMP6   /SAVE AC
+       JMS I   [IDLE   /CHECK IF FILE OPEN
+       TAD I   IOTPTR  /GET READ/WRITE POINTER
+       DCA     TEMP7   /SAVE
+       TAD     ENTNO   /GET FILE #
+       SZA CLA         /IF TTY,BUFFER FIELD IS 0
+       CDF 10
+       TAD     TEMP6   /GET WORD TO STORE AGAIN
+       DCA I   TEMP7   /STORE IT IN BUFFER
+CDF0,  CDF
+       TAD I   IOTHDR  /HEADER WORD
+       AND     (7737   /TURN OFF BLOCK WRITTEN BIT
+       TAD     (40             /TURN IT ON AGAIN
+       DCA I   IOTHDR
+       JMP I   BCPUT   /RETURN
+
+       PAGE
+\f/TELETYPE DRIVING ROUTINE
+/2 ENTRY POINTS-XPUTCH PUTS A CHARCTER IN THE RING BUFFER
+/               XPRINT TYPES A CHARACTER IF POSSIBLE
+/              AND     RETURNS TO CALL+1 IF THERE
+/              ARE MORE CHARCTERS IN THE BUFFER,CALL+2
+/              IF THE BUFFER IS EMPTY
+/THE IDEA IS THE PLACE CALLS TO XPRINT AT VARIOUS POINTS IN THE INTER-
+/PRETER AND THUS KEEP THE TTY BUSY WITHOUT WASTING THE TIME WAITING FOR
+/THE TTY FLAG. THE SUCCESS OF THIS SCHEME DEPENDS HEAVILY ON THE NUMBER
+/AND PLACEMENT OF THE CALLS TO XPRINT.
+
+XPUTCH,        0
+       DCA     CHRSAV  /SAVE THE CHARACTER
+XPUT1, ISZ     SPINNR  /SPIN RANDOM # SEED
+       JMS     XPRINT  /START A CHAR IF POSSIBLE
+       NOP
+       TAD     BCNT    /GET THE NUMBER OF AVAILABLE SLOTS
+       SNA CLA         /ARE THERE ANY?
+       JMP     XPUT1   /NO-TRY TO RPINT 1 AND FREE UP A SPACE
+PUTCHR,        TAD     CHRSAV  /GET CHARACTER AGAIN
+       DCA I   BUFIN   /PUT CHARACTER IN RING BUFFER
+       ISZ     BUFIN   /BUMP BUFEER POINTER OF INPUT
+       CLA CLL CMA     /-1 IN AC
+       TAD     BCNT    /DECREMENT AVAILABLE SLOT COUNT
+       DCA     BCNT
+       TAD     BUFIN   /GET BUFFER INPUT POINTER
+       TAD     MBEND   /SUBTRACT ADDR OF END OF BUFFER
+       SPA SNA CLA     /PAST EDN OF BUFFER?
+       JMP I   XPUTCH  /NO-RETURN
+       TAD     BSTRTA  /YES-RESET INPUT POINTER TO BEGINNING OF BUFFER
+       DCA     BUFIN
+       JMP I   XPUTCH  /RETURN
+
+BUFIN, BSTRT           /POINTER TO NEXT SLOT FOR BUFFER INPUT
+BUFOUT,        BSTRT           /POINTER TO NEXT CHARACTER TO BE PRINTED
+BSTRTA,        BSTRT           /ADDR OF START OF TTY BUFFER
+BCNT,  30              /# OF AVAILABLE SLOTS IN BUFFER (40 INITIALLY)
+CHRSAV=TEMP1
+MBEND, -BEND           /-ADDR OF END OF RING BUFFER
+MCTRLC,        -3
+M50,   -30
+MXON,  -21+3
+MXOFF, -23+21
+XFLAG, 0
+
+
+XPRINT,        0
+       KSF             /IS KEYBOARD FLAG UP?
+       JMP     NOCC    /NO-NO CHANCE FOR A CTRL/C
+       KRB             /YES-GET THE CHAR IN KEYBOARD BUFFER
+       AND     [177    /GET RID OF PARAITY
+       TAD     MCTRLC  /IS IT CTRL/C
+       SNA
+       JMP I   FSTOP1  /YES-ABORT TO EDITOR
+       TAD     MXON
+       SZA
+       JMP     .+3
+       DCA     XFLAG
+       JMP     NOCC+3
+       TAD     MXOFF
+       SZA CLA
+       JMP     NOCC
+       ISZ     XFLAG
+       JMP     XPRINT+1
+NOCC,  TAD     XFLAG
+       SZA CLA
+       JMP     XPRINT+1
+       TAD     BCNT    /# OF AVAILABLE SLOTS IN BUFFER
+       TAD     M50             /IS BUFFER EMPTY?
+       SNA CLA
+       JMP     RECP2   /YES-RETURN TO CALL+2
+       TSF             /NO-TTY FLAG UP YET?
+       JMP I   XPRINT  /NO-GO ABOUT YOUR BUSINESS
+       TAD I   BUFOUT  /GET NEXT CHARACTER
+/*****************************************************************:
+/N.B. BECAUSE OF THE ABOVE INSTRUCTION,THE DF MUST BE SET TO THE
+/INTERPRETER FIELD WHENEVER XPRINT IS CALLED. WATCH YOUR HOOK PLACEMENT!
+/****************************************************************:
+       JMS I   (PCH    /TYPE THE CHAR
+       ISZ     BUFOUT  /BUMP BUFFER OUTPUT POINTER
+       TAD     BUFOUT  /GET OUTPUT POINTER
+       TAD     MBEND   /SUBTRACT END OF BUFFER
+       SPA SNA CLA     /IS OUTPUT POINTER PAST END?
+       JMP     BOUTRS  /NO-FREE UP A SPOT
+       TAD     BSTRTA  /YES-RESET POINTER TO BEGINNING
+       DCA     BUFOUT
+BOUTRS,        ISZ     BCNT    /INCREMENT # OF FREE SLOTS (WE JUST PRINTED ONE)
+       JMP I   XPRINT  /RETURN
+
+RECP2, ISZ     XPRINT  /BUMP RETURN
+       JMP I   XPRINT  /RETURN TO CALL+2 FOR EMPTY BUFFER
+
+
+/TELETYPE RING BUFFER
+
+BSTRT, "B              /START OF BUFFER
+       "R
+       "T
+       "S
+       " 
+       "V
+VERLOC,        260+VERSON
+       300+SUBVER
+       0215
+       0212
+VEREND,        0212
+VCHECK,        0
+       CDF 10
+       TAD I   N7644
+       CDF 0
+       AND     XR4
+       SNA CLA
+       JMP I   VCHECK
+       TAD     XR1
+       DCA     BUFIN
+       TAD     SACXR
+       DCA     BCNT
+       JMP I   VCHECK
+BEND,
+N7644, 7644
+
+\f      /LINE NUMBERS
+
+LINEI, TAD     INSAV   /GET INSTRUCTION
+       DCA     LINEHI  /SAVE
+       JMS I   [PWFECH /GET WORD FOLLOWING LINE # INST
+       DCA     LINELO  /SAVE  AS LOW ORDER LINE #
+TRHOOK,        JMP I   [ILOOP  /RETURN TO I-LOOP
+       TAD     KC240   /IF TRACE IS ON,FAKE CALL
+       DCA     INSAV   /TO FUNC2,#12
+       JMP I   .+1
+       FUNC2I          /DISPATCH TO TRACE FUNCTION
+
+/INTERMEDIATE TTY BUFFER
+/USED TO BUFFER OUTPUT FROM FPP BEFORE WE PUT IT
+/IN BASIC FORMAT FOR TRANSPORTATION TO THE TTY RING
+/BUFFER
+
+KC240, 240             /STOPPER TO MARK BEGINNING OF BUFFER
+INTERB,
+START3,        TAD     CDFPS   /CDF FOR PSEUDO-CODE
+       DCA I   [CDFPSU /PUT IN-LINE TO ILOOP
+       TAD     PSSTRT  /START OF PSEUDO-CODE
+       DCA I   INTPCK  /PUT INTO PC
+       JMS I   [FACCLR /ZERO FAC
+       TAD     CDFIO   /CDF FOR SYMBOL TABLE FIELD
+       DCA I   STDFL   /PUT IN LINE FOR STRING FUNCTIONS
+FPPTM5,        TAD     CDFIO   /CDF FOR SYMBOL TABLES
+       DCA I   ATABDL  /PUT IN LINE FOR ARRAY CALCULATIONS
+       TAD     CDFIO   /CDF FOR SCALAR TABLE
+FPPTM4,        DCA I   SCALDL  /PUT IN LINE FOR ARGPRE
+       TAD     CDFIO
+       DCA I   DLCDFL  /DATA FIELD FOR DATA LIST
+FPPTM3,        TAD     DLSTRT
+       DCA     DATAXR  /DO A RESTORE IN INCORE DATA LIST
+       JMP I   .+1     /CONTINUE INITAILIZATION CODE IN TTY INPUT BUFFER
+FPPTM2,        START4
+ATABDL,        ATABDF
+STDFL, STDF
+FPPTM1,                        /FLOATING POINT TEMPORARY
+INTPCK,        INTPC
+DLCDFL,        DLCDF
+SCALDL,        SCALDF
+
+       PAGE
+\f      /VT52 DELAY PARAMETERS (MUST BE AT BEGINNING OF PAGE)
+
+HEIGHT,        0               /NEGATIVE SCREEN HEIGHT
+DELAY, 0               /NEGATIVE DELAY VALUE
+       IFNZRO HEIGHT-1200 <__FIX SET COMMAND__>
+HCTR,  0               /HEIGHT COUNTER INITIALIZED BY SET
+DCTR,  0               /DELAY COUNTER INITIALIZED BY SET
+
+       /LOW LEVEL ROUTINE TO TYPE A CHAR
+
+PCH,   0
+       TSF             /WAIT FOR PREV CHAR
+       JMP     .-1
+       TLS             /TYPE THE CURRENT ONE
+       AND     [177    /MASK TO 7BIT
+       TAD     (-15    /TEST IF LINE FEED WILL BE SENT NEXT
+       SZA CLA
+       JMP I   PCH     /RETURN IF NOT
+       ISZ     HCTR    /TEST SCREEN HEIGHT IF LF
+       JMP I   PCH     /RETURN IF NOT AT BOTTOM OF SCREEN
+       TAD     HEIGHT
+       DCA     HCTR    /RESET HEIGHT COUNTER NOW
+       TAD     DELAY
+       SNA             /TEST FOR ZERO DELAY
+       JMP I   PCH     /RETURN IF SO
+       DCA     DCTR    /ELSE SET DELAY COUNTER
+DLOOP, ISZ     PSWAP   /NOW EXEC INNER LOOP 4096 TIMES (USUALLY)
+       JMP     .-1
+       KSF             /TEST IF KEY STRUCK
+       SKP
+       JMP I   PCH     /RETURN AT ONCE IF YES
+       ISZ     DCTR    /TEST DELAY TIMER
+       JMP     DLOOP   /REITERATE
+       JMP I   PCH     /NOW ALLOW PRINTING TO CONTINUE
+
+       /OPERATE CLASS INSTRUCTIONS
+
+OPERI, TAD     INSAV   /GET OPERATE INSTRUCTION
+       AND     [17     /MASK OFF OPERATE OPCODE
+       TAD     JMPI3   /BUILD JUMP OFF OPERATE JUMPTABLE
+       DCA     .+1             /STORE THE JUMP IN LINE
+       .               /DISPATCH TO PROPER OPERATE ROUTINE
+
+JMPI3, JMP I   .+1     /JUMP TO OPERATE ROUTINE CALLED FOR
+
+       /OPERATE JUMP TABLE
+
+       FUNC3I          /CALL RESIDENT FUNCTION OPCODE 0
+       SPFUNC          /SPECIAL FUNCTIONS      OPCODE 1
+       SFN             /SET FILE NUMBER        OPCODE 2
+       FNEGI           /NEGATE FAC             OPCODE 3
+       RETRNI          /GOSUB RETURN           OPCODE 4
+       RESTOR          /RESTORE DEVICE         OPCODE 5
+       LSUB1I          /LOAD S1 FROM FAC       OPCODE 6
+       LSUB2I          /LOAD S2 FROM FAC       OPCODE 7
+MSPACE,        20              /THIS OPCODE NOT DEFINED,SO WE PUT A CONST HERE
+       READI           /READ DEVICE            OPCODE 11
+       WRITEI          /WRITE DEVICE           OPCODE 12
+       SWRITE          /STRING WRITE           OPCODE 13
+       FUNC5I          /CALL FILE FUNCTION     OPCODE 14
+       FUNC4I          /CALL USER FUNCTION     OPCODE 15
+       FUNC1I          /CALL FUNCTIONS 1       OPCODE 16
+       FUNC2I          /CALL FUNCTIONS 2       OPCODE 17
+\f/ROUTINE TO SWAP PG 17600 WITH N7400 OR N7600 (WHICHEVER THE CASE MAY BE)
+/WHERE N IS THE HIGH CORE FIELD
+
+PSWAP, 0
+       TAD     KK7600  /POINTER TO 17600 AND COUNTER
+       DCA     TEMP1
+       TAD     PSFLAG  /GET SWAPPING FLAGS
+       RAR
+       CML RAL         /TOGGLE THE INPLACE BIT
+       DCA     PSFLAG  /STORE IT BACK
+       TAD     HICORE  /PICK UP ADDR OF HIGH CORE
+       DCA     TEMP2   /POINTER TO HIGH CORE
+P1CDF, HLT             /DF TO HI CORE
+       TAD I   TEMP2   /GET WORD FROM HI CORE
+       DCA     TEMP4   /SAVE IT
+P2CDF, CDF 10
+       TAD I   TEMP1   /GET WORD FROM 17600
+P1CDF1,        HLT             /DF TO HI CORE AGAIN
+       DCA I   TEMP2   /PUT 17600 WORD IN HI CORE
+P2CDF1,        CDF 10
+       TAD     TEMP4   /GET SAVED HI CORE WORD
+       DCA I   TEMP1   /AND PUT IN 17600
+       ISZ     TEMP2   /BUMP HI CORE POINTER
+KK7600,        7600            /CLA
+       ISZ     TEMP1   /BUMP 17600 POINTER AND CHECK FOR DONE
+       JMP     P1CDF   /NO DONE-MOVE NEXT WORD
+       CDF
+       JMP I   PSWAP   /DONE-RETURN
+HICORE,        0               /POINTS TO LOCATION OF 17600 SAVE AREA
+
+       IFNZRO  EAE     <
+
+       /TEMPORARY INCLUSION FOR FFOUT
+
+       /ADD OP TO FAC
+
+OADD,  0
+       CLL
+       TAD     AC2
+       TAD     AC1
+       DCA     AC1     /ADD GUARD BITS
+       RAL
+       TAD     OPL
+       TAD     ACL
+       DCA     ACL     /ADD LOW ORDER BITS
+       RAL
+       TAD     OPH
+       TAD     ACH
+       DCA     ACH     /ADD HIGH ORDER BITS
+       JMP I   OADD
+
+       /SHIFT FAC LEFT 1 BIT
+
+AL1,   0
+       TAD     AC1
+       CLL RAL
+       DCA     AC1
+       TAD     ACL
+       RAL
+       DCA     ACL
+       TAD     ACH
+       RAL
+       DCA     ACH
+       JMP I   AL1
+       >
+       PAGE
+\f      /LOAD SUBSCRIPT 1 OR 2 FROM FAC OR MEMORY
+
+LSUB2I,        ISZ     DCASUB
+       JMP     LSUB1I
+LS2I,  ISZ     DCASUB
+LS1I,  JMS I   [FACSAV /PRESERVE FAC
+       JMS I   ARGPRL  /GET ARG POINTER INTO AC
+       JMS I   [FFGET  /LOAD ARG INTO FAC (SKIPS NEXT INST ON RETURN)
+LSUB1I,        JMS I   [FACSAV /SAVE THE FAC
+       JMS I   [UNSFIX /GET INT(FAC)
+DCASUB,        DCA     S1      /SET RESULT AS SUBSCRIPT 1
+       JMS I   [FACRES /RESTORE FAC
+       TAD     DCAS1
+       DCA     DCASUB  /FUDGE INSTR BACK
+       JMP I   [ILOOP  /NEXT INSTRCUTION
+DCAS1, DCA     S1
+ARGPRL,        ARGPRE
+
+/JMP DISPATCH FOR FUNC1 CALLS
+
+JMSI4, JMS I   .+1     /CALL FOR CANNED FUNCTION SET 1
+
+/JUMP TABLE FOR FUNCTION CALL 1
+
+       ATAN            /FUNCTION BITS= 0
+       COS             /               1
+       EXPON1          /               2
+       EXPON           /               3
+       INT             /               4
+       LOG             /               5
+       SGN             /               6
+       SIN             /               7
+       RND             /               10
+       FROOT           /               11
+
+/JUMP FOR FUNC2 DISPATCH
+
+JMSI5, JMP I   .+1     /JMP OFF THE SET 2 TABLE
+
+/JUMP TABLE FOR FUNCTION SET 2
+
+       ASC             /FUNCTION BITS= 0
+       CHR             /               1
+       DATE            /               2
+       LEN             /               3
+       POS             /               4
+       SEG             /               5
+       STR             /               6
+       VAL             /               7
+       ERRORR          /               10
+/ERRORR MUST BE FUNCTION #10,ELSE "ERROPC" MUST CHANGE
+       TRACE           /               11
+       TPRINT          /               12
+/TPRINT MUST BE #12 OR TRHOOK+1 MUST CHANGE
+
+/DISPATCH FOR FUNC5 CALLS
+
+JMPFIL,        JMP I   .+1     /CALL FORR FILE MANIPULATING FUNCTIONS
+
+/JUMP TABLE FOR FILE FUNCTIONS
+
+       CHAIN           /FUNCTION BITS= 0
+       CLOSE           /               1
+       OPENAF          /               2
+       OPENAV          /               3
+       OPENNF          /               4
+       OPENNV          /               5
+       FSTOP           /INT. EXIT      6
+
+/ERROR CALL FOR USER FUNCTIONS-USER FUNCTION SHOULD "JMS I (IA"
+
+IA,    JMS I   [ERROR
+\f      /FUNCTION OVERLAY DRIVER
+
+FUNC4I,        JMS I   [XPRINT /PURGE TTY RING BUFFER
+       JMP     .-1     /BEFORE CALLING USER FUNCTION
+       IAC             /LOOK FOR OVERLAY FLAG=3
+FUNC5I,        IAC             /LOOK FOR OVERLAY FLAG=2
+FUNC2I,        IAC             /LOOK FOR OVERLAY FLAG=1
+FUNC1I,        DCA     TEMP1   /LOOK FOR OVERLAY FLAG=0
+       CDF             /DF TO THIS FIELD
+       TAD     TEMP1   /GET OVERLAY # AGAIN
+       CIA             /NEGATE
+       TAD     OVRLAY  /COMPARE AGAINST OVERLAY FLAG
+       SNA CLA         /IS THE ONE WE WANT ALREADY RESIDENT?
+       JMP     OVDNE   /YES-JUST JUMP TO FUNCTION
+       TAD     TEMP1   /NO-GET NUMBER OF OVERALY DESIRED
+       TAD     OATADI  /USE AS OFFSET TO BUILD STARTING BLOCK TAD
+       DCA     TEMP2   /POINTS TO PROPER STARING BLOCK #
+       TAD I   TEMP2   /GET STARTING BLOCK FOR THIS OVERLAY
+       DCA     OVADD   /PUT IN DRIVER CALL
+       JMS I   L7607   /CALL SYSTEM HANDLER
+       0500            /OVERLAY 3400-4600
+       3400
+OVADD, .               /STARTING BLOCK # OF OVERLAY
+OE,    JMS I   [ERROR  /I/O ERROR
+       TAD     TEMP1
+       DCA     OVRLAY  /CHANGE RESIDENT FLAG
+OVDNE, TAD     [SAC-1  /ENTER STRING FUNCTIONS WITH SACXR SET UP
+       DCA     SACXR
+       TAD     TEMP1   /FUNCTION #
+       TAD     JMSTAD  /BUILD A TAD OF THE PROPER DISPATCH JMS
+       DCA     .+2     /PUT IN LINE
+       JMS I   [FBITGT /GET # OF FUNCTION DESIRED
+       .               /BUILD JUMP OFF JUMP TABLE
+FUJUMP,        DCA     .+1     /PUT JUMP IN LINE
+       .               /GO TO DESIRED FUNCTION
+       JMP I   [ILOOP  /DONE
+
+OATADI,        ARITHA
+L7607, 7607
+OVRLAY,        0               /# OF CURRENTLY RESIDENT OVERLAY
+                       /0=ARITHMETIC,1=STRING,2=FILE,3=USER
+
+/OVERLAY TABLE-CONTAINS STARTING BLOCK # OF SYSTEM OVERLAYS
+/INITIALIZED BY LOADER
+
+ARITHA,        .               /STARTING BLOCK OF ARITHMETIC OVERLAY
+STRNGA,        .               /STARTING BLOCK OF STRING OVERLAY
+FILEFA,        .               /STARTING BLOCK OF FILE OVERLAY
+USRA,  .               /STARTING BLOCK OF USER FUNCTIONS
+
+JMSTAD,        TAD I   TADTAB
+
+TADTAB,        JMSI4
+       JMSI5
+       JMPFIL
+       JMSUSR
+
+\f/CALL FOR RESIDENT FUNCTION
+
+FUNC3I,        JMS I   [FBITGT /ISOLATE FUNCTION #
+       TAD     JMSI7   /MAKE A JUMP OFF JUMP TABLE
+       JMP     FUJUMP  /PUT THE JUMP IN LINE AND EXECUTE IT
+
+JMSI7, JMP I   .+1
+
+/JUMP TABLE FOR RESIDENT FUNCTIONS
+
+       XABSVL          /FUNCTION BITS= 0
+       COMMA           /               1
+       CRFUNC          /               2
+       ILOOPF          /               3
+       TAB             /               4
+       PNT             /               5
+       USE             /               6
+
+
+       *1557   /****N.B.****
+               /THIS TABLE CANNOT BE MOVED!!!!
+
+/JUMP DISPATCH FOR USER ROUTINES
+JMSUSR,        JMS I   .+1
+
+/JUMP TABLE FOR USER FUNCTIONS
+       ILOOPF          /USER FUNCTION  1
+       ILOOPF          /               2
+       ILOOPF          /               3
+       ILOOPF          /               4
+       ILOOPF          /               5
+       ILOOPF          /               6
+       ILOOPF          /               7
+       ILOOPF          /               8
+       ILOOPF          /               9
+       ILOOPF          /               10
+       ILOOPF          /               11
+       ILOOPF          /               12
+       ILOOPF          /               13
+       ILOOPF          /               14
+       ILOOPF          /               15
+       ILOOPF          /               16
+
+       PAGE
+\f/SPECIAL FUNCTIONS
+
+SPFUNC,        JMS I   [FBITGT /ISOLATE FUNCTION BITS
+       TAD     JMPI6   /MAKE A JUMP OFF SPECIAL FUNCTION TABLE
+       DCA     .+1             /PUT IN LINE
+       .
+
+JMPI6, JMP I   .+1     /JUMP TO SPECIAL FUNCTION ROUTINE
+
+/SPECIAL FUNCTION JUMP TABLE
+
+       SETF            /SET FSWITCH                    0
+       FRANDM          /RANDOMIZE                      1
+       FSTOPN          /LEAVE INTERPRETER              2
+       SRLIST          /STRING READ FROM DATA LIST     3
+       CSFN            /SET FILE # TO TTY              4
+       RDLIST          /READ DATA LIST                 5
+       AMODE           /SWITCH TO A MODE               6
+       SSMODE          /SWITCH TO S MODE               7
+\f/SUBROUTINE UNSFIX-UNSIGNED INTEGER FIX ROUTINE. FIXS A POSITIVE 12 BIT
+/NUMBER OUT OF FAC MANTISSA AND LEAVES RESULT IN AC.RESULT IS AN UNSIGNED,
+/12 BIT INTEGER
+
+UNSFIX,        0
+       CDF 0
+       TAD     ACL     /LOW MANTISSA
+       CLL RAL         /HI BIT OF LO MANTISSA TO LINK
+       CLA
+       TAD     ACH     /HIGH MANTISSA
+       SPA             /IS NUMBER POSITIVE?
+FM,    JMS I   [ERROR  /NO-BOO!!!
+       RAL             /SHIFT THE SIGN BIT OUT AND THE MANTISSA OVER,
+       DCA     ACH     /MAKING 12 BITS OF MANTISSA AND BINARY POINT BEFORE BIT 0
+       TAD     ACX             /GET EXPONENT
+       SPA SNA CLA     /IS X>1?
+       JMP I   UNSFIX  /NO-FIX IT TO 0
+       TAD     ACX             /YES-GET EXPONENT
+       TAD     [-14            /SET BINARY POINT AT 12
+       SNA             /DONE ALREADY?
+       JMP     UNSOUT  /YES
+       SMA             /NO-IS # TOO BIG?
+FO,    JMS I   [ERROR  /YES
+       DCA     ACX             /NO-STORE COUNT
+       TAD     ACH     /HI MANTISSA
+UNSLP, CLL RAR         /SCALE RIGHT
+       ISZ     ACX             /DONE?
+       JMP     UNSLP   /NO
+       JMP I   UNSFIX  /YES-RETURN
+
+UNSOUT,        TAD     ACH     /ANSWER IN AC
+       JMP I   UNSFIX
+
+/RESTORE ROUTINE
+
+RESTOR,        TAD     ENTNO   /GET CURRENT FILE #
+       SNA CLA         /IS IT 0?
+       JMP     RESDLS  /YES-RESTORE DATA LIST
+       JMS I   (WRBLK  /NO-WRITE CURRENT BUFFER
+       STA             /-1
+       TAD I   IOTLOC  /STARTING BLOCK-1
+       DCA I   IOTBLK  /SET CURRENT BLOCK #
+       TAD I   IOTBUF  /GET BUFFER ADDRESS
+       DCA I   IOTPTR  /USE IT TO RESET READ\WRITE POINTER
+       TAD I   IOTHDR  /GET HEADER WORD
+       AND     (7435   /CLEAR EOF BIT,BUFFER WRITTEN BIT,AND CHAR #
+       DCA I   IOTHDR
+       JMS I   [NEXREC /READ FIRST BLOCK INTO BUFFER
+       JMP I   [ILOOP  /DONE
+RESDLS,        TAD     DLSTRT  /ADDRESS OF START OF INCORE DATA LIST
+       DCA     DATAXR  /USE IT TO RESET DATA LIST POINTER
+       JMP I   [ILOOP  /THATS ALL!
+\f/SUBROUTINE STFIND-WHEN CALLED,IF LINK=1 STRING ARRAY TABLE IS
+/USED,IF LINK=0 STRING SYMBOL TABLE IS USED. RETURNS WITH AC SET
+/TO CDF OF OPERAND STRING,STRPTR POINTING TO THE FIRST WORD
+/IN THE STRING, AND THE MAX LENGTH OF THE STRING IS IN STRMAX. ALSO,
+/THE ACTUAL LENGTH OF THE STRING IS IN STRCNT
+
+STFIND,        0
+       SZL             /IS THIS AN ARRAY INST?
+       JMP     SAFIND  /YES-POINTER IS INTO ARRAY TABLE
+       TAD     INSAV   /GET INST AGAIN
+       AND     [377    /ISOLATE OPERAND POINTER
+       DCA     TEMP1   /NO-SAVE OPERAND POINTER
+       TAD     TEMP1   /N
+       CLL RAL         /2N
+       TAD     TEMP1   /3N (3 WORDS/ENTRY)
+       TAD     STSTRT  /ADD BASE ADR OF STRING TABLE
+STCOM, DCA     XR2     /POINTER TO THIS ENTRY IN STRING TABLE
+STDF,  .               /DF TO THAT OF SYMBOL TABLES (SET BY START)
+       TAD I   XR2     /GET POINTER TO STRING
+       DCA     STRPTR
+       TAD I   XR2     /GET CDF FOR OPERAND STRING
+       DCA     STRCDF  /SAVE
+       TAD I   XR2     /GET -(MAX LENGTH OF STRING)
+       DCA     STRMAX  /SAVE
+       SNL             /ARRAY ELEMENT?
+       JMP     STRCDF  /NO-SKIP THIS SUBSCRIPT CALCULATION
+       TAD     S1      /GET SUBSCRIPT
+       CLL CMA         /SET UP 12 BIT COMPARE
+       TAD I   XR2     /GET DIMENSION
+       SNL CLA         /IS S1>DIMENSION?
+       JMP I   (SU     /YES
+       TAD     STRMAX  /NO-GET ELEMENT LENGTH
+       CIA             /MAKE POSITIVE
+       CLL IAC         /ROUND OFF TO NEAREST MULTIPLE OF 2
+       CLL RAR         / DIVIDE BY TWO (COUNT/2=WORD COUNT)
+       CLL IAC         /ADD A WORD FOR HEADER
+       DCA     TEMP3   /# OF WORDS IN EACH ARRAY ELEMENT
+       TAD     S1      /GET SUBSCRIPT
+       JMS I   [MPY    /S1*ELEMENT LENGTH (ASSUMES LINK UNCHANGED ON RETURN)
+       TAD     STRPTR  /ARRAY OFFSET+POINTER TO A(0)
+       DCA     STRPTR  /FINAL STRING POINTER
+       RAL             /CARRY TO BIT 11
+       TAD     TEMP6   /ADD TO ACCUMLATED OVERLAPS FROM MULTIPLY
+       CLL RTL
+       RAL             /PUT OVERLAP # INTO BITS 6-8
+       TAD     STRCDF  /ADD TO CDF IF NECESSARY
+       DCA     STRCDF  /SAVE AGAIN
+STRCDF,        0               /DF TO STRING FIELD
+       TAD I   STRPTR
+       CDF
+       DCA     STRCNT  /STORE -(CURRENT LENGTH OF STRING)
+       TAD     STRCDF  /CDF TO OPERAND IN AC
+       DCA I   (SSTEX  /SETUP STRING STORE EXIT DF HERE
+       JMS I   (BYTSET /ENTER FUNCTIONS WITH BYTE POINTERS SETUP
+       JMP I   STFIND  /RETURN
+
+SAFIND,        TAD     INSAV   /GET INST
+       AND     (37     /ISOLATE OPERAND POINTER
+       CLL RTL         /4N (4 WORDS/ENTRY)
+       TAD     SASTRT  /USE STRING ARRAY TABLE
+       STL             /SET LINK FOR ARRAY INST
+       JMP     STCOM   /RETURN TO SUBROUTINE MAINLINE
+
+       /PNT(X)
+       /SEND 7BIT CHAR TO THE CURRENT FILE
+
+PNT,   JMS I   [UNSFIX /FIX X
+       AND     [177    /STRIP TO 7 ASCII BITS
+       TAD     [200    /FORCE CHANNEL 8
+       JMS I   [PUTCH  /PUT IN FILE BUFFER
+       JMP I   [ILOOP  /DONE
+
+       PAGE
+\f/ROUTINE SFN-ROUTINE TO RESET POINTERS IN PAGE ZERO FILE POINTER
+/AREA TO REFLECT A CHANGE IN THE CURRENT FILE NUMBER
+
+SFN,   JMS I   [UNSFIX /FIX FAC TO GET FILE #
+CSFN,  DCA     ENTNO   /IF ENTRY IS HERE,FILE #=0 (TTY)
+       TAD     ENTNO
+       STL
+       TAD     (-4     /IS RESULT A LEGAL FILE #?
+       SNL SZA CLA
+FN,    JMS I   [ERROR  /NO-ERROR
+       TAD     ENTNO   /PICK UP FILE NUMBER
+       CLL RTL
+       RTL
+       CIA
+       TAD     ENTNO
+       CIA             /MULTIPLY BY SIZE OF IOTABLE
+       IFNZRO  IOTSIZ-15 <__ASSEMBLY ERROR__>
+       TAD     (TTYF   /ADD TO BASE
+       DCA     XR1     /STORE IN TEMP
+       TAD     (IOTHDR-1 /NOW POINT AT PAGE 0 AREA
+       DCA     XR2
+       TAD     (-IOTSIZ+3 /SETUP ALL BUT LAST 3
+       DCA     TEMP2
+       TAD     XR1
+       DCA I   XR2
+       ISZ     XR1
+       ISZ     TEMP2
+       JMP     .-4     /SET UP THE POINTERS NOW
+       JMP I   [ILOOP  /--RETURN--
+\f      /GOSUB
+
+GOSUB, TAD I   GSP
+       SMA CLA
+GS,    JMS I   [ERROR  /ERROR IF STACK OVERFLOW
+       TAD I   [CDFPSU /ELSE GET CDF INSTR
+       DCA I   GSP
+       ISZ     GSP
+       TAD I   (INTPC
+       DCA I   GSP     /STORE INT PC
+       ISZ     GSP
+       JMP I   (SUCJMP /EXEC AS NORMAL GOTO NOW
+
+       /GOSUB RETURN
+
+RETRNI,        STA
+       TAD     GSP
+       DCA     GSP     /POP STACK
+       TAD I   GSP     /GET PC
+       DCA I   (INTPC
+       STA
+       TAD     GSP     /POP STACK
+       DCA     GSP
+       TAD I   GSP
+       SMA
+GR,    JMS I   [ERROR  /FATAL ERROR IF NO RETURN
+       DCA I   [CDFPSU
+       JMP I   (JFAIL  /BUMP PC PAST ADDR WORD AND CONTINUE
+
+GSP,   GSTCK           /GOSUB STACK POINTER
+
+       /FOR-LOOP JUMP ROUTINE
+       /ENTER WITH AC = HORD
+
+JFOR,  SNA             /IS FAC=0?
+       JMP I   (JFAIL  /YES-DO NOT JUMP
+       TAD     FSWITC  /ADD FSWITCH
+       SPA CLA         /ARE SIGN BIT=FSWITCH?
+       JMP I   (JFAIL  /NO-DO NOT JUMP
+       JMP I   (SUCJMP /YES-DO JUMP
+
+/ROUTINE TO INITIALIZE FSWITCH
+
+SETF,  AC4000
+       AND     ACH     /ISOLATE SIGN OF MANTISSA
+       DCA     FSWITC  /STORE IN FSWITCH
+       JMP I   [ILOOP  /DONE
+FSWITC,        0
+\f/ROUTINE TO RESET CHARACTER NUMBER TO 1
+
+CNOCLR,        0
+       TAD I   IOTHDR
+       AND     [7477   /SET CHAR BITS TO 0
+       DCA I   IOTHDR
+       JMP I   CNOCLR  /RETURN
+
+       /ROUTINE TO ZERO THE CURRENT I/O BUFFER
+
+BLZERO,        0
+       STA
+       TAD I   IOTBUF
+       DCA     XR1     /POINT INTO THE BUFFER
+       TAD     [7400
+       DCA     CNOBML  /SET COUNT TO 400 WORDS
+       TAD     (232    /INSERT A ^Z IN THE BUFFER FIRST
+       CDF 10
+       DCA I   XR1
+       ISZ     CNOBML
+       JMP     .-2     /LOOP FOR THE REST
+       CDF
+       JMP I   BLZERO  /--RETURN--
+
+       /BUMP 3 FOR 2 CHAR NUMBER FOR CURRENT FILE
+
+CNOBML,        0
+       TAD I   IOTHDR  /HEADER WORD
+       TAD     [100    /ADD 1 TO THE COUNT BITS
+       DCA I   IOTHDR
+       JMP I   CNOBML  /DONE
+\f      /STRING COMPARE
+       /COMPARE SAC WITH MEMORY, BLANK EXTENDING THE
+       /SHORTER STRING ON THE RIGHT
+
+SCOMP, DCA     MODESW  /SET INTERPRETER TO ARITH MODE NOW
+       JMS I   [FACCLR /TENTATIVELY ASSUME EQUAL (FAC = 0)
+SCOMLP,        TAD     STRCNT  /IS THE MEMORY STRING EMPTY NOW?
+       SNA CLA
+       TAD     L40     /PAD WITH SPACE IF YES
+       SNA
+       JMS I   (LDB    /LOAD NEXT BYTE IF NOT
+       DCA     TEMP2
+       TAD     SACLEN  /NOW IS THE SAC EMPTY
+       SNA CLA
+       TAD     L40     /YES, PAD IT
+       SNA
+       TAD I   SACXR   /NO GET IT
+       CLL CIA         /COMPARE TO MEMORY
+       TAD     TEMP2
+       SZA CLA
+       JMP     SNEQ    /JMP IF NOT EQUAL, L=SENSE OF COMPARE
+       TAD     STRCNT  /IS MEMORY STRING DONE
+       SZA CLA
+       ISZ     STRCNT  /NO, BUMP COUNT
+L40,   40              /EFFECTIVE NOP
+       TAD     SACLEN  /IS THE SAC EMPTY
+       SZA CLA
+       ISZ     SACLEN  /NO BUMP COUNT
+       TAD     SACLEN  /GET SAC REMAINDER (SKP IF IS JUST ZERO)
+       TAD     STRCNT  /ADD ARG REMAINDER
+       SZA CLA
+       JMP     SCOMLP  /LOOP IF BOTH NOT EMPTY
+       JMP I   [ILOOP  /OTHERWISE EQUAL
+SNEQ,  STA RAR
+       DCA     ACH     /STORE SIGN BIT
+       JMP I   [ILOOP  /--RETURN--
+
+       PAGE
+\f      /STRING DATA LIST READ, STRING LOAD AND STRING CONCATENATE
+
+SRLIST,        JMS I   (DLREAD /FIRST READ NEG BYTE COUNT
+       DCA     STRCNT  /STORE IT
+       STL             /SET LINK MEANS USE PHONY DATA LIST BYTE LOAD
+       SKP             /SKP INTO STRING LOAD ROUTINE
+SLOAD, CLL             /CLEAR LINK TO USE NORMAL LOAD BYTE ROUTINE
+       DCA     SACLEN  /CLEAR SAC LENGTH COUNTER
+       SZL
+       TAD     (DRGCH-LDB /USE PHONY LOAD BYTE
+SCON1, TAD     (LDB    /USE REAL LDB FOR CONCATENATE
+       DCA     SCLDB
+       TAD     STRCNT
+       SNA CLA
+       JMP I   [ILOOP  /NOTHING TO DO IF NULL STRING
+       TAD     SACLEN  /COMPUTE OFFSET INTO SAC
+       CIA
+       TAD     [SAC-1
+       DCA     SACXR   /TO STORE AFTER END OF PREV STRING
+SEGCOM,        JMS I   SCLDB   /GET A BYTE
+       DCA I   SACXR   /STORE IT
+       STA
+       TAD     SACLEN  /NOW BUMP SIZE OF SAC
+       DCA     SACLEN
+       TAD     SACLEN  /CHECK IF ROOM LEFT
+       TAD     (SACLIM
+       SPA CLA
+SC,    JMS I   [ERROR  /FATAL ERROR IF SAC OVERFLOW
+       ISZ     STRCNT
+       JMP     SEGCOM  /ITERATE IF MORE
+       JMP I   [ILOOP  /--RETURN--
+
+SCLDB, 0
+
+       /ROUTINE TO GET A BYTE FROM THE DATA LIST
+
+DRGCH, 0
+       TAD     SACLEN  /TEST FOR EVEN OR ODD
+       CLL RAR
+       SZL CLA
+       JMP     CHR2    /SECOND CHAR
+       JMS I   (DLREAD /FIRST CHAR, READ ANOTHER WORD
+       DCA     DRCHR
+       TAD     DRCHR
+       CLL RTR
+       RTR
+       RTR             /SHIFT RIGHT
+       SKP
+CHR2,  TAD     DRCHR   /GET SECOND CHAR
+       AND     [77     /MASK TO 6BIT
+       JMP I   DRGCH   /RETURN
+
+DRCHR, 0
+\f
+/ROUTINE TO SET EOF BIT IN I/O ENTRY
+EOFSET,        TAD I   IOTHDR  /HEADER
+       CLL RTR         /EOF BIT TO LINK
+       STL RTL         /SET LINK
+                       /PUT LINK IN EOF BIT
+       DCA I   IOTHDR  /STORE IN I/O TABLE ENTRY
+       JMP I   [ILOOP  /EOF BIT SET-ABORT TO ILOOP
+
+/SUBROUTINE MPY- 12 BIT BY 12 BIT MULTIPLY. MULTIPLIES THE CONTENTS
+/OF TEMP3 BY THE CONTENTS OF THE AC,LEAVING THE HI RESULT IN TEMP6
+/AND THE LOW RESULT IN THE AC
+
+MPY,   0
+       DCA     TEMP10
+       DCA     TEMP6
+       TAD     [-14
+       DCA     TEMP5
+MP12LP,        TAD     TEMP3
+       RAR
+       DCA     TEMP3
+       TAD     TEMP6
+       SNL
+       JMP     .+3     /12 BIT MULTIPLY USED TO FIND (DIM1+1)*S2
+       CLL
+       TAD     TEMP10
+       RAR
+       DCA     TEMP6
+       ISZ     TEMP5
+       JMP     MP12LP
+       TAD     TEMP3   /LORD OF (DIM1+1)*S2 IN AC
+       RAR             /HORD OF (DIM1+1)*S2 IN TEMP6
+       JMP I   MPY     /RETURN
+
+       /ROUTINE TO CHECK IF FILE IDLE
+
+IDLE,  0
+       TAD I   IOTHND  /GET HANDLER ENTRY
+       SNA CLA         /IS IT EMPTY?
+FI,    JMS I   [ERROR  /YES-USER TRIED TO DO SOMETHING TO AN UNOPEN FILE
+       JMP I   IDLE    /NO-RETURN
+\f/ROUTINE TO READ NEXT WORD IN DATALIST INTO AC
+
+DLREAD,        0
+       TAD     DATAXR  /DATA LIST POINTER
+       CLL CMA         /SET UP 12 BIT COMPARE
+       TAD     DLSTOP  /ADDR OF END OF DATA LIST
+       SNL CLA         /POINTER AT END OF LIST?
+DA,    JMS I   [ERROR  /YES
+DLCDF, .               /NO-DF TO DATA LIST
+       TAD I   DATAXR  /FETCH WORD FROM DATA LIST
+       CDF
+       JMP I   DLREAD  /DONE
+
+       /RANDOMIZE STATEMENT
+
+FRANDM,        TAD     SPINNR  /USE SPINNR FOR NEW SEED FOR RND(X)
+       STL RAL         /MAKE SURE SEED IS ODD
+       DCA     RSEED
+       JMP I   [ILOOP  /DONE
+RSEED, 2713
+
+/SUBROUTINE CR,LF
+
+CRLFR, 0
+       TAD     [215
+       JMS I   [PUTCH
+       TAD     (212
+       JMS I   [PUTCH  /PRINT A CR,AND LF
+       DCA I   IOTPOS  /ZERO NUMBER OF CHARS PRINTED SO FAR
+       JMP I   CRLFR
+
+/SUBROUTINE FOTYPE
+/RETURNS TO CALL+1 IF FILE FIXED LENGTH,CALL+2 IF VARIABLE
+
+FOTYPE,        0
+       TAD I   IOTHDR  /GET HEADER
+       AND     (4      /ISOLATE TYPE BIT
+       SZA CLA         /IS IT FIXED LENGTH?
+       ISZ     FOTYPE  /NO-BUMP RETURN
+       JMP I   FOTYPE  /RETURN
+
+       /ABS(X) FUNCTION
+
+XABSVL,        JMS     ABSVAL  /NEGATE FAC IF NEGATIVE
+       JMP I   [ILOOP  /--RETURN--
+
+       /SUBROUTINE TO TAKE ABS VALUE OF FAC
+
+ABSVAL,        0
+       TAD     ACH
+       SPA CLA         /IS FAC<0?
+       JMS I   [FFNEG  /YES-NEGATE IT
+       JMP I   ABSVAL  /RETURN
+
+/ROUTINE TO RESTORE THE FAC FROM FP TEMP
+
+FACRES,        0
+       JMS I   [FFGET  /GET FAC
+       INTERB          
+       JMP I   FACRES  /RETURN
+
+       PAGE
+\f      /STRING STORE
+
+SSTORE,        TAD     SACLEN
+       SNA
+       JMP I   (SSTEX  /EXIT IF NULL STRING IN SAC
+       DCA     TEMP1   /SET COUNT
+       TAD     SACLEN  /SEE IF WILL FIT
+       CIA
+       TAD     STRMAX
+       SMA SZA CLA     /SKP IF LEN.LE.MAX LEN
+SL,    JMS I   [ERROR  /ERROR IF TARGET STRING TOO SMALL
+       TAD I   SACXR   /PICK UP SAC BYTE
+       JMS I   (DPB    /STORE IT
+       ISZ     TEMP1
+       JMP     .-3
+       JMP I   (SSTEX  /--RETURN--
+
+       /STRING READ FROM FILE TO MEMORY
+
+SREAD, JMS I   [GETCH  /GET CHAR FROM FILE
+       TAD     CHAR
+       TAD     [-215   /IS IS CR?
+       SNA
+       JMP I   (SSTEX  /YES, EXIT
+       TAD     (3      /IS IT LF?
+       SNA CLA
+       JMP     SREAD   /YES, IGNORE IT
+       TAD I   (BYTCNT /SEE IF THIS CHAR WILL FIT
+       TAD     STRMAX
+       SMA CLA
+       JMP     ST      /NO, SOFT ERROR
+       TAD     CHAR    /YES, STORE IT
+       JMS I   (DPB
+       JMP     SREAD
+ST,    JMS I   [ERROR
+       TAD     [215    /FAKE OUT INPUT ROUTINE
+       DCA     CHAR
+       JMP I   (SSTEX  /SET STRING SIZE AND EXIT
+\f      /STRING WRITE FROM SAC TO DEVICE
+
+SWRITE,        DCA     COMMAS
+       TAD     SACLEN  /SEE IF NULL STRING
+       SNA
+       JMP I   [ILOOP  /RETURN IF SO
+       CIA
+       TAD I   IOTPOS  /ADD TO NUMBER OF CHARS PRINTED SO FAR
+       TAD     (-WIDTH
+       SMA SZA CLA     /SKP IF LE WIDTH OF LINE
+       JMS I   [CRLFR  /ELSE RESET CARRAIGE
+       TAD     SACLEN
+       DCA     STRCNT  /SET LOOP COUNTER
+       TAD     [SAC-1
+       DCA     SACXR   /POINT AT SAC
+SWRLP, TAD I   SACXR
+       TAD     (240
+       AND     [77
+       TAD     (240    /CONVERT TO 8BIT
+       JMS I   (PUTCH
+       ISZ     STRCNT
+       JMP     SWRLP   /ITERATE IF MORE
+       JMP I   [ILOOP  /--RETURN--
+
+\f/COMMA FUNCTION (KNOWN ONLY TO COMPILER FOR FORMATTING PRINT
+/STATEMENTS)
+
+COMMA, JMS I   [FTYPE  /SKP IF FILE IS ASCII
+       JMP I   [ILOOP  /NO-COMMA FUNCTION IS A NOP
+       TAD     COMMAS  /GET COMMA SWITCH
+       SNA CLA         /WAS LAST THING PRINTED A COMMA?
+       JMP     .+3     /NO-WE ARE OK
+       TAD     ("      /YES-PRINT A SPACE BEFORE DOING COMMA CALCULATION
+       JMS I   [PUTCH
+       IAC
+       DCA     COMMAS  /SET COMMA SWITCH
+       TAD     (-4
+       DCA     TEMP2
+       TAD I   IOTPOS  /GET NUMBER OF CHARS PRINTED SO FAR
+COMLOP,        TAD     (-COLWID
+       SPA             /PAST THIS ONE?
+       JMP     SLOVER  /YES-SLIDE PRINT HEAD TO START OF NEXT
+       SNA             /EXACTLY ON A COLUMN?
+       JMP I   [ILOOP  /YES-DONE
+       ISZ     TEMP2   /ALL MARKERS CHECKED YET?
+       JMP     COMLOP  /NO-DO NEXT
+       CLA             /FALL INTO CR ROUTINE TO RESET COL TO 0
+
+/CARRIAGE RETURN FUNCTION (KNOWN ONLY TO COMPILER FOR TERMINATING
+/PRINT STATEMENTS)
+
+CRFUNC,        TAD I   IOTHDR
+       CLL RTR
+       SNL CLA         /SKP IF EOF IS SET
+       JMS I   [FTYPE  /SKP IF FILE IS ASCII
+       JMP I   [ILOOP  /WE DON'T WANT TO OUTPUT CLFR
+       JMS I   [CRLFR  /DO AS WE ARE TOLD
+       JMP I   [ILOOP  /NEXT INST
+
+       /TAB FUNCTION
+
+TAB,   JMS I   [UNSFIX /FIX X TO INTEGER
+       CIA             /NEGATE
+       TAD I   IOTPOS  /COMPARE DESIRED COLUMN TO REAL COLUMN
+       IAC             /BUMP BY 1 (WORD 7=COL #-1)
+       SMA             /IS X>=CURRENT COLUMN?
+       JMP I   [ILOOP  /YES-THEN DO NOTHING
+                       /FALL INTO SPACE OUT ROUTINE
+
+SLOVER,        DCA     COLCNT  /-# OF COLUMNS TO NEXT MARKER
+       JMS I   [FTYPE  /IS FILE NUMERIC?
+       JMP I   [ILOOP  /YES-THIS IS A NOP
+       TAD     ("      /GET SPACE
+       JMS I   [PUTCH  /PRINT IT
+       ISZ     COLCNT  /THERE YET?
+       JMP     .-3     /NO-TYPE ANOTHER SPACE
+       JMP I   [ILOOP  /YES-DONE
+
+COMMAS,        1               /SET TO 1 IF LAST PRINT WAS A COMMA MOVE
+COLCNT,        0
+
+/ROUTINE TO CALL ERROR ROUTINE BY FAKING A FUNC2 CALL TO FUNCTION #10
+
+ERROR, 0
+       CLA CLL IAC     /ENTRY AC RANDOM
+       AND     PSFLAG  /TEST IF OS/8 17600 RESIDENT
+       SZA CLA         /SKP IF NOT
+       JMS I   [PSWAP  /ELSE FORCE IT OUT (THESE ERRORS ARE FATAL)
+       TAD     (7607
+       DCA     INSAV   /FAKE A FUNC CALL TO FUNC2 #10
+       JMP I   (FUNC2I
+XERRRET,JMP I  ERROR   /RETURN TO CALLER IF NON FATAL ERROR
+
+       /FLOATING NEGATE
+
+FNEGI, JMS I   [FFNEG  /CALL NEGATE ROUTINE
+       JMP I   [ILOOP  /RETURN TO ILOOP
+
+NUMBUF,        ZBLOCK  6       /6 DIGIT BUFFER USED BY FFOUT
+
+       PAGE
+\f      /INCREMENT AND LOAD 6BIT BYTE FROM MEMORY
+
+LDB,   0
+       JMS     BUMP    /INCREMENT POINTER AND SET DF
+       TAD I   BYTPTR  /PICK UP BYTE
+       CDF
+       ISZ     BYTSWT  /TEST HALFWORD SWITCH
+       JMP     .+4
+       CLL RTR
+       RTR
+       RTR
+       AND     [77     /MASK TO 6BIT
+       JMP I   LDB     /RETURN WITH CHAR IN AC
+
+       /INCREMENT AND DEPOSIT BYTE IN MEMORY
+
+DPB,   0
+       AND     [77     /MASK TO 6BIT NOW
+       DCA     BYTE
+       JMS     BUMP    /INCREMENT POINTER AND SET DF
+       TAD     [77     /GET MASK
+       ISZ     BYTSWT  /SKP IF PTR BUMPED
+       CMA CML         /ELSE PRESERVE LEFT HALF
+       AND I   BYTPTR  /ZERO OUT TARGET BYTE
+       DCA I   BYTPTR
+       TAD     BYTE    /GET BYTE
+       SZL
+       JMP     .+4     /JMP IF NO SHIFT
+       CLL RTL
+       RTL
+       RTL
+       TAD I   BYTPTR
+       DCA I   BYTPTR  /STORE BYTE
+       CDF
+       ISZ     BYTCNT  /TALLY NUMBER OF BYTES STORED
+       JMP I   DPB     /--RETURN--
+
+       /BUMP BYTE POINTER
+
+BUMP,  0
+       TAD     BYTSWT  /BUMP LOW ORDER BIT
+       CLL CMA
+       DCA     BYTSWT
+       ISZ     BYTSWT  /SKP IF NO CARRY
+       ISZ     BYTPTR  /ELSE BUMP WORD PTR
+       JMP     BYTCDF  /JMP OUT IF FIELD NOT CROSSED
+       TAD     [10
+       TAD     BYTCDF
+       DCA     BYTCDF  /PROPAGATE CARRY INTO CDF INSTR
+BYTCDF,        0               /GETS SET BY BYTSET TO TARGET FIELD
+       JMP I   BUMP    /RETURN WITH A CLEAR LINK
+
+       /BYTE LOAD/STORE INITIALIZE ROUTINE
+
+BYTSET,        0
+       TAD     SSTEX   /GET FIELD OF STRING
+       DCA     BYTCDF  /STORE INLINE
+       TAD     STRPTR  /NOW GET ADDR OF COUNT WORD
+       DCA     BYTPTR  /STORE
+       IAC
+       DCA     BYTSWT  /SET LOW ORDER BIT TO CARRY NEXT TIME
+       DCA     BYTCNT  /CLEAR DEPOSITED BYTE COUNT
+       TAD     [SAC-1
+       DCA     SACXR   /ALWAYS RETURN WITH SAC POINTER SET UP
+       JMP I   BYTSET  /--RETURN--
+
+       /STRING STORE EXIT ROUTINE
+
+SSTEX, 0               /GETS SET BY STFIND TO DF OF STRING
+       TAD     BYTCNT  /ENTER WITH POSITIVE LENGTH IN COUNT
+       CIA
+       DCA I   STRPTR  /STORE IN STRING
+       JMP I   [ILOOP  /--RETURN-- (ILOOP RESETS DF)
+
+BYTCNT,        0
+BYTPTR,        0
+BYTSWT,        0
+BYTE,  0
+\f/SUBROUTINE BUFCHK-CHECKS THE POSITION OF THE BUFFER POINTER FOR
+/THE DEVICE WHOSE I/O TABLE ENTRY IS IN WORKING AREA. RETURNS TO CALL+1
+/IF THE POINTER IS AT THE END AND CHAR NUMBER IS 1 (LAST
+/AVAILABLE CHAR 3 HAS BEEN USED),CALL+2 IF THE POINTER IS AT THE
+/END BUT THE CHAR # IS NOT 1 (THERE IS 1 CHAR 3 LEFT), CALL+3
+/IF THERE IS 1 WORD LEFT IN BUFFER,CALL+4 IF MORE THAN 1 LEFT.
+
+BUFCHK,        0
+       TAD     ENTNO   /GET DEVICE #
+       SNA CLA         /IS IT TTY?
+       TAD     (62-400 /YES-CHECK FOR A BUFFER 60 WORDS LONG
+       TAD     [400    /NO-CHECK FOR A BUFFER 400 WORDS LONG
+       TAD I   IOTBUF  /ADD LENGTH TO BUFFER ADDRESS
+       CIA             /-ADDR OF END OF BUFFER
+       TAD I   IOTPTR  /CHECK AGAINST CURRENT POINTER
+       SNA             /IS POINTER AT END OF BUFFER?
+       JMP     EBC     /AT END-CHECK THE CHAR #
+       ISZ     BUFCHK
+       ISZ     BUFCHK  /NO-BUMP RETURN
+       IAC
+       SNA CLA         /WAS POINTER AT LAST WORD?
+       JMP I   BUFCHK  /YES-RETURN TO CALL+3
+       ISZ     BUFCHK  /NO
+       JMP I   BUFCHK  /RETURN TO CALL+4
+
+EBC,   JMS I   [CHARNO /GET CHAR #
+       JMP I   BUFCHK  /IT WAS 1-RETURN TO CALL+1
+       NOP             /IT WAS 3-RETURN TO CALL+2
+       ISZ     BUFCHK  /IT WAS 2-RETURN TO CALL+2
+       JMP I   BUFCHK
+\f
+/SUBROUTINE PACKCH-PACKS ASCII CHARS,3 FOR 2, INTO BUFFER FOR THE
+/DEVICE IN WORK AREA. CALL WITH THE CHARACTER IN THE AC
+
+PACKCH,        0
+       DCA     TEMP1   /SAVE
+       JMS I   [CHARNO /DETERMINE CHARACTER NUMBER
+       SKP             /1
+       JMP     CHAR3P  /3
+       TAD     TEMP1   /1 OR 2-GET CHAR AGAIN
+       JMS I   [WRITFL /STORE IN BUFFER
+       JMS I   (CNOBML /BUMP CHARACTER NUMBER
+       JMP I   PACKCH  /DONE
+
+CHAR3P,        AC7776
+       TAD I   IOTPTR  /BACK BUFFER POINTER UP TO POINT TO CHAR 1
+       DCA I   IOTPTR
+       TAD     TEMP1   /CHAR
+       CLL RTL
+       RTL             /SLIDE LEFT HALF INTO BITS 0-3
+       DCA     TEMP1   /SAVE
+       TAD     TEMP1
+       JMS     COMBNE  /ISOLATE LEFT HALF,COMBINE WITH CHAR1,AND PUT IN FILE
+       TAD     TEMP1   /CHAR AGAIN
+       CLL RTL
+       RTL             /SLIDE RIGHT HALF INTO BITS 0-3
+       JMS     COMBNE  /ISOLATE RIGHT HALF,COMBINE WITH CHAR 2,AND PUT IN FILE
+       JMS I   [CNOCLR /CLEAR THE CHARACTER NUMBER (RESET IT TO 1)
+       JMP I   PACKCH  /DONE
+
+COMBNE,        0
+       AND     [7400   /ISOLATE HALF IN QUESTION
+       DCA     TEMP2   /SAVE
+       JMS I   (BCGET  /GET A WORD FROM FILE BUFFER IN FIELD 1
+       AND     [377    /FLUSH ANY SLUSH IN BITS 0-3
+       TAD     TEMP2   /COMBINE
+       JMS I   [WRITFL /PUT IN BUFFER
+       JMP I   COMBNE  /RETURN
+
+       PAGE
+\f/ROUTINE TO READ WORD FROM FILE BUFFER AND BUMP POINTER
+
+READFL,        0
+       JMS I   (FOTYPE /IS FILE VARIABLE LENGTH
+       SKP
+VR,    JMS I   [ERROR  /YES-IT IS AN ERROR TO TRY AND READ IT
+       TAD I   IOTHDR  /CHECK IF MORE THERE
+       CLL RTR         /EOF BIT TO LINK
+       SNL CLA         /EOF?
+       JMP     .+3     /NO-CONTINUE
+RE,    JMS I   [ERROR  /YES-ATTEMPT TO READ BEYOND EOF
+       JMP I   [ILOOP  /NOT FATAL-RETURN TO I LOOP
+       JMS     BCGET   /GET WORD FROM FILE BUFFER
+       ISZ I   IOTPTR  /BUMP POINTER
+       JMP I   READFL  /DONE
+
+/ROUTINE TO WRITE AC IN FILE BUFFER AND INCREMENT POINTER
+
+WRITFL,        0
+       JMS I   (BCPUT  /STORE AC IN FILE BUFFER
+       ISZ I   IOTPTR  /BUMP POINTER
+       TAD I   IOTHDR  /GET FILE HEADER WORD
+       CLL RTR         /EOF BIT TO LINK
+       SNL CLA         /WAS FILE PAST END?
+       JMP I   WRITFL  /NO-RETURN
+WE,    JMS I   [ERROR  /YES-ATTEMPT TO WRITE PAST END OF FILE
+       JMP I   [ILOOP  /NON-FATAL RETURN TO ILOOP
+
+/ROUTINE TO GET ONE WORD FROM FILE BUFFER IN FIELD 1
+
+BCGET, 0
+       JMS I   [IDLE   /CHECK IF FILE OPEN
+       TAD I   IOTPTR  /GET READ WRITE POINTER
+       DCA     WRITFL  /SAVE
+       TAD     ENTNO   /GET FILE #
+       SZA CLA         /IF TTY,BUFFER FIELD IS 0
+       CDF 10          /DF TO BUFFER FIELD
+       TAD I   WRITFL  /GET WORD FROM BUFFER
+       CDF
+       JMP I   BCGET   /RETURN
+\f/SUBROUTINE UNPACK-UNPACKS ASCII, 3 FOR 2 ,FROM THE FILE IN THE I/O
+/WORKING AREA. RETURNS WITH THE CHAR IN CHAR.
+
+UNPACK,        0
+       JMS I   [CHARNO /GET CHAR #
+       SKP             /1
+       JMP     CHAR3U  /3
+       JMS I   (CNOBML /BUMP CHAR NUMBER
+       JMS     READFL  /GET CHAR AGAIN
+U123C, AND     [177    /STRIP OFF 7 BITS
+       SNA
+       JMP     UNPACK+1        /ZERO
+       TAD     [200
+       DCA     CHAR    /SAVE
+       TAD     CHAR
+       TAD     (-232   /IS IT CTRL/Z?
+       SNA CLA
+       JMP I   [EOFSET /YES-SET EOF BIT
+       JMP I   UNPACK  /RETURN
+
+CHAR3U,        JMS I   [CNOCLR /RESET CHAR # TO 1
+       AC7776
+       TAD I   IOTPTR
+       DCA I   IOTPTR  /BACK BUFFER POINTER UP 2
+       JMS     READFL  /GET LEFT HALF OF CHAR
+       AND     [7400
+       DCA     XR5     /SAVE
+       JMS     READFL  /GET NEXT WORD WITH RIGHT HALF
+       AND     [7400   /ISOLATE RIGHT HALF
+       CLL RTR
+       RTR             /SLIDE RIGHT HALF OVER
+       TAD     XR5     /COMBINE WITH LEFT HALF
+       CLL RTR
+       RTR             /MOVE TO BITS 4-11
+       JMP     U123C   /REJOIN MAINLINE
+\f/READ FUNCTION-GETS NUMBERS INTO VARIABLES
+
+READI, JMS I   [FTYPE  /SKP IF FILE IS ASCII
+       JMP     RIMAGE  /READ NUMERIC IMAGE
+       JMS I   (FFIN   /READ ASCII INTO NUMBER
+       JMP I   [ILOOP  /--RETURN--
+RIMAGE,        JMS I   [BUFCHK /YES-CHECK BUFFER POINTER
+       NOP             /PAST END-NEXT RECORD
+       NOP             /AT END-NEXT RECORD
+       JMS I   [NEXREC /ONLY 1 WORD LEFT-IT IS UNUSED IN NUMERIC FMT
+       JMS     READFL  /GET WORD FROM FILE
+       DCA     ACX             /STORE AS EXPONENT
+       JMS     READFL  /GET WORD FROM FILE
+       DCA     ACH     /STORE AS HIGH MANTISSA
+       JMS     READFL  /GET WORD FROM FILE
+       DCA     ACL     /STORE AS LOW MANTISSA
+       JMP I   [ILOOP  /DONE
+
+/ROUTINE TO FETCH ASCII CHARACTERS FROM FILE BUFFER
+
+GETCH, 0
+       JMS I   [FTYPE  /IS FILE ASCII?
+SR,    JMS I   [ERROR  /NO-ERROR
+       TAD     ENTNO
+       SZA CLA
+       JMP     NTTY
+       TAD     TCHAR
+       TAD     [-215
+       SNA CLA
+       JMS I   [DRCALL
+NTTY,  JMS I   [BUFCHK /NO-CHECK STATUS OF BUFFER
+       JMS I   [NEXREC /LAST CHAR READ-NEXT RECORD
+       NOP             /CHAR 3 NOT USED YET
+TCHAR, 215             /NOP: CHAR 2 AND 3 LEFT
+       JMS     UNPACK  /UNPACK CHAR FROM BUFFER
+       TAD     ENTNO
+       SZA CLA
+       JMP I   GETCH   /RETURN
+       TAD     CHAR
+       DCA     TCHAR
+       JMP I   GETCH
+
+/SUBROUTINE CHARNO-RETURNS TO CALL+1 IF CHAR #=1,CALL+2 IF 3,CALL+3
+/IF 2
+
+CHARNO,        0
+       TAD I   IOTHDR  /HEADER
+       AND     (300    /ISOLATE CHAR #
+       CLL RTL
+       RTL             /CHAR # TO BITS 0,1
+       SMA SZA         /IS IT 2?
+       ISZ     CHARNO  /YES-BUMP RETURN
+       SZA CLA         /IS IT 2 OR 3?
+       ISZ     CHARNO  /YES-BUMP RETURN
+       JMP I   CHARNO  /RETURN
+
+       PAGE
+\f/WRITE FUNCTION-PUTS NUMBERS IN FILE BUFFERS
+
+WRITEI,        JMS I   [FTYPE  /SKP IF FILE IS ASCII
+       JMP     WIMAGE  /ELSE DO IMAGE WRITE
+       JMS I   (FFOUT  /CONVERT INTERNAL TO ASCII
+       TAD     XR1
+       CIA
+       TAD     (INTERB-1 /CALCULATE NUMBER OF CHARS STORED IN BUFFER
+       DCA     TEMP10  /SAVE
+       TAD     (INTERB-1
+       DCA     SACXR   /NOW POINT SACXR INTO BUFFER
+       TAD     TEMP10  /GET COUNT OF CHARS TO BE PRINTED
+       CIA
+       TAD I   IOTPOS  /ADD TO PRINT HEAD POSITION
+       TAD     (-WIDTH /COMPARE AGAINST "72"
+       SMA SZA CLA     /WILL THE NUMBER FIT ON THIS LINE?
+       JMS I   [CRLFR  /NO-ISSUE A CR,LF
+CPLOOP,        TAD I   SACXR   /GET CHAR FROM INTERMEDIATE BUFFER
+       JMS     PUTCH   /PUT ON DEVICE
+       ISZ     TEMP10  /BUMP COUNTER
+       JMP     CPLOOP  /NEXT
+       TAD     O240
+       JMS     PUTCH   /SEND OUT A SPACE AFTER NUMBER
+       JMP     WDONE   /TAKE COMMON EXIT
+WIMAGE,        JMS I   [BUFCHK /FILE IS NUMERIC-CHECK BUFFER STATUS
+O240,  240             /PAST END-NEW RECORD (AND INST SERVES AS NOP)
+O210,  0210            /AT END-NEW RECORD (AND SERVES AS NOP)
+       JMS I   [NEXREC /ONE WORD LEFT-DON'T USE IT
+       TAD     ACX     /EXPONENT
+       JMS I   [WRITFL /WRITE IN BUFFER
+       TAD     ACH     /HIGH MANTISSA
+       JMS I   [WRITFL /WRITE IN BUFFER
+       TAD     ACL     /LOW MANTISSA
+       JMS I   [WRITFL /WRITE IN BUFFER
+WDONE, DCA I   (COMMAS /CLEAR COMMA SWITCH
+       JMP I   [ILOOP  /WRITE IS DONE
+\f/ROUTINE TO PUT ASCII CHARS IN FILE BUFFER. IGNORES RUBOUTS.
+
+PUTCH, 0
+       DCA     TEMP1   /SAVE CHAR
+       TAD     TEMP1   /GET CHAR AGAIN
+       TAD     (-377
+       SNA CLA         /IS IT A RUBOUT?
+       JMP I   PUTCH   /YES-RETURN
+       JMS I   [FTYPE  /IS FILE NUMERIC?
+SW,    JMS I   [ERROR  /YES-ERROR
+       ISZ I   IOTPOS  /BUMP COULMN NUMBER
+       TAD     ENTNO   /GET ENTRY #
+       SNA CLA         /IS IT TTY?
+       JMP     TOUT    /YES-JUST PUT CHARS IN RING BUFFER
+       JMS I   [BUFCHK /NO-IS BUFFER FULL?
+       JMS I   [NEXREC /YES-NEXT RECORD
+O40,   40              /THERE IS A CHAR 3 LEFT (AND IS A NOP)
+O20,   20              /THERE IS A CHAR 2 AND 3 LEFT (AND IS A NOP)
+       TAD     TEMP1   /GET CHAR AGAIN
+       JMS I   [PACKCH /PUT IN BUFFER
+       JMP I   PUTCH   /RETURN
+
+TOUT,  TAD     TEMP1   /GET CHAR
+       JMS I   [XPUTCH /PUTCH CHAR IN OUTPUT BUFFER FOR TTY
+       JMP I   PUTCH   /RETURN
+\f/SUBROUTINE NEXREC-WRITES THIS BUFFER IN FILE,THEN READS IN NEXT BUFFER
+/IF POSSIBLE,ELSE SETS EOF BIT. IF DEVICE IS READ OR WRITE ONLY
+/IT JUST READS OR WRITES A BLOCK,WHICHEVER IS APPROPRIATE
+
+NEXREC,        0
+       TAD I   IOTHDR  /GET HEADER
+       AND     O20             /GET READ/WRITE ONLY BIT
+       SNA CLA         /IS IT ON?
+       JMP     FILSTR  /NO-DEVICE IS FILE STRUCTURED
+       JMS I   (FOTYPE /YES-IS IT INPUT OR OUTPUT FILE?
+       JMP     RONLY
+       JMS     WRBLK
+RWONC, ISZ I   IOTBLK
+       JMS     BLINIT  /INIT FILE TABLE ENTRIES
+       JMP I   NEXREC  /DONE
+
+RONLY, JMS     BLREAD
+       JMP     RWONC
+
+FILSTR,        JMS     WRBLK   /WRITE THE CURRENT BLOCK IF IT HAS BEEN CHANGED
+       JMS     BLINIT  /INIT FILE TABLE ENTRIES
+       ISZ I   IOTBLK  /BUMP BLOCK #
+       TAD I   IOTLOC  /STARTING BLOCK
+       CIA             /NEGATE
+       TAD I   IOTBLK  /SUBTRACT FROM CURRENT BLOCK FOR FILE LENGTH
+       CLL CMA         /SET UP CURRENT FILE LENGTH FOR 12 BIT COMPARE
+       TAD I   IOTLEN  /COMPARE TO ACTUAL LENGTH
+       SNL CLA         /IS IT > CURRENT LENGTH?
+       JMP     LASTB   /YES-EXTEND THE FILE IF IT IS OUTPUT
+       JMS     BLREAD  /READ IN THE NEXT RECORD
+       JMP I   NEXREC  /RETURN
+
+
+LASTB, JMS I   (FOTYPE /IS FILE FIXED LENGTH?
+       JMP I   [EOFSET /YES-SET EOF FLAG
+       TAD I   IOTLEN  /NO-GET ACTUAL LENGTH
+       CLL CMA 
+       TAD I   IOTMAX  /MAXIMUM LENGTH
+       SNL CLA         /IS ACTUAL LENGTH >= MAXIMUM LENGTH?
+       JMP I   [EOFSET /YES-SET EOF BITS
+       ISZ I   IOTLEN  /NO-BUMP ACTUAL LENGTH
+       JMP I   NEXREC  /RETURN WITHOUT READING NEXT RECORD
+\f/ROUTINE TO READ 2 PAGES FROM DEVICE
+
+BLREAD,        0
+       JMS I   (BLZERO
+       TAD     O210    /"READ 2 PAGES"
+       JMS I   [DRCALL /HANDLER CALL
+       JMP I   BLREAD
+
+/ROUTINE TO WRITE 2 PAGES ONTO DEVICE
+
+WRBLK, 0
+       TAD I   IOTHDR  /GET FILE HEADER
+       AND     O40     /GET FILE WRITTEN BIT
+       SNA CLA         /HAS THIS BLOCK BEEN CHANGED?
+       JMP I   WRBLK   /NO-RETURN
+       TAD     (4210   /"WRITE 2 PAGES"
+       JMS I   [DRCALL /CALL TO DEVICE HANDLER
+       JMS I   (BLZERO
+       JMP I   WRBLK
+
+/ROUTINE TO INITIALIZE I/O TABLE ENTRIES AFTER READ OR WRITE
+
+BLINIT,        0
+       TAD I   IOTBUF
+       DCA I   IOTPTR  /INIT READ/WRITE POINTER
+       TAD I   IOTHDR
+       AND     (7437   /SET CHAR # TO 1 AND CLEAR BLOCK WRITTEN BIT
+       DCA I   IOTHDR
+       JMP I   BLINIT
+
+/ROUTINE TO SAVE THE FAC IN FP TEMP 
+
+FACSAV,        0
+       JMS I   [FFPUT  /STORE FAC
+       INTERB          /USE INTERMEDIATE BUFFER FOR TEMP STORAGE
+       JMP I   FACSAV  /RETURN
+
+       PAGE
+\f
+
+
+
+
+
+/////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////
+////////////  OVERLAY BUFFER  3400-4600  ////////////////////
+////////////  CONTAINS FUNCTION OVERLAYS ////////////////////
+////////////  AT RUN TIME                ////////////////////
+/////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////
+
+
+\f/////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////
+////////////// OVERLAY 1-ARITHMETIC FUNCTIONS ///////////////
+/////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////
+
+       *OVERLAY
+
+
+
+/INTEGER FUNCTION
+/RANGE=ALL X
+
+INT,   VERSON^100+SUBVAF+6000 /INITIALLY CONTAINS VERSION OF ARITH OVERLAY
+       JMS I   [FFPUT  /SAVE X
+       FPPTM1
+       TAD     ACX     /GET EXPONENT
+       SMA SZA CLA     /IS EXP<0?
+       JMP     INSC    /NO-GO ON
+       TAD     ACH     /YES
+       SPA CLA         /IS X<0?
+       JMP     M1R     /YES-INT=-1
+       JMS I   [FACCLR /YES-RETURN A 0
+       JMP I   INT
+INSC,  TAD     ACH     /GET HI MANTISSA
+       SMA CLA         /IS IT <0?
+       JMP     INTPOS  /NO-USE FAC AS IS
+       JMS I   [FFNEG  /YES-NEGATE FAC (MAKE IT POS)
+       IAC             /AND SET FLAG
+INTPOS,        DCA     TEMP3   /FLAG FOR NEGATIVE
+       DCA     TEMP5   /ZERO LORD MASK
+       CLL CML RAR
+       DCA     TEMP4   /INITIALIZE HORD MASK TO 4000
+       TAD     ACX
+       CIA             /- COUNT
+       DCA     TEMP2
+MASKL, TAD     TEMP4
+       CLL CML RAR     /ROTATE 1'S THROUGH 3 WORD MASK
+       DCA     TEMP4   /
+       TAD     TEMP5   /UNTIL THERE IS A COUNT OF ZERO
+       RAR
+       DCA     TEMP5
+       ISZ     TEMP2   /DONE?
+       JMP     MASKL   /NO
+       TAD     ACH     /YES-MASK HORD
+       AND     TEMP4
+       DCA     ACH
+       TAD     ACL     /MASK LORD
+       AND     TEMP5
+       DCA     ACL
+       TAD     TEMP3   /NEG FLAG
+       SNA CLA         /WAS ORIGINAL NUMER <0?
+       JMP I   INT     /NO-DONE
+       JMS I   [FFPUT  /SAVE INT(X)
+       FPPTM2
+       JMS I   (FFADD  /-INT(X)+(X)
+       FPPTM1
+       TAD     ACH     /SAVE HORD
+       DCA     TEMP3
+       JMS I   [FACCLR /FLUSH FAC
+       TAD     TEMP3   /WAS INT(X)=X?
+       SNA CLA
+       JMP     JUSNEG  /YES-JUST NEGATE INT(X)
+       JMS I   (FFADD  /NO-ADD 1
+       ONE
+JUSNEG,        JMS I   (FFADD  /GET INT(X)
+       FPPTM2
+JNEG,  JMS I   [FFNEG  /AND  NEGATE (INT(5.3)=-6)
+       JMP I   INT     /DONE
+
+M1R,   JMS I   [FFGET  /LOAD FAC WITH 1
+       ONE
+       JMP     JNEG    /JUST NEGATE AND RETURN
+
+ONE,   1
+       2000
+       0
+
+\f/EXPONENTIATION FUNCTION
+/IF B=0,A^B=1
+/IF A=0 AND B>0,A^B=0
+/IF A=0 AND B<0,DIVIDE BY ZERO ERROR MESSAGE RESULTS AND A^B=0
+/IF B=INTEGER > 0, A^B=A*A*A*.......*A
+/IF B=INTEGER < 0, A^B=1/A*A*A*.......*A
+/IF B=REAL AND A>0, A^B=EXP(B*LOG(A))
+/IF B=REAL AND A<0, A FATAL ERROR RESULTS
+
+EXPON, 0
+       JMS I   [FFPUT  /SAVE A
+       FPPTM5
+       JMS I   [FFPUT  /SET UP RUNNING PRODUCT IN CASE OF
+       FPPTM4          /MULTIPLIES
+       TAD     ACH     /HI ORDER OF A
+       DCA     EXPON   /SAVE IT
+       DCA     INSAV   /POINTER TO B IN SYMBOL TABLE
+       JMS I   ARGPLL  /FIND B
+       JMS I   [FFGET  /GET B
+ARGPLL,        ARGPRE          /LOC SKIPPED BY FPP,SO WE USE IT FOR CONSTANT
+       CDF
+       TAD     ACH     /HI ORDER OF B
+       SNA             /IS B=0?
+       JMP I   (RETRN1 /YES A^B=1
+       SMA CLA         /IS B<0?
+       JMP     .+4     /NO
+       TAD     EXPON   /YES-GET HI ORDER A
+       SNA CLA         /IS A=0?
+       JMP I   (DV     /YES-DIVIDE BY ZERO ERROR
+       TAD     EXPON   /B>0. IS A=0?
+       SNA CLA
+       JMP     RET0    /YES A^B=0
+       JMS I   [FFPUT  /SAVE B
+       FPPTM3
+       JMS     INT             /GET INT(B)
+       JMS I   (MULLIM /TEST EXPONENT OF RESULT TO LIMIT LARGE MULTIPLY LOOPS
+       JMS I   (FFSUB  /INT(B)-B
+       FPPTM3
+       TAD     ACH     /IS INT(B)-B=0?
+       SZA CLA
+       JMP I   (USELOG /NO-USE LOGS
+       JMS I   [FFGET  /NO-USE REPETITIVE MULTIPLY
+       FPPTM3          /GET B AGAIN
+       TAD     ACH
+       DCA     EXPON   /SAVE SIGN OF B
+       JMS I   (ABSVAL /!B!
+       JMS I   [FFPUT  /USE ABS(B) AS MULTIPLY COUNT
+       FPPTM3
+EMLOOP,        JMS I   [FFGET  /GET B
+       FPPTM3
+       JMS I   (FFSUB  /B-1
+       ONE
+       JMS I   [FFPUT  /SAVE NEW COUNT
+       FPPTM3
+       TAD     ACH
+       SNA CLA         /IS COUNT ZERO YET
+       JMP I   (EMDONE /YES-MULTIPLIES ARE DONE
+       JMS I   [FFGET  /NO-GET RUNNING PRODUCT
+       FPPTM4
+       JMS I   (FFMPY  /MULTIPLY BY A
+       FPPTM5
+       JMS I   [FFPUT  /SAVE NEW RUNNING PRODUCT
+       FPPTM4
+       JMP     EMLOOP
+
+RET0,  JMS I   [FACCLR /RETURN WITH 0 IN FAC
+       JMP I   [ILOOP
+
+       PAGE
+\fEMDONE,       JMS I   [FFGET  /GET RUNNING PRODUCT
+       FPPTM4
+       TAD I   EXPONK  /GET SIGN OF B
+       SMA CLA         /WAS IT -?
+       JMP I   [ILOOP  /NO-A^B=A*A*A*...*A
+       JMS I   FIDVP   /YES-INVERT
+       ONE
+       JMP I   [ILOOP  /A^B=1/A:A*A*...*A
+
+RETRN1,        JMS I   [FFGET
+       ONE             /SET FAC TO 1
+       JMP I   [ILOOP
+
+USELOG,        TAD I   EXPONK  /SIGN OF A
+       SPA CLA         /A<0?
+EM,    JMS I   [ERROR  /YES-PRINT A MESSAGE
+       JMS I   [FFGET  /LOAD A
+       FPPTM5
+       JMS I   FFLOGL  /LOG(A)
+       JMS I   FMPYLV  /B*LOG(A)
+       FPPTM3
+       JMS I   FFEXPL  /EXP(B*LOG(A))
+       JMP I   [ILOOP  /DONE
+
+
+FFEXPL,        EXPON1
+FFLOGL,        LOG
+FMPYLV,        FFMPY
+EXPONK,        EXPON
+FIDVP, FFDIV1
+
+/SGN FUNCTION
+
+SGN,   0
+       TAD     ACH     /GET HIGH MANTISSA
+       SNA             /IS X=ZERO?
+       JMP I   [ILOOP  /YES-THEN LEAVE IT ALONE
+       SPA CLA         /IS X>0?
+       JMP     .+3     /NO
+       IAC             /YES-SET FAC=1
+       SKP
+       CMA             /NO-SET FAC=-1
+       DCA     ACX             /SET UP FLOAT
+       JMS I   [FFLOAT /FLOAT VALUE OF SGN FUNCTION
+       JMP I   [ILOOP  /DONE
+\f      IFZERO EAE <
+/FLOATING SQUARE ROOT
+/USES A HARDWARE TYPE ALGORITHM FOR BINARY SQUARE ROOTS
+/REF: THE LOGIC OF COMPUTER ARITHMETIC-IVAN FLORES-P 409
+/
+FROOT, 0
+       CLA CLL CML RTR /SET RESULT TO 2000;0000
+       DCA     AN1
+       DCA     AN2
+       CDF             /DF TO PACKAGE FIELD
+       TAD     KM22    /SET COUNTER FOR DEVELOPING 22 BITS OF RESULT
+       DCA     AC2     /ALREADY HAVE 1
+       TAD     ACH
+       SNA
+       JMP I   FROOT   /ZERO FAC-NORMALIZED!-RETN. SAME
+       SPA     CLA
+       JMS I   [FFNEG  /TAKE ROOT OF ABSOL VALUE
+       TAD     ACX     /GET EXPONENT OF FAC
+       SPA             /IF NEGATIVE-MUST PROPAGATE SIGN
+       CML
+       RAR             /DIVIDE EXP. BY 2
+       DCA     ACX     /STORE IT BACK
+       SZL             /INCREMENT EXP. IF ORIGINAL EXP 
+       ISZ     ACX     /WAS ODD
+       NOP
+       SNL             /DO A PRE-SHIFT FOR EVEN EXPONENTS
+       JMS I   AL1K    /SO FIRST BIT PAIR IS 10 NOT 01
+       CLA CLL CMA RAL /SET COUNTER FOR DETECTING A
+       DCA     ZCNT    /ZERO REMAINDER
+       CLA CLL CML RTR /SET UP POSITION OF TRIAL BIT
+       RTR             /FOR FIRST PASS THRU LOOP
+       DCA     OPH
+       DCA     OPL
+       TAD     K6000   /GET A FAST FIRST BIT-WE KNOW 
+       TAD     ACH     /THIS WILL WORK SINCE # IS NORMALIZED
+       DCA     ACH     /IF # IS A POWER OF TWO, AND A PERFECT
+       TAD     ACH     /SQUARE-WE ARE DONE HERE!
+       SNA             /WELL IS IT?
+       TAD     ACL     /COULD BE-CHECK LOW ORDER
+       SNA     CLA
+       JMP     DONE    /WHOOPPEE-WE WIN BIG.
+       JMP     LOP01   /NOPE-LOOP DON'T SHIFT FIRST TIME
+SLOOP, TAD     OPH     /SHIFT TRIAL BIT 1 PLACE
+       CLL     RAR     /TO THE RIGHT
+       DCA     OPH     /AND STORE BACK
+       TAD     OPL
+       RAR
+       DCA     OPL
+       JMS I   AL1K    /SHIFT FAC LEFT 1 PLACE
+LOP01, TAD     OPL     /ADD TRIAL BIT TO`ANSWER
+       TAD     AN2     /SO FAR
+       CLL CMA IAC     /NEGATE IT
+       TAD     ACL     /AND ADD TO FAC (REMAINDER SO FAR)
+       SNA             /IS RESULT ZERO?
+       ISZ     ZCNT    /YES-INCREMENT COUNTER
+       DCA     TM      /STORE RESULT IN TEMPORARY
+\f      CML     RAL     /ADD CARRY TO HIGH ORDER FOR SUBTRACT
+       TAD     OPH     /ADD TRIAL BIT
+       TAD     AN1     /ADD RESULT SO FAR (HI ORDER)
+       CLL CMA IAC     /AND SUBTRACT FROM HI ORDER FAC
+       TAD     ACH
+       SNL             /RESULT NEGATIVE?
+       JMP     GON     /YES-NEXT RESULT BIT IS 0
+       SZA             /NO-IS HI ORDER RESULT=0?
+       JMP     LOP02   /NO-GO ON
+       ISZ     ZCNT    /YES-WAS LOW ORDER =0?
+       JMP     .+3     /NO-GO ON
+       CMA             /YES-REM.=0-SET COUNTER SO
+       DCA     AC2     /LOOKS LIKE WE'RE DONE
+LOP02, DCA     ACH     /STORE HIGH ORDER REM. IN FAC
+       TAD     TM      /STORE LO ORDER REM. IN FAC
+       DCA     ACL
+       TAD     OPL     /TRIAL BIT SHIFTED LEFT 1 IS
+       CLL     RAL     /RESULT BIT-ADD IT TO ROOT DEVELOPED
+       TAD     AN2     /SO FAR
+       DCA     AN2
+       TAD     OPH
+       RAL
+       TAD     AN1
+       DCA     AN1
+GON,   CLA CLL CMA RAL /RESET COUNTER FOR ZERO REM.
+       DCA     ZCNT    
+       ISZ     AC2     /DONE ALL 23 RESULT BITS?
+       JMP     SLOOP   /NO-GO ON
+DONE,  TAD     AN1     /YES-STORE ANSWER IN FAC
+       DCA     ACH     /ITS NORMALIZED ALREADY
+       TAD     AN2
+       DCA     ACL
+       JMP I   FROOT   /AND RETURN
+
+K6000, 6000
+ZCNT,  0
+AL1K,  AL1
+AN1,   0
+AN2,   0
+KM22,  -26
+
+       PAGE
+       >
+\f      IFNZRO EAE <
+/
+/FLOATING SQUARE ROOT
+/USES MODIFIED HARDWARE ALGORITHM FOR BINARY SQUARE ROOTS
+/REF: THE LOGIC OF COMPUTER ARITHMETIC-IVAN FLORES; P-409
+       *SGN+14
+FROOT, 0
+       CLA CLL CML RTR /SET RESLT TO 2000,0000
+       DCA     OPL
+       DCA     OPH
+       SWAB            /MODE B OF EAE-ALSO DOES MQL
+       CDF
+       DCA     RBCNT   /CLR. SHIFT COUNTER
+       TAD     KM22
+       DCA     AC2     /SET COUNTER FOR 23 BITS OF RESULT
+       TAD     ACX     /GET EXPONENT OF FAC
+       ASR             /DIVIDE BY 2
+       1
+       DCA     ACX     /STORE IT BACK
+       DPSZ            /INCREMENT EXP. IF ORIG. EXP
+       ISZ     ACX     /WAS ODD
+       NOP
+       MQA             /DETERMINE WHETHER TO DO A 
+       CLL     RAL     /PRE-SHIFT FOR EVEN EXPONENTS.
+       CML     RAL
+       DCA     RKNT    /STORE BIT-0 OR 1 SHIFT CNT
+       CLL CML RTR     /SET UP FIRST TRIAL BIT
+       RTR
+       DCA     AC1
+       DCA     AC0     /STORE AWAY
+       DCA     ACNT    /ZERO COUNTER
+       DLD             /GET THE FAC
+       ACH
+       SWP             /GET IN RIGHT ORDER
+       SNA             /IS IT ZERO? (HI ORD=0)
+       JMP I   FROOT   /YES-ROOT = 0
+       SPA             /NEGATIVE?
+       DCM             /YES-TAKE ABSOL. VALUE
+       SHL             /SHIFT # 1 BIT IF EXP WAS EVEN
+RKNT,  0               /SO FIRST BIT PAIR IS 10 NOT 01
+       TAD     K6000   /SUBTRACT 2000-KNOW FIRST BIT
+       DPSZ            /IS 1(NORMALIZED)-DONE??
+       JMP     LOP1    /NO-WE MUST LOOP
+       JMP     DONE    /YES-AN EASY ONE!!!
+LOOP,  DLD             /GET THE FAC
+       ACH
+       SHL             /SHIFT FAC APPROPRIATELY
+       1
+LOP1,  DST             /MUST STOR BACK IN CASE RESLT
+       ACH             /BIT IS 0
+       DLD             /GET TRIAL BIT
+       AC0
+
+       ASR             /SHIFT THE BIT APPROPRIATELY
+ACNT,  0
+       ISZ     ACNT    /SHIFT 1 MORE NEXT TIME
+       DAD             /ADD IN RESULT SO FAR
+       OPH
+       DCM             /NEGATE IT
+       ISZ     RBCNT   /BUMP COUNTER FOR RESLT BIT
+       DAD             /DO THE SUBTRACT
+       ACH
+       SNL             /RESULT NEGATIVE?
+       JMP     GON     /YES-NEXT RESULT BIT = 0
+
+       DPSZ            /NO-DID WE GET A ZERO REMAINDER?
+       JMP     NOTZRO  /NOPE
+ZREM,  CMA             /YES-SET SO LOOKS LIKE WE'RE DONE
+       DCA     AC2
+NOTZRO,        DST             /GOOD SUBTR.-MODIFY FAC
+       ACH             /ITS NOT CHANGED BY BAD SUBTRACT
+       CAM             /CLEAR EVERYTHING
+       RTR
+       ASR             /SHIFT RESLT BIT TO RIGHT PLACE
+RBCNT, 0
+       DAD             /ADD IT TO THE RESULT SO FAR
+       OPH             /WE APPEND IT TO RIGHT OF LAST 
+       DST             /BIT
+       OPH             /STORE IT BACK
+GON,   ISZ     AC2     /DONE 23 BITS?
+       JMP     LOOP    /NO-GO ON
+DONE,  DLD             /YES-GET RESULT-ITS NORMALIZED
+       OPH
+       DCA     ACH     /STORE HIGH ORDER BACK
+       SWP
+       DCA     ACL     /STORE LOW ORDER BACK
+       JMP I   FROOT   /RETURN
+KM22,  -26
+K6000, 6000
+
+       PAGE
+       >
+\f/23-BIT EXTENDED FUNCTIONS
+
+/1-31-72       R BEAN
+
+/******SINE******
+
+SIN,   0
+       JMS     NHNDLE  /IF X<0,NEGATE X AND SET NFLAG
+       JMS I   (FFMPY  /X*2/PI
+       TOVPI
+       JMS     FRACT   /SAVE X IN TEMP1,THE INTEGER PART OF X IN NUM,AND GET FRACTIONAL PART IN FAC
+       TAD     NUM             /GET INTEGER PART OF (2/PI)*X
+       AND     (3              /ISOLATE BITS 10,11
+       TAD     JMPISN
+       DCA     .+1             /MAKE JUMP TO ARGUMENT REDUCING ROUTINE
+       JMP     .               /AND ADJUST ARG ACCORDING TO QUADRANT OF X
+JMPISN,        JMP I   .+1
+       POLYSN          /X IN QUAD1,SIN(X)=SIN(X)
+       QUAD2           /X IN QUAD2,SIN(X)=SIN(1-X)
+       QUAD3           /X IN QUAD3,SIN(X)=SIN(-X)
+       QUAD4           /X IN QUAD4,SIN(X)=SIN(X-1)
+
+QUAD2, JMS I   (FFSUB1 /1-X
+       ONE
+       JMP     POLYSN  /CALCULATE SIN(1-X)
+QUAD3, JMS I   [FFNEG  /-X
+       JMP     POLYSN  /CALCULATE SIN(-X)
+QUAD4, JMS I   (FFSUB  /X-1
+       ONE
+POLYSN,        JMS I   [FFPUT  /SAVE X
+       FPPTM1
+       JMS I   (FFSQ   /U=X**2
+       JMS I   [FFPUT  /SAVE U
+       FPPTM2
+       JMS I   (FFMPY  /A7*U
+       SINA7
+       JMS I   (FFADD  /A5+A7*U
+       SINA5
+       JMS I   (FFMPY  /A5*U+A7*U**2
+       FPPTM2
+       JMS I   (FFADD  /A3+A5(U)+A7(U**2)
+       SINA3
+       JMS I   (FFMPY  /A3(U)+A5(U**2)+A7(U**3)
+       FPPTM2
+       JMS I   (FFADD  /A1+A3(U)+A5(U**2)+A7(U**3)
+       SINA1
+       JMS I   (FFMPY  /A1(X)+A3(X**3)+A5(X**5)+A7(X**7)
+       FPPTM1
+       JMS     NCHK    /IF NFLAG IS SET,SET SIN(X)=-SIN(X)
+       JMP I   SIN     /FAC=SIN(X)
+
+
+/******COSINE******
+/USES SIN ROUTINE TO CALCULATE COS(X)
+
+COS,   0
+       JMS I   (FFADD  /COS(X)=SIN(PI/2+X)
+       PIOV2
+       JMS     SIN
+       JMP I   COS     /RETURN
+\f/ROUTINE TO SEPERATE THE INTEGER AND FRACTIONAL PARTS OF FAC
+/ORIGINAL FAC IS SAVED IN TEMP1,THE INTEGER PORTION OF FAC IS
+/SAVED AT NUM,AND THE FRACTIONAL FORTION OF THE FAC IS LEFT IN THE FAC
+
+FRACT, 0
+       JMS I   [FFPUT  /SAVE X
+       FPPTM1
+       JMS I   (FFIX   /INTEGER PORTION OF X
+       TAD     ACX
+       DCA     NUM             /SAVE FIXED FORTION OF X
+       JMS I   [FFLOAT /FAC=FLOAT(FIX(X))
+       JMS I   (FFSUB1 /FAC=X-INT(X)=FRACTION (X)
+       FPPTM1
+       JMP I   FRACT   /RETURN
+
+/ROUTINE TO CHECK IF FAC<0; IF IT IS,FAC IS NEGATED AND NFLAG IS
+/SET TO 1
+
+NHNDLE,        0
+       TAD     ACH     /FETCH HIGH ORDER MANTISSA
+       SMA CLA         /IS IT <0?
+       JMP     NFLGST  /NO-CLEAR NFLAG
+       JMS I   [FFNEG  /YES-NEGATE FAC
+       IAC             /AND SET NFLAG
+NFLGST,        DCA     NFLAG
+       JMP I   NHNDLE
+
+/ROUTINE TO NEGATE FAC IF NFLAG IS NOT =0
+
+NCHK,  0               /LOC ALSO USED FOR TEMP STORAGE
+       TAD     NFLAG
+       SZA CLA         /IS NFLAG=0?
+       JMS I   [FFNEG  /NO-NEGATE FAC
+       JMP I   NCHK    /YES-RETURN
+
+       NUM=NCHK
+\f/******EXPONENTIAL******
+
+EXPON1,        0               /LOC USED FOR TEMP STORAGE BY SIN,ARCTAN
+       JMS I   (FFMPY  /Y=XLOG2(E)
+       LOG2E
+       JMS     FRACT   /GET FRACTIONAL PART OF Y
+       JMS I   (FFMPY  /(FRACTION(Y))*(LN2/2)
+       LN2OV2
+       JMS I   [FFPUT  /SAVE Y
+       FPPTM1
+       JMS I   (FFSQ   /Y**2
+       JMS I   (FFADD  /B1+Y**2
+       EXPB1
+       JMS I   (FFDIV1 /A1/(B1+Y**2)
+       EXPA1
+       JMS I   (FFADD  /A0+A1/(B1+Y**2)
+       EXPA0
+       JMS I   (FFSUB  /A0-Y+A1/(B1+Y**2)
+       FPPTM1
+       JMS I   [FFPUT  /SAVE
+       FPPTM2
+       JMS I   [FFGET  /GET Y
+       FPPTM1
+       ISZ     ACX             /MULT. BY 2=2Y
+       NOP
+       JMS I   (FFDIV  /2Y/(A0-Y+A1/(B1+Y**2))
+       FPPTM2
+       JMS I   (FFADD  /1+2Y/(AO-Y+A1/(B1+Y**2))
+       ONE
+       JMS I   (FFSQ   /[1+2Y/(A0-Y+A1/(B1+Y**2))]**2=EXP(Y)
+       TAD     NUM
+       TAD     ACX             /EXP(X)=(2**N)(EXPY)
+       DCA     ACX
+       JMP I   EXPON1  /FAC=EXPON(X)
+
+       NFLAG=EXPON1
+
+/CONSTANT THAT WOULDN'T FIT ELSEWHERE
+TOVPI, 0               /.6366198
+       2427
+       6302
+
+MULLIM,        0
+       TAD     ACX     /CHECK IF NUMBER OF MULTIPLIES IS TOO LARGE
+       SPA
+       CLA             /RETURN IF EXPONENT IS NEGATIVE (WE'LL USE LOGS)
+       TAD     (-4     /ONLY A ROUGH ROUGH LIMIT ON THE EXPONENT
+       SPA SNA CLA     /SKP IF NUMBER GT 15 APPROX
+       JMP I   MULLIM  /NO, CONTINUE
+       JMP I   (USELOG /YES, USE LOG INSTEAD
+
+       PAGE
+\f/******ARC TANGENT******
+
+ATAN,  0
+       JMS I   NHNDLL  /IF X<0,SET NFLAG AND NEGATE
+       JMS I   [FFPUT  /SAVE X
+       FPPTM1
+       JMS I   FSUBM   /X-1
+       ONE
+       TAD     ACH     /GET HI MANTISSA
+       SPA CLA         /WAS X>1?
+       JMP     ARGPOL  /NO-CLEAR GT1FLG
+       JMS I   [FFGET  /YES-ATAN(X)=PI/2-ATAN(1/X)
+       ONE
+       JMS I   FDIVM   /1/X
+       FPPTM1
+       JMS I   [FFPUT
+       FPPTM1
+       IAC             /SET GT1FLG
+ARGPOL,        DCA     GT1FLG
+       JMS I   [FFGET  /GET X OR 1/X
+       FPPTM1
+       JMS I   FSQRM   /Y**2
+       JMS I   [FFPUT  /SAVE
+       FPPTM2
+       JMS I   FADDM   /Y**2+B3
+       ATANB3
+       JMS I   FDIV1M  /A3/(Y**2+B3)
+       ATANA3
+       JMS I   FADDM   /B2+A3/(Y**2+B3)
+       ATANB2
+       JMS I   FADDM   /Y**2+B2+A3/(Y**2+B3)
+       FPPTM2
+       JMS I   FDIV1M  /A2/(Y**2+B2+A3/(Y**2+B3))
+       ATANA2
+       JMS I   FADDM   /B1+A2/(Y**2+B2+A3/(Y**2+B3))
+       ATANB1
+       JMS I   FADDM   /Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))
+       FPPTM2
+       JMS I   FDIV1M  /A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)))
+       ATANA1
+       JMS I   FADDM   /B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)))
+       ATANB0
+       JMS I   FMPYM   /ATAN(Y)=X*(B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))))
+       FPPTM1
+       TAD     GT1FLG  /WAS X>1?
+       SNA CLA
+       JMP     NGT     /NO-TEST IF X<0?
+       JMS I   FSUB1M  /ATAN(X)=PI/2-ATAN(1/X)
+       PIOV2
+NGT,   JMS I   NCHKL   /IF NFLAG SET,NEGATE FAC
+       JMP I   ATAN    /FAC=ATAN(X)
+NHNDLL,        NHNDLE
+NCHKL, NCHK
+\f/******NAPERIAN LOGARITHM******
+
+       GTFLG=ATAN
+
+LOG,   0
+       TAD     ACH
+       SPA SNA         /X<0 OR X=0?
+       JMP I   ARTRAP  /YES-TAKE ILLEGAL ARGUMENT TRAP
+       CLL RTL
+       SNA             /NO-HORD=2000?
+       TAD     ACX     /YES-EXP=1?
+       CMA IAC
+       IAC
+       SNA
+       TAD     ACL     /YES-LORD=0?
+       SZA CLA
+       JMP     POLYNL  /NO-ARG IS LEGAL AND NOT 1
+       DCA     ACX
+       DCA     ACL
+LTRPRT,        DCA     ACH
+       JMP I   LOG     /YES-LOG(1)=0
+POLYNL,        TAD     ACX
+       DCA     GTFLG   /SAVE EXPONENT FOR LATER
+       DCA     ACX             /ISOLATE MANTISSA IN FAC
+       JMS I   [FFPUT  /SAVE F
+       FPPTM1
+       JMS I   FADDM   /F+SQR(.5)
+       SQRP5
+       JMS I   [FFPUT  /SAVE
+       FPPTM2
+       JMS I   [FFGET
+       FPPTM1
+       JMS I   FSUBM   /F-SQR(.5)
+       SQRP5
+       JMS I   FDIVM   /Z=F+SQR(.5)/F-SQR(.5)
+       FPPTM2
+       JMS I   [FFPUT
+       FPPTM1
+       JMS I   FSQRM   /Z**2
+       JMS I   [FFPUT
+       FPPTM2
+       JMS I   FMPYM   /C5(Z**2)
+       LOGC5
+       JMS I   FADDM   /C3+C5(Z**2)
+       LOGC3
+       JMS I   FMPYM   /C3(Z**2)+C5(Z**4)
+       FPPTM2
+       JMS I   FADDM   /C1+C3(Z**2)+C5(Z**4)
+       LOGC1
+       JMS I   FMPYM   /C1(Z)+C3(Z**3)+C5(Z**5)
+       FPPTM1
+       JMS I   FSUBM   /C1(Z)+C3(Z**3)+C5(Z**5)-1/2=LOG2(F)
+       ONEHAF
+       JMS I   [FFPUT  /SAVE LOG2(F)
+       FPPTM2
+       TAD     GTFLG   /I
+       DCA     ACX             /SET UP FLOAT
+       JMS I   [FFLOAT
+       JMS I   FADDM   /I+LOG2(F)
+       FPPTM2
+       JMS I   FMPYM   /[I+LOG2(F)]*LOGE(2)=LOGE(X)
+       LN2
+       JMP I   LOG     /FAC=LN(X)
+
+       GT1FLG=LOG
+FMPYM, FFMPY
+FADDM, FFADD
+FDIVM, FFDIV
+FDIV1M,        FFDIV1
+FSUBM, FFSUB
+FSUB1M,        FFSUB1
+FSQRM, FFSQ
+ARTRAP,        LM
+/CONSTANTS USED BY VARIOUS FUNCTIONS
+
+SINA1, 1               /1.5707949
+       3110
+       3747
+SINA3, 0               /-.64592098
+       5325
+       1167
+SINA5, 7775            /.07948766
+       2426
+       2466
+SINA7, 7771            /-.004362476
+       5610
+       3164
+PIOV2, 1               /1.5707963
+       3110
+       3756
+LOG2E, 1               /1.442695
+       2705
+       2434
+LN2OV2,        7777            /.34657359
+       2613
+       4415
+EXPB1, 6               /60.090191
+       3602
+       7054
+EXPA1, 12              /-601.80427
+       5514
+       3104
+EXPA0, 4               /12.015017
+       3001
+       7301
+ATANB0,        7776            /.17465544
+       2626
+       6157
+ATANA1,        2               /3.7092563
+       3553
+       1071
+ATANB1,        3               /6.762139
+       3303
+       670
+ATANA2,        3               /-7.10676
+       4344
+       5267
+ATANB2,        2               /3.3163354
+       3241
+       7554
+ATANA3,        7777            /-.26476862
+       5703
+       4040
+ATANB3,        1               /1.44863154
+       2713
+       3140
+SQRP5, 0               /.7071068
+       2650
+       1170
+LOGC1, 2               /2.8853913
+       2705
+       2440
+LOGC3, 0               /.9614706
+       3661
+       566
+LOGC5, 0               /.59897865
+       2312
+       5525
+ONEHAF,        0               /.5
+       2000
+       0
+LN2,   0               /.6931472
+       2613
+       4415
+\f      *4500
+
+       /******FIX******
+/ROUTINE TO FIX ANY FLOATING NUMBER IN FAC BETWEEN -2047 AND +2047 TO
+/A TWELVE BIT INTEGER AND LEAVE RESULT IN EXP (LOC 44)
+
+FFIX,  0
+       CLA
+       TAD     ACX             /FETCH EXPONENT
+       SZA SMA         /IS NUMBER <1?
+       JMP     .+3     /NO-CONTINUE ON
+FTRPRT,        CLA
+       JMP     FIXDNE+1        /YES-FIX IT TO ZERO
+       TAD     (-13            /SET BINARY POINT AT 11
+       SNA             /PLACES TO RIGHT OF CURRENT POINT?
+       JMP     FIXDNE  /NO-NUMBER IS ALREADY FIXED THEN.
+       SMA             /YES-IS NUMBER TOO LARGE TO FIX?
+       JMP I   (FO     /YES-TAKE OVERFLOW TRAP
+       DCA     ACX             /NO-SET SCALE COUNT
+FIXLP, CLL             /0 IN LINK
+       TAD     ACH     /GET HIGH MANTISSA
+       SPA             /IS IT <0?
+       CML             /YES-PUT A 1 IN LINK
+       RAR             /SCALE RIGHT
+       DCA     ACH     /SAVE
+       ISZ     ACX             /DONE YET?
+       JMP     FIXLP   /NO
+FIXDNE,        TAD     ACH     /YES-ANSWER IN AC
+       DCA     ACX             /RETURN WITH ANSWER IN 44
+       JMP I   FFIX    /RETURN
+
+/******FLOAT******
+/ROUTINE TO FLOAT ANY INTEGER IN EXP (LOC 44) INTO FAC
+
+FFLOAT,        0
+       TAD     ACX
+       DCA     ACH     /PUT NUMBER IN HI MANTISSA
+       DCA     ACL     /CLEAR LOW MANTISSA
+       TAD     (13             /11(10) INTO EXPONENT
+       DCA     ACX
+       JMS I   [FFNOR  /NORMALIZE
+       JMP I   FFLOAT  /RETURN
+\f/RANDOM NUMBER GENERATOR
+
+RND,   0
+       TAD I   (RSEED  /GET SEED
+       DCA     TEMP3   /PUT IN MULTIPLY OPERAND
+       TAD     (73
+       JMS I   [MPY    /MULTIPLY SEED BY 73
+       DCA I   (RSEED  /USE LOW ORDER 12 BITS AS NEW SEED
+       TAD I   (RSEED  /LOW ORDER OF PRODUCT ALSO SERVES
+       CLL RAR         /AS RANDOM NUMBER
+       DCA     ACH     /SET SIGN TO 0 AND STORE AS HORD
+       DCA     ACX
+       RAR
+       DCA     ACL     /USE 12 BITS AS MANTISSA
+       DCA     AC1             /CLEAR FPP OVERFLOW
+       JMS I   [FFNOR  /AND NORMALIZE
+       JMP I   [ILOOP  /DONE
+
+       PAGE
+\f      /FLOATING POINT OUTPUT ROUTINE
+       /CONVERT INTERNAL NUMBER TO ASCII
+       /EXIT WITH CHAR STRING IN 'INTERB'
+       /XR1 = POINTER TO LAST CHAR STORED
+
+FFOUT, 0
+       TAD     (INTERB-1
+       DCA     XR1     /SET POINTER TO ASCII BUFFER
+       TAD     ACH     /SEE IF FAC NEGATIVE
+       SMA CLA
+       JMP     OKPOS   /JMP IF POSITIVE
+       JMS I   [FFNEG  /TAKE ABS VALUE IF NEGATIVE
+       TAD     ("-     /PRINT MINUS SIGN
+       SKP
+OKPOS, TAD     (240    /PRINT SPACE IF POSITIVE
+       DCA I   XR1
+       TAD     ACH     /SEE IF NUMBER IS ZERO
+       SNA CLA
+       JMP     ZERXIT  /SPECIAL CASE IF SO
+       JMS I   (CVTNUM /CALL ROUTINE TO UNPACK TO BASE 10
+       TAD     (NUMBUF-1
+       DCA     XR2     /POINT XR2 AT DIGIT BUFFER
+       TAD     (5      /TEST FORMAT TO USE
+       TAD     DECEXP
+       CLL
+       TAD     (-4
+       SNL
+       JMP     SMLFMT  /JMP IF .0NNNNNN TO .0000NNNNNN
+       TAD     (-7
+       SZL CLA
+       JMP     REGFMT  /JMP IF .NNNNNN TO NNNNNN
+                       /OTHERWISE USE E FORMAT N.NNNNNE+NNN OR N.NNNNNE-NNN
+       TAD I   XR2     /GET DIGIT TO LEFT OF POINT
+       JMS     PUTD    /PUT IT OUT
+       TAD     (".
+       DCA I   XR1     /NOW SEND OUT DECIMAL POINT
+       TAD     (-5
+       DCA     AC2     /DO 5 MORE DIGITS
+       TAD I   XR2     /PICK UP DIGIT
+       JMS     PUTD    /CONVERT TO ASCII AND STORE
+       ISZ     AC2
+       JMP     .-3     /LOOP FOR MORE
+       TAD     ("E     /PRINT E
+       DCA I   XR1
+/      CLL
+       TAD     DECEXP  /TAKE ABS(DECEXP)
+       SPA
+       CML CIA
+       DCA     DECEXP
+       RTL             /CONVERT "+" TO "-" IF NEGATIVE
+       TAD     ("+
+       DCA I   XR1
+       JMS     IDIV    /PRINT 3 DIGITS OF EXPONENT NOW
+       -144
+       JMS     IDIV
+       -12
+       TAD     DECEXP
+       JMS     PUTD
+       JMP I   FFOUT   /ALL DONE --RETURN--
+\f      /HANDLE .0NNNNNN TO .0000NNNNNN
+
+SMLFMT,        DCA     AC0     /STORE NUMBER OF LEADING ZEROES
+       TAD     (".     /PUT OUT DECIMAL POINT
+       DCA I   XR1
+       JMS     PUTD    /SEND A 0
+       ISZ     AC0
+       JMP     .-2     /LOOP FOR LEADING 0'S
+
+       /GENERAL NON E FORMAT .NNNNNN TO NNNNNN
+
+REGFMT,        TAD     (-7
+       DCA     AC1     /INIT COUNT OF NONZERO DIGITS
+       TAD     (NUMBUF+6
+       DCA     AC2     /POINT AT END OF DIGIT BUFFER
+SHRINK,        STA             /DECREMENT DIGIT POINTER
+       TAD     AC2
+       DCA     AC2
+       ISZ     AC1     /REDUCE SIGNIFICANT DIGIT COUNT
+       TAD     DECEXP
+       IAC
+       TAD     AC1
+       SMA CLA
+       JMP     PRTLP   /JMP OUT IF NOT TO RIGHT OF DECIMAL POINT
+       TAD I   AC2     /ELSE LOOK AT DIGIT
+       SNA CLA
+       JMP     SHRINK  /DISCARD IT IF ZERO
+PRTLP, STA
+       TAD     DECEXP
+       DCA     DECEXP  /SEE IF DIGIT TO BE PRINTED FOLLOWS DP
+       AC0002
+       TAD     DECEXP
+       SZA CLA
+       JMP     NODP    /NO
+       TAD     (".     /YES, PRINT DP
+       DCA I   XR1
+NODP,  TAD I   XR2     /PICK UP DECIMAL DIGIT
+       JMS     PUTD    /PUT OUT
+       ISZ     AC1
+       JMP     PRTLP   /JMP IF MORE DIGITS TO PRINT
+       JMP I   FFOUT   /--RETURN--
+
+ZERXIT,        JMS     PUTD
+       JMP I   FFOUT   /--RETURN--
+
+       /DIVIDE DECEXP BY -DIVISOR IN CALL+1
+
+IDIV,  0
+       DCA     AC1     /CLEAR QUOTIENT
+IDIVLP,        TAD     DECEXP
+       TAD I   IDIV
+       SPA
+       JMP     IDVOUT  /JMP OUT IF LESS THAN DIVISOR
+       DCA     DECEXP  /ELSE UPDATE IT
+       ISZ     AC1     /TALLY QUOTIENT
+       JMP     IDIVLP  /ITERATE
+IDVOUT,        CLA
+       TAD     AC1     /GET QUOT AS NEXT DIGIT
+       JMS     PUTD    /PUT OUT
+       ISZ     IDIV
+       JMP I   IDIV
+
+       /CONVERT NUMBER IN AC TO ASCII DIGIT
+       /MUST NOT TOUCH THE LINK
+
+PUTD,  0
+       TAD     ("0     /ADD IN 0
+       DCA I   XR1     /STORE IN BUFFER
+       JMP I   PUTD
+
+       PAGE
+\f      /CONVERT NUMBER IN FAC TO FORMAT N.NNNNNE NNN
+       /DECIMAL EXPONENT RETURNED AS SIGNED NUMBER IN DECEXP
+       /6 DIGITS STORED IN NUMBUF AS BINARY 0-9
+       /FIRST REDUCES MANTISSA TO FORM 0DD DDF FFF FFF...
+       /BY SUCCESSIVE MULTIPLIES OR DIVIDES BY 10. FOLLOWED BY
+       /RENORMALIZATIONS UNTIL INTIGER BITS
+       /DDDD ARE LT 10.
+       /DECIMAL DIGITS ARE ISOLATED BY REPEATED MULTIPLICATION BY 10.
+
+CVTNUM,        0
+       DCA     AC1     /CLEAR OVERFLOW WORD
+       SKP             /SKP IN AND CLEAR DECIMAL EXPONENT
+ADJDEC,        TAD     DECEXP
+       DCA     DECEXP  /STORE UPDATED DECIMAL EXPONENT
+NORML, TAD     ACH     /SEE IF FRACTION IS NORMALIZED
+       RAL
+       SPA CLA
+       JMP     NORMED  /JMP IF YES
+       JMS I   (AL1    /SHIFT AC LEFT 1 BIT
+       STA
+       TAD     ACX     /COMPENSATE BINARY EXPONENT
+       DCA     ACX
+       JMP     NORML   /TRY AGAIN
+NORMED,        TAD     ACX     /RANGE CHECK BINARY EXPONENT NOW
+       SMA SZA
+       JMP     DIVCHK  /JMP IF NUMBER GE 1
+       TAD     O4
+       DCA     ACX     /INCREASE BINARY EXP TOWARDS ZERO
+       JMS     AR1     /SHIFT 4 BITS RIGHT
+       JMS     AR1     /MAX RELATIVE ERROR WILL BE LT 15*2^-34 PER MULTIPLY
+       JMS     AR1
+       JMS     AR1
+       JMS     MPY10   /NOW MULTIPLY BY 10.
+       STA             /DECREASE DECIMAL EXPONENT
+       JMP     ADJDEC  /RENORMALIZE AND TRY AGAIN
+
+DIVCHK,        TAD     (-5     /SEE IF EXP GT 4
+       SPA
+       JMP     INRANG  /JMP IF NOT, NUMBER MAY BE IN RANGE
+DIVGO, CLA CLL
+       TAD     (-40    /SET 32. STAGE SUBTRACT-SHIFT DIVIDE (SLOW BUT ACCURATE)
+       DCA     AC2     /(THE LEN ELEKMAN TECHNIQUE)
+                       /MAX RELATIVE ERROR WILL BE LT 9*2^-34. PER DIVIDE
+DVLOOP,        TAD     ACH     /SEE IF GE 10.
+       TAD     (5400
+       SMA
+       DCA     ACH     /UPDATE IF YES
+       CML STA RAL
+       DCA     AC0     /SAVE LOW ORDER BIT
+       JMS I   (AL1    /SHIFT MANTISSA NOW
+       ISZ     AC0     /STORE BIT NOW
+       ISZ     AC1
+       ISZ     AC2     /BUMP COUNT
+       JMP     DVLOOP  /ITERATE
+       TAD     ACH     /NOW ZERO OUT REMAINDER
+       AND     [377
+       DCA     ACH
+       IAC             /NOW INCREASE DECIMAL EXPONENT
+       JMP     ADJDEC
+
+INRANG,        DCA     AC2     /SET SHIFT COUNTER
+       SKP
+       JMS     AR1     /SHIFT FAC RIGHT
+       ISZ     AC2
+       JMP     .-2     /LEAVE EFFECTIVE BINARY POINT RIGHT OF ACH BIT 4
+       TAD     ACH     /ACH = 0DD DDF FFF FFF (D=DECIMAL DIGIT BITS)
+       TAD     (5400   /SEE IF DDDD GE 10
+       SMA CLA
+       JMP     DIVGO   /DIVIDE AGAIN (NORMALIZATION WILL WORK)
+       CLL
+       TAD     AC1     /NOW ROUND BY ADDING 0.000005
+       TAD     (4761
+       DCA     AC1
+       IAC             /ADD 24761 TO LOW BITS
+       RAL
+       TAD     ACL
+       DCA     ACL
+       SZL
+       ISZ     ACH
+       TAD     ACH
+       TAD     (5400   /SEE IF CARRY INTO 9.XXX...
+       SZA CLA
+       JMP     CVT10   /JMP IF NO
+       TAD     [200    /ELSE SET TO 1.00000
+       DCA     ACH
+       DCA     ACL
+       DCA     AC1
+       ISZ     DECEXP  /AND BUMP DECIMAL EXPONENT
+O4,    4               /EFFECTIVE NOP
+
+       /NOW CONVERT TO DECIMAL DIGITS
+
+CVT10, TAD     (-6     /DO 6 DIGITS
+       DCA     AC0
+       TAD     (NUMBUF-1
+       DCA     XR3
+       JMP     CVTGO   /FIRST DIGIT IS ALREADY IN
+CVTLP, TAD     ACH     /ZERO OUT PREV DIGIT
+       AND     [177
+       DCA     ACH
+       JMS     MPY10   /MULTIPLY BY 10.
+CVTGO, TAD     ACH     /GET DIGIT FROM 0DD DDF FFF FFF
+       RTL
+       RTL
+       RTL
+       AND     [17
+       DCA I   XR3     /STORE IT
+       ISZ     AC0
+       JMP     CVTLP   /LOOP IF MORE
+       JMP I   CVTNUM  /--RETURN--
+
+       /MULTIPLY ACH,,ACL,,AC1 BY 10.
+
+MPY10, 0
+       TAD     ACH
+       DCA     OPH     /COPY AC TO OP
+       TAD     ACL
+       DCA     OPL
+       TAD     AC1
+       DCA     AC2
+       JMS I   (AL1    /N*2
+       JMS I   (AL1    /N*4
+       JMS I   (OADD   /N*5
+       JMS I   (AL1    /N*10.
+       JMP I   MPY10
+
+       /SHIFT FAC RIGHT 1 BIT
+
+AR1,   0
+       TAD     ACH
+       CLL RAR
+       DCA     ACH
+       TAD     ACL
+       RAR
+       DCA     ACL
+       TAD     AC1
+       RAR
+       DCA     AC1
+       JMP I   AR1     /DONE
+
+       PAGE
+\f      IFZERO  EAE <
+
+/FLOATING POINT INPUT ROUTINE
+
+FFIN,  0
+       CLA     CMA
+       DCA I   FDVPT   /INITIALIZE PERIOD SWITCH TO -1
+       CMA             /SET SIGN SWITCH TO -1
+       DCA     SIGNF
+       CDF             /DF TO PACKAGE FIELD
+       DCA     DSWIT   /ZERO CONVERSION SWITCH
+DECONV,        DCA     ACX     /ZERO OUT THE FAC!
+       DCA     ACL
+P200,  200
+       DCA     ACH
+DECNV, DCA     DNUMBR  /ZERO # OF DIGITS SINCE DEC. PT.
+DECON, JMS     GCHR    /GET A CHAR.FROM TTY.
+       JMP     FFIN1   /TERMINATOR-
+       ISZ     DSWIT   /DIGIT-BUMP CONVERSION SWITCH
+       ISZ     DNUMBR  /BUMP # OF DIGITS-# IS STORED IN
+       JMS I   FMPYLL  /"FMPY  TEN"
+       TEN
+       JMS I   [FFPUT  /"FPUT I        TM3PT"
+       FPPTM1
+       JMS I   [FFGET  /"FGET  TP"
+       TP
+       JMS I   [FFNOR  /"FNOR"
+       JMS I   FADDLL  /"FADD I        TM3PT"
+       FPPTM1
+       JMP     DECON   /GO ON
+FFIN1, ISZ I   FDVPT   /HAVE WE HAD A PERIOD YET?
+       JMP     FIGO2   /YES-GO ON
+       ISZ     TP1     /NO-IS THIS A PERIOD?
+       ISZ     TP1
+       SKP     CLA
+       JMP     DECNV   /YES-ZERO DIG. COUNT AFTER DEC. PT.
+                       /AND GO CONVERT REST
+       DCA     DNUMBR  /NO-TERMINATOR-ZERO COUNT OF
+                       /DIGITS AFTER DECIMAL POINT.
+FIGO2, ISZ     SIGNF   /IS # NEGATIVE?(DID WE GET - SIGN?)
+       JMS I   FFNEGP  /YES-NEGATE IT
+       CLA     CMA     /RESET SIGN SWITCH FOR EXP.
+       DCA     SIGNF
+       TAD     CHAR    /NO-WAS THE TERMINATOR AN 'E'?
+       TAD     KME     
+       SNA     CLA
+GETE,  JMS     GCHR    /YES-GET A CHAR. OF EXPONENT
+       JMP     EDON    /END OF EXPONENT
+       TAD     TM      /GOT DIG. OF EXP-STORED IN TP1
+       CLL     RTL     /MULT. ACCUMULATED EXP BY 10
+       TAD     TM
+       CLL     RAL
+       TAD     TP1     /ADD DIGIT
+       JMP     GETE    /CONTINUE
+\fEDON, TAD     TM      /GET EXPONENT
+       ISZ     SIGNF   /WAS EXPONENT NEGATIVE?
+       CMA     IAC     /YES-NEGATE IT
+       CMA     IAC     /AND CALC. DNUMBR - EXPON.
+       TAD     DNUMBR  /GET # TIMES TO DIV MANTISSA BY TEN
+       CLL CMA IAC
+       SPA             /RESULT POSITIVE?
+       CLL CMA CML IAC /NO-MAKE POS. AND SET LINK
+       CMA             /NEGATE FOR COUNTER
+       DCA     DNUMBR  /AND STORE
+       RAL             /LINK=1-DIV;=0-MUL. # BY TEN
+       TAD     MDV     /FORM CORRECT INSTRUCTION
+       DCA     SIGNF   /AND STORE FOR EXECUTION
+FCNT,  ISZ     DNUMBR  /DONE ALL OPERATIONS?
+       JMP     SIGNF   /NO
+       JMP I   FFIN    /YES-RETURN
+SIGNF, 0               /NO- MUL OR DIV. MANTISSA
+       TEN             /BY TEN
+       JMP     FCNT    /GO ON
+FFNEGP,        FFNEG
+DNUMBR,        0
+KME,   -305
+MDV,   JMS I   .+1     /THESE 3 WDS. MUST BE IN THIS ORDER
+FMPYLL,        FFMPY
+FDVPT, FFDIV           /!!!!!!!!!!!!!!!!!
+FADDLL,        FFADD
+
+KK12,  12
+TP,    13
+TP1,   0
+       0
+TEN,   4
+       2400
+       0
+\f/ROUTINE TO GET A CHAR FROM THE TTY AND SEE IF IT IS DIGIT
+/OR A TERMINATOR.
+/RETURN TO CALL + 1 IF TERMINATOR, TO CALL + 2 IF DIGIT
+/THIS ROUTINE MUST NOT MODIFY THE MQ!!
+GCHR,  0
+       DCA     TM      /STORE ACCUMULATED EXPONENT (MAYBE)
+       JMS     INPUT   /GET A CHAR FROM TTY.
+       TAD     CHAR    /PICK IT UP
+       TAD     PLUS    /WAS IT PLUS SIGN?
+       SNA
+       JMP     DECON1  /YES-GET ANOTHER CHAR.
+       TAD     MINUS   /NO WAS IT MINUS SIGN?
+       SZA     CLA
+       JMP     .+3
+       DCA     SIGNF   /YES-FLIP SWITCH
+DECON1,        JMS     INPUT   /GET A CHAR.
+       TAD     CHAR
+       TAD     K7506   /SEE IF ITS A DIGIT
+       CLL
+       TAD     KK12
+       DCA     TP1     /STORE FOR LATER
+       SZL             /DIGIT?
+       ISZ     GCHR    /YES-RETN. TO CALL+2
+       JMP I   GCHR    /NO-RETN. TO CALL+1
+K7506, 7506
+/
+/INPUT ROUTINE-IGNORES LEADING SPACES
+/
+INPUT, 0
+       JMS I   IGETCH  /USE OUR ROUTINE TO GET CHAR
+       TAD     DSWIT   /GET TERMINATOR
+       SZA CLA         /VALID INPUT YET?
+       JMP     IOUT    /YES-CONTINUE
+       TAD     CHAR    /NO-GET CHAR
+       TAD     M240    /COMPARE AGAINST SPACE
+       SZA             /SKP IF SPACE
+       TAD     (240-212 /COMPARE TO LF
+       SNA CLA         /IS IT A SPACE OR LF?
+       JMP     INPUT+1 /YES-IGNORE IT
+IOUT,  JMP I   INPUT   /RETURN
+IGETCH,        GETCH           /POINTER TO GET CHAR ROUTINE
+                       /ALTERED BY "VAL" FUNCTION TO PICK FROM SAC (BE CAREFULL)
+M240,  -240
+PLUS,  -253
+MINUS, 253-255
+/
+/ROUTINE TO DECIDE CALLING MODE IN LIEU OF "SPECIAL MODE" PROBLEMS
+/
+PATCHF,        0
+       SZA             /IS AC EMPTY
+       JMP     RTN2    /NO-THIS IS ALWAYS SI MODE WITH ADDR IN AC
+       TAD     FF              /YES-GET SPECIAL MODE FLIP-FLOP
+       SZA CLA         /IF ON,THE ZERO AC MEANS ADDRESS OF 0
+RTN2,  ISZ     PATCHF  /USE AC AS ADDRESS OF OPERAND
+       JMP I   PATCHF  /RETURN
+\f      PAGE
+/
+/INVERSE FLOATING SUBTRACT-USES FLOATING ADD
+/!!FSW1!!-THIS IS OP-FAC
+/
+FFSUB1,        0
+       JMS I   [PATCHF /WHICH MODE?
+       TAD I   FFSUB1  /CALLED BY USER-GET ADDR. OF OP.
+       JMS I   ARGETL  /GO PICK UP OPERAND
+       CDF
+       JMS I   FFNEGA  /NEGATE FAC
+       TAD     FFSUB1  /AND GO ADD
+       JMP I   SUB0P
+FFNEGA,        FFNEG
+SUB0P, SUB0
+/
+/INVERSE FLOATING DIVIDE
+/FSWITCH=1
+/THIS IS OP/FAC
+/
+FFDIV1,        0
+       JMS I   [PATCHF /WHICH MODE OF CALL?
+       TAD I   FFDIV1  /CALLED BY USER-GET ADDR.
+       JMS I   ARGETL  /PICK UP OPERAND
+       TAD     ACL     /SWAP THE FAC AND OPERAND
+       DCA     OPL     /THERE IS A POINTER TO OPL
+       TAD I   AC2     /IN AC2 LEFT FROM ARGET SUBR.
+       DCA     ACL
+       TAD     ACX     /MIGHT AS WELL SUBTRACT THE
+       CLL CMA IAC     /EXPONENTS HERE (SAVES A WORD)
+       TAD     OPX     /THEN ZERO OPX SO WILL NOT
+       DCA     ACX     /MESS UP WHEN ITS DONE AGAIN
+       DCA     OPX     /LATER (SEE DIV. ROUTINE)
+       TAD     ACH
+       DCA     AC2     /NOW SWAP HIGH ORDER MANTISSAS
+       TAD     OPH
+       DCA     ACH
+       TAD     AC2
+       DCA     OPH
+       CDF             /DF TO PACKAGE FIELD
+       TAD     FFDIV1  /NOW KLUDGE UP A SUBROUTINE LINKAGE
+       DCA I   FFDP
+       TAD     KFD1
+       DCA I   MDSETP
+       JMP I   MD1P    /GO SET UP AND DIVIDE
+
+MD1P,  MD1
+ARGETL,        ARGET
+MDSETP,        MDSET
+FFDP,  FFDIV
+KFD1,  FFD1
+\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
+       JMS I   ARGETK  /GET ARGUMENT
+MD1,   CDF             /DF TO PACKAGE FIELD
+       CLA CLL CMA RAL /SET SIGN CHECK TO -2
+       DCA     TM
+       TAD     OPH     /IS OPERAND NEGATIVE?
+       SMA     CLA
+       JMP     .+3     /NO
+       JMS I   OPNEGP  /YES-NEGATE IT
+       ISZ     TM      /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   FFNEGK  /YES-NEGATE IT
+       ISZ     TM      /BUMP SIGN CHECK
+       NOP             /MAY SKIP
+LEV,   TAD     OPX     /EXIT WITH OPERAND EXPONENT IN AC
+       JMP I   MDSET
+
+FFNEGK,        FFNEG
+OPNEGP,        OPNEG
+ARGETK,        ARGET
+
+/
+/CONTINUATION OF FLOATING DIVIDE ROUTINE
+/
+FD1,   TAD     AC2     /NEGATE HI ORDER PRODUCT
+       CLL CMA IAC
+       TAD     ACH     /COMPARE WITH REMAINDER OF FIRST DIV.
+       SNL             /WELL?
+       JMP I   DVOPSP  /GREATER THAN REM.-ADJUST QUOT OF 1ST DIV.
+       CLL             /OK-DO  (REM-(Q*OPL))/OPH
+       DCA     ACH     /FIRST STORE ADJUSTED PRODUCT
+       JMS I   DV24P   /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
+       CLL
+       ISZ     ACL
+       SKP
+       IAC
+       RAR
+       DCA     ACH     /STORE IN FAC
+       TAD     ACL     /P@ LOW ORDER RIGHT
+       RAR
+       DCA     ACL     /STORE BACK
+       ISZ     ACX     /BUMP EXPONENT
+       NOP
+       TAD     ACH
+       JMP     DVL1+1
+FD,    DCA     ACH     /STORE HIGH ORDER RESULT
+       JMP I   FDDONP  /GO LEAVE DIVIDE
+
+FDDONP,        FDDON           /END OF FLTG. DIV. ROUTINE
+DV24P, DV24            /ROUTINE TO DO A 24X12BIT DIVIDE
+DVOPSP,        DVOPS           /ROUTINE TO ADJUST QUOT OF FIRST DIV.
+/
+/CONTINUATION OF ROUTINE TO ADJUST QUOT. OF FIRST DIV.
+/DBAD1 IS ONLY EXECUTED ON DIVIDE OVERFLOW-OTHERWISE THE
+/ROUTINE STARTS AT DVOP2
+/
+DBAD1, DCA     ACX     /DIVIDE OVERFLO-ZERO ALL
+DVOP2, SNA             /IS IT ZERO?
+       DCA     ACL     /YES-MAKE WHOLE THING ZERO
+       DCA     ACH
+       JMS I   DV24P   /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
+
+       PAGE
+\f/FLOATING MULTIPLY-DOES 2 24X12 BIT MULTIPLIES
+FFMPY, 0
+       JMS I   [PATCHF /WHICH MODE OF CALL?
+       TAD I   FFMPY   /CALLED BY USER-GET OPERAND ADDR.
+       JMS I   MDSETK  /SET UP FOR MPY-OPX IN AC ON RETN.
+       TAD     ACX     /DO EXPONENT ADDITION
+       DCA     ACX     /STORE FINAL EXPONENT
+       DCA     DV24    /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
+RTZRO, DCA     ACL     /LOW ORDER
+       TAD     DV24    /HIGH ORDER
+       DCA     ACH
+       TAD     ACH     /DO WE NEED TO NORMALIZE?
+       RAL
+       SMA     CLA
+       JMP     SHLFT   /YES-DO IT FAST
+MDONE, DCA     AC1     /NO-ZERO OVERFLOW WD(DO I NEED THIS???)
+       ISZ     FFMPY   /BUMP RETURN POINTER
+       ISZ     TM      /SHOULD RESULT BE NEGATIVE?
+       JMP I   FFMPY   /NOPE-RETN.
+       JMS I   FFNEGR  /YES-NEGATE IT
+       JMP I   FFMPY   /RETURN
+SHLFT, CMA             /SUBTRACT 1 FROM EXP.
+       TAD     ACX
+       DCA     ACX
+       JMS I   AL1PTR  /SHIFT FAC LEFT 1 BIT
+       JMP     MDONE+1 /DONE.
+AL1PTR,        AL1
+/
+/24 BIT BY 12 BIT MULTIPLY.  MULTIPLIER IS IN OPL
+/MULTIPLICAND IS IN ACH AND ACL
+/RESULT LEFT IN DV24,AC2, AND AC1
+MP24,  0
+       TAD     KKM12   /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
+\f      CLL             /YES-ADD MULTIPLICAND TO PARTIAL PRODUCT
+       TAD     AC2
+       TAD     ACL     /LOW ORDER
+       DCA     AC2
+       RAL             /PROPAGATE CARRY
+       TAD     ACH     /HI ORDER
+MPLP2, TAD     DV24
+       RAR             /NOW SHIFT PARTIAL PROD. RIGHT 1 BIT
+       DCA     DV24
+       TAD     AC2
+       RAR
+       DCA     AC2
+       RAR             /1 BIT OF OVERFLOW TO AC1
+       DCA     AC1
+       ISZ     OPX     /DONE ALL 12 MULTIPLIER BITS?
+       JMP     MPLP    /NO-GO ON
+       JMP I   MP24    /YES-RETURN
+/
+/PART OF DIVIDE ROUTINE-FFDIV MUST BE AT LOC. 6722
+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     FFMPY   /DONE ALL BITS?
+       JMP     MP12L   /NO-LOOP BACK
+       CLL CMA IAC     /YES-LOW ORDER PROD. OF QUOT. X OPL IN AC
+       DCA     ACL     /NEGATE AND STORE
+       CML     RAL     /PROPAGATE CARRY
+       JMP I   FD1P    /GO ON
+FD1P,  FD1     /POINTER TO REST OF DIVIDE ROUTINE
+/
+/FLOATING DIVIDE ROUTINE
+/USES THE METHOD OF TRIAL DIVISION BY HI ORDER
+FFDIV, 0               /(USED AS A TEM. BY I/O ROUTINES)
+       JMS I   [PATCHF /WHICH MODE OF CALL?
+       TAD I   FFDIV   /CALLED BY USER-GET ARG. ADDR.
+       JMS I   MDSETK  /GO SET UP FOR DIVIDE-OPX IN AC ON RETN.
+FFD1,  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     KM13    /SET COUNTER FOR 12 BIT MULTIPLY
+       DCA     FFMPY   /TO MULTIPLY QUOT. OF DIV. BY 
+       JMP     DVLP1   /LOW ORDER OF OPERAND (OPL)
+\f/
+/END OF FLOATING DIVIDE-FUDGE SOME
+/STUFF THEN JUMP INTO MULTIPLY
+/
+FDDON, TAD     FFDIV   /STORE RETN. ADDR. IN MULT ROUTINE
+       DCA     FFMPY
+       JMP     MDONE   /GO CLEAN UP
+/
+/DIVIDE ROUTINE--24 BITS IN ACH,ACL ARE DIVIDED BY 12 BITS
+/IN OPH.  OPH IS ASSUMED NEGATIVE AND .GT. ACH IN ABSOLUTE VALUE
+/ELSE-DIVIDE OVERFLOW--WE RETURN NORMALLY WITH QUOTIENT
+/IN ACL AND REM. IN ACH.  (AC2=0 ON RETN.)
+/
+DV24,  0
+       TAD     ACH     /CHECK THAT DIVISOR IS .GT. DIVIDEND
+       TAD     OPH     /DIVISOR IN OPH (NEGATIVE)
+       SZL     CLA     /IS IT?
+       JMP I   DVOVR   /NO-DIVIDE OVERFLOW
+       TAD     KM13    /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
+FFNEGR,        FFNEG
+MDSETK,        MDSET
+KKM12, -14
+KM13,  -15
+DVOVR, DV
+
+       PAGE
+\f/
+/FLOATING ADD
+/
+FFADD, 0
+       JMS I   [PATCHF /WHICH MODE FO CALL?
+       TAD I   FFADD   /CALLED BY USER-GET ADDR. OF OPR.
+       JMS I   ARGETP  /PICK UP OPERAND
+FAD1,  CDF             /DF TO PACKAGE FIELD
+       TAD     OPH     /IS OPERAND = 0
+       SNA     CLA
+       JMP     DONA    /YES-DONE
+       TAD     ACH     /NO-IS FAC=0?
+       SNA     CLA
+       JMP     DOADD   /YES-DO ADD
+       TAD     ACX     /NO-DO EXPONENT CALCULATION
+       CLL CMA IAC
+       TAD     OPX
+       SMA     SZA     /WHICH EXP. GREATER?
+       JMP     FACR    /OPERANDS-SHIFT FAC
+       CMA     IAC     /FAC'S-SHIFT OPERAND=DIFFRNCE+1
+       JMS     OPSR
+       JMS     ACSR    /SHIFT FAC ONE PLACE RIGHT
+DOADD, TAD     OPX     /SET EXPONENT OF RESULT
+       DCA     ACX
+       JMS     OADD    /DO THE ADDITION
+       JMS I   FNORP   /NORMALIZE RESULT
+DONA,  ISZ     FFADD   /BUMP RETURN
+       JMP I   FFADD   /RETURN
+FACR,  JMS     ACSR    /SHIFT FAC = DIFF.+1
+       JMS     OPSR    /SHIFT OPR. 1 PLACE
+       JMP     DOADD   /DO ADDITION
+/
+/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
+       RAL             /TO LINK
+       CLA
+       TAD     OPH     /GET HI MANTISSA
+       RAR             /SHIFT IT RIGHT, PROPAGATING SIGN
+       DCA     OPH     /STORE BACK
+       TAD     OPL
+       RAR
+       DCA     OPL     /STORE LO ORDER BACK
+       RAR             /SAVE 1 BIT OF OVERFLOW
+       DCA     AC2     /IN AC2
+       ISZ     OPX     /INCREMENT EXPONENT
+NOP2,  NOP     
+       ISZ     AC0     /DONE ALL SHIFTS?
+       JMP     LOP2    /NO-LOOP
+       JMP I   OPSR    /YES-RETN.
+\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 SIGN BIT OF MANTISSA
+       RAL             /SET UP SIGN PROPAGATION
+       CLA
+       TAD     ACH     /GET HIGH ORDER MANTISSA
+       RAR             /SHIFT RIGHT`1, PROPAGATING SIGN
+       DCA     ACH     /STORE BACK
+       TAD     ACL     /GET LOW ORDER
+       RAR             /SHIFT IT
+       DCA     ACL     /STORE BACK
+       RAR
+       DCA     AC1     /SAVE 1 BIT OF OVERFLOW
+       ISZ     ACX     /INCREMENT EXPONENT
+NOP1,  NOP
+       ISZ     AC0     /DONE?
+       JMP     LOP1    /NO-LOOP
+       JMP I   ACSR    /YES-RETN-AC=L=0
+/
+/DIVIDE OVERFLOW-ZERO ACX,ACH,ACL
+/
+DBAD,  CLA     CLL     /NECESSARY SO WE DON'T GET OVRFLO AGAIN
+       JMP I   DBAD1P  /GO ZERO ALL
+/
+/FLOATING SUBTRACT
+/
+FFSUB, 0
+       JMS I   [PATCHF /WHICH MODE OF CALL?
+       TAD I   FFSUB   /CALLED BY USER-GET ADDR. OF OP
+       JMS I   ARGETP  /PICK UO THE OP.
+       JMS     OPNEG   /NEGATE OPERAND
+       TAD     FFSUB   /JMP INTO FLTG. ADD
+SUB0,  DCA     FFADD   /AFTER SETTING UP RETURN
+       JMP     FAD1
+ARGETP,        ARGET
+\f      *6135
+/
+/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
+/
+/NEGATE OPERAND
+/
+OPNEG, 0
+       TAD     OPL     /GET LOW ORDER
+       CLL CMA IAC     /NEGATE AND STORE BACK
+       DCA     OPL
+       CML     RAL     /PROPAGATE CARRY
+       TAD     OPH     /GET HI ORDER
+       CLL CMA IAC     /NEGATE AND STORE BACK
+       DCA     OPH
+       JMP I   OPNEG
+/
+/ADD OPERAND TO FAC
+/
+OADD,  0
+       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.
+DBAD1P,        DBAD1
+FNORP, FFNOR
+       >
+\f      IFNZRO EAE <
+/EAE FLOATING POINT PACKAGE
+/FOR PDP8/E WITH KE8-E EAE
+/
+/W.J. CLOGHER
+/
+/DEFINITIONS OF EAE INSTRUCTIONS
+       SWP=    7521
+       CAM=    7621
+       MQA=    7501
+       MQL=    7421
+       SGT=    6006
+       SWAB=   7431
+       SWBA=   7447
+       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
+       /
+       TM=     TEMP4
+       \f/
+/FLOATING POINT INPUT ROUTINE
+/
+       PAGE
+FFIN,  0
+       CLA     CMA
+       DCA     PRSW    /INITIALIZE PERIOD SWITCH TO -1
+       CMA             /SET SIGN SWITCH TO -1
+       DCA     SIGNF
+       CDF             /CHANGE TO DF OF PACKAGE
+       DCA     DSWIT   /ZERO CONVERSION SWITCH
+DECONV,        DCA     ACX     /ZERO OUT THE FAC!
+       DCA     ACL
+       DCA     ACH
+DECNV, DCA     DNUMBR  /ZERO # OF DIGITS SINCE DEC. PT.
+DECON, JMS     GCHR    /GET A CHAR.FROM TTY.
+       JMP     FFIN1   /TERMINATOR-
+       ISZ     DSWIT   /DIGIT-BUMP CONVERSION SWITCH
+       ISZ     DNUMBR  /BUMP # OF DIGITS
+       DCA     TP1     /STORE IT IN FORM EASILY FLOATIBLE
+       JMS I   FMPYLL  /MULTIPLY # BY 10
+       TEN
+       JMS I   [FFPUT  /STORE IT AWAY
+       FPPTM1
+       JMS I   [FFGET  /GET NEW DIGIT
+       TP
+       JMS I   [FFNOR  /FLOAT IT
+       JMS I   FADDLL  /ADD IT TO THE ACCUMULATED #
+       FPPTM1
+       JMP     DECON   /GO ON
+FFIN1, ISZ     PRSW    /HAVE WE HAD A PERIOD YET?
+       JMP     FIGO2   /YES-GO ON
+       TAD     K2      /NO-IS THIS A PERIOD?
+       SNA     CLA
+       JMP     DECNV   /YES-ZERO DIG. COUNT AFTER DEC. PT.
+                       /AND GO CONVERT REST
+       DCA     DNUMBR  /NO-TERMINATOR-ZERO COUNT OF
+                       /DIGITS AFTER DECIMAL POINT.
+FIGO2, CLA     MQL     /0 TO MQ FOR LATER MULTIPLY
+       ISZ     SIGNF   /IS # NEGATIVE?(DID WE GET - SIGN?)
+       JMS I   FFNEGP  /YES-NEGATE IT
+       SWAB
+       CMA             /RESET SIGN SWITCH FOR EXP.
+       DCA     SIGNF
+       TAD     CHAR    /NO-WAS THE TERMINATOR AN 'E'?
+       TAD     KME     
+       SNA     CLA
+GETE,  JMS     GCHR    /YES-GET A CHAR. OF EXPONENT
+       JMP     EDON    /END OF EXPONENT
+       MUY             /GOT DIGIT OF EXP-MULT ACCUMULATED
+       K12             /EXPONENT BY TEN AND ADD DIGIT
+       JMP     GETE    /CONTINUE
+\fEDON, ISZ     SIGNF   /WAS EXPONENT NEGATIVE?
+       DCM             /YES-NEGATE IT
+       CLA     CLL     /CLEAR AC AND LINK
+       TAD     DNUMBR  /GET # TIMES TO DIV MANTISSA BY TEN
+       SAM             /SUBTRACT FROM EXPONENT
+       CLL
+       SPA             /RESULT POSITIVE?
+       CLL CMA CML IAC /NO-MAKE POS. AND SET LINK
+       CMA             /NEGATE FOR COUNTER
+       DCA     DNUMBR  /AND STORE
+       RAL             /LINK=1-DIV;=0-MUL. # BY TEN
+       TAD     MDV     /FORM CORRECT INSTRUCTION
+       DCA     FINST   /AND STORE FOR EXECUTION
+FCNT,  ISZ     DNUMBR  /DONE ALL OPERATIONS?
+       JMP     FINST   /NO
+       JMP I   FFIN    /YES-RETURN
+FINST, 0               /NO- MUL OR DIV. MANTISSA
+       TEN             /BY TEN
+       JMP     FCNT    /GO ON
+FFNEGP,        FFNEG
+PRSW,  0
+DNUMBR,        0
+SIGNF, 0
+K2,    2
+KME,   -305
+MDV,   JMS I   .+1     /THESE 3 WDS. MUST BE IN THIS ORDER
+FMPYLL,        FFMPY
+       FFDIV           /!!!!!!!!!!!!!!!!!
+FADDLL,        FFADD
+
+K12,   12
+TP,    13
+TP1,   0
+       0
+TEN,   4
+       2400
+       0
+\f/ROUTINE TO GET A CHAR FROM THE TTY AND SEE IF IT IS DIGIT
+/OR A TERMINATOR.
+/RETURN TO CALL + 1 IF TERMINATOR, TO CALL + 2 IF DIGIT
+/THIS ROUTINE MUST NOT MODIFY THE MQ!!
+GCHR,  0
+       JMS     INPUT   /GET A CHAR FROM TTY.
+       TAD     CHAR    /PICK IT UP
+       TAD     PLUS    /WAS IT PLUS SIGN?
+       SNA
+       JMP     DECON1  /YES-GET ANOTHER CHAR.
+       TAD     MINUS   /NO WAS IT MINUS SIGN?
+       SZA     CLA
+       JMP     .+3
+       DCA     SIGNF   /YES-FLIP SWITCH
+DECON1,        JMS     INPUT   /GET A CHAR.
+       TAD     CHAR
+       TAD     K7506   /SEE IF ITS A DIGIT
+       CLL
+       TAD     K12
+       SZL             /DIGIT?
+       ISZ     GCHR    /YES-RETN. TO CALL+2
+       JMP I   GCHR    /NO-RETN. TO CALL+1
+K7506, 7506
+PLUS,  -253
+MINUS, 253-255
+/
+/
+/INPUT ROUTINE-IGNORES LEADING SPACES
+/
+INPUT, 0
+       JMS I   IGETCH  /USE OUR ROUTINE TO GET CHAR
+       TAD     DSWIT   /GET TERMINATOR
+       SZA CLA         /VALID INPUT YET?
+       JMP     IOUT    /YES-CONTINUE
+       TAD     CHAR    /NO-GET CHAR
+       TAD     M240    /COMPARE AGAINST SPACE
+       SZA
+       TAD     (240-212 /IS IT AN LF?
+       SNA CLA         /IS IT A SPACE OR LF?
+       JMP     INPUT+1 /YES-IGNORE IT
+IOUT,  JMP I   INPUT   /RETURN
+M240,  -240
+IGETCH,        GETCH           /ALTERED BY VAL FUNCITON TO PICK FROM SAC
+/
+/ROUTINE TO DECIDE CALLING MODE IN LIEU OF "SPECIAL MODE" PROBLEMS
+/
+PATCHF,        0
+       SZA             /IS AC EMPTY
+       JMP     RTN2    /NO-THIS IS ALWAYS SI MODE WITH ADDR IN AC
+       TAD     FF              /YES-GET SPECIAL MODE FLIP-FLOP
+       SZA CLA         /IF ON,THE ZERO AC MEANS ADDRESS OF 0
+RTN2,  ISZ     PATCHF  /USE AC AS ADDRESS OF OPERAND
+       JMP I   PATCHF  /RETURN
+/
+\f      PAGE
+/
+/FLOATING SUBTRACT-USES FLOATING ADD
+/FSW1!!
+FFSUB1,        0
+       JMS I   [PATCHF /WHICH MODE?
+       TAD I   FFSUB1  /CALLED BY USER-GET ADDR. OF OP
+       JMS I   ARGETL  /PICK UP ARGUMENT
+       CDF
+       JMS I   FFNEGA  /NEGATE FAC!
+       TAD     FFSUB1
+       JMP I   SUB0P
+FFNEGA,        FFNEG
+SUB0P, SUB0
+
+
+/
+/FLOATING DIVIDE
+/FSWITCH=1
+/THIS IS OP/FAC
+/
+FFDIV1,        0
+       JMS I   [PATCHF /WHICH MODE OF CALL?
+       TAD I   FFDIV1  /CALLED BY USER-GET ADDR.
+       JMS I   ARGETL  /(INTERP.)-GET OPRND.-ADDR. IN AC
+       CDF             /CDF TO FIELD OF PACKAGE
+       TAD     ACH     /SWAP FAC AND OPRND-OPH IN MQ!
+       DCA     OPH     /STORE ACH IN OPH
+       TAD     ACX     /GET EXP OF FAC
+       SWP             /OPH TO AC, ACX TO MQ
+       DCA     ACH     /STORE OPH IN ACH
+       TAD     OPX     /STORE OPX IN ACX
+       DCA     ACX
+       TAD     OPL     /OPL TO MQ, ACX TO AC
+       SWP
+       DCA     OPX     /STORE ACX IN OPX
+       TAD     ACL
+       DCA     OPL     /STORE ACL IN OPL
+       TAD     OPH     /OPH TO MQ FOR LATER
+       SWP
+       DCA     ACL     /STORE OPL IN ACL
+       TAD     FFDIV1  /SET UP SO WE RETN TO
+       DCA I   FFDP    /NORMAL DIVIDE ROUTINE
+       TAD     FD1
+       DCA I   MDSETP
+       JMP I   MD1P    /GO ARRANGE OPERANDS
+
+MD1P,  MD1
+ARGETL,        ARGET
+MDSETP,        MDSET
+FFDP,  FFDIV
+FD1,   FFD1
+
+\f
+/PATCH TO EAE ADD ROUTINE
+
+ADDPCH,        0
+       TAD     AC1     
+       TAD     RB4000
+       DPSZ
+       JMP     ADDP1
+       CLL CML RTR
+       ISZ     ACX
+       NOP
+ADDP1, TAD     RB4000
+       JMP I   ADDPCH
+RB4000,        4000
+
+
+/
+PTCHAD,        CDF
+       TAD     OPH
+       SNA CLA /OPERAND ZERO
+       JMP I   JADON   /YES
+       TAD     ACH     /FAC ZERO
+       SZA CLA
+       JMP I   JFAD1   /NO
+       TAD     OPX
+       DCA     ACX
+       TAD     OPH
+       DCA     ACH
+       TAD     OPL
+       DCA     ACL
+       JMP I   JADON
+JADON, ADON
+JFAD1, FAD1
+\f/
+/FLOATING MULTIPLY--DOES 4 SINGLE MULTIPLIES WITH EAE
+/THIS USES THE FACT THAT IF AC IS NON-ZERO WHEN YOU DO
+/A MUY INSTR, THE AC IS ADDED TO RESULT OF THE MULTIPLY.
+/(IN THE LOW ORDER, NATCHERLY)
+       PAGE
+FFMPY, 0
+       JMS I   [PATCHF /WHICH MODE?
+       TAD I   FFMPY   /CALLED BY USER-GET ADDRESS
+       JMS     MDSET   /SET UP FOR MULT
+       CLA     MUY     /MULTIPLY-LOW ORDER FAC STILL IN MQ
+       OPH             /THIS IS PRODUCT OF LOW ORDERS
+       MQL             /ZAP LOW ORDER RESULT-INSIGNIFICANT
+       TAD     ACH     /GET LOW ORDER(!) OF FAC
+       SWP     MUY     /TO MQ-HIGH ORD. RESLT OF LAST MPY
+       OPL             /TO AC-WILL BE ADDED TO RESLT-THIS
+       DST             /IS PRODUCT-LOW ORD FAC,HI ORD OP
+       AC0             /STORE RESULT
+       DLD             /HIGH ORDER FAC TO MQ, OPX TO AC
+       ACL
+       TAD     ACX     /ADD FAC EXPONENT-GET SUM OF EXPS.
+       DCA     ACX     /STORE RESULT
+       MUY             /MUL. HIGH ORDER FAC BY LOW ORD OP.
+       OPH             /HIGH ORDER FAC WAS IN MQ
+       DAD             /ADD IN RESULT OF SECOND MULTIPLY
+       AC0
+       DCA     ACH     /STORE HIGH ORDER RESULT
+       TAD     ACL     /GET HIGH ORDER FAC
+       SWP             /SEND IT TO MQ AND LOW ORD. RESULT
+       DCA     AC0     /OF ADD TO AC-STORE IT
+       RAL             /ROTATE CARRY TO AC
+       DCA     ACL     /STORE AWAY
+       MUY             /NOW DO PRODUCT OF HIGH ORDERS
+       OPL             /FAC HIGH IN MQ, OP HIGH IN OPL
+       DAD             /ADD IN THE ACCUMULATED #
+       ACH
+       SNA             /ZERO?
+       JMP     RTZRO   /YES-GO ZERO EXPONENT
+       NMI             /NO-NORMALIZE (1 SHIFT AT MOST!)
+       DCA     ACH     /STORE HIGH ORDER RESULT
+       CLA     SCA     /GET STEP CNTR-DID WE NEED A SHIFT?
+       SNA     CLA
+       JMP     SNCK    /NO-JUST CHECK SIGN
+       CLA     CMA     /YES-MUST DECREASE EXP. BY 1
+       TAD     ACX
+RTZRO, DCA     ACX     /STORE BACK
+\f
+       TAD     AC0
+       SPA     CLA     /IS HIGH ORDER OF OVERFLO WD. 1?
+       DPIC            /YES-ADD 1 TO LOW ORDER-STILL IN MQ
+SNCK,  ISZ     MSIGN   /RESULT NEGATIVE?
+       JMP     MPOS    /NO-GO ON
+       TAD     ACH     /YES-GET HIGH ORDER BACK
+       DCM             /LOW ORDER STILL IN MQ-NEGATE
+       DCA     ACH     /STORE HIGH ORDER BACK
+MPOS,  SWP             /LOW ORDER TO AC
+       DCA     ACL     /STORE AWAY
+       ISZ     FFMPY   /BUMP RETURN
+       JMP I   FFMPY   /RETIRN
+MSIGN, 0
+ARGETK,        ARGET
+DVOFL, DV
+
+/
+/ROUTINE TO SET UP FOR MULTIPLY AND DIVIDE
+/
+MDSET, 0
+       JMS I   ARGETK  /GET OPERAND (ADDR. IN AC)
+       CDF             /CHANGE TO DATA FIELD OF PACKAGE
+MD1,   CLA CLL CMA RAL /MAKE A MINUS TWO
+       DCA     MSIGN   /AND STORE IN MSIGN.
+       TAD     OPL     /GET LOW ORDER MANTISSA OF OP.
+       SWP             /GET INTO RIGHT ORDER ( OPH IN MQ)
+       SMA             /NEGATIVE?
+       JMP     .+3     /NO
+       DCM             /YES-NEGATE IT
+       ISZ     MSIGN   /BUMP SIGN COUNTER
+       SHL             /SHIFT OPRND LEFT 1 TO AVOID OVRFLO
+       1
+       DST             /STORE BACK-OPH CONTAINS LOW ORDER
+       OPH             /       OPL CONTAINS HIGH ORDER
+       DLD             /GET THE MANTISSA OF THE FAC
+       ACH
+       SWP             /MAKE IT CORRECT ORDER
+       SMA             /NEGATIVE?
+       JMP     FPOS    /NO
+       DCM             /YES-NEGATE IT
+       ISZ     MSIGN   /BUMP SIGN COUNTER (MAY SKIP)
+       NOP
+FPOS,  DST             /STORE BACK-ACH CONTAINS LOW ORDER
+       ACH             /       ACL CONTAINS HIGH ORDER
+       JMP I   MDSET   /RETURN
+\f
+
+
+/
+/FLOATING DIVIDE
+/
+       *5722
+FFDIV, 0
+       JMS I   [PATCHF /WHICH MODE?
+       TAD I   FFDIV   /CALLED BY USER-GET ARG. ADDRESS
+       JMS     MDSET   /GET ARG. AND SET UP SIGNS
+FFD1,  DVI             /DIVIDE-ACH AND ACL IN AC,MQ
+       OPL             /THIS IS HI (!) ORDER DIVISOR
+       DST             /QUOT TO AC0,REM TO AC1
+       AC0
+       SZL     CLA     /DIVIDE ERROR?
+       JMP I   DVOFL   /YES-HANDLE IT
+       TAD     OPX     /DO EXPONENT CALCULATION
+       CMA     IAC     /EXP. OF FAC - EXP. OF OP
+       TAD     ACX
+       DCA     ACX
+       DPSZ            /IS QUOT = 0?
+       SKP             /NO-GO ON
+       DCA     ACX     /YES-ZERO EXPONENT
+DVLP,  MUY             /NO-THIS IS Q*OPL*2**-12
+       OPH
+       DCM             /NEGATE IT
+       TAD     AC1     /SEE IF GREATER THAN REMAINDER
+       SNL
+       JMP I   DVOPSP  /YES-ADJUST FIRST DIVIDE
+       DVI             /NO-DO Q*OPL*2**-12/OPH
+       OPL
+       SZL     CLA     /DIV ERROR?
+       JMP I   DVOFL   /YES
+DVLP1, TAD     AC0     /NO-GET QUOT OF FIRST DIV.
+       SMA             /NEGATIVE?
+       JMP     .+5     /NO-REMEMBER-QUOT OF 2ND DIV. IN MQ
+       LSR             /YES-MUST SHIFT IT RIGHT 1
+       1
+       ISZ     ACX     /ADJUST EXPONENT
+       NOP
+       ISZ     MSIGN   /SHOULD SIGN BE MINUS?
+       SKP             /NO
+       DCM             /YES-DO IT
+DBAD1, DCA     ACH     /STORE IT BACK
+       SWP
+       DCA     ACL
+       ISZ     FFDIV
+       JMP I   FFDIV   /BUMP RETN. AND RETN.
+
+DVOPSP,        DVOPS
+DBAD,  CAM
+       DCA     ACX     /ZERO EXPONENT
+       JMP     DBAD1   /GO ZERO MANTISSA
+\f/FLOATING ADDITION-IN ORDER NOT TO LOSE BITS, WE DO NOT
+/SHIFT BOTH NUMBERS RIGHT 1 BIT BEFORE ADD-ONLY SHIFTS DONE
+/ARE TO ALIGN EXPONENTS.
+/
+       PAGE
+FFADD, 0
+       JMS I   [PATCHF /WHICH MODE OF CALLING
+       TAD I   FFADD   /CALLED DIRECTLY BY USER
+       JMS I   ARGETP  /PICK UP ARGUMENTS
+       JMP I   PATCHK  /CHECK FOR ADDITION BY ZERO
+FAD1,  TAD     OPX     /PICK UP EXPONENT OF OPERAND
+       MQL             /SEND IT TO MQ FOR SUBTRACT
+       TAD     ACX     /GET EXPONENT OF FAC
+       SAM             /SUBTRACT-RESULT IN AC
+       SPA             /NEGATIVE RESULT?
+       CMA     IAC     /YES-MAKE IT POSITIVE
+       DCA     CNT     /STORE IT AS A SHIFT COUNT
+       TAD     CNT     /COUNT TOO BIG?(CAN'T BE ALIGNED)
+       TAD     M27
+       SPA SNA CLA
+       CMA             /NO-OK
+       DCA     AC0     /YES-MAKE IT A LOAD OF LARGEST #
+       DLD             /GET ADDRESSES TO SEE WHO'S SHIFTED
+       ADDRS
+       SGT             /WHICH EXP GREATER(GT FLG SET
+                       /BY SUBTR. OF EXPS.)
+       SWP             /OPERAND'S-SHIFT THE FAC
+       DCA     SHFBG   /STORE ADDRESS OF WHO GETS SHIFTED
+       SWP             /GET ADDRESS OF OTHER (0 TO MQ)
+       DCA     DADR    /THIS ONE JUST GETS ADDED
+       SGT             /WHICH EXPONENT WAS GREATER?
+       JMP     .+3     /FAC'S - DO NOTHING
+       TAD     OPX     /OPERAND'S-PUT FINAL EXP. IN ACX
+       DCA     ACX
+       DLD             /GET THE LARGER # TO AC,MQ
+DADR,  0
+       SWP             /PUT IN THE RIGHT ORDER
+       ISZ     AC0     /COULD EXPONENTS BE ALIGNED?
+       JMP     LOD     /NO-JUST LEAVE LARGER IN AC,MQ
+       DST             /YES-STORE THIS TEMPORARILY
+       AC0             /(IF ONLY FAC STORAGE WAS REVERSED)
+       DLD             /GET THE SMALLER #
+SHFBG, 0
+       SWP             /PUT IT IN RIGHT ORDER
+       ASR             /DO THE ALIGNMENT SHIFT
+CNT,   0
+\f      DAD             /ADD THE LARGER #
+       AC0
+       DST             /STORE RESULT
+       AC0
+       SZL             /OVERFLOW?(L NOT = SIGN BIT)
+       CMA             /NOTE-WE DIDN'T SHIFT BOTH RIGHT 1
+       SMA     CLA
+       JMP     NOOV    /NOPE
+       CLA CLL CML RAR /MAYBE-SEE IF 2 #S HAD SAME SIGN
+       AND     ACH
+       TAD     OPH
+       SMA     CLA     /SIGNS ALIKE?
+       JMP     OVRFLO  /YES-OVERFLOW
+NOOV,  JMS I   ADDPCL  /JUMP TO PATCH FOR THIS ROUTINE
+LOD,   NMI             /NORMALIZE (LOW ORDER STILL IN MQ)
+       DCA     ACH     /STORE FINAL RESULT
+       SWP             /GET AND STORE LOW ORDER
+       DCA     ACL
+       SCA             /GET SHIFT COUNTER(# OF NMI SHIFTS)
+       CMA     IAC     /NEGATE IT
+       TAD     ACX     /AND ADJUST FINAL EXPONENT
+       DCA     ACX
+ADON,  ISZ     FFADD   /BUMP RETURN PAST ADDRESS
+       JMP I   FFADD   /RETURN
+OVRFLO,        TAD     AC1     /OVERFLOW-GET HIGH ORDER RESLT BACK
+       ASR             /SHIFT IT RIGHT 1
+       1
+       TAD     KK4000  /REVERSE SIGN BIT
+       DCA     ACH     /AND STORE
+       SWP
+       DCA     ACL     /STORE LOW ORDER
+       ISZ     ACX     /BUMP EXPONENT
+       NOP
+       JMP     ADON    /DONE
+KK4000,        4000
+M27,   -27
+ADDRS, OPH
+       ACH
+ARGETP,        ARGET
+/FLOATING SUBTRACT-USES FLOATING ADD
+/FSW0!!
+FFSUB, 0
+       JMS I   [PATCHF /WHICH MODE?
+       TAD I   FFSUB   /CALLED BY USER-GET ADDRESS OF OP.
+       JMS I   ARGETP
+       CDF
+       TAD     OPL     /OPH IS IN MQ!
+       SWP             /PUT IT IN RIGHT ORDER
+       DCM             /NEGATE IT
+       DCA     OPH     /STORE BACK
+       MQA
+       DCA     OPL
+       TAD     FFSUB   /GO TO ADD
+SUB0,  DCA     FFADD
+       JMP     FAD1-1
+\f/
+/FLOATING NEGATE--NEGATE FLOATING AC
+/
+FFNEG, 0
+       SWAB            /MUST BE MODE B
+       DLD             /GET MANTISSA
+       ACH
+       SWP             /CORRECT ORDER PLEASE!
+       DCM             /NEGATE IT
+       DCA     ACH     /RESTORE
+       SWP             /SEND 0 TO MQ
+       DCA     ACL
+       JMP I   FFNEG
+
+
+/
+/CONTINUATION OF DIVIDE ROUTINE
+/WE ARE ADJUSTING THE RESULT OF THE
+/FIRST DIVIDE.
+/
+DVOPS, CMA     IAC
+       DCA     AC1     /ADJUST REMAINDER
+       TAD     OPL     /WATCH FOR OVERFLOW
+       CLL CMA IAC
+       TAD     AC1
+       SNL
+       JMP     DVOP1   /DON'T ADJUST QUOT.
+       DCA     AC1
+       CMA
+       TAD     AC0
+       DCA     AC0     /REDUCE QUOT BY 1
+DVOP1, CLA     CLL
+       TAD     AC1     /GET REMAINDER
+       SNA             /ZERO?
+       CAM             /YES-ZERO EVERYTHING
+       DVI             /NO
+       OPL
+       SZL     CLA     /DIV. OVERFLOW?
+       JMP I   DVOVR   /YES
+       DCM             /NO-ADJUST HI QUOT (MAYBE)
+       JMP I   DVLP1P  /GO BACK
+DVLP1P,        DVLP1
+DVOVR, DV
+ADDPCL,        ADDPCH
+PATCHK,        PTCHAD
+       >
+\f      PAGE
+/ARGUMENT PICK UP ROUTINE-ENTER WITH DATA FIELD SET TO EITHER
+/FLTG. DATA FIELD OR FLTG. INSTR. FIELD.
+/ADDRESS OF OPERAND IS IN THE AC ON ENTRY.
+/ON RETURN, THE`AC IS CLEAR
+/
+ARGET, 0
+       DCA     AC2     /STORE ADDRESS OF OPERAND
+       TAD I   AC2     /PICK UP EXPONENT
+       DCA     OPX
+       JMS     ISZAC2  /MOVE POINTER TO HORD,WATCH FOR FIELD OVERLAP
+       TAD I   AC2     /PICK IT UP
+       IFZERO EAE <
+       NOP
+       NOP
+       >
+
+       IFNZRO EAE <
+       SWAB            /OPH INTO MQ BECAUSE EAE ROUTINES
+       MQA             /EXPECT TO FIND IT THERE
+       >
+       DCA     OPH     /STORE
+       JMS     ISZAC2  /MOVE POINTER TO LORD,WATCHING FOR OVERLAP
+       TAD I   AC2     /PICK IT UP
+       DCA     OPL     /STORE IT
+       JMP I   ARGET   /RETURN
+\f      IFZERO EAE <
+/
+/ROUTINE TO NORMALIZE THE FAC
+/
+FFNOR, 0
+       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,        AC2000          /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)
+       JMP     FNLP    /JUMP SO FFGET AND PUT ARE ORGED RIGHT
+
+FFNORR,        DCA     AC1     /DONE W/NORMALIZE-CLEAR AC1
+       JMP I   FFNOR   /RETURN
+AL1P,  AL1
+       >
+       IFNZRO EAE <
+
+/
+/ROUTINE TO NORMALIZE THE FAC
+/
+       *6215
+FFNOR, 0
+       CDF             /CHANGE D.F. TO FIELD OF PACKAGE
+       SWAB            /FORCE MODE B
+       DLD             /PICK UP MANTISSA
+       ACH
+       SWP             /PUT IT IN CORRECT ORDER
+       NMI             /NORMALIZE IT
+       SNA             /IS THE # ZERO?
+       DCA     ACX     /YES-INSURE ZERO EXPONENT
+       DCA     ACH     /STORE HIGH ORDER BACK
+       SWP             /STORE LOW ORDER BACK
+       DCA     ACL
+       CLA     SCA     /STEP COUNTER TO AC
+       CMA     IAC     /NEGATE IT
+       TAD     ACX     /AND ADJUST EXPONENT
+       DCA     ACX
+       JMP I   FFNOR   /RETURN
+       >
+\f/FLOATING GET
+
+       *6241
+FFGET, 0
+       JMS I   [PATCHF /WHICH MODE OF CALL
+       TAD I   FFGET   /CALLED BY USER-GET ADDR. OF OP
+       JMS     ARGET   /PICK UP OPERAND
+       TAD     OPX
+       DCA     ACX     /LOAD THE OPERAND INTO FAC
+       TAD     OPL
+       DCA     ACL
+       TAD     OPH
+       DCA     ACH
+       ISZ     FFGET
+       CDF
+       JMP I   FFGET   /RETN. TO CALL +2
+/
+/FLOATING PUT
+/
+FFPUT, 0
+       JMS I   [PATCHF /WHICH MODE OF CALL?
+       TAD I   FFPUT   /CALLED BY USER-GET OPR. ADDR
+       DCA     FFGET   /STORE IN A TEMP
+       TAD     ACX     /GET FAC AND STORE IT
+       DCA I   FFGET   /AT SPECIFIED ADDRESS
+       JMS     ISZFGT  /BUMP POINTER,WATCHING FOR FIELD OVERLAP
+       TAD     ACH
+       DCA I   FFGET
+       JMS     ISZFGT
+       TAD     ACL
+       DCA I   FFGET
+       ISZ     FFPUT   /BUMP RETN.
+       CDF
+       JMP I   FFPUT   /RETN. TO CALL+2
+
+/ROUTINES TO BUMP ARGET AND FPUT POINTERS AND INCREMENT THE
+/DATA FIELD IF THE POINTER CROSSES A FIELD BOUNDARY
+
+ISZFGT,        0
+       ISZ     FFGET   /BUMP POINTER
+       JMP I   ISZFGT  /NO SKIP MEANS JUST RETURN
+       SKP             /SKIP MEANS WE HAVE TO INCREMENT DATA FIELD
+NEWCDF,        DCA     ISZFGT  /THIS INST EXECUTED ONLY BY ISZAC2
+       RDF             /GET THE DATA FIELD
+       TAD     CDF10   /BUMP BY 1 AND MAKE A CDF
+       DCA     .+1             /PUT IN LINE
+       .
+       JMP I   ISZFGT  /RETURN
+
+CDF10, CDF 10
+
+ISZAC2,        0
+       ISZ     AC2             /BUMP POINTER
+       JMP I   ISZAC2  /NOTHING HAPPENED
+       TAD     ISZAC2  /NEED NEW DF. GET RETURN ADDR
+       JMP     NEWCDF  /AND BUMP DF
+\f      IFZERO EAE <
+/
+/ROUTINE TO ADJUST QUOTINET OF FIRST DIVIDE (MAYBE) WHEN THE
+/REMAINDER OF THE FIRST`DIVIDE IS LESS THAN QUOT*OPL
+/USED BY FLTG. DIVIDE ROUTINE
+/
+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
+       JMP I   DVOP2P  /GO ON
+DVOP2P,        DVOP2
+
+FNLP,  CLL CML CMA     /-1
+       TAD     ACX     /SUBTR. 1 FROM EXPONENT
+       DCA     ACX
+       JMS I   AL1P    /SHIFT FAC LEFT 1
+       JMP     NORMLP  /GO BACK AND SEE IF NORMALIZED
+ZEXP,  DCA     ACX
+       JMP     FFNORR
+       >
+\f/
+/FSQUARE-SQUARE FAC-CALLS MULTIPLY TO MUL. FAC BY ITSELF
+/
+       *6347
+A,
+FFSQ,  0
+       JMS I   TMPY    /CALL MULTIPLY TO MULTIPLY
+       ACX             /FAC BY ITSELF
+       JMP I   FFSQ    /DONE
+TMPY,  FFMPY
+/
+/      ERROR TRAPS
+O0,    JMS I   [ERROR  /OVERFLOW
+DV,    JMS I   [ERROR  /DIVISION ERROR
+       JMS I   [FACCLR /RETURN 0 IN FAC
+       JMP I   [ILOOP
+LM,    JMS I   [ERROR  /ILLEGAL ARGUMENT
+
+       PAGE
+
+\f      *OVERLAY+3000
+
+
+/TELETYPE "DRIVER"-WHEN CALLED,GRABS CHARACTERS FROM THE
+/TELETYPE UNTIL A CR IS SENT OR THE BUFFER IS FULL. ASSUMES TTY ENTRY
+/IS IN I/O WORK AREA.
+
+TTYDRI,        0
+       JMP     LFLUSH+1
+IO,    JMS I   [ERROR
+LFLUSH,        JMS I   [CRLFR  /PRINT A CR,LF
+       TAD     K277    /PRINT A ? SIGNIFYING WAIT FOR INPUT
+       JMS I   [XPUTCH
+       TAD I   IOTBUF  /BUFFER ADDRESS
+       DCA I   IOTPTR  /INITIALIZE POINTER TO START OF BUFFER
+       JMS I   [CNOCLR /INITIALIZE CHAR # TO 1
+TTYIN, JMS I   [XPRINT /EMPTY TTY BUFFER BEFORE AWAITING INPUT
+       JMP     .-1
+       TAD I   (HEIGHT /ALWAYS RESET SCREEN HIEGHT ON INPUT
+       DCA I   (HCTR
+       TAD     K5252   /DESIGN INTO AC
+KSFA,  KSF             /CHAR READY?
+       JMP     SPIN    /NO-DIDDLE WHILE WE WAIT
+       CLA CLL         /FLUSH SPINNER OUT OF AC
+       TAD     [200    /FORCE PARITY BIT
+       KRS             /GET CHAR
+       DCA     CHAR    /SAVE
+       TAD     CHAR
+       JMS I   [XPUTCH /ECHO IT
+       KCC             /CLEAR KEYBOARD FLAG AND SET READER RUN
+       TAD     CHAR
+       TAD     MCTRLU  /IS IT CTRL/U?
+       SNA CLA
+       JMP     LFLUSH  /YES-START AGAIN
+       TAD     CHAR    /NO
+       TAD     CRUBOT  /IS IT RUBOUT?
+       SNA
+       JMP     BACKUP  /YES-BACK UP BUFFER POINTER
+       TAD     MCR     /NO-IS IT CR?
+       SNA CLA
+       JMP     CR      /YES-DONE
+       TAD     CHAR
+       JMS I   [PACKCH /PACK CHAR IN BUFFER
+       JMS I   [BUFCHK /BUFFER FULL?
+       JMP     IO      /YES-ERROR
+       NOP             /NO-CHAR 3 LEFT
+       NOP             /NO-2 AND 3 LEFT
+       JMP     TTYIN   /NO-NEXT CHAR
+MCTRLU,        -225
+MCR,   377-215
+CRUBOT,        -377
+K5252, 5252
+K277,  277
+
+BACKUP,        TAD I   IOTPTR  /BUFFER POINTER
+       CIA             /NEGATE
+       TAD I   IOTBUF  /COMPARE AGAINST START OF BUFFER
+       SNA CLA         /BUFFER EMPTY?
+       JMP     TTYIN   /YES-THERE IS NOTHING TO RUBOUT
+       TAD     SCOPFG  /TEST IF CONSOLE IS A SCOPE
+       SNA CLA
+       JMP     NOSCOP  /JMP IF NOT
+       TAD     (10
+       JMS I   [XPUTCH /PRINT BS,SP,BS TO RUBOUT IF SCOPE
+       TAD     (40
+       JMS I   [XPUTCH
+       TAD     (10
+       SKP
+NOSCOP,        TAD     K334
+       JMS I   [XPUTCH /ECHO "\"
+       JMS I   [CHARNO /GET CHAR # OF NEXT CHAR (LAST #+1)
+       JMP     C1B     /1
+       JMP     C3B     /3
+       JMS I   [CNOCLR /IT WAS 2-MAKE IT 1
+PBACK, CLA CMA         /-1
+       TAD I   IOTPTR  /BACK UP BUFFER POINTER
+       DCA I   IOTPTR
+       JMP     TTYIN   /NEXT CHAR
+K334,  334
+
+C1B,   TAD I   IOTHDR
+       AND     [7477
+       TAD     [200    /IT WAS 1-MAKE IT 3
+       DCA I   IOTHDR
+       JMP     TTYIN   /NO NEED TO BACK UP POINTER
+
+C3B,   TAD I   IOTHDR
+       AND     [7477
+       TAD     [100    /IT WAS 3,MAKE IT 2
+       DCA I   IOTHDR
+       JMP     PBACK   /BACK UP POINTER
+
+
+CR,    JMS I   [CRLFR  /ECHO A CR,LF
+       TAD     K4
+       TAD     TTYDRI  /BUMP DRIVE RETURN TO NORMAL
+       DCA     TTYDRI
+       TAD     CHAR
+       JMS I   [PACKCH /PACK CHAR IN BUFFER
+       TAD I   IOTBUF
+       DCA I   IOTPTR  /INITAILZE BUFFER POINTERS
+       JMS I   [CNOCLR
+       JMP I   TTYDRI  /RETURN
+K4,    4
+
+
+SPIN,  ISZ     SPINNR  /SPIN RANDOM # SEED
+       SKP
+       CMA CML RAL     /MARCH TO THE LEFT
+       JMP     KSFA    /CHECK FOR CHAR YET
+SCOPFG,        0               /GETS SET TO SCOPE FLAG BY STARTUP CODE
+\f/SUBROUTINE FBITGT-ROUTINE TO PUT FUNCTION BITS FROM INSTRUCTION INTO AC
+
+FBITGT,        0
+       TAD     INSAV
+       CLL RTR
+       RTR             /PUT FUNCTION BITS IN BITS 8-11
+       AND     [17     /MASK THEM OFF
+       JMP I   FBITGT  /RETURN
+
+/DATA LIST READ (NUMERIC)
+
+RDLIST,        JMS I   (DLREAD /FETCH WORD FROM LIST
+       DCA     ACX             /STORE AS EXPONENT
+       JMS I   (DLREAD
+       DCA     ACH     /HIGH MANTISSA
+       JMS I   (DLREAD
+       DCA     ACL     /LOW MANTISSA
+       JMP I   [ILOOP
+
+/SUBROUTINE FTYPE-RETURNS TO CALL+1 IF FILE NUMERIC,CALL+2 IF ASCII
+
+FTYPE, 0
+       TAD I   IOTHDR  /GET HEADER
+       CLL RAR         /TYPE TO LINK
+       SZL CLA         /IS IT NUMERIC?
+       ISZ     FTYPE   /NO-BUMP RETURN
+       JMP I   FTYPE   /RETURN
+
+       PAGE
+\f/LAST PAGE OF BRTS-CONTAINS SAC,I/O TABLE, AND SOME MISCELLANEOUS CODE
+
+/TELETYPE INPUT BUFFER (74. CHARACTERS LONG)
+/THIS BUFFER CONTAINS ONCE ONLY START CODE WHEN LOADED
+
+TTYBUF,
+START4,        TAD     CDFPS   /DF FOR BOTTOM OF PSEUDO-CODE
+       TAD     MCDF1   /COMPARE TO A CDF 10
+       SZA CLA         /DO THEY MATCH?
+       JMP I   [ILOOP  /NO-ALL BUFFERS ARE FREE-START INTERPRETER
+       TAD     PSSTRT
+       CLL CMA
+       TAD     [400
+       SNL CLA         /IS START OF PSEUDO-CODE BELOW 400
+       JMP     CHKB2   /NO-CHECK FOR 1000
+       TAD     [17             /YES-SET ALL BUFFERS BUSY
+       JMP     BAS
+CHKB2, TAD     PSSTRT
+       CLL CMA
+       TAD     C1000
+       SNL CLA         /IS START OF PSEUDO-CODE BELOW 1000
+       JMP     CHKB3   /NO-CHECK 1400
+       TAD     C16             /YES-ONLY BUFFER 1 IS AVAILABLE
+       JMP     BAS
+CHKB3, TAD     PSSTRT
+       CLL CMA
+       TAD     C1400
+       SNL CLA         /IS START OF CODE BELOW 1400?
+       JMP     CHKB4   /YES-CHECK 2000
+       TAD     C14             /YES-ONLY BUFFER 1 AND 2 AVAILABLE
+       JMP     BAS
+CHKB4, TAD     PSSTRT
+       CLL CMA
+       TAD     K2000
+       SNL CLA         /IS CODE START BELOW 2000?
+       JMP I   [ILOOP  /NO-START INTERPRETER-ALL BUFFER FREE
+       TAD     [10     /YES-BUFFERS 1,2, AND 3 AVAILABLE
+BAS,   DCA     BMAP
+       JMP I   [ILOOP  /START INTERPRETER
+       0
+MCDF1, -6211
+K2000, 2000
+C14,   14
+C16,   16
+C1000, 1000
+C1400, 1400
+       ZBLOCK  10
+TTYEND,        0
+\f        *OVERLAY+3277
+
+////////////////////////////////////////////////////////////////
+/////// I/O TABLE 5 13-WORD ENTRIES ////////////////////////////
+////////////////////////////////////////////////////////////////
+
+TTYF,   1               /TELETYPE ENTRY-FILE IS ASCII
+        TTYBUF          /BUFFER ADDRESS
+        0               /CURRENT BLOCK IN BUFFER
+        TTYBUF          /READ WRITE POINTER
+        TTYDRI          /HANDLER ENTRY
+       ZBLOCK  10
+FILE1,  ZBLOCK 15             /FILE #1
+FILE2,  ZBLOCK 15             /FILE #2
+FILE3,  ZBLOCK 15             /FILE #3
+FILE4,  ZBLOCK 15             /FILE #4
+
+       PAGE
+\f      /CROSS FIELD LITERAL EQUATES
+
+       PGETCH= [GETCH
+       PILOOP= [ILOOP
+       PPUTCH= [PUTCH
+       PSACM1= [SAC-1
+       PXPUTCH= [XPUTCH
+       PXPRINT= [XPRINT
+       PFFNOR= [FFNOR
+       PFFGET= [FFGET
+       PFFPUT= [FFPUT
+       PUNSFIX= [UNSFIX
+       PERROR= [ERROR
+       PFACCLR= [FACCLR
+       PIDLE=  [IDLE
+       PPSWAP= [PSWAP
+       PFTYPE= [FTYPE
+       USR=    [200
+       O200=   [200
+       O400=   [400
+       O100=   [100
+       O10=    [10
+       O17=    [17
+       O7400=  [7400
+       O77=    [77
+       O215=   [215
+       O7700=  [7700
+       M215=   [-215
+\f/////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////
+////////////// OVERLAY 2- STRING FUNCTIONS  /////////////////
+/////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////
+
+       FIELD 1
+       *2000
+       RELOC   OVERLAY
+
+       /VERSION NUMBER WORD FOR STRING OVERLAY
+
+       VERSON^100+SUBVSF+6000
+
+/CHR$ FUNCTION
+/RETURNS 1 6BIT CHAR STRING FOR THE VALUE OF X
+
+CHR,   JMS I   PUNSFIX /FIX X TO 12 BIT INTEGER
+       AND     O77     /MASK TO 6BIT
+       DCA I   (SAC    /AND PUT INTO SAC
+       CMA
+       DCA     SACLEN  /SET SAC LENGTH TO 1
+       JMP I   (SSMODE /SET TO SMODE AND RETURN
+
+/ASC FUNCTION
+/RETURNS DECIMAL ASCII FOR 1 CHAR STRING IN FAC
+
+ASC,   TAD I   (SAC    /GET FIRST CHAR OF STRING
+       JMP     FLOATS  /FLOAT RESULT INTO FAC AND RETURN
+
+/LEN FUNCTION
+/RETURNS LENGTH OF SAC IN FAC
+
+LEN,   TAD     SACLEN  /LENGTH OF STRING IN SAC
+       CIA             /MAKE POSITIVE
+
+/ROUTINE TO FLOAT FAC AND RETURN
+
+FLOATS,        DCA     ACH     /NUMBER TO BE FLOATED IN HORD
+       DCA     ACL     /CLEAR LORD
+       DCA     TEMP2   /CLEAR FPP OVERFLOW
+       TAD     (13     /SET EXP TO 11
+       DCA     ACX
+       JMS I   PFFNOR  /NORMALIZE
+       JMP I   PILOOP  /RETURN
+\f
+
+
+/STR$ FUNCTION
+/RETURNS ASCII STRING FOR NUMBER IN FAC
+
+STR,   JMS I   (FFOUT  /GET NUMBER INTO INTERMEDIATE BUFFER FIRST
+       TAD     XR1
+       CIA
+       TAD     (INTERB-1
+       DCA     SACLEN
+       TAD     SACLEN  /NOW SAVE COUNTER
+       DCA     TEMP2
+       TAD     (INTERB-1
+       DCA     XR1     /POINT AT BUFFER
+STRLUP,        TAD I   XR1     /GET A CHAR
+       AND     O77     /MASK TO 6BIT
+       TAD     (-40    /CROCK TO DELETE BLANKS
+       SZA
+       JMP     .+3
+       ISZ     SACLEN  /IGNORE THE BLANK
+       JMP     .+3
+       TAD     (40
+       DCA I   SACXR   /STORE IN SAC
+       ISZ     TEMP2
+       JMP     STRLUP  /LOOP FOR MORE
+       JMP I   (SSMODE /DONE-RETURN IN SMODE
+\f
+/VAL FUNCTION
+/RETURNS NUMBER IN FAC FOR STRING IN SAC
+
+VAL,   TAD     SACLEN
+       DCA     VALCNT  /COUNT OF CHARS TO INPUT
+       TAD     (VALGET /ADDR OF PHONY INPUT ROUTINE
+       DCA I   (IGETCH /PUT IN INPUT ROUTINE IN PLACE OF KRB
+       JMS I   (FFIN   /CALL FPP INPUT ROUTINE
+       TAD     PGETCH  /NOW RESTORE REAL INPUT ADDR
+       DCA I   (IGETCH /RESTORE IN INPUT ROUTINE
+       JMP I   PILOOP  /DONE
+
+VALGET,        0
+       TAD     VALCNT  /TEST NUMBER OF CHARS LEFT
+       SNA CLA
+       JMP     EOVAL   /NONE
+       ISZ     VALCNT  /ELSE BUMP
+       NOP
+       TAD I   SACXR   /GET A BYTE
+       TAD     (240
+       AND     O77
+       TAD     (240    /CONVERT TO 8BIT
+       SKP
+EOVAL, TAD     O215
+       DCA     CHAR
+       JMP I   VALGET  /RETURN WITH CHAR IN 'CHAR'
+
+VALCNT,        0
+
+       PAGE
+\f/     DATE FUNCTION
+/      RETURNS STRING OF THE FORM "MM/DD/YY" IN SAC IF DATE IS PRESENT
+/      RETURNS NULL STRING OTHERWISE
+
+
+DATE,  TAD     CDFIO   /COPY CDF TO FIELD 17600 IN LINE
+       DCA     .+1
+YEAREX,        0
+       TAD     PSFLAG  /GET TD8E BIT TO LINK
+       CLL RAL
+       SNL CLA
+       TAD I   (MDATE  /IF ZERO LOOK AT MDATE IN N7600
+       SZL
+       TAD I   (MDATE-200 /ELSE LOOK AT N7400
+       DCA     DATEWD  /STORE (DATE IS NOT A CLOSED SUBROUTINE)
+       CDF             /DATE IS IN THE FORM MMM MDD DDD YYY
+       TAD     DATEWD  /PICK UP DATE
+       SZA CLA
+       TAD     (-10    /RETURN 8. BYTES IF NOT NULL DATE
+       DCA     SACLEN  /SET SAC LENGTH
+       TAD I   (BIPCCL /NOW GET YEAR EXTENSION
+       AND     (600    /IT'S IN THE 600 BITS
+       CLL RTR
+       RTR             /SHIFT INTO PLACE
+       DCA     YEAREX  /HOLD YEAR EXTENSION
+       TAD     DATEWD  /NOW ISOLATE MONTH
+       AND     O7400
+       CLL RTL
+       RTL
+       RAL
+       JMS     PUTN    /PUT "MM/" INTO THE SAC
+       TAD     DATEWD  /NOW GET DAY OF MONTH
+       AND     (370
+       CLL RTR
+       RAR
+       JMS     PUTN    /PUT "DD/" IN SAC
+       TAD     DATEWD  /FINALLY GET YEAR
+       AND     (7
+       TAD     YEAREX  /ADD TO EXTENSION BITS
+       TAD     (106    /ADD 70. FOR BASE YEAR
+       JMS     PUTN    /PUT OUT "YY/" (EXTRA SLASH WILL BE IGNORED)
+       JMP I   (SSMODE /RETURN IN STRING MODE
+
+PUTN,  0
+       ISZ     NHIGH   /BUMP HIGH ORDER DIGIT
+       TAD     (-12    /-10.
+       SMA
+       JMP     .-3     /LOOP IF NOT REDUCED YET
+       TAD     (12+60  /CONVERT TO DECIMAL DIGIT
+       DCA     NLOW    /HOLD MOMENTARILY
+       TAD     NHIGH   /NOW GET HI ORDER DIGIT
+       TAD     (57     /MAKE 6BIT
+       DCA I   SACXR
+       TAD     NLOW    /SEND OUT LOW DIGIT
+       DCA I   SACXR
+       TAD     (57
+       DCA I   SACXR   /SEND OUT "/"
+       DCA     NHIGH   /CLEAR NHIGH FOR NEXT TIME (BE CAREFULL!!)
+       JMP I   PUTN
+NHIGH, 0
+NLOW,  0
+DATEWD,        0
+\f/TRACE FUNCTION PRINTER. WHEN TRACE IS ENABLED,THIS ROUTINE
+/PRINTS THE LINE # EACH TIME IT IS STORED
+
+TPRINT,        JMS I   (LMAKE  /MAKE LINE # INTO FIVE DIGITS
+       TAD     ("%
+       JMS I   PXPUTCH /PRINT "%"
+       TAD     (" 
+       JMS I   PXPUTCH /PRINT A SPACE
+       TAD     (DIG1-1 /ADDR OF FIRST DIGIT-1
+       DCA     XR5             /IN XR5
+IGS,   TAD I   XR5     /GET DIGIT OF LINE NUMBER
+       DCA     TCHR    /SAVE IT
+       TAD     (-"0
+       TAD     TCHR    /COMPARE IT TO 0
+       SNA CLA         /IS IT A 0?
+       JMP     IGS     /YES-IGNORE LEADING ZEROES
+PREST, TAD     TCHR    /NO-GET CHAR AGAIN
+       TAD     M215
+       SNA CLA         /IS IT A CR?
+       JMP     TDONE   /YES-LINE NUMBER IS PRINTED
+       TAD     TCHR    /NO-GET CHAR A THIRD TIME
+       JMS I   PXPUTCH /TYPE IT
+       TAD I   XR5     /GET NEXT CHAR
+       DCA     TCHR
+       JMP     PREST   /AND LOOP
+TDONE, TAD     (" 
+       JMS I   PXPUTCH /FOLLOW LINE # WITH A SPACE
+       TAD     ("%
+       JMS I   PXPUTCH /TYPE ANOTHER "%"
+       TAD     (215
+       JMS I   PXPUTCH /TYPE,CR,LF
+       TAD     (212
+       JMS I   PXPUTCH
+       JMS I   PXPRINT /EMPTY RING BUFFER OF TRACE NUMBER
+       JMP     .-1
+       JMP I   PILOOP  /DONE
+TCHR,  0
+
+       PAGE
+\f/TRACE FUNCTION-ROUTINE TO TURN TRACE ON AND OFF
+
+TRACE, TAD     ACH     /GET HI MANTISSA OF ARG
+       SNA CLA         /SKP TO TURN TRACE ON
+       TAD     TRREST  /ELSE RESTORE TRACE BYPASS INSTR IN LINE NUMBER ROUTINE
+       DCA I   HOOKL   /BY NOP ING INSTRUCTION AT TRHOOK
+TRREST,        JMP I   PILOOP
+
+HOOKL, TRHOOK
+
+/ERROR ROUTINE
+
+ERRORR,        JMS I   PXPRINT /PURGE TTY RING BUFFER
+       JMP     .-1     /BEFORE PRINTING ERROR
+       TAD     ETABA   /ADDR OF ERROR TABLE
+       DCA     XR4             /POINTS INTO ERROR TABLE
+FERRLP,        TAD I   XR4     /GET 2 CHAR ERROR CODE
+       DCA     TEMP1   /SAVE
+       TAD     TEMP1
+       CLL RTR
+       RTR
+       RTR
+       AND     O77     /STRIP TO 6 BIT
+       TAD     K0300   /MAKE 8 BIT (LETTERS ONLY ALLOWED)
+       DCA     ESTRNG  /PUT IN MESSAGE
+       TAD     TEMP1   /2 CHAR CODE AGAIN
+       AND     O77     /SECOND CHAR
+       TAD     K0300   /MAKE LETTER
+       DCA     ESTRNG+1        /PUT IN MESSAGE
+       TAD I   XR4     /GET ERROR CODE +1
+       TAD I   PERROR  /COMPARE AGAINST RETURN ADDR
+       SZA CLA         /MATCH?
+       JMP     FERRLP  /NO-TRY NEXT ONE
+       JMS     LMAKE   /MAKE THE LINE # INTO DECIMAL DIGITS
+       TAD     ESTRA   /ADDR OF MESSAGE
+       DCA     XR5
+ETLOP, TAD I   XR5     /GET MESSAGE CHAR
+       SPA             /DONE? (MESSAGE ENDNS WITH - NUMBER
+       JMP     FATCHK  /YES-DETERMINE ERROR TYPE
+       JMS I   PXPUTCH /NO-PUT CHAR IN RING BUFFER
+       JMP     ETLOP
+
+FATCHK,        CLA
+       TAD     MFATAL  /-ADDR OF FATAL ERRORS
+       TAD     XR4             /ADDR OF THIS ERROR
+       SMA CLA         /FATAL ERROR?
+       JMP I   ERRETN  /NO-NEXT INST
+       JMP I   STOPI   /YES-TERMINATE RUN
+
+ERRETN,        XERRRET
+STOPI, FSTOPN
+
+MAKED, 0
+       AND     O17     /ISOLATE BCD DIGIT
+       TAD     K260    /MAKE ASCII DIGIT
+       JMP I   MAKED
+
+K260,  260
+K0300, 300
+\f/SUBROUTINE LMAKE-MAKES THE CURRENT LINE NUMBER INTO FIVE DIGITS
+/STARTING AT DIG1
+
+LMAKE, 0
+       TAD     LINEHI  /YES:GET HI LINE #
+       JMS     MAKED   /GET DIGIT 2
+       DCA     DIG2    /PUT IN MESSAGE
+       TAD     LINEHI
+       CLL RTR
+       RTR
+       JMS     MAKED   /GET DIGIT 1
+       DCA     DIG1    /AND PUT IN MESSAGE
+       TAD     LINELO  /DOGOTS 3,4, AND 5
+       JMS     MAKED   /GET DIGIT 5
+       DCA     DIG5
+       TAD     LINELO
+       CLL RTR
+       RTR
+       JMS     MAKED   /GET DIGIT 4
+       DCA     DIG4    /AND PUT IN MESSAGE
+       TAD     LINELO
+       CLL RAL
+       RTL
+       RTL
+       JMS     MAKED   /GET DIGIT 3
+       DCA     DIG3    /MESSAGE NOW COMPLETE
+       JMP I   LMAKE
+\f/ERROR MESSAGE
+
+EMESS, 215
+       212
+ESTRNG,        0000
+       0000
+       " 
+       "A
+       "T
+       " 
+       "L
+       "I
+       "N
+       "E
+       " 
+DIG1,  0
+DIG2,  0
+DIG3,  0
+DIG4,  0
+DIG5,  0
+       215
+       212
+ESTRA, EMESS-1         /MINUS NUMBER TO END ABOVE MESSAGE
+\f/ERROR TABLE\r/ENTRY FORMAT-   2 CHAR 6-BIT ERROR CODE (LETTERS ONLY)
+/              -(ADDR OF CALL)-1
+
+ETABA, ETAB-1          
+MFATAL,        -EFATAL
+ETAB,  0602            /FB
+       -FB-1           /ATTEMPT TO OPEN AN ALREADY OPEN FILE
+       0722            /GR
+       -GR-1           /RETURN WITHOUT A GOSUB
+       2622            /VR
+       -VR-1           /ATTEMPT TO READ VARIABLE LENGTH FILE
+       2325            /SU
+       -SU-1           /SUBSCRIPT ERROR
+       0405            /DE
+       -DE-1           /DEVICE DRIVER ERROR
+       1705            /OE
+       -OE-1           /DRIVER ERROR WHILE OVERLAYING
+       0615            /FM
+       -FM-1           /ATTEMPT TO FIX MINUS NUMBER
+       0617            /FO
+       -FO-1           /ATTEMPT TO FIX NUMBER >4095
+       0616            /FN
+       -FN-1           /ILLEGAL FILE #
+       2303            /SC
+       -SC-1           /ATTEMPT TO OVERFLOW SAC ON CONCATENATE
+       0611            /FI
+       -FI-1           /ATTEMPT TO CLOSE OR USE UNOPENED FILE
+       0401            /DA
+       -DA-1           /ATTEMPT TO READ PAST END OF DATA LIST
+       0723            /GS
+       -GS-1           /TOO MANY NESTED GOSUBS
+       2322            /SR
+       -SR-1           /ATTEMPT TO READ STRING FROM NUMERIC FILE
+       2327            /SW
+       -SW-1           /ATTEMPT TO WRITE STRING INTO NUMERIC FILE
+       2001            /PA
+       -PA-1           /ILLEGAL ARG IN POS
+       0603            /FC
+       -FC-1           /OS/8 ERROR WHILE CLOSING TENTATIVE FILE
+       0311            /CI
+       -CI-1           /INQUIRE FAILURE IN CHAIN
+       0314            /CL
+       -CL-1           /LOOKUP FAILURE IN CHAIN
+       1116            /IN
+       -IN-1           /INQUIRE FAILURE IN OPEN
+       0417            /DO
+       -DO-1           /NO MORE ROOM FOR DRIVERS
+       0605            /FE
+       -FE-1           /FETCH ERROR IN OPEN
+       0217            /BO
+       -BO-1           /NO MORE FILE BUFFERS AVAILABLE
+       0516            /EN
+       -EN-1           /ENTER ERROR IN OPEN
+       1106            /IF
+       -IF-1           /ILLEGAL DEV:FILENAME SPECIFICATION
+       2314            /SL
+       -SL-1           /STRING TOO LONG OR UNDEFINED
+       1726            /OV
+       -O0-1           /NUMERIC OR INPUT OVERFLOW
+       1415            /LM
+       -LM-1           /ATTEMPT TO TAKE LOG OF NEG # OR 0
+       0515            /EM
+       -EM-1           /ATTEMPT TO EXPONENTIATE A NEG NUMBER TO A REAL ROWER
+       1101            /IA
+       -IA-1           /ILLEGAL ARGUMENT IN USER FUNCTION
+       0330            /CX
+       -CX-1           /ILLEGAL FILENAME EXTENSION IN A CHAIN STATEMENT
+/***********************************************************
+EFATAL,                        /ERRORS BEFORE THIS LABEL ARE FATAL
+/*******************************************************
+       2205            /RE
+       -RE-1           /ATTEMPT TO READ PAST EOF
+       2705            /WE
+       -WE-1           /ATTEMPT TO WRITE PAST EOF
+       0426            /DV
+       -DV-1           /ATTEMPT TO DIVIDE BY 0
+       2324            /ST
+       -ST-1           /STRING TRUNCATION ON INPUT
+       1117            /IO
+       -IO-1           /TTY INPUT BUFFER OVERFLOW
+\f      T=      .
+       *ETAB
+       *T
+/SEG$ FUNCTION
+/RETURNS SEGMENT OF X$ BETWEEN Y AND Z
+/IF Y<=0,THEN Y TAKEN AS 1
+/IF Y>LEN(X$),NULL STRING RETURNED
+/IF Z<=0,NULL STRING RETURNED
+/IF Z>LEN(X$),Z IS SET=LEN(X$)
+/IF Z<Y,NULL STRING IS RETURNED
+
+SEG,   CLA IAC
+       DCA     MODESW  /RETURN IN STRING MODE
+       TAD     ACH     /IS Y>0?
+       SMA SZA CLA
+       JMS I   PUNSFIX /FIX IF POSITIVE
+       SNA
+       IAC             /SET Y TO 1 IF Y.LE.0
+       DCA     YARG
+       TAD     SACLEN  /COMPARE YARG TO SACLEN
+       CIA
+       STL CIA
+       TAD     YARG
+       SNL SZA CLA     /SKP IF YARG.LOS.LEN(X$)
+       JMP     NULLST  /NO-RETURN THE NULL STRING
+       DCA     INSAV   /FAKE POINTER TO SCALAR #0
+       JMS I   ARGPLK  /GET ADDR OF Z
+       JMS I   PFFGET  /LOAD Z INTO FAC
+ARGPLK,        ARGPRE          /LOC SKIPPED BY FPP SO WE PUT CONST HERE
+       TAD     ACH     /HI MANTISSA OF Z
+       SPA SNA CLA     /IS Z<0?
+       JMP     NULLST  /YES-RETURN THE NULL STRING
+       JMS I   PUNSFIX /NO-FIX Z
+       STL
+       TAD     SACLEN  /CALC Z-LEN(SAC)
+       SNL             /SKP IF Z.LO.LEN(SAC)
+       CLA             /ELSE TAKE LEN(SAC)
+       CMA
+       TAD     SACLEN
+       TAD     YARG    /NUMBER OF BYTES TO USE
+       SMA
+       JMP     NULLST  /NONE, RETURN NULL STRING
+       DCA     STRCNT
+       TAD     YARG    /INDEX INTO STRING FOR SOURCE BYTES
+       TAD     (SAC-2
+       DCA     XR2     /SET SOURCE XR
+       TAD     STRCNT
+       DCA     SACLEN  /SET NEW LENGTH OF SAC NOW
+       TAD I   XR2     /NOW MOVE THE BYTES
+       DCA I   SACXR
+       ISZ     STRCNT
+       JMP     .-3
+       JMP I   PILOOP  /--RETURN--
+NULLST,        CLA CLL
+       DCA     SACLEN  /ZERO SAC
+       JMP I   PILOOP  /--RETURN--
+YARG,  0
+
+       PAGE
+\f      /POS FUNCTION
+       /RETURNS THE POSITION IN X$ OF Y$ STARTING AFTER Z
+
+POS,   CLA CLL
+       DCA     INSAV   /FAKE AS STRING CALL TO STRING 0
+       JMS I   (STFIND /FIND Y$
+       TAD     STRCNT  /# OF CHARS IN Y$
+       SNA CLA         /IS Y$ THE NULL STRING?
+       JMP     ONERET  /YES-RETURN 1 AS POSITION
+       TAD     SACLEN  /NO-# OF CHARS IN X$
+       SNA CLA         /IS X$ THE NULL STRING?
+       JMP     ZRORET  /YES-RETURN 0
+       TAD     ACH     /NO-GET HORD OF Z
+       SPA SNA CLA     /IS Z GT 0?
+PA,    JMS I   PERROR  /NO-ILLEGAL ARGUMENT
+       JMS I   PUNSFIX /FIX Z
+       DCA     POSITN  /USE IT AS POSITION TO START SEARCH
+       TAD     POSITN
+       STL
+       TAD     SACLEN  /COMPARE POSITION TO MAXIMUM LENGTH OF STRING
+       SNL SZA CLA
+       JMP     PA      /Z IS PAST END OF STRING-ERROR
+POSSET,        TAD     STRCNT
+       CMA
+       TAD     POSITN  /GET POSITION NOW CHECKING+SIZE IF Y$
+       TAD     SACLEN  /COMPARE AGAINST LENGTH OF STRING
+       SMA SZA CLA     /ANY MORE TO COME?
+       JMP     ZRORET  /NO-SEARCH FAILS
+       JMS I   (BYTSET /SETUP BYTE LOAD ROUTINE
+       TAD     POSITN  /SEARCH START POSITION IN X$
+       TAD     (SAC-2  /ADD TO BASE OF SAC
+       DCA     SACXR
+       TAD     STRCNT  /# OF CHARS IN Y$
+       DCA     TEMP3   /COUNTER
+SRCLP, JMS I   (LDB
+       CIA
+       TAD I   SACXR   /COMPARE CHARS
+       SNA CLA         /DO THEY MATCH?
+       JMP     SCONTU  /YES-CONTINUE MATCH TO NEXT CHAR IN X$ AND Y$
+       ISZ     POSITN  /BUMP POSITION TO BE CHECKED
+       JMP     POSSET  /ITERATE
+
+SCONTU,        ISZ     TEMP3   /MORE CHARS IN Y$?
+       JMP     SRCLP   /YES, ITERATE
+       TAD     POSITN  /NO FOUND A MATCH
+       JMP I   (FLOATS
+ZRORET,        JMS I   PFACCLR /SEARCH FAILS-RETURN 0
+       JMP I   PILOOP
+
+ONERET,        CLA IAC
+       JMP I   (FLOATS /RETURN 1
+POSITN,        0
+
+       PAGE
+\f      RELOC
+
+//////////////////////////////////////////////////
+//////////////////////////////////////////////////
+///////// OVERLAY 3-FILE MANIPULATING ////////////
+/////////     FUNCTIONS              ////////////
+//////////////////////////////////////////////////
+//////////////////////////////////////////////////
+
+       *3400
+
+       /FILE CLOSING ROUTINE
+
+       VERSON^100+SUBVFF+6000  /VERSION WORD FOR FILES OVERLAY
+
+ANDPTR,        ANDLST
+ANDLST,        7776    /MASKS FOR CLEARING BUFFER AND HANDLER STATUS BITS
+       7775
+       7773
+       7767
+
+CLOSE, TAD     ENTNO   /GET FILE #
+       SNA CLA         /IS IT TTY?
+       JMP I   PILOOP  /YES-DON'T DO ANYTHING
+       JMS I   PIDLE   /SEE IF FILE OPEN
+       JMS I   PFTYPE  /IS FILE NUMERIC?
+       JMP     NOCZ    /YES-DON'T OUTPUT ^Z
+       JMS I   (FOTYPE /NO-IS FILE VARIABLE LENGTH?
+       JMP     NOCZ    /NO-DON'T OUTPUT ^Z
+       TAD     (232    /YES
+       JMS I   PPUTCH  /WRITE A ^Z IN FILE
+NOCZ,  JMS I   (WRBLK  /WRITE LAST BLOCK IF IT HAS CHANGED
+       JMS I   PPSWAP  /RESTORE 17600
+       JMS I   (FOTYPE /IS FILE FIXED LENGTH?
+       JMP     CLOSED  /YES-NO NEED TO CLOSE THE FILE
+       TAD I   IOTLEN  /NO-GET FILE LENGTH
+       DCA     CLENG   /PUT IN CLOSE CALL
+       TAD     IOTFIL
+       DCA     FNAP    /POINTER TO FILE NAME
+       TAD I   IOTHDR
+       CLL RTL
+       RTL
+       RAL             /GET DEVICE NUMBER INTO BITS 8-11
+       AND     O17     /ISOLATE IT
+       CIF 10
+       JMS I   O7700   /CALL USR
+       4               /CLOSE
+FNAP,  .               /POINTER TO FILE NAME
+CLENG, .
+FC,    JMS I   PERROR  /FILE CLOSING ERROR
+CLOSED,        TAD I   IOTBUF  /GET BUFFER ADDRESS
+       CLL RTL
+       RTL             /BUFFER NUMBER INTO AC
+       RAL             /BITS 10,11
+       AND     (3      /STRIP
+       TAD     ANDPTR  /USE AS INDEX INTO MASKS
+       DCA     TEMP1
+       TAD     BMAP    /BUFFER STATUS MAP
+       AND I   TEMP1   /CLEAR THE BIT FOR THIS BUFFER
+       DCA     BMAP
+\f      TAD I   IOTHDR  /HEADER WORD
+       AND     O7400   /STRIP HEADER TO DEVICE # ONLY
+       DCA I   IOTHDR
+       TAD     MM4             /-4
+       DCA     TEMP3   /USE AS COUNTER
+CHECKL,        TAD     TEMP3   /GET 3 OF FILE TO CHECK
+       TAD     (W0PTR  /MAKE POINTER TO PROPER W0 HEADER
+       DCA     TEMP1   /SAVE POINTER
+       TAD     TEMP3   /-# OF FILE WERE CHECKING
+       TAD     ENTNO   /COMPARE TO CURRENT NUMBER
+       SNA CLA         /IS IT THIS ONE?
+       JMP     PSTCHK  /YES-DON'T CHECK DRIVER
+       TAD I   TEMP1   /GET HEADER WORD FOR THE FILE OF INTEREST
+       AND     O7400   /ISOLATE DEVICE #
+       CIA             /NEGATE
+       TAD I   IOTHDR  /COMPARE TO CURRENT DEVICE #
+       SNA CLA         /SAME DEVICE?
+       JMP     CRETN   /YES-LEAVE DRIVER IN CORE
+PSTCHK,        ISZ     TEMP3   /ALL 4 CHECKED?
+       JMP     CHECKL  /NO-CHECK THE NEXT 1
+       TAD I   IOTHDR
+       AND     O10     /GET HANDLER LENGTH BIT
+       SZA CLA         /TWO PAGES?
+       JMP     TPREL   /YES-FREE BOTH PAGES
+       TAD I   IOTHND  /THIS IS THE ONLY FILE USING HANDLER THEN
+       CLL RTL
+       RTL             /SLIDE BITS 4,5 OF HANDLER PAGE TO AC BITS 10,11
+       RAL
+       AND     (3      /ISOLATE HANDLER BUFFER NUMBER
+       TAD     ANDPTR  /MAKE POINTER TO PROPER AND MASK
+RELCOM,        DCA     TEMP1
+       TAD     DMAP    /DRIVER PAGE MAP
+       AND I   TEMP1   /CLEAR HANDLER PAGE BIT
+       DCA     DMAP
+CRETN, DCA I   IOTHND  /SET FILE AS IDLE
+       JMS I   PPSWAP  /GET RID OF 17600 AGAIN
+       JMP I   PILOOP  /DONE
+
+TPREL, TAD I   IOTHND  /ONLY FILE USING HANDLER
+       CLL RTL
+       RTL             /ISOLATE HANDLER BUFFER NUMBER
+       RAL
+       AND     (3
+       TAD     (ANDLS2 /USE AS INDEX TO AND MASK
+       JMP     RELCOM
+
+W0PTR, FILE1
+       FILE2           /FILE TABLE ENTRIES
+       FILE3
+       FILE4
+
+MM4,
+ANDLS2,        7774
+       7701
+
+/CODE TO READ IN COMPILER AND START IT
+/THIS CODE GETS MOVED TO FIELD 1 AND EXECUTED FROM 
+/LOC 2001-2013 IN FIELD 1
+
+CREAD, CDF 10
+       CIF 0
+       4613            /"JMS I L7607K"
+       3700            /31 PAGES
+       0               /0-7577
+CBLK,  7617            /STARTING BLOCK OF COMPILER
+       HLT             /SYSTEM ERROR,AND SINCE WE ARE PROBABLY CLOBBERED,WE CAN'T REPORT IT
+       CIF 0
+       5612            /"JMP I .+1"-START THE COMPILER
+       7001            /STARTING ADDR OF COMPILER
+K7607K,        7607
+                       /LESS THAN THE DESIRED VALUE
+
+EXTCHK,        0               /SKIP RETURN IF CURRENT
+       AC0002
+       IAC
+       TAD     IOTFIL  /IS .SV
+       DCA     EXTEMP  /JUST A TEMP
+       TAD I   EXTEMP  /GET EXTENSION
+       TAD     (-2326
+       SNA CLA         /IS IT .SV?
+       ISZ     EXTCHK  /YES: SKIP
+       JMP I   EXTCHK
+EXTEMP,        0
+
+       PAGE
+\f/CHAIN FUNCTION
+/SETS UP COMMAND DECODER AREA,THEN CHAINS TO BCOMP.SV
+
+CHAIN, JMS I   PXPRINT /EMPTY TTY RING BUFFER
+       JMP     .-1
+       JMS I   PPSWAP  /RESTORE PG 17600
+       JMS I   DNA2    /GET FILE NAME IN NAME AREA FROM CURRENT FILE
+       CIF 10
+       JMS I   O7700   /CALL USR
+       10              /LOCK IN CORE
+       TAD I   IOTDEV
+       DCA     DNA1    /FIRST TWO CHARS OF DEV NAME
+       TAD I   IOTDEV+1 /LAST TWO CHARS
+       DCA     DNA2
+       CIF 10
+       JMS I   USR
+       12              /INQUIRE
+DNA1,  0               /DEVICE NAME
+DNA2,  NAMEG
+CDIN,  0
+CI,    JMS I   PERROR  /ERROR
+       TAD     CDIN    /GET ENTRY POINT OF DRIVER FOR CHAIN FILE
+       SZA CLA         /IS IT IN CORE?
+       JMP     DISIN   /YES-NO NEED TO FETCH IT
+       TAD     DNA2    /NO-DEVICE # INTO AC
+       CIF 10
+       JMS I   USR
+       1               /FETCH HANDLER
+       7001            /INTO PAGE 7000
+       JMP     CI      /MAKE IT LOOK LIKE INQUIRE ERROR
+DISIN, TAD     IOTFIL
+       DCA     STB     /POINTER TO FILE NAME
+       TAD     DNA2    /GET DEVICE #
+       CIF 10
+       JMS I   USR
+       2               /LOOKUP
+STB,   0               /POINTER TO FILE NAME
+FLN,   0
+CL,    JMS I   PERROR  /LOOKUP ERROR
+       TAD     STB     /GET STARTING BLOCK
+       CDF 10
+       DCA I   (7620   /STARTING BLOCK IN CD AREA
+       TAD     FLN     /FILE LENGTH
+       CLL RTL
+       RTL
+       AND     (7760   /PUT IN BITS 0-7
+       TAD     DNA2    /COMBINE WITH DEVICE #
+       DCA I   (7617   /PUT IN CD AREA
+       TAD     O100    /SET R SWITCH
+       DCA I   (7644
+       TAD I   (7605   /STARTING BLOCK OF COMPILER
+       SNA             /(IS THIS A CORE IMAGE?
+       JMP     CICHAIN /YES: HANDLE SOMEWHAT DIFFERENTLY
+       CDF
+       DCA I   (CBLK   /INTO COMPILER READ CODE
+       CDF
+       JMS I   (EXTCHK /SKP IF EXTENSION .SV
+       SKP
+       JMP     CX      /ERROR IF IT IS
+       JMS I   (PSWAP2 /NOW EXEC DESTRUCTIVE EXIT CODE
+       CDF     10
+       JMP I   (CSMOVE /MOVE THE COMPILER READ TO FIELD 1 AND EXECUTE IT
+
+CICHAIN,CDF
+       JMS I   (EXTCHK /SKP IF EXTENSION IS .SV
+CX,    JMS I   PERROR  /ERROR IF NOT
+       JMS I   (PSWAP2 /NOW EXEC ONCE ONLY CLEAN UP ROUTINE
+       TAD     STB
+       DCA     CHNSTB
+       CIF     10      /NOW DO A RESET AND DELETE TENTATIVE FILES
+       JMS I   USR
+       13              /RESET
+       CIF 10          /FLAG TENTATIVE FILE CLEANUP
+       JMS I   USR
+       6
+CHNSTB,        HLT
+\f      /FILE LOOKUP
+
+FLOOK, AC0002
+       JMS I   (ENTLOK /LOOKUP
+       DCA I   IOTLEN  /ACTUAL LENGTH
+       TAD I   IOTLEN
+       DCA I   IOTMAX  /ALSO EQUALS MAXIMUM LENGTH
+CLEANP,        DCA I   IOTPOS  /ZERO COLUMN POINTER
+       CMA             /-1
+       TAD I   IOTLOC  /STARTING BLOCK-1
+       DCA I   IOTBLK  /CURRENT BLOCK #=STARTING BLOCK-1
+       TAD I   IOTBUF
+       DCA I   IOTPTR  /READ/WRITE POINTER AT BEGINNING OF BUFFER
+       CIF 10
+       JMS I   USR     /CALL TO USR
+       11              /USROUT
+       JMS I   PPSWAP  /GET RID OF 17600
+       JMS I   (BLZERO
+       JMS I   (NEXREC /DO A NEXREC TO READ IN FIRST FILE BLOCK
+       JMP I   PILOOP  /DONE
+
+       /ROUTINE FOR INTERPRETER EXIT
+
+FSTOP, KSF             /IS THE KEYBOARD FLAG SET?
+       JMP     NOCTC   /NO-THERE IS NO CHANGE ^C SENT US HERE
+       TAD     O200    /YES-FORCE PARITY BIT
+       KRB             /GET CHARACTER
+       TAD     (-203   /COMPARE AGAINST ^C
+       SZA CLA         /WAS IT ^C?
+       JMP     NOCTC   /NO-THIS IS A NORMAL EXIT
+       TSF
+       JMP     .-1
+       TAD     ("^     /YES -ECHO ^
+       TLS
+       CLA
+       TSF
+       JMP     .-1
+       TAD     ("C     /ECHO "C"
+       TLS
+NOCTC, TSF
+       JMP     .-1
+       JMP I   (MEXIT
+
+       PAGE
+\f      /FILE OPENING ROUTINE
+
+OPENAV,        TAD     (4      /ALPHANUMERIC,VARIABLE LENGTH
+OPENAF,        IAC             /ALPHANUMERIC,FIXED LENGTH
+       JMP     OPENNF
+OPENNV,        TAD     (4              /NUMERIC,VARIABLE LENGTH
+OPENNF,        DCA I   IOTHDR  /SET UP HEADER WORD
+       TAD     ENTNO   /IS FILE TTY?
+       SNA CLA
+       JMP I   PILOOP  /YES-DON'T DO ANYTHING
+       TAD I   IOTHND  /GET HANDLER ENTRY
+       SZA CLA         /IS FILE IDLE?
+FB,    JMS I   PERROR  /ATTEMPT TO OPEN FILE ALREADY OPEN
+       JMS I   PPSWAP  /RESTORE 17600
+       JMS I   (NAMEG  /GET FILE DEVICE NAME AND FILE NAME INTO WORDS 7-14 FROM SAC
+       CIF 10
+       JMS I   O7700   /CALL TO USR
+       10              /LOCK USR IN CORE
+       TAD I   IOTDEV
+       DCA     DEVNA1  /DEVICE NAME INTO INQUIRE CALL
+       TAD I   IOTDEV+1
+       DCA     DEVNA2
+       CIF 10
+       JMS I   USR     /CALL TO USR
+       12              /INQUIRE
+DEVNA1,        .               /DEVICE NAME
+DEVNA2,        .
+ENTRYN,        0               /ENTRY POINT
+IN,    JMS I   PERROR  /INQUIRE ERROR
+       TAD     DEVNA2  /GET DEVICE #
+       CLL RAR
+       RTR             /PUT INTO BITS 0-3
+       RTR
+       TAD I   IOTHDR
+       DCA I   IOTHDR  /STORE IN HEADER WORD
+       TAD     ENTRYN  /GET DRIVER ADDRESS
+       SZA             /IS IT IN CORE?
+       JMP I   (DRIVRN /YES-NO NEED TO FETCH IT
+       TAD     DMAP    /NO-GET MAP OF DRIVER PAGES
+       CLL RAR         /PAGE 7000 BIT IN LINK
+       SNL             /IS PAGE 7000 FREE?
+       JMP     FREE70  /YES
+       CLL RAR         /NO-7200 BIT TO LINK
+       SNL             /IS PAGE 7200 FREE?
+       JMP     FREE72  /YES
+\f      CLL RAR         /NO-7400 BIT TO LINK
+       SZL CLA         /IS PAGE 7400 FREE?
+DO,    JMS I   PERROR  /NO-NO MORE ROOM FOR DRIVERS
+       TAD     O7400   /YES-LOAD HANDLER INTO 7400
+       DCA     FETPAG  /SET UP IN FETCH CALL
+       TAD     (4      /SET BIT 9 TO SHOW PAGE 7400 OCCUPIED
+       JMP     DFETCH  /FETCH DRIVER
+
+FREE70,        CLL RAR         /PAGE 7200 BIT TO LINK
+       SNL CLA         /IS 7200 FREE?
+       IAC             /YES-THERE IS ROOM FOR A TWO PAGE HANDLER
+       TAD     (7000
+       DCA     FETPAG  /SET UP FETCH TO USE PAGE 7000
+       CLL CLA CML RTL /TURN ON BIT 10
+       DCA     TPH     /SAVE IN TWO PAGE SET WORD
+       IAC             /SET BIT 11 TO SHOW PAGE 7000 OCCUPIED
+       JMP     DFETCH  /FETCH HANDLER
+
+FREE72,        CLL RAR         /7400 BIT TO LINK
+       SNL CLA         /IS 7400 PAGE FREE?
+       IAC             /YES-THEN THERE IS ROOM FOR A 2 PAGE HANDLER
+       TAD     (7200
+       DCA     FETPAG  /SET ADDRESS IN FETCH CALL
+       TAD     (4
+       DCA     TPH     /IF TWO PAGE LOADED,SET BIT 9 ALSO
+       AC0002          /TURN ON BIT 10 TO SHOW PAGE 7200 OCCUPIED
+DFETCH,        TAD     DMAP    /TURN ON PAGE BIT FOR WHERE BUFFER WILL BE LOADED
+       DCA     DMAP
+       TAD     DEVNA2  /DEVICE # IN AC
+       CIF 10
+       JMS I   USR     /CALL TO USR
+       1               /FETCH
+FETPAG,        .               /DRIVER ADDRESS
+FE,    JMS I   PERROR  /FETCH ERROR
+       CDF 10
+       CLA CMA
+       TAD I   (37     /GET ADDR OF HANDLER INFO TABLE
+       TAD     DEVNA2  /USE THE DEVICE # AS AN INDEX INTO THAT TABLE
+       DCA     TEMP1   /SAVE POINTER
+       TAD I   TEMP1   /GET THE INFO WORD FOR THE HANDLER JUST FETCHED
+       CDF
+       SMA CLA         /IS HANDLER 2 PAGES LONG?
+       JMP     DRAP    /NO MAP IS COMPLETE
+       TAD     TPH             /YES-UPDATE DRIVER MAP TO INCLUDE
+       TAD     DMAP    /SECOND PAGE OF TWO PAGE HANDLERS
+       DCA     DMAP
+       TAD     O10
+       TAD I   IOTHDR  /SET 2 PAGE BIT IN HEADER WORD
+       DCA I   IOTHDR
+DRAP,  TAD     FETPAG  /HANDLER ENTRY ADDRESS
+       JMP I   (DRIVRN /PAGE ESCAPE
+
+TPH,   0
+\f/ROUTINE TO MOVE THE COMPILER READER INTO FIELD 1 AND START IT
+
+CSMOVE,        TAD     (CREAD-1
+       DCA     XR1     /POINTES TO COMPILER STARTING CODE
+       TAD     (-13
+       DCA     TEMP1   /COUNTER
+       TAD     (2000
+       DCA     XR2     /MOVE TO LOC 2001 IN FIELD 1
+       CDF
+       TAD I   XR1     /GET WORD OF CODE
+       CDF 10
+       DCA I   XR2     /MOVE IT
+       ISZ     TEMP1   /DONE?
+       JMP     .-5     /NO
+       CIF 10          /YES-START IT
+       JMS I   (2000
+
+       PAGE
+\fDRIVRN,       DCA I   IOTHND  /DRIVER ENTRY INTO I/O TABLE
+       TAD     BMAP    /GET BUFFER MAP
+       CLL RAR         /BUFF1 BIT TO LINK
+       SNL             /IS IT FREE?
+       JMP     B1      /YES-ASSIGN BUFF1
+       RAR             /BUFF2 BIT TO LINK
+       SNL             /IS IT FREE?
+       JMP     B2      /YES-ASSIGN BUFF2
+       RAR             /BUFF3 BIT TO LINK
+       SNL             /IS IT FREE
+       JMP     B3      /YES-ASSIGN BUFF3
+       RAR             /NO-BUFF4 BIT TO LINK
+       SZL CLA         /IS IT FREE?
+BO,    JMS I   PERROR  /NO-NO MORE BUFFERS AVAILABLE
+       TAD     (1400
+       DCA I   IOTBUF  /SET BUFFER ADDRESS TO 1400
+       TAD     O10     /SET BUFF4 BIR IN MAP
+       JMP     BUFASS
+
+B3,    CLA
+       TAD     (1000
+       DCA I   IOTBUF  /SET BUFFER ADDRESS TO 1000
+       TAD     (4
+       JMP     BUFASS  /SET BUFF3 BIT IN MAP
+
+B2,    CLA
+       TAD     O400
+       DCA I   IOTBUF  /SET BUFF ADDRESS TO 400
+       CLL CML CLA RTL /SET BUFF2 BIT IN MAP
+       JMP     BUFASS
+
+B1,    CLA
+       DCA I   IOTBUF  /SET BUFF ADDRESS TO 0000
+       CLA IAC         /TURN ON BUFF1 BIT IN MAP
+\fBUFASS,       TAD     BMAP
+       DCA     BMAP    /UPDATE BUFFER ASSIGNMENT MAP
+       TAD I   IOTHDR  /GET HEADER WORD
+       CLL RTR
+       RAR             /FIXED,VARIABLE BIT TO LINK
+       SNL CLA         /IS IT FIXED?
+       JMP I   (FLOOK  /YES-DO A LOOKUP
+       TAD     (3              /NO-DO AN ENTER
+       JMS     ENTLOK  /ENTER
+       DCA I   IOTMAX  /MAXIMUM LENGTH IN WORD 7
+       DCA I   IOTLEN  /ZERO ACTUAL LENGTH
+       JMP I   (CLEANP /FINALIZE I/O TABLE ENTRY
+
+MEXIT, CLA
+       JMS I   PPSWAP
+       JMS I   (PSWAP2 /RESTORE PG 27600
+       CDF 10
+       TAD I   (EDBLK  /GET BLOCK # FOR EDITOR
+       CDF
+       SNA             /SHALL WE CALL THE EDITOR?
+       JMP I   (7600   /NOkJUST CALL OS/8
+       DCA     EBLK    /YES-PUT THE BLOCK # IN DRIVER CALL
+       JMS I   (7607   /CALL SYS DRIVER
+       2100            /READ 8 BLOCKS
+       0               /INTO 0-3377
+EBLK,  .               /BLOCK # OF EDITOR
+       HLT             /SYS ERROR,AND SINCE WE ARE PROBABLY CLOBBERED,WE CAN'T REPORT IT
+       JMP I   .+1     /START THE EDITOR
+       3212
+\fENTLOK,       0
+       DCA     FNOM    /FUNCTION NUMBER IN PLACE
+       TAD     IOTFIL  /POINTER TO FILE NAME
+       DCA     STARTB  /INTO CALL
+       TAD I   (DEVNA2 /DEVICE NUMBER
+       CIF 10
+       JMS I   USR     /CALL TO USR
+FNOM,  .               /ENTER OR LOOKUP
+STARTB,        .
+FLEN,  .
+EN,    JMS I   PERROR  /ENTER ERROR
+       TAD     STARTB  /FILE STARTING BLOCK #
+       SZA CLA         /IS IT NON-ZERO?
+       JMP     FILSTU  /YES-DEVICE IS FILE STRUCTURED
+       TAD     FLEN    /NO-GET FILE LENGTH
+       SZA CLA         /IS IT EMPTY?
+       JMP     FILSTU  /NO-DEVICE IS FILE STRUCTURED
+       TAD     (20             /NO-FILE IS READ/WRITE ONLY
+       TAD I   IOTHDR
+       DCA I   IOTHDR  /SET READ/WRITE ONLY BIT
+       TAD     FNOM
+       CLL RAR
+       SNL CLA
+       IAC
+FILSTU,        TAD     STARTB  /GET STARTING BLOCK # OF FILE
+       DCA I   IOTLOC  /PUT IN I/O TABLE
+       TAD     FLEN    /FILE LENGTH
+       CIA             /MAKE FILE LENGTH POSITIVE
+       JMP I   ENTLOK  /RETURN
+\f/SUBROUTINE P2SWAP-RESTORE OS/8 RESIDENT MONITOR PRIOR TO EXIT FROM INTERPRETERTER
+/THIS IS DESTRUCTIVE CODE,AND ONCE THIS ROUTINE HAS BEEN EXECUTED
+/THERE IS NO PLACE TO GO BUT OUT.
+/HAS 3 FUNCTIONS:
+/        1) REMOVES CTRL/C HOOKS FROM SYS DRIVER
+/        2) RESTORES BATCH CONTROL WORDS TO 27774-27777
+/        3) IF SYS=TD/8E,RESTORES PAGE 27600 AND RETURNS CDFS TO PAGE 07600
+
+PSWAP2,        0
+       TAD     (4207
+       DCA I   (7600   /REMOVE CTRL/C HOOKS
+       TAD     (6213
+       DCA I   (7605
+       TAD     (7600
+       DCA I   (HICORE /FUDGE POINTER IN SWAP ROUTINE (IN CASE IT WAS TD8E)
+       TAD     PSFLAG  /GET RESIDENT STATUS FLAG
+       SPA CLA         /IS THIS TD8/E SYS?
+       JMS I   (PSWP2P /YES-RESTORE PAGE 27600 AND PAGE 07600
+       TAD     CDFIO
+       DCA     .+3     /CDF TO HI CORE
+       CDF 10
+       TAD I   BOSPT1  /GET BATCH WORD
+       CDF 10
+       DCA I   BOSPT2  /BACK INTO LOFTY STATE
+       ISZ     BOSPT1
+       ISZ     BOSPT2
+       JMP     .-6
+       CDF
+       JMP I   PSWAP2  /YES-WE ARE FINISHED,SO RETURN
+BOSPT1,        7600
+BOSPT2,        7774
+
+       PAGE
+\f      /PARSE A FILENAME OF THE FORM "DEVN:FILENM.EX" IN THE SAC
+       /DSK: AND A NULL EXTENSION ARE THE DEFAULTS
+       /THE END OF THE SAC IS USED AS A WORK AREA
+       /IF SYNTAX IS CORRECT, THE NAME IS PACKED INTO
+       /THE FILENAME FIELD OF THE CURRENT FILE
+       /OTHERWISE A FATAL ERROR IS RETURNED
+       /ENTERED WITH OS/8 SWAPPED IN
+
+       WKAREA= SAC+16  /DEFINE SCRATCH AREA
+
+NAMEG, 0
+       TAD     SACLEN
+       TAD     (16     /COMPARE STRING LENGTH TO 16
+       SPA CLA
+IF,    JMS I   PERROR  /TOO MANY CHARS IN "DEV:FILENM.EX"
+       TAD     SACLEN
+       DCA     TEMP2   /STRING LENGTH COUNTER
+       TAD     PSACM1
+       DCA     SACXR
+       TAD     (DSK-1  /FIRST USE THE DEFAULT DEVICE
+       JMS     DEVFUD
+NCG,   TAD I   SACXR   /GET CHAR FROM SAC
+       DCA     TEMP1   /SAVE
+       TAD     TEMP1
+       TAD     (-72    /IS IT A COLON?
+       SNA
+       JMP     CAD     /YES-CHARS SO FAR=DEVICE NAME
+       TAD     (14     /NO-IS IT A PERIOD?
+       SNA CLA
+       JMP     SSAD    /YES-NEXT TWO CHARS=EXTENSION
+       TAD     TEMP1   /NO-GET CHAR AGAIN
+       DCA I   XR2     /STORE IN WORK AREA
+       ISZ     TEMP4   /BUMP COUNT FOR CURRENT SECTION
+NCGS,  ISZ     TEMP2   /END OF STRING YET?
+       JMP     NCG     /NO-NEXT CHAR
+\f      TAD     TEMP4   /YES-GET CHAR COUNT FOR THIS SECTION (NAME)
+       TAD     (-6
+       SMA SZA CLA     /IS IT >6?
+       JMP     IF      /YES-TOO MANY CHARACTERS IN FILE NAME
+       TAD     (WKAREA-1 /NO-ADDRESS OF SCRATCH NAME BLOCK
+       DCA     XR1
+       STA             /-1
+       TAD     IOTDEV  /ADDRESS OF FINAL NAME BLOCK-1
+       DCA     XR2
+       TAD     (-6             /MOVE 6 WORDS
+       DCA     TEMP2
+MML,   TAD I   XR1
+       CLL RTL
+       RTL
+       RTL
+       TAD I   XR1
+       DCA I   XR2     /MOVE NAME WORD FROM SCRATCH AREA TO FINAL DEST
+       ISZ     TEMP2   /DONE?
+       JMP     MML     /NO
+       JMP I   NAMEG   /YES-RETURN
+
+CAD,   TAD     TEMP4   /GET CHAR COUNT FOR THIS SECTION
+       TAD     (-4     /COMPARE AGAINST 4
+       SMA SZA CLA     /TOO MANY CHARS?
+       JMP     IF      /YES-DEVICE NAME TOO LONG
+       TAD     (WKAREA-1+4
+       JMS     DEVFUD  /CLEAR BUF AND GET NAME FROM FILE FIELD THIS TIME
+       JMP     NCGS
+
+SSAD,  TAD     TEMP4   /COUNT FOR THIS SECTION (FILE NAME)
+       TAD     (-6
+       SMA SZA CLA     /TOO MANY?
+       JMP     IF      /YES-FILE NAME TOO LONG
+       DCA     TEMP4   /NO-CLEAR COUNT
+       TAD     DSK
+       TAD     TEMP2   /COMPARE AGAINST # OF CHARS LEFT
+       SPA SNA CLA
+       JMP     IF      /TOO MANY CHARS IN EXTENSION
+       TAD     (WKAREA-1+12
+       DCA     XR2
+       JMP     NCGS
+
+DEVFUD,        0
+       DCA     XR1     /POINT AT LOC OF DEV:
+       TAD     (WKAREA-1
+       DCA     XR2     /POINT AT START OF WORK AREA
+       TAD     (-10
+       DCA     TEMP4
+       TAD     (-4
+       DCA     TEMP3
+       TAD I   XR1     /GET A DEVICE NAME BYTE
+       DCA I   XR2     /STORE IN WORK AREA DEVICE FIELD
+       ISZ     TEMP3
+       JMP     .-3     /ITERATE
+       DCA I   XR2     /NOW CLEAR REST OF FILE NAME
+       ISZ     TEMP4
+       JMP     .-2     /ITERATE
+       TAD     (WKAREA-1+4 /POINT XR2 AT FILENAME FIELD
+       DCA     XR2
+       JMP I   DEVFUD  /RETURN WITH TEMP4 CLEAR
+
+DSK,   4;23;13;0       /6BIT DEFAULT DEVICE NAME "DSK"
+\f/SUBROUTINE TO RESTORE PAGE 27600 OF TD8/E DRIVER
+/AND READJUST THE CDFS IN FIELD 0
+
+PSWP2P,        0
+       TAD     PSFLAG
+       RTL
+       SNL CLA         /BIT 1 SET MEANS PHONEY TD8E
+       JMP     .+3
+       DCA     PSFLAG
+       JMP I   PSWP2P
+       DCA     PSFLAG  /CLEAR RESIDENT STATUS FLAG
+       TAD     (CDF 20
+       DCA I   (P2CDF  /PUT CDF 20 IN SWAP ROUTINE
+       TAD     (CDF 20
+       DCA I   (P2CDF1
+       JMS I   PPSWAP  /MOVE DOWN PAGE 27600
+       TAD     (6223
+       DCA I   (7642
+       TAD     (6222
+       DCA I   (7721
+       TAD     (6222   /RESTORE CDFS IN PAGE 07600
+       DCA I   (7727
+       JMP I   PSWP2P  /RETURN
+
+       PAGE
+\f
+
+
+       FIELD 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+/////////////// END OF OVERLAY AREA /////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+
+       $
+\f<:STTYF,      1\e+1"E0;'
+J<S\13PRINT\13\e;R-5DI[XPRINT\e>
+J<S\13SACPTR\13\e;R-6DI[SAC-1\e>
+J<S\13PUTCHL\13\e;R-6DI[PUTCH\e>
+J<S\13ILOOPL\13\e;R-6DI[ILOOP\e>
+J<S\13INTL\13\e;R-4DI[UNSFIX\e>
+J<S\13CDFPSL\13\e;R-6DI[CDFPSU\e>
+J<S\13ERROR\13\e;R-5DI[ERRDIS\e>
+J<S\13FBITS\13\e;R-5DI[FBITGT\e>
+J<S\13PWFECL\13\e;R-5DI[PWFECH\e>
+J<S\13MPYLNK\13\e;R-6DI[MPY\e>
+J<S\13XPUT\13\e;R-4DI[XPUTCH\e>
+J<S\13FIDLE\13\e;R-5DI[IDLE\e>
+J<S\13DEVCAL\13\e;R-6DI[DRCALL\e>
+J<S\13WRITFW\13\e;R-6DI[WRITFL\e>
+J<S\13STHINL\13\e;R-6DI[STHINI\e>
+J<S\13LDHINL\13\e;R-6DI[LDHINI\e>
+J<S\13STH\13\e;R-3DI[STHL\e>
+J<S\13LDH\13\e;R-3DI[LDHL\e>
+J<S\13FACSAL\13\e;R-6DI[FACSAV\e>
+J<S\13FACREL\13\e;R-6DI[FACRES\e>
+J<S\13FGETL\13\e;R-5DI[FFGET\e>
+J<S\13FPUTL\13\e;R-5DI[FFPUT\e>
+J<S\13FNORL\13\e;R-5DI[FFNOR\e>
+J<S\13FCLR\13\e;R-4DI[FACCLR\e>
+J<S\13FNEGL\13\e;R-5DI[FFNEG\e>
+J<S\13FLOATL\13\e;R-6DI[FFLOAT\e>
+J<S\13GETCHL\13\e;R-6DI[GETCH\e>
+J<S\13EOFSEL\13\e;R-6DI[EOFSET\e>
+J<S\13BSWL\13\e;R-4DI[BSWP\e>
+J<S\13PACKL\13\e;R-5DI[PACKCH\e>
+J<S\13CNOCLL\13\e;R-6DI[CNOCLR\e>
+J<S\13BUFCHL\13\e;R-6DI[BUFCHK\e>
+J<S\13FTYPL\13\e;R-5DI[FTYPE\e>
+J<S\13CHRNOL\13\e;R-6DI[CHARNO\e>
+J<S\13NEXREL\13\e;R-6DI[NEXREC\e>
+J<S\13CRLF\13\e;R-4DI[CRLFR\e>
+J<S\13VALLK\13\e;R-5DI[VALGET\e>
+J<S\13PATCHP\13\e;R-6DI[PATCHF\e>
+J<S\13P1SWAP\13\e;R-6DI[PSWAP\e>
+J<S\13LDHRST\13\e;R-6DI[LRESET\e>
+J<S\13STHRST\13\e;R-6DI[SRESET\e>
+P>
+\f