*DECK C$R4TRU 
          IDENT  C$R4TRU
          TITLE  C.R4TRU - TRUNCATE R4 VALUE TO INTEGER 
* 
*      C.R4TRU - TRUNCATE R4 VALUE TO INTEGER 
* 
*         INPUT 
*              DPCOMP2 REGISTER VALUE KNOWN AS *IN*:  
*                X1 = MOST  SIG. PART OF DPCOMP2 TO BE TRUNCATED
*                X2 = LEAST SIG. PART OF DPCOMP2 TO BE TRUNCATED
*         OUTPUT
*              DPCOMP2 REGISTER VALUE KNOWN AS *OUT*: 
*                X3 = MOST  SIG. PART OF TRUNCATED DPCOMP2
*                X4 = LEAST SIG. PART OF TRUNCATED DPCOMP2
* 
 L1       BSS    0           HERE TO EXIT WITH NO CHANGE
          BX3    X1          COPY *IN* TO *OUT* 
          BX4    X2 
          ENTRY  C.R4TRU
 C.R4TRU  DATA   0           ENTRY/EXIT WORD
          UX3    B2,X1       GET PROPOSED SHIFT VALUE 
  
*      REPRESENTING VALUES IN OCTAL DIGITS, CONSIDER
*       X1 = ABCDEFGHIJKLMNOP * 2**B2, AND
*       X2 = QRSTUVWXYZ123456 * 2**(B2-48). 
* 
*      BELOW INDICATES VARIOUS VALUES OF B2 FOR DIFFERENT OCTAL POINTS
*      A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6
*     - - - - - - - - - - - - - - - -   + + + + + + + + + + + + + + + + 
*  B  4 4 4 3 3 3 3 2 2 2 1 1 1               1 1 1 2 2 2 3 3 3 3 4 4 4 
*  2  8 5 2 9 6 3 0 7 4 1 8 5 2 9 6 3 0 3 6 9 2 5 8 1 4 7 0 3 6 9 2 5 8 
* 
*       SO B2 = -49 MEANS THE VALUE IS AT LEAST 0.25 BUT LESS THAN 0.5
*          B2 = -48 MEANS THE VALUE IS AT LEAST 0.5 BUT LESS THAN 1.0 
*          B2 = -47 MEANS THE VALUE IS AT LEAST 1.0 BUT LESS THAN 2.0 
*          B2 = -46 MEANS THE VALUE IS AT LEAST 2.0 BUT LESS THAN 4.0 
*          B2 =  -1 MEANS THE VALUE HAS 1 FRACTION BIT IN MOST SIG. PART
*          B2 =   0 MEANS THE VALUE IS EXACTLY IN MOST SIG. PART
*          B2 =  +1 MEANS THE VALUE HAS 1 INTEGER BIT IN LEAST SIG. PART
*          B2 = +48 MEANS THE VALUE IS EXACTLY BOTH PARTS 
*          B2 = +49 MEANS THE VALUE MISSES 1 INTEGER BIT
* 
*      OUR TASK IS TO TAKE *IN* WHOSE B2 LIES BETWEEN +48 AND -48 
*       AND TRUNCATE ALL BITS TO THE RIGHT OF THE BINARY POINT. 
* 
*      IF -48 < B2 <= 0 THEN
*       WE THROW AWAY THE LEAST SIGNIFICANT PART OF *IN*
*       AND CONVERT THE MOST SIGNIFICANT PART TO AN INTEGER (AND BACK)
* 
*      IF 0 < B2 < 48 THEN
*       WE CONVERT THE LEAST SIGNIFICANT PART OF *IN* TO AN INTEGER,
*       CONVERT IT BACK, AND
*       FORM A DPCOMP2 FROM BOTH PARTS. 
  
  
*      IF CONVERSION TO INTEGER IS DONE BY MULTIPLYING BY A POWER OF TWO
*       (INSTEAD OF DIVIDING), SET *OUT* TO *IN* AND EXIT 
  
          SB3    48 
          GE     B2,B3,L1 
  
*      IF THE VALUE IS LESS THAN 1.0, 
*       SET *OUT* TO ZERO AND EXIT
  
          SB3    -48
          LE     B2,B3,L2 
  
*      IF *IN* IS SINGLE PRECISION, GO HANDLE IT
  
          LT     B2,B0,L3 
  
*      THE FRACTION PART OF *IN* IS ENTIRELY IN LEAST SIG. PART 
  
*      CONVERT LEAST SIGNIFICANT PART TO INTEGER
  
          UX2    X2,B2
          LX2    X2,B2
  
*      CONVERT IT BACK TO REAL
  
          PX2    X2,B0
          NX2    X2 
  
*      PUT BOTH PARTS TOGETHER AS DPCOMP2 
  
          FX3    X1+X2
          DX4    X1+X2
  
          EQ     C.R4TRU
  
  
  
  
*      *IN* WAS LESS THAN 1.0 - EXIT WITH ZERO VALUE
  
 L2       BSS    0
          MX3    0
          BX4    X0-X0
          EQ     C.R4TRU
  
  
  
  
*      *IN* WAS SINGLE PRECISION
  
 L3       BSS    0
          LX3    X3,B2       CONVERT SINGLE-PRECISION TO INTEGER
          BX2    X0-X0       SET X2 = 0 (WHICH IS 0.0)
          PX1    X3          CONVERT INTEGER TO MOST SIGNIFICANT PART 
          NX3    X1 
          DX4    X3+X2       SET EXPONENT IN LEAST SIGNIFICANT PART 
          EQ     C.R4TRU
  
          END 
