*DECK COMMDWA 
          IDENT     COMM$WA 
          COMMENT   CRM COMMON WA ROUTINE - FIND PRU OF WA
          LIST      C,F,X 
          TITLE     COMM$WA (FLSH$WA) 
          SST 
          B1=1
          ENTRY     COMM$WA,FLSH$WA 
          BASE      D 
*#
*1CD  COMM.WA 
*0D   PURPOSE 
*0        PERFORM I/O FOR WORD ADDRESSABLE FILES
*0D   CALLING SEQUENCE
*0        EQ        =XCOMM.WA 
*0D   PARAMETERS
*0        A0        FIT ADDRESS.
*         A2        FIT ADDRESS.
*         B1        1.
*         B5        RETURN ADDRESS. 
*         X0, 00-23 REQUIRED NO. OF CHAR(RL) UPON ENTRY.
*         X0, 24-47 0 - WILL BE RETURNED AS RESIDUE OF RL.
*         X0, 48-50 UNUSED                                              T39A  49
*         X0, 51    THIS OPERATION ...                                  T39A  50
*                   0 - GET,                                            T39A  51
*                   1 - PUT.                                            T39A  52
*         X0, 52    SPECIAL CASE BIT ...                                T39A  53
*                   0 - NORMAL,                                         T39A  54
*                   1 - AMOUNT OF DATA REQUESTED IS AN INTEGRAL         T39A  55
*                       NUMBER OF PRUS, AND WA IS ON APRU BOUNDARY.     T39A  56
*         X0, 53    INSUFFICIENT DATA FLAG
*         X0, 54    RETURNED- REQUESTED WA NOT AVAILABLE. 
*         X0, 56    LAST OPERATION ...
*                   0 - GET OR OPEN,
*                   1 - PUT.
*         X0, 57    EOS FLAG ...
*                   0 - UPON ENTRY, 
*                   1 - EOS HIT.
*         X0, 58    EOI FLAG ...
*                   0 - UPON ENTRY, 
*                   1 - EOI HIT.
*         X0, 59    THIS OPERATION ...
*                   0 - NORMAL, WE ARE MOVING DATA, 
*                   1 - WE ARE JUST FIDDLING AROUND WITH W RECORD 
*                   CONTROL WORDS.
*0D   ACTION
*0        X0, 00-23 IS RETURNED AS THE NO. OF CHAR AVAILABLE
*         X0, 24-47 IS RETURNED AS UNFULFILLED PART OF REQUEST. 
*         EOS/EOI FLAGS ARE RETURNED. 
*         B3        ADDRESS OF WA (IN CIO BUFFER).
*         THE CPRU FIELD IS USED AS FOLLOWS...
* 
*         IF AN ATTEMPT WAS MADE TO READ A PRU INTO 
*         THE I/O BUFFER, THAT PRU NUMBER IS STORED 
*         IN CPRU.
*         IF (CPRU) .NE. 0 UPON ENTRY .AND. ANOTHER 
*         PRU MUST BE READ INTO THE BUFFER .AND.
*         THE LAST OPERATION (AS GIVEN BY X0) WAS A 
*         PUT, THEN THE BUFFER IS FLUSHED AND THE 
*         DATA IN THE BUFFER IS WRITEN STARTING AT
*         CPRU, BEFORE THE READ IS ATTEMPTED. 
*         IF (CPRU) .EQ. 0 UPON ENTRY, NO ATTEMPT 
*         WILL BE MADE TO WRITE OUT DATA. 
*0D   REGISTERS 
*0        ALL USED, A02,B15 PRESERVED AS UPON ENTRY 
*0D   OTHER CODE REQUIRED 
*0        TEXT - TXTCRM 
*         SUBROUTINES - NONE. 
*0D   NARRATIVE DESCRIPTION 
*#
*#
*     0.   COLUMNS 61 THRU 72 ARE USED IN THE CODE TO 
*          REMARK WHICH REGISTERS ARE UNAVAILABLE. A NEW LIST 
*          VOIDS THE PRECEEDING ONE.
* 
*          NUMBERS REFER TO THESE COMMENTS. THIS ONE IS 0.
*#
 COMM$WA  CAP.RM
          SAVE
*#
*     1.   FIND WA, PRESERVE IN X2, 30-59.
*#
          MX4       54             (-63D)                   AX0124,B15
          F.RM      WA,1
          BX2       X1             DONT CHANGE THE ABOVE F.RM,
*                                  BECAUSE IT WILL DO 18 BIT ARITHMETIC 
*                                  WHEN SETTING X2. 
          EQ.RM     RT,#WT#,NOSPC,B2  W-REC NOT SPECIAL CASED 
*#                                                                      T39A  58
*0    1.1  IF WA IS ON A PRU BOUNDARY, CHECK FOR SPECIAL CASE. IF NOT 
*          GO TO 2. 
*#                                                                      T39A  61
          BX3       -X4*X2         WA MOD 64
          SB3       X3             IF REM = 1, YEAH.                    T39A  66
          NE        B3,B1,NOSPC                                         T39A  67
*#                                                                      T39A  68
*0    1.2  POSSIBLY A SPECIAL CASE. SEE IF AMOUNT OF DATA REQUESTED 
*          IS AN INTEGRAL NUMBER OF PRUS-S; IF SO SET UP X0 AND GO TO 
*          2.1; ELSE GO TO 2. 
*#                                                                      T39A  71
          MX6       36
          BX7       -X6*X0         RL - CHAR
          SB5       D64 
          EQ        =YCHWR$RM 
 D64      BSS       0 
          SX3       X7             RL - WRDS
          SB3       X7             SAVE NO. WDS REQUESTED FOR SPEC CASE 
          AX7       18             UBC
          NZ        X7,NOSPC       IF NOT MUL WRDS, NO SPECIAL CASE 
          BX3       -X4*X3         RL MOD 64
          NZ        X3,NOSPC       IF REM NOT 0, NO SPEC CASE 
 .MD      IFNE      #BETA#,0,1
          ON.RM     WSAB,NOSPC     IF LCM, CANT DO SPEC CASE
          MX6       1 
          LX6       52+1
          BX0       X6+X0          TURN ON SPEC CASE BIT
 NOSPC    BSS 
*#
*     2.   FIND PRU(WA) - PRU NO. ON FILE INTO WHICH WA FALLS.
*          PRESERVE IN X2, 00-23. 
*#
          IX5       X2-X4          WA+63
          LX2       30
          AX5       6              [(WA+63)/64] = PRU(WA) 
          BX2       X5+X2 
* 
*   (X2) = WA (59-30)  +  PRU(WA) (29-0)
* 
          SB2       59-52          CHECK FOR SPECIAL CASE 
          LX1       B2,X0 
          NG        X1,SPECCASE 
          SX6       255B
          ON.RM     SBF,=XERR$RM   CANT USE BUFFER IF SBF ON
*#
*     3.   IF PRU(WA) IS IN THE BUFFER, NEXT STEP. ELSE GO TO  11 . 
*#
          F.RM      CPRU,3         CURRENT PRU AT FIRST.    AX01234,B15 
          ZR        X3,NOTHERE
          IX7       X5-X3          PRU(WA) - CPRU 
          NG        X7,NOTHERE     PRU(WA) < CPRU _ NOT IN BUFFER.
* 
*          POSSIBLY IT-S THERE
* 
          F.RM      FIRST,B4
 COULDBE  BSS       0 
          F.RM      IN,B2 
          SX7       B2-B4 
          IX7       X7-X4          IN-FIRST+63. 
          AX7       6              [(IN-FIRST+63)/64] = NO. OF PRUS 
*                                  IN CIO BUFFER. 
          IX7       X7+X3          NO. OF LAST PRU IN BUFFER + 1. 
          IX7       X5-X7          PRU(WA)-(LPRU+1) 
          NG        X7,INTHERE     PRU(WA)<LPRU+1 _ PRU(WA) IN BUFFER.
* 
*         MAYBE, MAYBE NOT. IF FILE IS BUSY, WAIT AND CHECK 
*         AGAIN.
* 
          SA1       A0
          LX1       59
          NG        X1,NOTHERE     DEFINITELY NOT.
          RCL.RM    A0,AUTO 
*                                                           AX02,B1245
          EQ        COULDBE 
* 
 INTHERE  BSS       0 
*#
*     4.   PRU(WA) IN BUFFER. 
*0         JUMP TO THIS TAG EXPECTS ... 
*                   AX02, 
*                   B2 = IN,
*                   B4 = FIRST. 
*0         FIND ADDRESS OF WA IN BUFFER, TO B3. 
*#
          SX6       63
          F.RM      CPRU,3
          MX5       30
          LX3       6              CPRU*64
          IX6       X3-X6          CPRU*64-63 = WA(CPRU)
          LX2       30
          BX5       -X5*X2         WA 
          IX5       X5-X6          WA-WA(CPRU)
          SB3       X5+B4          ADDRESS(WA)=WA-WA(CPRU)+FIRST
          LX2       30
*                                                           AX02,B1235
*#
*     5.   IS THERE ENOUGH ROOM IN THE BUFFER TO ACCOMODATE 
*          THE WHOLE REQUEST. IF YES, RETURN. ELSE NEXT 
*          STEP.
*#
* 
*          IF ADDRESS(WA) < ADDRESS(IN), ITS POSSIBLE 
* 
          GE        B3,B2,NOTAVAIL WA REQUESTED IS NOT AVAILABLE
* 
 POSIBL   BSS       0 
          F.RM      IN,3,B2 
 RESETRL  BSS       0 
*#
*     6.   IF AMOUNT AVAILABLE IS LESS THAN AMOUNT REQUESTED, 
*          SET AMOUNT AVAILABLE IN RL PART OF X0 AND WHATS NOT
*          IN RESIDUE PART OF X0. 
*#
          SX4       B2-B3          AMOUNT ACTUALLY AVAILABLE. 
          MX1       36                                      AX012,B1235 
          PL        X4,AMTOK
          MX4       0              A NEGATIVE AMOUNT IS ZERO. 
 AMTOK    BSS       0 
          IX5       X4+X4          AVAIL*2
          LX4       3              AVAIL*8
          IX4       X4+X5          (AVAIL*10)-BCC 
          BX3       -X1*X0         REQUESTED RL 
          IX5       X4-X3          AVAILABLE - REQUESTED
          NG        X5,RETRY       AVAIL .LT. REQUESTED 
* 
*          AVAIL .GE. REQUEST, ALL OK, JUST EXIT. 
* 
 EXITC    BSS       0 
*#
*     10.  RETURN 
*#
          RESTORE 
          JP        B6
 RETRY    BSS       0 
*          IF FILE BUSY, WAIT AND TRY AGAIN.
          BX5       -X5 
*          ELSE, REFORMAT X0, AND CHECK END CONDITIONS. 
          BX0       X1*X0 
          LX5       24
          IX5       X5+X4 
          BX0       X0+X5          X0 REFORMATTED 
          NZ        X4,EXITC
 ENDCON   BSS       0 
*#
*     7.   CHECK FOR EOI. IF HIT, SET INDICATOR IN X0 
*#
          F.RM      CDS4,3
          SX1       B1+B1 
          BX3       -X1*X3         REMOVE BINARY BIT
          SX5       01031B                                              T39A 229
          IX5       X3-X5                                               T39A 230
          NZ        X5,NEXTCK                                           T39A 231
          MX1       1 
          LX1       59
          BX0       X0+X1 
          EQ        EXITC 
 NEXTCK   BSS       0 
*#
*     8.   CHEK FOR SCOPE END-OF-RECORD. IF HIT, SET EOS FLAG IN X0.
*#
          LX3       59-4
          PL        X3,EXITC
          MX1       1 
          LX1       58
          BX0       X0+X1 
          EQ        EXITC 
 NOTAVAIL BSS       0 
          MX1       1 
          LX1       55
          BX0       X1+X0 
          EQ        RESETRL 
 NOTHERE  BSS       0 
*#
*     11.  PRU REQUIRED NOT IN THE BUFFER. IF LAST OPERATION
*          WAS A PUT OR PUTP, GO TO 13  TO GET THAT DATA OUT. 
*          ELSE CONTINUE. 
*#
          BX4       X0
          SB6       NOFLSHR 
          LX4       3 
          NG        X4,FLSH$
 NOFLSHR  BSS       0 
*#                                                                      T39A  85
*     11.1
*         PRESENT WA LE EOIWA, GO TO 11.2; ELSE                         T39A  88
*         SET NO DATA + EOI STATUS AND RETURN.                          T39A  89
*#                                                                      T39A  90
*#                                                                      T39A  96
*0    11.2        WA .LT. EOIWA MEANS WE CAN ELIMINATE READ/ALLOCATION
*         AT EOI ENTIRELY UNLESS THIS OP A GET
*0        WE DO THIS BY SETTING CPRU TO PRU(WA) TO MAKE THINGS LOOK     T39A  99
*         LIKE THE BUFFER IS AVAILABLE FOR DATA STUFFING. THEN WE MOVE  T39A 100
*         THE IN POINTER (LIMIT OF WHERE WE CAN PUT STUFF IN) TO THE    T39A 101
*         FIRST + THE MINIMUM OF RL AND BFS-1.                          T39A 102
*#                                                                      T39A 103
          MX6       30                                                  T39A 104
          F.RM      EOIWA,5                                             T39A 105
          BX3       X2*X6          WA                                   T39A 106
          LX3       30                                                  T39A 107
          IX4       X3-X5          WA - EOIWA 
          BX3       -X6*X2         PRU(WA)
          NG        X4,READPRU     JUMP IF WA.LT.EOIWA
*#
*     12.  READ PRU(WA) INTO BUFFER, AND SET CPRU TO PRU READ.
*#
          AX5       6 
          F.RM      CPRU,X3 
          IX6       X3-X5 
          PL        X6,NOSKIP 
*         FILE MUST BE REPOSITIONED TO EOI
          SX5       17B 
          MX1       42
          BX6       -X1 
          BX4       X2             SAVE X2
          SYSY      240B,RCL,6,5
          BX2       X4             RESTORE X2 
 NOSKIP   BSS       0 
          MX6       1                                                   T39A 160
          LX6       58+1                                                T39A 162
          BX0    X0+X6                                                  T39A 163
          MX6       36             RESTRUCTURE X0 
          BX1       -X6*X0
          IX0       X0-X1 
          LX1       24
          BX0       X0+X1 
          EQ        EXITC          RETURN 
 READPRU  BSS       0 
          SET.RM PAE,0                                                  T39A 166
          MX1       30
          BX3       -X1*X2
          BX5       X2             SAVE X2 FOR AWILE
          SET.RM    PRUNO,X3       STORE PRU NO FOR READ   AX026,B1235
          F.RM      FIRST,4 
          SET.RM    IN,X4 
          SET.RM    OUT,X4
          SYSY      10B,RCL 
          BX2       X5             RESTORE X2 
* 
                                                            AX02,B1235
          SET.RM    CPRU,X3 
          SA3       A0
          SX1       36000B         *SCAN CIO STATUS CODE FIELD
          BX7       X1*X3          **FOR CIO ERRORS 
          NZ        X7,CIOERR 
          F.RM      IN,B2 
          F.RM      FIRST,3,B4
          EQ        INTHERE 
* 
*         EVALUATE CIO ERROR- ISSUE PARITY/OP SYSTEM ERROR MESSAGE
* 
 CIOERR   SX3       X7-4000B
          BX7       X0             *GET A COPY OF COMMDWA CONTROL WORD
          CRMEP     ES=0721B,FNF=#YES#,IFOP=(NZ X3)  *OP SYSTEM ERROR 
          LX7       59-56 
          CRMEP     ES=0135B,FNF=#YES#,IFOP=(NG X7)  *WRITE PARITY ERROR
          CRMEP     ES=0136B,FNF=#NO#                *READ PARITY ERROR 
*#
*    12.1 THIS IS THE SPECIAL CASE OF *WA* ON A PRU BOUNDARY AND
*         REQUESTED AMOUNT IS AN INTEGRAL NUMBER OF PRU-S. FIRST CHECK
*         IF THE LAST OPERATION WAS A PUT.  IF SO, BRANCH TO FLSH$ TO 
*         FLUSH THE BUFFER. 
*#
 SPECCASE BSS       0 
          BX1       X0
          LX1       59-56 
          PL        X1,SCFLRET     JUMP IF LAST OP NOT PUT
          SB6       SCFLRET 
          EQ        FLSH$          HOPE B3 IS NOT DESTROYED BY FLSH$WA
*#
*    12.2 IF READING PAST EOI, BRANCH TO *NOSKIP* (12+) TO SET EOI BIT
*         AND RETURN TO GET$WA. 
*         IF WRITING MORE THAN A BUFFER SIZE BEYOND EOI, BRANCH TO
*         *NOTHERE* (11) TO HANDLE EOI ALLOCATION.
*         IF WRITING LESS THAN A BUFFER SIZE BEYOND EOI, ISSUE A WRITE
*         TO EXTEND EOI JUST UP TO REQUESTED WA AND UPDATE EOIWA. 
*         IF WRITING EXACTLY AT EOI, SET UP REGISTERS AND UPDATE EOIWA. 
*         OTHERWISE, CONTINUE.
*#
 SCFLRET  BSS       0 
          SB2       59-51+1        SAVE THIS OPERATION BIT IN B4
          MX6       59
          LX1       B2,X0 
          BX6       -X6*X1
          MX4       30
          SB4       X6
          BX3       -X4*X2         PRU(WA)
          BX4       X4*X2 
          F.RM      EOIWA,5 
          LX4       30             WA 
          IX6       X4-X5          WA - EOIWA 
          NG        X6,SCNOTEOI    JUMP IF NOT PAST EOI 
          ZR        B4,=XNOSKIP    GET PAST EOI 
          MX1       42
          SX7       17B            SET LEVEL NUMBER 
          BX1       -X1            SET SKIP COUNT 
          BX4       X2             SAVE X2
          SYSY      240B,RCL,1,7   SKIP TP EOI
          BX2       X4             RESTORE X2 
          F.RM      BFS 
          IX1       X6-X1 
          PL        X1,NOTHERE     IF .GT. BFS TO ALLOCATE
          ZR        X6,ATEOI
          IX5       X5+X6          INCREMENT EOIWA BY AMT NOW WRITING 
          F.RM      FIRST          SET BUFFER PTRS TO ALLOCATE TO WA
          IX6       X6+X1 
          SET.RM    OUT,X1
          SA6       A7-B1          IN 
          SET.RM    PRUNO,0 
          BX4       X2             SAVE X2 AROUND CIO.RM CALL 
          SYSY      14B,RCL        WRITE TO WA
          BX2       X4             RESTORE X2 
 ATEOI    BSS       0 
          MX3       0              WRITE AT EOI - SET PRUNO=0 
          SB7       014B               CIO CODE FOR WRITE 
*#
*    12.3 UPDATE PRU NUMBER . 
*#
 SCNOTEOI BSS       0 
          SET.RM    PRUNO,X3
*#
*    12.4 CALCULATE NEW FET POINTERS (FIRST,IN,OUT,LIMIT) FROM WSA AND
*         RL AND STORE IN FET.  STORE CIO FUNCTION CODE IN REGISTER.
*#
          BX4       X2
          RCL.RM    A0,AUTO 
          BX2       X4
          F.RM      UWD,X6
          F.RM      FIRST,X4
          SET.RM    PIN,X4         SAVE FIRST 
          SX4       B3+B1 
          IX4       X6+X4 
          SET.RM    FIRST,X6       FIRST=WSA
          SET.RM    OUT,X6         OUT=WSA
          SET.RM    LIMIT,X4
          ZR        B4,SCGET
          SX4       X4-1
          SET.RM    IN,X4          IN=LIMIT-1 
          SB2       30
          AX4       B2,X2          GET WA 
          SX7       B3             REQUEST SIZE 
          IX4       X4+X7          WA+RQS 
          IX7       X5-X4          EOIWA-(WA+RQS) 
          PL        X7,DINC        JUMP IF NOT WRITE PAST EOI 
          SET.RM    EOIWA,X4       SET NEW EOIWA
 DINC     BSS       0 
          ZR        X3,SCCIO           JUMP IF WRITE
          SB7       214B               REWRITE
          EQ        SCCIO 
 SCGET    BSS       0 
          SET.RM    IN,X6          IN=WSA 
          SB7       010B           CIO CODE FOR READ
*#
*    12.5 ISSUE CIO REQUEST.
*#
 SCCIO    BSS       0 
          SYSY      B7,RCL         ISSUE CIO FC B7
*#
*    12.6 IF WRITING AND IN AND OUT ARE NOT EQUAL, ISSUE ANOTHER CIO
*         WRITE TO EMPTY THE BUFFER (WRITE PAST EOI). 
*#
          F.RM      IN,X4 
          F.RM      OUT,X5
          IX5       X4-X5 
          ZR        X5,SCRESET     JUMP IF ALL DATA READ/WRITTEN
          ZR        B4,SCRSET1     JUMP IF READ 
          SYSY      14B,RCL        FINSIH WRITE SINCE IN .NE. OUT 
*#
*    12.7 RESET FET POINTERS BACK TO ORIGINAL CIRCULAR BUFFER.
*         ZERO CPRU TO FORCE NEXT OPERATION TO REREAD SINCE PHYSICAL
*         FILE POSITION DOES NOT AGREE WITH CIRCULAR BUFFER CONTENTS. 
*#
 SCRESET  BSS       0 
          F.RM      PIN,X6         FIRST=IN=OUT=PIN 
          F.RM      BFS,X4,+1      BFS+1
          IX4       X6+X4          LIMIT=FWB+BFS+1
          SET.RM    FIRST,X6
          SET.RM    IN,X6 
          SET.RM    OUT,X6
          SET.RM    LIMIT,X4
          SET.RM    CPRU,0
          SA3       A0
          SX1       36000B         *SCAN CIO STATUS CODE FIELD
          BX7       X1*X3          **FOR CIO ERRORS 
          NZ        X7,CIOERR 
          SB2       B0
          NZ        B4,EXITC       JUMP IF PUT
          MX1       36
          IX7       X5+X5          CONVERT WORDS TO CHARS 
          LX5       3 
          BX3       -X1*X0         ORIGINAL RL
          IX4       X5+X7          NO. CHARS READ 
          IX5       X3-X4          RESIDUE
          ZR        X5,EXITC       JUMP IF ALL DATA READ
          BX0       X1*X0              ALL DATA NOT READ - REFORMAT X0
          LX5       24
          BX6       X4+X5 
          BX0       X0+X6 
          EQ        ENDCON         JUMP TO CHECK END CONDITIONS 
SCRSET1   BSS       0 
          SB3       X5             WORDS READ 
          EQ        SCRESET 
  
* CALL /REWDWA/ 
*CALL /REWDWA/
  
 FLSH$    F.RM      IN,B2 
* CALL /FLSHDWA/               /FLSHDWA/*COMDECK /FLSHDWA/
*CALL /FLSHDWA/ 
          END 
