*COMDECK /TGETDSQ/
*#
*1CD  TERM$SQ CODE MODULE 
*0D   PURPOSE 
*0        HANDLE ALL GET/PUT COMMUNICATION WITH TERMINALS - CONTAINS TWO
*         ROUTINES TGET$SQ AND TPUT$SQ. 
*0D   CALL
*                SB6     RETURN ADDRESS 
*                EQ      =XTGET$SQ
*         OR
*                SB6     RETURN ADDRESS 
*                EQ      =XTPUT$SQ
*0D   PARAMETERS
*         A0     FIT ADDRESS
*         B1     1
*         B6     RETURN ADDRESS 
*0D   ACTION
*OC   TGET$SQ 
*0        THIS ROUTINE WILL READ SKIP A RECORD FROM A TERMINAL TYPE 
*         DEVICE DIRECTLY TO THE USERS WORKING STORAGE AREA AS
*         DEFINED BY THE WSA FIELD OF THE FIT.  ONLY A MAXIMUM OF 
*         MRL CHARACTERS WILL BE READ - ANY ADDITIONAL CHARACTERS 
*         WILL BE DISCARDED WITHOUT COMMENT.  THE END OF THE RECORD 
*         IS DEFINED BY THE CHARRIAGE RETURN CHARACTER OF THE 
*         TERMINAL. 
*0        IF ANY DATA EXISTS IN THE OUTPUT BUFFER IT IS FLUSHED 
*         BEFORE THE READ.
*0        THIS ROUTINE WILL PROCESS RECORDS IN RT=Z/S FORMATS.
*         FOR RT=S THE READ SKIP IS ISSUED WITH RECALL AND RL IS
*         RETURNED TO THE USER.  FOR RT=Z, IN ADDITION TO THIS, THE 
*         CHARACTERS FROM RL TO FL(MRL) ARE FILLED WITH BLANKS. 
*         BLANKS ARE DEFINED AS 55B IF THE ASCII BITS ARE OFF IN
*         THE FET AND ARE DEFINED AS 0040B IF THE ASCII BITS ARE NON- 
*         ZERO. 
*0        ERROR 721B IS ISSUED AND ERROR EXIT(EX) TAKEN IF FET
*         CODE AND STATUS BITS 11-13 ARE RETURNED NON-ZERO BY CIO.
*0        THE DATA EXIT(DX) IS TAKEN WITH FP=EOP IF THE EOF BIT IS
*         SET IN THE FET (BY A %EOF IN NOS/BE OR A NULL LINE IN NOS). 
*         %EOR IS NOT DETECTABLE, THEREFOR EOS WILL NEVER BE RETURNED.
*0C   TPUT$SQ 
*0        THIS ROUTINE WILL TRANSFER A RECORD FROM THE USER WORKING 
*         STORAGE AREA(WSA) TO A CIRCULAR BUFFER TO BE WRITTEN WHEN 
*         APPROPRIATE TO THE USERS TERMINAL.  ONE CIRCULAR BUFFER IS
*         USED FOR ALL FILES CONNECTED TO THE TERMINAL.  ALL OUTPUT 
*         IS DONE VIA THE FILE ZZZZZOU, UNLESS FIRST FILE WRITTEN IS
*         OUTPUT IN WHICH CASE OUTPUT IS USED.
*0        FOR RT=S, RL CHARACTERS ARE TRANSFERED TO THE BUFFER AND
*         A WRITER IS ISSUED. 
*0        FOR RT=Z AND RL"0, ALL TRAILING BLANKS EXCEPT ONE ARE 
*         REMOVED STARTING AT CHARACTER RL AND THE REMAINING CHARACTERS 
*         ARE TRANSFERRED TO THE BUFFER WHERE A ZERO BYTE IS ADDED
*         WHERE APPROPRIATE WITH ZERO FILL. 
*0        FOR RT=Z AND RL=0, ALL TRAILLING BLANKS EXCEPT ONE ARE
*         REMOVED STARTING AT CHARACTER FL(MRL) AND THE REMAINING 
*         CHARACTERS ARE TRANSFERRED TO THE BUFFER WHERE A ZERO BYTE
*         IS ADDED WHERE APPROPRIATE WITH ZERO FILL.
*0        ONE BLANK IS PRESERVED TO SUPPLY SPACING IN QUESTION AND
*         ANSWER SESSIONS AND TO GUARD TRAILLING COLONS.
*0        A BLANK IS DEFINED AS 55B IF THE ASCII BITS IN THE FET
*         ARE ZERO AND AS 0040B IF THE ASCII BIT S ARE NON-ZERO.
*0        WHEN THE BUFFER IS FULL A WRITE IS ISSUED AND PERIODIC
*         RECALL IS USED TO WAIT FOR ROOM IN THE BUFFER.  IF A GET
*         IS RECIEVED ON A FILE CONNECTED TO THE TERMINAL, THE
*         OUTPUT BUFFER IS FLUSHED WITH A WRITER WITH RECALL BEFORE 
*         THE GET IS PERFORMED. 
*0        ERROR 721B IS ISSUED IF BITS 11-13 OF THE FET CODE AND
*         STATUS ARE RETURNED NON-ZERO BY CIO.
*         ERROR 142B IS ISSUED IF THE RL GIVEN IS GREATER THAN MRL
*         AND MRL IS NON-ZERO.  THE ERROR EXIT(EX) IS TAKEN FOR BOTH. 
*0D   REGISTERS 
*0        THESE ROUTINES USE ALL REGISTERS EXCEPT B7 AND X0.
*         IT PRESERVVES A0,B1,B6. 
*0D   OTHER CODE REQUIRED 
*0    ROUTINES
*         CHWR$RM 
*         ERR$RM
*         MOVE$RM 
*         RM$CIO
*         RM$RCLP 
*         RM$RCLA 
*0    MACROS
*         BUFINC
*         F.RM
*         INC.RM
*         RESTORE 
*         RCL.RM
*         SAVE
*         SET.RM
*         SYSY
*#
          TITLE     TGET$SQ 
          CAP.RM
 TGET$SQ  BSS       0 
 SYS      IFC       NE,/"OS.NAME"/KRONOS/ 
          SA1       PFET
          LX1       59
          NG        X1,QUIET       IF NOT BUSY
          RCL.RM    PFET,AUTO 
 QUIET    BSS       0 
 .MD      IFNE      #BETA#,0
          SX6       102B
          ON.RM     WSAB,=YERR$RM  IF READ TO LCM 
 .MD      ENDIF 
          SA1       PFET+2
          SA3       A1+B1          PICK UP OUT
          IX1       X1-X3 
          ZR        X1,DONE        IF IN=OUT
          SA4       A0             SAVE A0
          SA0       PFET           SET A0 TO PFET FOR WRITER
          SYSY      24B,R 
          SA0       A4             RESTORE A0 
 DONE     BSS       0 
 SYS      ENDIF 
          OFF.RM    SBF,NOSBF      IF NOT SBF FILE
          F.RM      RRL,3 
          SET.RM    MRL,X3         SET MRL TO RL PARAMETER
 NOSBF    BSS       0 
          RJ        CHKBUF
*         SAVE FILE FIRST/LIMIT POINTERS
          SA1       A0+B1 
          BX7       X1
          SA2       A0+4
          SA7       TFIRST
          BX6       X2
          SA6       A7+B1 
          F.RM      PRD,3 
          F.RM      MRL,X7         PICK UP MAX RL 
          SB5       EXIT
          PL        X3,=XCHWR$RM   USE RL IF GET
          F.RM      RPTL,X7        USE PTL IF GETP
          EQ        =XCHWR$RM      CONERT RL
 EXIT     BSS       0 
          SX3       X7             RL IN WORDS
          F.RM      WSA,X6         PICK UP WORKING STORAGE ADDRESS
          SET.RM    FIRST,X6       SET FIRST AT WSA 
          IX7       X6+X3          CALC WSA+MRL 
          SA6       A7+B1          SET IN TO WSA
          SX2       X7+B1          CALC LIMIT=WSA+MRL+1 
          SA6       A6+B1          SET OUT TO WSA 
          SET.RM    LIMIT,X2       SET LIMIT TO WSA+MRL+1 
          SYSY      20B,RCL        ISSUE READSKP WITH RECALL
          SA3       A0             PICK UP CDS AND SAVE IN X3 
          SX1       30B            SET EOF MASK 
          BX2       X1*X3 
          BX1       X2-X1 
          ZR        X1,EOPEX       IF EOF SET, TAKE DX
          F.RM      FIRST,X0       PICK UP FIRST
          SA1       A1+B1          PICK UP IN 
          IX0       X1-X0          RL(WORDS)=I-FIRST SAVE FOR GETWR RETU
          BX1       X0
          BX2       X0
          LX1       B1             RL*2 
          LX2       3              RL*8 
          IX1       X1+X2          RL*10=RL IN CHARACTERS 
* 
*                   X3 STILL CONTAINS CDS(GFET+0) 
*                   X0 IS RL IN WORDS 
* 
          SB2       X1             SAVE RL IN B2
          SX2       34000B         SET ERROR MASK 
          BX3       X2*X3 
          INC.RM    RC,1           INCREMENT RECORD COUNT 
          SX6       721B*2+1
          LX6       59
          NZ        X3,=XERR$RM    IF ERROR RETURNED BY SYSTEM
          ZR        B2,EOSEX       IF RL=0, WE READ A NOS/BE EOS
          F.RM      RT,X2,-#ZT#    ELSE 
          NZ        X2,RETURN      IF RECORD TYPE NOT Z 
          SA1       A0+2           PICK UP IN POINTER 
          SA2       X1-1           PICK UP LAST WORD OF RECORD
          SA3       MBCD           PICK UP MASK FOR DISPLAY CODE
          SB4       60-6+1         SET SHIFT COUNT FOR SIX BIT CHAR 
          F.RM      ASCII 
          ZR        X1,NASCII      IF BCD TERMINAL
          SA3       MASCII         ELSE, PICK UP MASK FOR ASCII(96OR256)
          SB4       60-12+1        SET SHIFT FOR 12 BIT CHAR
 NASCII   BSS       0 
          NZ        X2,BFILL       IF WORD NOT ALL ZERO 
          SB2       B2-10          RL-10 FOR 60/66 BIT TERMINATOR 
          SA2       A2-1           PICK UP PREVIOUS WORD
 BFILL    BSS       0 
          SX5       B1
          IX1       X2-X5          CHANGE TRAILING 0S TO 1S 
          BX1       -X2*X1         PRESERVE JUST TRAILING 1S
          BX5       X1*X3          PRESERVE AS MANY 1S AS BLANKS NEEDED 
          LX3       X5,B4          POS MASK SO 1S ARE IN BOTTOM OF CHAR 
          CX6    X3                NUMBER OF BLANKS IN LAST WORD
          F.RM   ASCII
          ZR     X1,NTASCII 
          LX6       1              DOUBLE FOR ASCII ( 12 BITS ) 
NTASCII   BSS    0
          SB4    X6 
          SB2    B2-B4             ADJUSTED RL
          IX1       X5-X3          MASK IS ALL 1S EXCEPT TOP BITS 
          BX3       X5+X1          OR IN TOP BITS - MASK COMPLETE 
          SA1       A3+B1          PICK UP WORD OF BLANKS 
          BX3       X1*X3          MASK OFF PROPER NO. OF BLANKS
          IX7       X3+X2          OR BLANKS INTO WORD
          SA7       A2             STORE WORD IN WSA
          SB3       A2+B1          INCREMENT WSA POINTER
          SA1       A0+4
          SB5       X1-1           PICK UP LIMIT-1
          EQ        B3,B5,RETURN   IF LAST WORD 
          SA1       A3+B1          PICK UP WORD OF BLANKS 
          BX7       X1
 ADDB     BSS       0 
          SA7       B3             BLANK NEXT WORD
          SB3       B3+B1          INCREMENT WSA POINTER
          LT        B3,B5,ADDB     IF LESS THAN LIMIT-1 
 RETURN   BSS       0 
          SET.RM RL,B2
          SET.RM    LOP,#GE#       SET LOP TO GET 
          SET.RM    FP,#EOR#
          SET.RM    PTL,B2
 RETURN1  BSS       0 
*         RESTORE FILE FIRST/LIMIT POINTERS 
          SA1       TFIRST
          BX7       X1
          SA2       A1+B1 
          SA7       A0+B1          FIRST
          MX5       60-18 
          BX6       X2
          BX7       -X5*X7
          SA7       A7+B1          IN 
          SA7       A7+B1          OUT
          SA6       A7+B1          LIMIT
          JP        B6             EXIT 
 EOSEX    BSS       0 
          SET.RM    FP,#EOS#
          EQ        DATAEXIT
 EOPEX    BSS       0 
          SET.RM    FP,#EOP#
 DATAEXIT BSS       0 
          SET.RM    LOP,#GE#
          F.RM      DX,B2          PICK UP DATA EXIT
          SET.RM    RL,0           CLEAR RL 
          ZR        B2,RETURN1     IF NO DATA EXIT
          SX2       40B            SIMULATE RJ
          SX7       B6
          LX2       21
          BX7       X7+X2 
          LX7       30
          SA7       B2             STORE IN DX
          SB6       B2+B1          GOTO DX+1
          EQ        RETURN1        GO RESET FIRST/LIMIT 
* 
*         NOTE :  
*                   THESE CONSTANTS MUST BE PRESERVED IN THIS ORDER 
*                   FOR CODE TO WORK CORRECTLY
* 
 MBCD     VFD       60/40404040404040404040B
 BLANKS   DATA      10L 
 MASCII   VFD       60/40004000400040004000B
 ABLANKS  VFD       60/00400040004000400040B
 PBSZ     EQU       101B
* END /TGETDSQ/ 
