COMCRDS 
COMMON
          CTEXT  COMCRDS - READ CODED LINE TO STRING BUFFER.
 RDS      SPACE  4
          IF     -DEF,QUAL$,1 
          QUAL   COMCRDS
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 RDS      SPACE  4
***       RDS - READ CODED LINE TO STRING BUFFER. 
*         R. S. HORECK.      71/05/19.
*         S. R. MCPHERSON.   74/09/30.
 RDS      SPACE  4
***              RDS READS 1 CODED LINE FROM A CIO BUFFER TO A WORKING
*         BUFFER 1 CHARACTER/WORD.
*         WORDS IN THE CIRCULAR BUFFER ARE UNPACKED AND STORED 1
*         CHARACTER/WORD IN THE WORKING BUFFER UNTIL END OF LINE
*         (0000) BYTE IS DETECTED.  IF THE CODED LINE TERMINATES BEFORE 
*         THE WORKING BUFFER IS FILLED, THE WORKING BUFFER IS PADDED
*         WITH SPACE CODES UNLESS UPON ENTRY THE COMPLEMENT OF THE
*         WORD COUNT OF THE WORKING BUFFER IS USED.  IN THIS CASE,
*         THE REMAINDER OF THE WORKING BUFFER IS NOT SPACE FILLED.
*         IF THE CODED LINE EXCEEDS THE SIZE OF THE 
*         WORKING BUFFER THE EXCESS CHARACTERS ARE IGNORED. 
* 
*         ENTRY  (X2) = ADDRESS OF FET FOR FILE.
*                (B6) = FWA WORKING BUFFER. 
*                (B7) = WORD COUNT OF WORKING BUFFER. 
*                       IF (B7) .LT.  0, IT IS THE COMPLEMENT OF THE
*                       BUFFER LENGTH AND THE STRING BUFFER WILL
*                       NOT BE SPACE FILLED.
* 
*         EXIT   (X1) = 0 FOR TRANSFER COMPLETE.
*                (X1) = -1 IF EOF DETECTED ON FILE. 
*                (X1) = -2 IF EOI DETECTED ON FILE. 
*                (X1) = (B6) IF EOR WAS DETECTED ON FILE BEFORE 
*                             TRANSFER WAS COMPLETED. 
*                (B6) = ADDRESS PLUS ONE OF LAST CHARACTER FROM CODED 
*                             LINE IN WORKING BUFFER. 
*                (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  LCB=, RDX=.
  
  
 +        EQ     RDS1        ENTRY FROM LCB= ON A CONTINUATION READ 
  
*         SPACE FILL REMAINDER OF BUFFER. 
  
 RDS12    EQ     B6,B7,RDS=  IF WORKING BUFFER FULL 
          SX6    1R          * *
          SX4    B7-B6       (X4) = COUNT OF WORDS REMAINING IN BUFFER
          MX3    59          (X3) = -1
          SA6    B6          INITIALIZE (A6)
          SB2    X4 
          LX7    X6          (X7) = * * 
          EQ     B2,B1,RDS=  IF ONLY 1 WORD REMAINING 
          BX2    -X3*X4      (X2) = 0 IF EVEN WORD COUNT
          AX4    1           COUNT/2
          NZ     X2,RDS13    IF ODD WORD COUNT
          SA6    A6+B1       STORE NEXT WORD
          IX4    X4+X3       DECREMENT LOOP COUNT 
          SX2    A3-B1       RESET FET ADDRESS
          ZR     X4,RDS=     IF WORD COUNT = 2
  
 RDS13    IX4    X4+X3       DECREMENT LOOP COUNT 
          SA7    A6+1 
          SA6    A7+B1
          NZ     X4,RDS13    LOOP TO END OF BUFFER
          SX2    A3-1        RESET FET ADDRESS
          EQ     RDS=        EXIT 
  
 +        EQ     RDS1        ENTRY FROM LCB= ON A CONTINUATION READ 
  
 RDS=     PS                 ENTRY/EXIT 
          SA4    RDS12       SET RETURN ADDRESS 
  
          IF     -DEF,B1=1,1
          SB1    1
  
          SA1    X2+4        (B5) = LIMIT 
          PL     B7,RDS0     IF BUFFER TO BE SPACE FILLED 
          SA4    RDS=        SKIP SPACE FILLING THE BUFFER
          SB7    -B7
 RDS0     SA3    X2+B1       (X3) = FIRST, (A3) = ADDRESS OF FIRST
          SB7    B6+B7       (B7) = LWA+1 
          SX4    B6          (X4) = FWA WORKING STORAGE 
          SB5    X1 
  
*         INITIALIZE REGISTERS FOR TRANSFER.
  
 RDS1     SA1    A3+B1       IN 
          SA2    A1+B1       (B4) = OUT 
          SB4    X2 
          IX6    X1-X2       IN - OUT 
          SX1    B5          LIMIT
          PL     X6,RDS2     IF IN \ OUT
          IX6    X1-X2       LIMIT - OUT
 RDS2     ZR     X6,=XLCB=   IF NO FREE BUFFER SPACE
          MX2    -6          (X2) = CHARACTER MASK
          SB3    X6          (B3) = FREE BUFFER SPACE 
  
  
 RDS3     NE     B4,B5,RDS4  IF OUT .NE. LIMIT
          SA1    A3 
          SB4    X1          OUT = FIRST
 RDS4     SX6    B4          RESET OUT
          SA6    A2 
          ZR     B3,RDS1     IF FREE BUFFER SPACE EXHAUSTED 
  
*         READ WORD FROM BUFFER.
  
          SA1    B4 
          SB4    B4+B1
          EQ     B7,B6,RDS10 IF MAXIMUM CHARACTERS PROCESSED
          SB2    B0+         INITIALIZE CHARACTER COUNT 
          NG     X1,RDS5     IF POSSIBLY 10 SEMI-COLONS 
          ZR     X1,RDS8     IF ZERO WORD SKIP UNPACKING
  
*         UNPACK WORD TO WORKING BUFFER 
  
 RDS5     LX1    6
          SB2    B2+B1       BUMP CHARACTER COUNT 
          BX6    -X2*X1      PICK UP CHARACTER
          BX1    X2*X1       ERASE CHARACTER
 RDS6     SA6    B6 
          SB6    B6+B1
          EQ     B6,B7,RDS10 IF MAXIMUM CHARACTERS PROCESSED
          NZ     X1,RDS5     IF MORE CHARACTERS THIS WORD 
          SX6    B2-9 
          SB2    B0          RESET CHARACTER COUNT
          SB3    B3-B1       DECREMENT FREE BUFFER SPACE
          NG     X6,RDS10    IF END OF LINE 
          ZR     B3,RDS7     IF FREE BUFFER SPACE EXHAUSTED 
          SA1    B4          GET NEXT WORD TO BE UNPACKED 
          SB4    B4+B1
          NG     X1,RDS6.1   IF POSSIBLY 10 SEMI-COLONS 
          ZR     X1,RDS10    IF ZERO WORD, END OF LINE
 RDS6.1   NZ     X6,RDS5     IF WORD COMPLETLY PROCESSED
          EQ     RDS6        PROCESS LAST CHARACTER 
  
 RDS7     NZ     X6,RDS3     IF LAST CHARACTER PROCESSED
          SA6    B6          PROCESS LAST CHARACTER 
          SB6    B6+B1
          EQ     RDS3 
  
 RDS8     SB2    X4 
          NE     B6,B2,RDS9  IF AT LEAST 1 CHARACTER IN WORKING BUFFER
          SX6    1R          ASSURE 1 BLANK IN STRING BUFFER
          SB6    B2+B1
          SA6    B2 
 RDS9     SA1    B6-B1       CHECK LAST CHARACTER IN BUFFER 
          NZ     X1,RDS10    IF NOT BEGINNING OF END OF LINE
          SB6    B6-1        ERASE CHARACTER
  
*         SEARCH FOR END OF LINE
  
 RDS10    SA1    B4-1        READ LAST WORD PROCESSED 
          MX7    -12
          BX7    -X7*X1      CHECK FOR END OF LINE
          SB3    B3-1        DECREMENT FREE BUFFER SPACE
          NZ     X7,RDS3     IF END OF LINE NOT FOUND 
          NE     B4,B5,RDS11 IF OUT .NE. LIMIT
          SB4    X3+         OUT .EQ. FIRST 
 RDS11    SA1    A3+B1       RESET IN 
          SB2    X4          FWA WORKING BUFFER 
          SB3    X1+         (B3) = IN
          GE     B6,B2,=XRDX= 
          SB6    B2+
          EQ     =XRDX=      EXIT 
          SPACE  4
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 RDS=     EQU    /COMCRDS/RDS=
 QUAL$    ENDIF 
          ENDX
