*COMDECK /CHEKDSQ/
*#
*1CD  CHEK$SQ 
*0D   PURPOSE 
*         (1) INFORM THE USER WHETHER LAST I/O ACTIVITY HAS CEASED. 
*         (2) RETURN RL(IN WORDS+UBC) TO USER THRU X0.
*0D   CALL
*                      SB6      <ADR> 
*                   EQ        =XCHEK$SQ/=XCHKR$SQ 
*              <ADR>   BSS      0 
*0D   PARAMETERS
*         A0      FIT ADDRESS.
*         X2      USERS COMPLETION ADDRESS. 
*         B1      1 
*         B6      RETURN ADDRESS. 
*0D   REGISTERS 
*         ALL REQUIRED. 
*         B1,A0,B6 PRESERVED
*         X0 USED TO RETURN RL (IN WORDS+UBC) TO USER.
*0D   OTHER CODE
*         RECALL, CHWR$SQ, ERR$RM 
*0D   ACTION
* 
* 
* 
*#
          TITLE     CHKR AND CHEK 
 CHEK$SQ  CAP.RM    TRANSIENT 
          F.RM      RTJ,X2
          ZR        X2,CHEK 
* CHKR
*#
*0D   1.  ENTER CHKR$SQ...
*         CHECK IF FILE IS COMPLETE .. IF SO STORE THE USERS COMPLETION 
*           ADDRESS IN B6 AND GO TO 4.
*         IF NOT RETURN TO THE USER THRU THE NORMAL B6 EXIT.
*#
          SA2       A0
          OFF.RM    CNF,FETOK 
          F.RM      LOP,X1,-#PU#
          NZ        X1,FETOK
          SA2       =YPFET$RM      IF LAST OP IS WRITE ON CNF , CHECK 
*                                  I/O COMPLETION ON PFET (BAM INTERNAL 
*                                  FET FOR OUTPUT ON TERMINAL)
FETOK     BSS       0 
          LX2       59             POSITION BUSY BIT
          PL        X2,B6EX        FILE COMPLETE.. IF NOT RETURN THRU B6
          F.RM      RTJ,B6         IF SO, GET COMP ADDR TO B6 
          EQ        CKWSI          AND GO DO FURTHER CHECKING.
*#
*0D   2.  HERE THE FILE IS PUT IN AUTO-RECALL,
*         CHWR$SQ IS CALLED TO CONVERT RL (IN CHARACTERS) TO
*           WORDS + UNUSED BIT COUNT, 
*         THESE RESULTS ARE STORED IN X0 FOR RETURN TO THE USER,
*         CONTROL IS RETURNED TO THE USER THRU B6.
*         THIS CODE IS PROCESSED ONLY IF WSI/RSI IS OFF.
*#
* 
 NOTWR    BSS       0 
          OFF.RM    CNF,FETOK2
          F.RM      LOP,X1,-#PU#
          NZ        X1,FETOK2 
          SA2       =YPFET$RM 
FETOK2    BSS       0 
          RCL.RM    A2,AUTO 
          F.RM      RL             GET RL (IN CHAR) 
          BX7       X1
          SB5       RLX0           SET RTN ADR
          EQ        =XCHWR$RM      CONVERT RL TO WORDS + UBC
 RLX0     BX0       X7             STORE RESULTS IN X0 (FOR USER) 
 B6EX     JP        B6             RETURN TO USER.
 CHEK$SQ  TITLE     CHEK$SQ 
 CHEK     BSS 
*#
*0D   3.  ENTER CHEK$SQ...
*         GET THE FET ADR IN A2 AND CONTINUE ON TO 4. 
*#
          SA2       A0             GET FIRST WORD OF FET
* 
* 
*#
*0D   4.  HERE THE FOLLOWING PROCEDURE IS PERFORMED.
*         A. IS THE I/O ACTIVITY SUPP BUFFER I/O (WSI=ON) 
*              NO..GO TO 2. 
*         B. PUT THE JOB IN AUTO-RECALL.
*         C. IS THERE ANY OUTSTANDING ERRORS AGAINST THE FILE...
*              YES.. GO TO 5. 
*         D. CALCULATE RL(WORDS) BY USING .. RL=IN-FIRST
*         E. STORE RL(WORDS) IN X0 (FOR USER) 
*         F. IS THE LAST OPERATION A GETWR
*              NO... INCREMENT RC BY 1, SET FP TO #EOR#, GO TO 5. 
*              YES.. GO TO 6. 
*#
* 
 CKWSI    BSS       0 
          OFF.RM    WSI,NOTWR      IF WSI"ON,GO TO 2. 
          ON.RM     CNF,NOTWR      IF CNF=ON GOTO 2 
          F.RM      LOP,X4,-#PU#   CHECK LOP FOR PUTWR. 
          SX3       34000B         SET ERROR MASK 
          RCL.RM    A2,AUTO 
          SA2       A2             GET FIRST WRD OF FET 
          BX3       X3*X2          MASK CDS FIELD 
          F.RM      FIRST,X0       PICK UP FIRST
          SA1       A1+B1          PICK UP IN 
          IX0       X1-X0          RL(WORDS)=IN-FIRST 
          NZ        X4,GWRCKS      IF LOP=GETWR, GO TO 6. 
          NZ        X3,WRAPUP      IF ERROR GO TO 5 
          SET.RM    FP,#EOR#       FP=EOR 
          INC.RM    RC,1           RC=RC+1
* 
*#
*0D   5.  THIS IS A NORMAL EXIT ROUTINE WHERE ..
*         A. THE CKS FLAG (FIT) IS SET, 
*         B. RL(WORDS) IS CONVERTED TO RL(CHARS) AND STORED 
*                IN THE FIT.  IF DEVICE TYPE IS S/L, UBC IN THE 
*                FET IS USED TO ADJUST RL.
*         C. A BRANCH TO 7 IS MADE IF THERE ARE ANY OUTSTANDING ERRORS
*              AGAINST THE FILE, ELSE 
*         D. CONTROL IS RETURNED TO THE USER THRU B6. 
*#
* 
 WRAPUP   BSS       0 
          SET.RM    CKS,1          SET CHECK FLAG 
          BX1       X0             CONVERT RL(WORDS) TO RL(CHARS) 
          IX2       X0+X0            MULTIPLY 
          LX1       3                  BY 
          IX2       X1+X2                TEN
          ZR        X2,NOUBC       AVOID NEGATIVE CHARACTER COUNT 
          F.RM      UBC 
          SX4       43691          1/6
          IX1       X1*X4 
          AX1       18             /6 
          IX2       X2-X1 
 NOUBC    BSS       0 
          SET.RM    RL,X2          STORE RL IN FIT
          NZ        X3,ERREX       IF ERROR GO TO 7, ELSE 
          JP        B6             RETURN.. (X0=RL(WORDS))
* 
*#
*0D   6.  HERE THE CORRECT FILE POSITION IS DETERMINED
*         BY EXAMINING THE CDS FIELD OF THE FET.
*         A. FOR FP= #EOI#, GO TO D.
*         B. FOR FP= #EOF#, GO TO D.
*         C. FOR FP= #EOR#, INCREMENT RC BY 1, GO TO D. 
*         D. SET FP IN FIT, GO TO 5.
*#
* 
 GWRCKS   BSS       0 
          BX4       X3
          SA2       A2             GET FIRST WRD OF FIT.
          LX2       59-9           POSITION EOI BIT.
          SX3       #EOI#          SET FP TO EOI
          NG        X2,SETFP       IF EOI, GO STORE FP IN FIT.
          LX2       10             RESET CDS
          SX1       30B            SET EOF MASK 
          BX3       X2*X1 
          BX1       X3-X1 
          SX3       #EOF#          SET FP TO EOF
          ZR        X1,SETFP       IF EOF, GO STORE FP IN FIT 
          SX3       #EOR#          SET FP TO EOR
          INC.RM    RC,1           RC=RC+1
* 
 SETFP    BSS       0 
          SET.RM    FP,X3          SET FP IN FIT. 
          BX3       X4
          EQ        WRAPUP         GO TO 5. 
* 
*#
*0D   7.  ERROR EXIT... HERE THE TYPE OF ERROR CONDITION
*         IS DIAGNOSED AND THE APPROPRIATE ERROR CODE IS
*         PASSED ON TO ERR$RM FOR PROCESSING. 
* 
*         ERRORS ARE DIAGNOSED SEPERATELY FOR THE READ SIDE 
*         AND WRITE SIDE BASED ON LOP= #GE# OR LOP= #PU#. 
* 
*         BEFORE RELINQUISHING CONTROL TO ERR$RM
*         A. THE APPROPRIATE ERROR CODE IS PUT IN X6 (DEPENDING ON THE
*            ERROR OPTION *EO* FOR PARITY ERRORS)...
*         B. THE CKS FLAG IS SET IN THE FIT.
* 
*         AFTER PROCESSING, ERR$RM RETURNS CONTROL TO THE USER
*         THRU B6.
*#
* 
ERREX     BSS       0 
          ZR        X4,PWRERR      IF LOP=PUTWR, SKIP 
          SX2       X3-10000B 
          SX6       720B           SET DATA EXCEEDS MLRS(DCE) ERROR 
          ZR        X2,ERRCALL     GO PROCESS ERROR IF SO.
          SX2       X2-4000B
          ZR        X2,TESTEO  IF BOTH (DCE) AND (PE),GO PROCESS ERROR
          SX2       X2+10000B 
          ZR        X2,TESTEO      IF (PE), GO PROCESS ERROR
          SX6       721B+1S17      SET FATAL OS ERROR 
          EQ        ERRCALL 
 TESTEO   BSS       0              NOW CHECK THE ERROR OPTION 
          F.RM      EO,X1,-#T#     GET EO FROM THE FIT
          MX3       58             STRIP OFF THE DISPLAY BIT
          BX1       -X3*X1
          NZ        X1,NOTTERM     BRANCH IF EO=A OR D....
          SX6       3_137B+1S17    EO=T...SET FATAL BIT.. 
          EQ        SETPEF
* 
 NOTTERM  BSS       0              HERE FOR EO=A OR EO=D... 
          SX6       3137B 
          EQ        SETPEF
* 
PWRERR    BSS       0 
          SX6       252B           DEVICE CAPACITY EXCEEDED 
 .OS      IFC       EQ,/"OS.NAME"/KRONOS/ 
          SX2       X3-22000B 
          NZ        X2,NOTL        IF NO EXTENDED ERROR CODE
          SA1       A0+6
          SX2       X1-4007B
          ZR        X2,ERRCALL     IF TRACK LIMIT 
 NOTL     BSS       0 
 .OS      ELSE
          SX2       X3-10000B 
          ZR        X2,ERRCALL     IF SO, GO PROCESS ERROR
 .OS      ENDIF 
          SX2       X3-4000B
          SX6       6_140B+1S17    SET FATAL BIT
          ZR        X2,SETPEF      IF PARITY ERROR
          SX6       721B+1S17      FATAL OS ERROR 
          EQ        ERRCALL 
* 
 SETPEF   BSS       0 
          SET.RM    PEF,1 
* 
ERRCALL   BSS       0 
          SET.RM    CKS,1          SET CHECK FLAG 
          EQ        =XERR$RM       GO PROCESS ERROR 
* END /CHEKDSQ/ 
