*DECK S$PTEF
          IDENT  S$PTEF 
          COMMENT  PRINT ON ERROR FILE
          SPACE  5
**    S$PTEF -   PRINT ON ERROR FILE
* 
*     CALLING SEQUENCE- 
*         S$PTEF(LINE,NCHAR)
*         S$PTEFU(LINE,CHAR)
*         S$OPEF(EFN) 
*         S$CLEF
*     GIVEN-
*         LINE - CONTAINS NCHAR CHARACTERS TO BE PRINTED
*         NCHAR  = NUMBER OF CHARACTERS TO BE PRINTED 
*         EFN = LOGICAL FILE NAME 
*     DOES- 
*         S$PTEF INSERTS ONE BLANK CHARACTER IN THE LEFT MARGIN 
*         AND PRINTS THE LINE ON THE FILE EFN.
*         S$PTEFU PRINTS THE LINE UNSHIFTED.
*         S$OPEF  (OPEN LIST FILE)
*            PUTS THE LOGICAL FILE NAME EFN IN THE FET. 
*         S$CLEF  (CLOSE LIST FILE) 
*            FLUSHES THE BUFFER AND RESETS THE FET POINTERS.
*         NCHAR  IS ROUNDED UP TO A MULTIPLE OF 10 AND A ZERO WORD
*         LINE TERMINATOR IS ADDED TO THE BUFFER AFTER EACH LINE. 
*         FLUSHES THE BUFFER IF IT IS FULL. 
*         OVERWRITES LAST BLANK WORD WITH TERMINATOR
          ENTRY  S$PTEFU
 S$PTEFU  SUBR
          SA2    *-1
          LX2    30 
          SB6    X2 
          EQ     S$PTEF+2 
          SPACE  2
          ENTRY  S$PTEF 
 S$PTEF   SUBR
          SB6    0
+         SB1    1
          SA3    A1+B1        X3 = ADDRESS SECOND PARAMETER 
          SA3    X3           X3 = VALUE OF SECOND PARAMETER
          NG     X3,S$PTEF
          SX3    X3+9         ADD 9 CHARACTERS FOR ROUNDING UP
          SA4    EFFET+2      IN
          SX0    1S20/10+1
          IX0    X0*X3
          AX0    20           X0 = X3/10 = NB OF WORDS ROUNDED UP 
          IX3    X4+X0        IN+LENGTH 
          SB5    X3           LIMIT ABOVE LAST WORD OF STRING TO BE COPIED
          SB3    LIMMIN1
          GT     B5,B3,L1     TAKE MIN(LIMIT,B5)
          SB3    B5           STOP COPYING BEFORE THIS ADDRESS
 L1       SB2    X4           OLD IN POINTER
          SB4    B2           PRELIMINARY TERMINATOR DESTINATION
          SA3    BLANK
          SA2    X1-1         A2 = ADDRESS BEFORE STRING COPIED 
          MX1    6
          BX7    X1*X3        ONE BLANK LEFT
 REP      SA2    A2+B1        FIRST STRING WORD 
          BX6    X2 
          NE     B6,B0,NOSHFT 
          LX6    54 
          BX4    -X1*X6 
          BX4    X7+X4        INSERT PREVIOUS CHARACTER 
          BX7    X1*X6        SAVE FOR NEXT STORE 
          BX6    X4 
NOSHFT    SA6    B2 
          SB2    B2+B1
          BX0    X3-X2
          ZR     X0,STOREW    IF NOT BLANKS THEN
          SB4    B2           REMEMBER POSSIBLE TERMINATOR POSITION 
 STOREW   NE     B2,B3,REP
          EQ     B4,B5,STORW1 
          SA3    B4 
          BX7    X1*X3
 STORW1   BSS    0
* 
*   IF BUFFER FULL THEN WRITE 
* 
          SB7    B2-LIMMIN1 
          NE     B7,B0,L2 
          RJ     WRT
* 
*   IF OTHER PART OF STRING NOT FULLY COPIED THEN CONTINUE
* 
          SB7    B5-EFBUF 
          MX1    6
          GT     B7,B0,REP    GT: MORE TO BE COPIED 
* 
*   STORE TERMINATOR
* 
 L2       SA1    TERM 
          BX6    X1+X7
          SA6    B4           B4 LE (LAST WORD COPIED+1)
          SX7    B4+B1
          SA7    EFFET+2      IN
* 
*   IF NOW BUFFER FULL THEN WRITE 
* 
          SX0    X7-LIMMIN1 
          NZ     X0,READY 
          RJ     WRT
          SX7    EFBUF
          SA7    EFFET+2      IN
 READY    EQ     B6,B0,S$PTEF 
          JP     B6 
* 
*   SUBROUTINE WRT
* 
 WRT      DATA   0
* 
*   SAVE REGISTERS A2,B5,B6,X7
* 
          SX6    A2           SAVE A2 
          LX6    18 
          SX1    B5 
          BX6    X6+X1        SAVE B5 
          LX6    18 
          SX1    B6 
          BX6    X6+X1        SAVE B6 
          SA6    SB2B5B6
          SA7    SAVEX7       SAVE X7 
* 
*   WRITE 
* 
          SX7    LIMMIN1
          SA7    EFFET+2      IN
          WRITE  EFFET,RECALL 
          SX6    EFBUF        RESET 
          SA6    EFFET+3      OUT 
* 
*   RESTORE REGISTERS 
* 
          SB1    1
          SA1    SB2B5B6
          SB6    X1           RESTORE B6
          AX1    18 
          SB5    X1           RESTORE B5
          AX1    18 
          SA2    X1           RESTORE A2
          SA1    SAVEX7 
          BX7    X1           RESTORE X7
* 
*   RE-INSTALL STOPS
* 
          SB5    B5-BUFLEN+1  NEW LIMIT FOLLOWING LAST WORD ADDRESS 
          SB3    LIMMIN1
          GT     B5,B3,WRT1   TAKE MIN(LIMIT,B5)
          SB2    EFBUF
          SB3    B5           STOP COPYING BEFORE THIS ADDRESS
 WRT1     SB4    B2           PRELIMINARY TERMINATOR POSITION 
          EQ     WRT
* 
* 
          ENTRY  S$OPEF 
* 
 S$OPEF   SUBR
          SA1    X1           LFN 
          MX0    54 
          BX2    X1 
          SX3    55B          BLANK 
          SB2    B0 
 OP2      BX4    -X0*X2       GET RIGHTMOST CHARACTER 
          BX4    X3-X4        0 IF BLANK
          NZ     X4,OP1       FUMP IF NOT BLANK 
          SB2    B2+6 
          AX2    6
          EQ     OP2
 OP1      MX0    1
          SB5    59 
          SB2    B5-B2
          AX0    B2,X0
          BX1    X1*X0
* 
*         NAME THAT IS INPUT IS ASSUMED TO BE ZERO FILLED 
* 
          SX0    1
          IX6    X1+X0        ADD COMPLETION BIT
          SA6    EFFET        42/LFN,18/1 TO FET
          EQ     S$OPEF       EXIT
* 
* 
          ENTRY  S$CLEF 
 S$CLEF   SUBR
          WRITER EFFET,RECALL 
          SX6    EFBUF        PERHAPS REOPENED LATER
          SA6    EFFET+2      IN
          SA6    EFFET+3      OUT 
          EQ     S$CLEF       EXIT
* 
 SB2B5B6  BSSZ   1
 SAVEX7   BSSZ   1
 BLANK    DATA   10H
 TERM     VFD    6/0,42/7L       ,12/0
* 
 EFFET    VFD    42/0LKWI,18/1
          VFD    42/,18/EFBUF       FIRST 
          VFD    42/,18/EFBUF       IN
          VFD    42/,18/EFBUF       OUT 
          VFD    42/,18/EFBUF+BUFLEN   LIMIT
 BUFLEN   EQU    7*100B+1     BUFFER LENGTH 
 EFBUF    BSS    BUFLEN       BUFFER
 LIMMIN1    EQU    EFBUF+BUFLEN-1 
* 
          END 
