*DECK S$PTLF
          IDENT  S$PTLF 
          COMMENT  PRINT ON LIST FILE 
          SPACE  5
**    S$PTLF -   PRINT ON ERROR FILE
* 
*     CALLING SEQUENCE- 
*         S$PTLF(LINE,NCHAR)
*         S$PTLFU(LINE,CHAR)
*         S$OPLF(LFN) 
*         S$CLLF
*     GIVEN-
*         LINE - CONTAINS NCHAR CHARACTERS TO BE PRINTED
*         NCHAR  = NUMBER OF CHARACTERS TO BE PRINTED 
*         LFN = LOGICAL FILE NAME 
*     DOES- 
*         S$PTLF INSERTS ONE BLANK CHARACTER IN THE LEFT MARGIN 
*         AND PRINTS THE LINE ON THE FILE LFN.
*         S$PTLFU PRINTS THE LINE UNSHIFTED.
*         S$OPLF  (OPEN LIST FILE)
*            PUTS THE LOGICAL FILE NAME LFN IN THE FET. 
*         S$CLLF  (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$PTLFU
 S$PTLFU  SUBR
          SA2    *-1
          LX2    30 
          SB6    X2 
*         EXIT ROUTINE IF CALLED BY MISTAKE 
          SA3    =XS$LFNAM
          LX3    6
          SB3    X3 
          SB4    3R  0
          SB5    B4-B3
          EQ     B5,B0,S$PTLFU
          EQ     S$PTLF+2 
          SPACE  2
          ENTRY  S$PTLF 
 S$PTLF   SUBR
          SB6    0
+         SB1    1
*         EXIT ROUTINE IF CALLED BY MISTAKE 
          SA3    =XS$LFNAM
          LX3    6
          SB3    X3 
          SB4    3R  0
          SB5    B4-B3
          EQ     B5,B0,S$PTLF 
          SA3    A1+B1        X3 = ADDRESS SECOND PARAMETER 
          SA3    X3           X3 = VALUE OF SECOND PARAMETER
          NG     X3,S$PTLF
          SX3    X3+9         ADD 9 CHARACTERS FOR ROUNDING UP
          SA4    LFFET+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 TESTING 
          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           TO BUFFER 
          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-LFBUF 
          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    LFFET+2      IN
* 
*   IF NOW BUFFER FULL THEN WRITE 
* 
          SX0    X7-LIMMIN1 
          NZ     X0,READY 
          RJ     WRT
          SX7    LFBUF
          SA7    LFFET+2      IN
 READY    EQ     B6,B0,S$PTLF 
          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    LFFET+2      IN
          WRITE  LFFET,RECALL 
          SX6    LFBUF        RESET 
          SA6    LFFET+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    LFBUF
          SB3    B5           STOP COPYING BEFORE THIS ADDRESS
 WRT1     SB4    B2           PRELIMINARY TERMINATOR POSITION 
          EQ     WRT
* 
* 
          ENTRY  S$OPLF 
* 
 S$OPLF   SUBR
*         EXIT ROUTINE IF CALLED BY MISTAKE 
          SA3    =XS$LFNAM
          LX3    6
          SB3    X3 
          SB4    3R  0
          SB5    B4-B3
          EQ     B5,B0,S$OPLF 
* 
*         BLANKS AT THE RIGHT ARE REMOVED BEFORE PUTTING THE NAME IN THE
*         FET.
* 
          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
* 
* 
          SX0    1
          IX6    X1+X0        ADD COMPLETION BIT
          SA6    LFFET        42/LFN,18/1 TO FET
          EQ     S$OPLF       EXIT
* 
* 
          ENTRY  S$CLLF 
 S$CLLF   SUBR
          WRITER LFFET,RECALL 
          SX6    LFBUF        PERHAPS REOPENED LATER
          SA6    LFFET+2      IN
          SA6    LFFET+3      OUT 
          EQ     S$CLLF       EXIT
* 
 SB2B5B6  BSSZ   1
 SAVEX7   BSSZ   1
 BLANK    DATA   10H
 TERM     VFD    6/0,42/7L       ,12/0
* 
 LFFET    VFD    42/0LOUTPUT,18/1 
          VFD    42/,18/LFBUF       FIRST 
          VFD    42/,18/LFBUF       IN
          VFD    42/,18/LFBUF       OUT 
          VFD    42/,18/LFBUF+BUFLEN   LIMIT
 BUFLEN   EQU    7*100B+1     BUFFER LENGTH 
 LFBUF    BSS    BUFLEN       BUFFER
 LIMMIN1    EQU    LFBUF+BUFLEN-1 
* 
          END 
