*COMDECK  COMCWTS 
          CTEXT  COMCWTS - WRITE CODED LINE FROM STRING BUFFER. 
 WTS      SPACE  4
          IF     -DEF,QUAL$,1 
          QUAL   COMCWTS
          BASE   D
*         COMMENT COPYRIGHT CONTROL DATA CORP. 1970.
 WTS      SPACE  4
***       WTS - WRITE CODED LINE FROM STRING BUFFER.
*         R. S. HORECK.      71/05/19.
 WTS      SPACE  4
***              WTS TRANSFERS 1 CODED LINE FROM A STRING BUFFER TO 
*         A CIO BUFFER WITH TRAILING SPACE SUPPRESSION. 
*         CHARACTERS IN THE WORKING BUFFER ARE PACKED AND STORED IN 
*         THE CIRCULAR BUFFER.
* 
*         ENTRY  (X2) = ADDRESS OF FET FOR FILE.
*                (B6) = FWA WORKING BUFFER. 
*                (B7) = WORD COUNT OF WORKING BUFFER. 
*                IF (B7) = 0, NO TRANSFER WILL BE PERFORMED.
* 
*         EXIT   (X2) = ADDRESS OF FET FOR FILE.
*                (B6) = WORD COUNT OF DATA WRITTEN. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 1, 2, 3, 4, 5, 6, 7. 
*                A - 1, 2, 3, 4, 6, 7.
* 
*         CALLS  DCB=, WTX=.
  
  
 +        EQ     WTS3        ENTRY FROM DCB= ON A WRITE REQUEST 
  
 WTS=     PS                 ENTRY/EXIT 
          SA4    WTS= 
          ZR     B7,WTS=     IF WORKING BUFFER EMPTY
  
          IF     -DEF,B1=1,1
          SB1    1
  
          SA1    X2+4        (B5) = LIMIT 
          SB4    B6+B7
          SB5    X1 
          SX7    1R 
          SA1    B4-B1       READ LAST CHARACTER
          SB2    B1+B1       (2)
 WTS1     BX6    X1-X7       CHECK FOR BLANKS 
          SA1    A1-B1       DECREMENT CHARACTER POSITION 
          ZR     X6,WTS1     IF BLANK 
          SB7    A1+B2       (B7) = LWA + 1 
          LT     B6,B7,WTS2  IF NOT TO PAST START OF BUFFER 
          SB7    B6+B1
 WTS2     SA3    X2+1        (A3) = ADDRESS OF FIRST
          SX4    0           (X4) = WORD COUNT TRANSFERED TO BUFFER 
  
*         INITIALIZE REGISTERS FOR TRANSFER.
  
 WTS3     SA2    A3+B1       (X2) = IN
          SA1    A2+B1       OUT
          SB3    X2+B1       (B3) = IN+1
          SB4    X1 
          SX6    B4-B3       OUT - IN+1 
          PL     X6,WTS4     IF OUT \ IN+1
          SX6    B5-B3       LIMIT - IN+1 
 WTS4     SB4    X6          (B4) = FREE BUFFER SPACE 
          SX3    X2          (X3) = IN
          NZ     X6,WTS6     IF SPACE AVAILABLE 
  
*         PROCESS EXHAUSTED FREE BUFFER SPACE.
  
 WTS5     SA2    A3+B1       (A2) = ADDRESS OF IN 
          SX2    X3          (X2) = IN
          NE     B3,B5,=XDCB=  IF IN+1 " LIMIT
          SA1    A3          (X1) = FIRST 
          SX6    X1 
          SA1    A2+B1       OUT
          IX7    X1-X6       OUT - IN+1 
          SB3    X6          IN+1 = FIRST 
          ZR     X7,=XDCB=   IF IN+1 = OUT
          SB4    X7          (B4) = FREE BUFFER SPACE 
  
*         CHECK ASSEMBLY BUFFER.
  
 WTS6     SB2    B6+10       SET LAST CHARACTER 
          MX6    0           CLEAR ASSEMBLY 
          SA1    B6          GET FIRST CHARACTER
          LT     B7,B2,WTS8  IF ASSEMBLY OVERRUNS WORKING BUFFER
          SA2    A1+B1       GET SECOND CHARACTER 
          SB6    A2+B1       INCREMENT CHARACTER ADDRESS
  
  
*         ASSEMBLE WORD.
  
 WTS7     LX1    6           POSITION ODD CHARACTER 
          SB6    B6+2        ADVANCE CHARACTER ADDRESS
          BX6    X6+X1       ASSEMBLE CHARACTER 
          SA1    A2+B1       GET NEXT ODD CHARACTER 
          BX6    X6+X2       ASSEMBLE CHARACTER 
          SA2    A1+B1       GET NEXT EVEN CHARACTER
          LX6    12          POSITION ASSEMBLY
          NE     B6,B2,WTS7  LOOP FOR 10 CHARACTERS 
          LX1    6           POSITION 9TH CHARACTER 
          BX6    X6+X2       ASSEMBLE CHARACTER 
          SB3    B3+B1       IN+1 = IN+1 + 1
          BX6    X6+X1       ASSEMBLE CHARACTER 
          SB4    B4-B1       DECREMENT FREE BUFFER SPACE
          SA6    X3          STORE WORD 
          SX4    X4+B1       COUNT WORD 
          SX3    B3-B1       IN = IN+1
          NZ     B4,WTS6     LOOP TO LAST CHARACTER OF FULL BUFFER
          EQ     WTS5        CHECK BUFFER POINTERS
  
*         PROCESS LAST @ 9 CHARACTERS.
  
 WTS8     SX7    0           SET ADD-ON CHARACTER 
          EQ     B6,B7,WTS10 IF WORKING BUFFER EMPTY
          SX2    B7-B6       SET CHARACTER COUNT REMAINING
          LX2    59-0        CHECK FOR ODD OR EVEN CHARACTER COUNT
          SB2    54          (B2) = SHIFT COUNT 
          PL     X2,WTS9     IF EVEN CHARACTER COUNT
          SX7    1R 
 WTS9     LX1    X1,B2       POSITION CHARACTER 
          SB6    B6+B1       ADVANCE CHARACTER ADDRESS
          SB2    B2-6        DECREMENT SHIFT COUNT
          BX6    X6+X1       ASSEMBLE CHARACTER 
          SA1    B6          GET NEXT CHARACTER 
          NE     B6,B7,WTS9  LOOP TO END OF BUFFER
  
*         PROCESS LAST WORD.
  
 WTS10    LX7    X7,B2       ADD LAST CHARACTER 
          SA2    A3+B1       SET (A2) = IN
          MX1    -12
          BX6    X6+X7
          SX4    X4+B1       COUNT WORD 
          SA6    X3          STORE LAST WORD
          BX7    -X1*X6 
          SX2    B3          IN = IN+1
          SB6    X4          SET WORD COUNT TRANSFERRED 
          SA3    A3          (X3) = FIRST 
          ZR     X7,WTS11    EXIT 
          SB3    B3+B1       ADVANCE IN+1 
          SB4    B4-B1       DECREMENT FREE BUFFER SPACE
          BX3    X2          (X3) = IN
          SB6    B7          RESET CHARACTER POSITION 
          ZR     B4,WTS5     IF FREE SPACE EXHAUSTED
          MX6    0
          SB6    X4+B1       RESET WORD COUNT 
          SA6    X2+
          SX2    B3+         IN = IN+1
 WTS11    SA1    A2+B1       SET OUT
          SB4    X1 
          EQ     =XWTX=      EXIT 
          SPACE  4
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 WTS=     EQU    /COMCWTS/WTS=
 QUAL$    ENDIF 
          ENDX
