*COMDECK  COMCWTW - WRITE WORDS FROM WORKING BUFFER.
 WTW=     CTEXT  COMCWTW - WRITE WORDS FROM WORKING BUFFER. 
 WTW      SPACE  4
          IF     -DEF,QUAL$,1 
          QUAL   COMCWTW
          BASE   D
 WTW      SPACE  4
***       WTW - WRITE WORDS FROM WORKING BUFFER.
* 
*         D. A. CAHLANDER.   70/11/29.
*         T. R. RAMSEY.      72/12/01. MODIFIED FOR SCOPE 3.4.
* 
*         CONTROL DATA  PROPRIETARY PRODUCT.
*         COPYRIGHT CONTROL DATA CORP. 1970.
 WTW      SPACE  4
***              WTW TRANSFERS DATA FROM A WORKING BUFFER TO A CIO
*         BUFFER.  THIS DECK ALSO CONTAINS DCB=, AND WTX=.
* 
*         WHEN CALLING CIO= FROM THIS ROUTINE B6 AND B7 
*         MUST CONTAIN WORKING STORAGE BUFFER ADDRESS,
*         AND NUMBER OF WORDS TO TRANSFER RESPECTIVELY
*         AS ERROR PROCESSING ROUTINES DEPEND UPON
*         THESE REGISTERS.
* 
*         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.
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 1, 2, 3, 4, 5, 6, 7. 
*                A - 1, 2, 3, 4, 6, 7.
* 
*         CALLS  CIO=, RCL=.
  
  
 WTW8     SX6    B3+B4       ADVANCE IN 
          SB3    B3+B4
          SB6    B6+B4
          SB7    B7-B4
          NE     B3,B5,WTW9  IF IN " LIMIT
          SA1    X2+B1       IN = FIRST 
          SX6    X1 
 WTW9     SA6    X2+2        UPDATE IN
          NZ     B7,WTW1     IF NOT END OF TRANSFER 
  
 WTW=     SUBR   0           ENTRY/EXIT 
 WTW1     SA1    X2+3        (B4) = OUT 
          =B1    1
          SA3    X2+2        (B3) = IN
          SA4    A1+B1       (B5) = LIMIT 
          ZR     B7,EXIT.    IF WORKING BUFFER EMPTY
          SB4    X1 
          SA1    X2+B1       (B2) = FIRST 
          SB3    X3 
          SB5    X4 
          SB2    X1 
          SA1    B6          READ FIRST WORD
          NE     B2,B4,WTW2  IF OUT " FIRST 
          SB4    B5 
 WTW2     LT     B3,B4,WTW3  IF NO END AROUND 
          SB4    B5+1 
 WTW3     SB4    B4-B1       CALCULATE FREE DATA SPACE
          SB4    B4-B3       (B4) = TRANSFER LENGTH 
          ZR     B4,WTW10    IF NO ROOM 
          BX7    X1 
          LE     B4,B7,WTW4  IF NOT ENOUGH ROOM 
          SB4    B7 
  
*         INITIALIZE REGISTERS FOR TRANSFER.
  
 WTW4     SA1    A1+B1
          SX4    B4-B1
          MX6    -3 
          SA7    B3 
          BX3    -X6*X4      NUMBER OF ODD WORDS
          AX4    3           NUMBER OF BLOCKS 
          ZR     X3,WTW6     IF NO ODD WORDS
  
*         TRANSFER UP TO 7 WORDS. 
  
 WTW5     SX3    X3-1 
          BX7    X1 
          SA1    A1+B1
          SA7    A7+B1
          NZ     X3,WTW5     LOOP 
  
*         PRE-READ REGISTERS. 
  
 WTW6     ZR     X4,WTW8     IF NO BLOCKS 
          SB5    X2          (B5) = FET ADDRESS 
          SA2    A1+B1
          SB2    B1+B1       (B2) = 2 
          SA3    A2+B1
          SB3    X4          (B3) = BLOCK COUNT 
          SA4    A3+B1
  
*         TRANSFER 8 WORD BLOCKS. 
  
 WTW7     BX6    X1 
          LX7    X2 
          SA1    A3+B2
          SA2    A4+B2
          SA6    A7+B1
          SB3    B3-B1
          SA7    A6+B1
          BX6    X3 
          LX7    X4 
          SA3    A1+B2
          SA4    A2+B2
          SA6    A6+B2
          SA7    A7+B2
          BX6    X1 
          LX7    X2 
          SA1    A3+B2
          SA2    A4+B2
          SA6    A6+B2
          SA7    A7+B2
          BX6    X3 
          LX7    X4 
          SA3    A1+B2
          SA4    A2+B2
          SA6    A6+B2
          SA7    A7+B2
          NZ     B3,WTW7     LOOP 
  
*         WRITE EXIT. 
  
          SA3    B5+B2       READ IN
          SA1    A3+B2       (B5) = LIMIT 
          SA4    B5          CHECK BUFFER STATUS
          SB6    B6+B4
          SB7    B7-B4
          SB3    X3+B4       ADVANCE IN 
          SX6    X3+B4
          SX2    B5 
          SB5    X1 
          LX4    59-0 
          SA3    X2+B1       READ FIRST 
          NE     B3,B5,WTW12 IF IN " LIMIT
          SX6    X3          IN = FIRST 
  
*         TRY TO BUFFER AHEAD.
  
 WTW12    PL     X4,WTW9     IF BUFFER BUSY 
          SA1    X2+3        READ OUT 
          SA6    X2+2        STORE IN 
          SB2    X3          (LIMIT-FIRST)
          IX6    X1-X6       (OUT-IN) 
          SX7    B5-B2
          LX3    X6,B1       2*(OUT-IN) 
          AX6    60          SIGN OF (OUT-IN) 
          BX4    X6-X7       INVERT BUFFER IF IN \ OUT
          IX6    X4-X3       BUFFER SIZE - 2*(OUT-IN) 
          MI     X6,WTW13    IF BUFFER THRESHOLD NOT REACHED
          WRITE  X2 
 WTW13    NZ     B7,WTW1     IF NOT DONE
          JP     EXIT.
  
*         DUMP CIRCULAR BUFFER. 
  
 WTW10    SA1    X2          CHECK BUFFER STATUS
          LX1    59-0 
          MI     X1,WTW11    IF NOT BUSY
          ZR     X1,WTW11    IF BLANK FET 
          RECALL
          JP     WTW1        CONTINUE WRITE 
 WTW11    WRITE  X2 
          JP     WTW1        CONTINUE WRITE 
 WTX      SPACE  4
**        WTX - WRITE EXIT. 
* 
*         IF BUFFER IS BUSY, RETURN.
*         OTHERWISE, WORD COUNT OF BUFFER IS CHECKED, AND A WRITE 
*         FUNCTION IS REQUESTED IF NECESSARY. 
* 
*         ENTRY  (A2) = ADDRESS OF IN.
*                (A3) = ADDRESS OF FIRST. 
*                (A4) = RETURN ADDRESS. 
*                (B3) = IN+1. 
*                (B4) = OUT.
*                (B5) = LIMIT.
*                (X2) = IN
* 
*         EXIT   TO RETURN ADDRESS. 
*                (B2) DESTROYED.
* 
*         CALLS  CIO=.
  
  
 WTX=     SA1    A3-B1       CHECK BUFFER STATUS
          SX6    X2          STORE IN 
          LX1    59 
          SA6    A2 
          PL     X1,WTX1     IF BUFFER BUSY 
  
*         IF BUFFER IS NOT BUSY, CHECK SIZE OF BUFFER.
*         ISSUE WRITE IF THRESHOLD IS REACHED.
  
          SA3    A3          FIRST
          SX6    B4-B3       (OUT-IN+1) 
          SB2    X3          (LIMIT-FIRST)
          LX3    X6,B1       2*(OUT-IN+1) 
          SX7    B5-B2
          AX6    60          SIGN OF (OUT-IN+1) 
          BX4    X6-X7       INVERT BUFFER IF IN+1 \ OUT
          IX6    X4-X3       BUFFER SIZE - 2*(OUT-IN+1) 
          NG     X6,WTX1     IF BUFFER THRESHOLD NOT REACHED
          WRITE  A3-B1
  
 WTX1     SB2    A4          SET RETURN ADDRESS 
          SX2    A3-B1       RESET (X2) 
          JP     B2          RETURN 
 DCB      SPACE  4
**        DCB - DUMP CIRCULAR BUFFER. 
* 
*         IF BUFFER IS BUSY, RECALL AND RETURN. 
*         IF BUFFER IS NOT BUSY, REQUEST WRITE FUNCTION AND RETURN. 
* 
*         ENTRY  (A2) = ADDRESS OF IN.
*                (A3) = ADDRESS OF FIRST. 
*                (A4) = RETURN ADDRESS. 
*                (X2) = IN. 
* 
*         EXIT   TO RETURN ADDRESS - 1. 
*                (B2) DESTROYED.
* 
*         CALLS  CIO=, RCL=.
  
  
 DCB=     SA1    A3-B1       CHECK BUFFER STATUS
          SX6    X2          STORE IN 
          LX1    59 
          SA6    A2 
          MI     X1,DCB1     IF NOT BUSY
          ZR     X1,DCB1     IF BLANK FET 
          RECALL
          SB2    A4-B1       CONTINUE WRITE 
          JP     B2 
  
 DCB1     WRITE  A3-B1
          SB2    A4-B1       CONTINUE WRITE 
          JP     B2 
          SPACE  4
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 WTW=     EQU    /COMCWTW/WTW=
 WTX=     EQU    /COMCWTW/WTX=
 DCB=     EQU    /COMCWTW/DCB=
 QUAL$    ENDIF 
 WTW=     ENDX
