*DECK     SSBEBF
PROC SSBEBF (TABLE, ORD, BIT, LEN, RESULT); 
# TITLE SSBEBF - EXTRACT BITFIELD FROM A TABLE.                        #
  
      BEGIN  # SSBEBF # 
# 
**    SSBEBF - EXTRACT BITFIELD FROM A TABLE. 
* 
*     D. G. DEPEW.           81/10/08.
* 
*     PROC SSBEBF (TABLE, ORD, BIT, LEN, RESULT)
* 
*     ENTRY   TABLE = ARRAY FROM WHICH BITFIELD IS TO BE EXTRACTED. 
*               ORD = WORD ORDINAL WITHIN TABLE WHERE BITFIELD STARTS.
*               BIT = STARTING BIT POSITION WITHIN THE WORD (SYMPLESE). 
*               LEN = NUMBER OF BITS TO EXTRACT (RANGE:  1 TO 60).
* 
*     EXIT    RESULT = RESULT OF THE EXTRACTION, CONCATENATED (WHEN A 
*                      WORD BOUNDARY IS CROSSED) AND RIGHT JUSTIFIED
*                      WITH LEADING ZEROES. 
*              TABLE = UNCHANGED. 
*                ORD = INCREMENTED BY 1 IF THE BITFIELD SPANS A WORD
*                      BOUNDARY.
*                BIT = FIRST BIT POSITION AFTER THE EXTRACTED BITFIELD. 
*                LEN = UNCHANGED. 
* 
*     NOTES   RESULT IS UNPREDICTABLE IF LEN IS OUT OF RANGE. 
*             IF THE SPECIFIED BITFIELD SPANS A WORD BOUNDARY, THE
*               OVERFLOW BITS ARE TAKEN FROM THE NEXT CONSECUTIVE CM
*               WORD.  THAT IS, NO CONSIDERATION IS MADE FOR SYMPL
*               PARALLEL ARRAYS OR FOR ARRAYS WITH AN ENTRY SIZE
*               GREATER THAN ONE. 
# 
  
      ARRAY TABLE [00:00] S(1);  #TABLE CONTAINING BITFIELD            #
        ITEM T$WD       U(00,00,60);
  
      ITEM ORD;              #WORD WITHIN TABLE                        #
      ITEM BIT;              #STARTING BIT WITHIN WORD                 #
      ITEM LEN;              #LENGTH OF BITFIELD                       #
      ITEM RESULT  U;        #WORD THAT RECEIVES BITFIELD              #
  
      ITEM THIS;             #NUM OF BITS TO EXTRACT FM SPECIFIED WORD #
      ITEM NEXT;             #NUM OF BITS TO EXTRACT FM FOLLOWING WORD #
  
  
  
  
  
      IF (BIT + LEN) GR 60
      THEN                   # WORD BOUNDARY IS SPANNED                #
        BEGIN 
        THIS = 60 - BIT;
        NEXT = BIT + LEN - 60;
        RESULT = (B<BIT,THIS> T$WD[ORD]  * 2 ** NEXT) 
                   LOR  (B<0,NEXT> T$WD[ORD + 1]);
        ORD = ORD + 1;
        BIT = NEXT; 
        END 
      ELSE                   # WORD BOUNDARY NOT SPANNED               #
        BEGIN 
        RESULT = B<BIT,LEN> T$WD[ORD];
        IF (BIT + LEN) EQ 60
        THEN                 # BITFIELD ENDS ON WORD BOUNDARY          #
          BEGIN 
          ORD = ORD + 1;
          BIT = 0;
          END 
        ELSE                 # SIMPLEST CASE                           #
          BIT = BIT + LEN;
        END 
  
      END  # SSBEBF # 
  
      TERM
