*COMDECK /REPODSQ/
 REPO$SQ  TITLE     REPOSITION TO START OF PRU
*#
*0        REPO$SQ.
*         MAKE PHYSICAL POSITION AGREE WITH LOGICAL POSITION. 
*         IF THE LAST OPERATION WAS A PUT OR REPLACE, THE BUFFER
*         WAS FLUSHED BY THE SKBL$SQ INITIALIZATION CODE SO THE 
*         PHYSICAL AND LOGICAL POSITIONS AGREE SO JUST RETURN.
*         IF THE LAST OPERATION WAS ENDFILE OR WEOR, THEBUFFER WAS
*         FLUSHED BY THOSE ROUTINES SO PHYSICAL AND LOGICAL POSITIONS 
*         AGREE.  THEREFOR, IF WPN,WRITE BIT OF LOP. IS SET JUST RETURN.
* 
*         MUST PRESERVE X0
*#
 REPO$SQ  BSS       0 
          F.RM      WPN 
          MX3       0 
          NG        X1,REP.XIT
*#
*         IF THE DEVICE IS NON-S/L DEVICE, CHECK THE FET C/S BITS.
*         IF FET C/S = 1X, NO END CONDITION WAS ENCOUNTERED. IF THE 
*         BUFFER IS EMPTY, PHYSICAL (IN) AND LOGICAL (OUT) POSITION 
*         AGREE SO JUST RETURN. OTHERWISE CALCULATE AMOUNT OF DATA
*         IN BUFFER IN PRU-S. 
*         IF FET C/S = 2X AND PAE IS ON, AN EOS WAS ENCOUNTERED BOTH
*         PHYSICALLY AND LOGICALLY SO JUST RETURN.
*         IF FET C/S = 2X AND PAE IS OFF, THE EOS IS IN THE BUFFER
*         BUT HAS NOT BEEN READ LOGICALLY SO TAKE THE SAME PATH AS
*         FOR C/S = 1X. 
*         IF FET C/S = 3X, AN EOP HAS BEEN READ BOTH LOGICALLY AND
*         PHYSICALLY. THUS THE PHYSICAL AND LOGICAL POSITIONS AGREE 
*         SO JUST RETURN. 
*         IF FET INDICATES EOI PHYSICAL LOGICAL POSITIONS AGREE 
*#
          ON.RM     SOL,REP.SL     SEPARATE CODE FOR S/L DEVICES
          SA2       A0             GET FET C/S
          SX7       1030B          EOI/EOF BITS 
          BX2       X7*X2 
          IX7       X2-X7 
          SB2       B0             SET FOR ON PRU BOUNDARY
          SB4       B0             SET FP TO EOR
          ZR        X7,REP.XIT     JUMP IF EOI - NO PRU 
          SX2       X2-20B
          NG        X2,REP.BFR     JUMP IF C/S=1X 
          SB4       #EOP# 
          NZ        X2,REP.XIT     JUMP IF C/S=3X 
          SB4       #EOS# 
          ON.RM     PAE,REP.XIT    JUMP IF EOS READ LOGICALLY+PHYSICALLY
 REP.BFR  BSS       0 
* 
*         CALCULATE NO. OF PRU-S TO BACKSPACE = 
*            (IN-OUT + MOD(BL,PRUSIZ) + PRUSIZE-1) / PRUSIZE
*                IF MOD(BL,PRUSIZ)=0, USE PRUSIZ FOR THIS TERM
*                IF FINAL REMAINDER=0 AND C/S=2X, ADD 1 FOR THE 
*                ZERO-LENGTH PRU THAT WAS READ. 
* 
          F.RM      BL
          SX3       9              MULTIPLY BL+9 BY.1 TO GET
          SA5       TENTH          ROUNDED NUMBER OF WORDS
          IX1       X1+X3 
          FX3       X5*X1 
*         TO DIVIDE BY PRUSIZE, FIND THE RIGHT SHIFT COUNT BY 
*         NORMALIZING THE PRUSIZE AND SUBTRACTING THAT SHIFT COUNT
*         FROM 47.  THIS YIELDS A SHIFT COUNT OF 6,7 OR 9 FOR THE 
*         VALID PRUSIZES OF 100, 200, OR 1000B. 
          F.RM      PRUSIZ
          SB4       47
          NX7       X1,B3 
          SB4       B4-B3 
          AX7       X3,B4 
          LX7       X7,B4 
* RETURN X3 TO SKBL$EOR = DISTANCE FROM BEGINNING OF PRU TO OUT 
          IX3       X3-X7          MOD(BL,PRUSIZ) 
          SB3       X1-1           PRUSIZE-1
*   RETURN BI=DISTANCE FROM PRU TO OUT
          SB2       X3
          F.RM      IN,5
          F.RM      OUT,4 
          BUFSP     X,4,5,5        IN-OUT 
          IX6       X5+X3          IN-OUT+MOD(BL,PRUSIZ)
          F.RM      BCC                                                 004062
          ZR        X1,WRDB                                             004063
          SX6       X6-1           AVOID COUNTING OUT TWICE             004064
 WRDB     BSS       0                                                   004065
          SX4       X6+B3          (IN-OUT+MOD(BL,PRUSIZ))+PRUSIZ-1 
          AX5       X4,B4 
          LX7       X5,B4 
          IX7       X6-X7 
          NZ        X7,REP.CIO
          NZ        X5,REP.NON0    IN=OUT=PRU BOUND,PRU COUNT=0,NO BK/RD
          SB4       B0
          EQ        REP.XIT        AT END OF SHORT PRU
 REP.NON0 BSS       0 
          NZ        X2,REP.CIO
          SX5       X5+B1          ADD 1 FOR 0-LEN PRU
 REP.CIO  BSS       0 
          SET.RM    PAE,1          SET FLAG TO AFTER BOUNDARY 
          SYSY      44B,R,5 
          BOI.RM    REP.XIT        JUMP IF BOV HIT
          SB4       B0
          EQ        REP.XIT        EXIT 
* 
*         SET CONSTANT ONE TENTH LOACL TO /REPODSQ/ 
* 
 TENTH    CON       1S48/10+1 
* 
*#
*         IF THE DEVICE IS AN S/L DEVICE, CHECK THE FET C/S BITS. 
*         IF C/S = 3X AND PAE IS SET, AN EOP HAS BEEN PHYSICALLY
*         AND LOGICALLY READ SO JUST RETURN. OTHERWISE COUNT THE
*         NUMBER OF RECORDS IN THE BUFFER BY CHAINING THROUGH THE S/L 
*         CONTROL WORDS UNTIL THE IN POINTER IS HIT. THEN BACK UP 
*         THAT MANY RECORDS.
*#
 REP.SL   BSS       0 
          SA2       A0             GET FET C/S
          SX7       30B            EOF BITS 
          BX3       X7*X2 
          SB3       B1             INITIALIZE COUNT OF RECORDS IN BUFFER
          LX2       59-9           EOI BIT
          IX3       X3-X7 
          NG        X2,REP.SL2X    NO SEPARATE EOF PRU WHEN EOI SET 
          NZ        X3,REP.SL2X    JUMP IF NOT EOF (NO TAPE MARK PRU) 
          SB4       #EOP# 
          SB3       B3+B1          BACK UP OVER EOP 
          ON.RM     PAE,REP.XIT    LOGICAL=PHYSICAL (EOP) 
 REP.SL2X BSS       0 
          F.RM      IN,4
          F.RM      OUT,5 
          SB4       B0             NO END CONDITION ENCOUNTERED 
*    RETURN X3/B2=BL(BLOCK LENGTH)
          F.RM      BL,X7 
          SX6       10
          IX7       X7-X6          ALLOW FOR S/L CONTROL WORD 
          SB5       REP.SLBL       RETURN ADDRESS 
          EQ        =YCHWR$RM 
 REP.SLBL BSS       0 
          SX3       X7
          F.RM      BLP            ADR OF NEXT SLCW 
          IX5       X5-X1 
          NZ        X5,NOTBB       OUT"BLP
          F.RM      MLRS,5,X5 
           IX5      X3-X5 
          NG        X5,NOTBB        NOT A FULL BLOCK
          SB3       B3-B1          DONT BACK OVER FULL BLOCK
          MX3       0              INDICATE ON BLOCK BOUNDARY 
 NOTBB    BSS       0 
          BX5       X1
          BUFSP     X,1,4,6        AMT DATA IN BUFFER FROM BLP UP TO IN 
          ZR        X6,REP.640
 REP.SLCW BSS       0 
          SA1       X5             LOAD S/L CW
          MX7       30             ISOLATE UNUSED BIT COUNT 
          BX7       -X7*X1
          AX7       24
          SX7       X7-55 
          NG        X7,REP.SL1     NOT GREATER THAN 54, OK
          SX7       B0-B1 
          IX1       X1+X7 
          F.RM      IN,2
          IX7       X2+X7 
          SX2       B1+B0          THROW AWAY THE GARBAGE 4 BITS
          IX6       X6-X2          FROM ROUNDING ON BINARY 9 TRACK TAPES
          SET.RM    IN,X7 
 REP.SL1  BSS       0 
          SX1       X1+B1          RECORD LENGTH + S/L CW 
          IX6       X6-X1          BUFR SPACE 
          SB3       B3+B1          RECORD COUNT 
          BUFINC    X,5,1,5 
          SX7       X6-1           DONE WHEN BUFFER SPACE GOES NEGATIVE 
          PL        X7,REP.SLCW    JUMP IF STILL RECORDS IN BUFFER
 REP.640  BSS       0 
          SET.RM    PAE,1          SET FLAG TO AFTER BOUNDARY 
          ZR        B3,REP.XIT     IF NOTHING TO SKIP 
          SX4       B3
          SYSY      640B,R,4
          ZR        X3,REP.XIT     WE ARE ON A BLOCK BOUNDARY 
          SX3       X3+B1          ALLOW FOR S/L CONTROL WORD 
 REP.XIT  BSS       0 
          SB2       X3             RETURN,B2=DISTANCE TO START OF BLOCK 
          F.RM      FIRST,B5
          SX6       X3+B5          SAVE OUT FOR AFEER READ
          RJ        ADJPTRS        SET CIRC BUFR SIZE TO 1 PRU (OR MBL) 
          MX4       0              INITIALIZE FP
          ZR        B2,DONTRD      IF ON BLOCK/PRU BOUNDARY 
*#
*         ISSUE A READ FOR THE PRU THAT REPO$SQ REPOSITIONED
*         TO (CIO CODE 10B FOR NON-S/L DEVICES AND 260B FOR 
*         S/L DEVICES). 
*#
          F.RM      SOL,X4         IF S/L ISSUE 260,ELSE ISSUE 10 
          SB5       59
          LX1       B5,X4 
          SX2       250B           (X2)=250(S/L) OR 0(NON-S/L)
          AX1       59
          BX2       X1*X2 
          SX2       X2+10B
          SYSY      X2,R
*#
*         IF THE DEVICE IS A PRU DEVICE AND IN EQUALS LIMIT-1 AND CODE
*         AND STATUS IS EOR THAN A ZERO LENGTH PRU WAS READ AND MUST
*         BE BACKED OVER. 
*#
          ON.RM     SOL,DONTRD
          F.RM      IN,5
          F.RM      LIMIT,X2,-1 
          IX7       X5-X2 
          NZ        X7,DONTRD 
          SA5       A0
          LX5       59-4
          PL        X5,DONTRD 
          SYSY      44B,R 
 DONTRD   BSS       0 
*********************************************************************** 
*** THIS IS THE END OF COMMON CODE*** 
*********************************************************************** 
* END /REPODSQ/ 
