*DECK,DCBTOF
          IDENT  DC$BTOF     CONVERTS BINARY INTEGER TO FLOATING. 
          ENTRY DC$BTOF 
  
*#
* *   DC$BTOF - BINARY TO FLOATING PT CONVERSION PAGE 1 
* *   C C CHOW      6/15/74 
* 
* DC  PURPOSE 
*       CONVERT AN 108 BIT BINARY INTEGER INTO NORMALIZED FLOATING PT,
*     SINGLE OR DOUBLE PRECISION, WITH SPECIFIED SCALING FACTOR.
* 
* DC  LANGUAGE
*       CP COMPASS
* 
* DC  ENTRY CONDITIONS
*       DC$CMBF 
*         UPINT = UPPER 54 BITS OF 108 BIT BINARY INTEGER.
*         LOWINT = LOWER 54 BITS OF 108 BIT BINARY INTEGER. 
*         EXPONEN = SCALING FACTOR FOR THE CONVERSION. POSER OF 10. 
*         SIGN = 0 IF +VE. COMPLIMENT OF 0 IF -VE.
*         FLAGDBL = TRUE IF DOUBLE PRECISION RESULT DESIRED.
* 
* DC  EXIT CONDITIONS 
*       NORMAL: 
*         DC$CMBF 
*           SINGLE = SINGLE PRECISION RESULT. 
*           DOUBLE = DOUBLE PRECISION RESULT 2ND WORD.
*           RETURNC = RETURN CODE. = 0. 
*       ERROR:  
*         DC$CMBF 
*           RETURNC = 666B. 
* 
* DC  NON-LOCAL VARIABLES 
*       DC$CM10 - COMMON BLOCK CONTAINING POWERS OF 10. 
* 
* DC  CALLING ROUTINES
*       DC$CONV - CDCS 1.0 CONVERSION ROUTINES. 
* 
* DC  DESCRIPTIONS
*       INITIALIZE "RETURNC" TO 0.
*       SPLIT 108 BIT BINARY INTO 3 PARTS, AND PACKED WITH EXPONENT OF
*     96, 48, AND 0. NORMALIZE THEM.
*       WITH GIVEN SCALING FACTOR "EXPONEN", SCALE AND CONVERT THE DATA 
*     INTO NORMALIZED DOUBLE PRECISION FORM. IF SINGLE PRECISION, ROUND 
*     1ST WORD WITH 2ND.
*       STORE RESULT IN "SINGLE" AND "DOUBLE".
*       IF ERROR DETECTED DURING CONVERSION, SET "RETURNC" AND EXIT.
* 
* DC  ACKNOWLEDGEMENTS
*       THIS ROUTINE IS EXTRACTED AND MODIFIED FROM "QU2" ROUTINE 
*     WITH IDENT "QU2CONV". 
*#
  
  
          ENTRY  DC$FTOF
  
*#
* *   DC$FTOF - FLTNG PT TO FLTNG PT CONVERSION  PAGE 1 
* *   C C CHOW      9/25/74 
* 
* DC  PURPOSE 
* 
*       CONVERT AND SCALE A DOUBLE PRECISION NUMBER (NORMALIZED OR
*     UNNORMALIZED) TO A NORMALIZED SINGLE OR DOUBLE PRECISION NUMBER.
* 
* DC  LANGUAGE
* 
*       CP COMPASS
* 
* DC  ENTRY CONDITIONS
* 
*       PARAMETERS PASSED:  
*         (A1) POINTS TO 1ST PART OF DOUBLE PRECISION SOURCE. 
*         (A1)+1 POINTS TO 2ND PART OF DP SOURCE, OR 0 IF SP SOURCE.
*         (A1)+2 POINTS TO SCALING FACTOR.
*         (A1)+3 POINTS TO TARGET PRECISION INDICATOR:  1 - SINGLE, 
*                                                       2 - DOUBLE. 
* 
* DC  EXIT CONDITIONS 
* 
*       NORMAL: 
*         DC$CMBF 
*           SINGLE = SINGLE PRECISION RESULT. 
*           DOUBLE = DOUBLE PRECISION RESULT. 
*           RETURNC = RETURN CODE = 0.
*       ERROR 
*         DC$CMBF 
*           RETURNC = 666B. 
* 
* DC  CALLING ROUTINE 
* 
*       DC$CONV - CDCS CONVERSION ROUTINES. 
* 
* DC  NON-LOCAL VARIABLES 
* 
*       DC$CMBF 
*         SIGN - SIGN OF NUMBER IN CONVERSION. 0 +VE. COMPLIMENT 0 -VE. 
* 
* DC  DESCRIPTIONS
* 
*       WITH PARAMETERS PASSED, SET 
*         X1 = 0, 
*         X2 = 1ST PART OF DOUBLE PRECISION SOURCE, 
*         X7 = 2ND PART OF DOUBLE PRECISION SOURCE, 
*         B6 = SCALING FACTOR,
*         B3 = TARGET SINGLE/DOUBLE PRECISION INDICATOR.
*       CONTINUE AS IN PROCEDURE "DC$BTOF". 
* 
* DC  ACKNOWLEDGEMENTS
*       THIS ROUTINE IS EXTRACTED AND MODIFIED FROM "QU2" ROUTINE 
*     WITH IDENT "QU2CONV". 
*#
  
  
* 
          USE    /DC$CMBF/   COMMON BLOCK FOR BINARY TO FLOATING CONVER.
 UPINT    BSSZ   1           UPPER 54 BITS OF 108 BIT INTEGER.
 LOWINT   BSSZ   1           LOWER 54 BITS OF 108 BIT INTEGER.
 EXPONEN  BSSZ   1           SCALING FACTOR. POWER OF 10. 
 SIGN     BSSZ   1           SIGN. 0 +VE.  COMPLEMENT 0 -VE.
 FLAGDBL  BSSZ   1           FLAG TO INDICATE DOUBLE PRECISION DESIRED. 
 SINGLE   BSSZ   1           SINGLE PRECISION RESULT. 
 DOUBLE   BSSZ   1           DOUBLE PRECISION RESULT. 
 RETURNC  BSSZ   1           RETURN CODE. 
          USE    /DC$CM10/   POWERS OF 10 COMMON BLOCK. 
* 
*                             THE FOLLOWING IS THE POWERS OF TEN TABLE
*                             THE FIRST 15 ARE THE POWERS FROM 1 TO 15
* 
TEN0      DATA      17204000000000000000B 
REG       DATA      17235000000000000000B 
          DATA      17266200000000000000B 
          DATA      17317640000000000000B 
          DATA      17354704000000000000B 
          DATA      17406065000000000000B 
          DATA      17437502200000000000B 
          DATA      17474611320000000000B 
          DATA      17525753604000000000B 
          DATA      17557346545000000000B 
          DATA      17614520137100000000B 
          DATA      17645644166720000000B 
          DATA      17677215224504000000B 
          DATA      17734430234712400000B 
          DATA      17765536304075100000B 
          DATA      20027065765114320000B 
          DATA      20064341571157602000B 
          DATA      20734734265552025560B 
          DATA      22456047403722377717B 
          DATA      25724473510762300351B 
          DATA      34435247735376716771B 
          DATA      17250000000000000000B 
          DATA      20135531676010000000B 
          DATA      21655155247457665561B 
          DATA      25124315770633631554B 
          DATA      33636750673556710033B 
          DATA      16450000000000000000B 
          DATA      17320000000000000000B 
          DATA      21056166544576650371B 
          DATA      24321553040115601065B 
          DATA      33034617735255702437B 
          DATA      16327151262457542115B 
          DATA      15456373043653242471B 
          DATA      13735207775211722471B 
          DATA      10466735010637062274B 
          DATA      01756003050311261572B 
          DATA      15527025551413537150B 
          DATA      14654513514767414355B 
          DATA      13137232247710714327B 
          DATA      07667112025437131766B 
          DATA      01150623477244210525B 
          DATA      14723630465154737562B 
          DATA      14055130051274405534B 
          DATA      12332173154211025040B 
          DATA      07066405673367561155B 
          DATA      00357757552302121101B 
          USE    0
* 
 DC$BTOF  DATA   0
* 
************************************************************************
*                             INPUT DATA HAS BEEN CONVERTED FROM DISPLAY
*                             CODE AND PLACED IN TWO WORDS OF 54 BITS 
*                             EACH.  UPPERINT HOLDS THE MOST SIGNIFICANT
*                             PART AND LOWERINT THE LEAST.  THEREFORE 
*                             THE DISPLAY CODE VALUE IS NOW CHANGED TO A
*                             108 BIT INTEGER, BASE 10. 
*                             THESE TWO WORDS ARE THEN SPLIT INTO THREE 
*                             WORDS AND PACKED.  THE MOST SIGNIFICANT 
*                             WITH AN EXPONENT OF 96, MIDDLE WITH AN
*                             EXPONENT OF 48, AND THE LEAST WITH AN 
*                             EXPONENT OF  0.  THEY ARE THEN NORMALIZED 
*                             PLACING THEM IN DESCENDING ORDER OF 
*                             SIGNIFICANCE IN  X1, X2, AND X3.
************************************************************************
* 
          SX6    B0 
          SA6    RETURNC     SET RETURN CODE TO 0.
          SA4    EXPONEN
          SA3    UPINT        PUT MOST SIGNIFICANT PART IN  X3
          SA2    LOWINT       SET X2 TO LESS SIGNIFICANT PART 
          SB6    X4           SET B6 TO THE POWER OF TEN, THIS IS A 
*                             COMBINATION OF THE NUMBER OF PLACES TO
*                             THE RIGHT OF THE DECIMAL AND POWER GIVEN
*                             IN THE DISPLAY CODED VALUE
          MX0    22B          BUILD A MASK IN X0  OF 18 BITS
          SA4    FLAGDBL               CONVERSION TYPE
          SB7    DC$BTOF     SAVE LOCATION OF RETURN
          SB1    1            SET B1 = 1
          ZR     X4,SINGLEP            TRUE=SINGLE, FALSE=DOUBLE
          SB3    2
          EQ     DOUBLEP
SINGLEP   SB3    1
DOUBLEP   BSS    0
          BX4    X0*X3        MOVE LEFT 18 BITS OF X3 TO X4 
          IX3    X3-X4        REMOVE LEFT 18 BITS OF X3 SETTING TO ZERO 
          MX0    14B          MASK OF 12 BITS 
          BX5    X0*X2        MOVE LEFT 12 BITS OF X2 TO X5 
          PX7    B0,X2        PACK X7 USING X2 AND B0 (= 0) 
          SB4    60B          SET B4 =  48
          LX3    6            LEFT SHIFT X3  6  BITS
          SB5    B4+B4        SET B5 =  96
          LX5    14B          LEFT SHIFT X5  12 BITS  SO REST IN LOW END
          IX3    X3+X5        ADD LEFT 12 BITS OF X2 FOUND IN X5 NOW
*                             TO X3 
          AX4    52B          RIGHT SHIFT UPPER 18 BITS OF X3 FOUND IN
*                             X4 NOW  42 BITS TO RIGHT
          PX1    B5,X4        PACK X1 USING X4  AND B5 (= 96) 
          SB5    5            SET B5 = 5
          PX2    B4,X3        PACK X2 USING X3 AND B4 (= 48)
          NX1    B0,X1        NORMALIZE X1,  MOST SIGNIFICANT PART
          NZ     X1,DEW       IF X1 NON-ZERO  JUMP TO DEW, VALUE GREATER
*                             THAN    2**96 
          NX1    B0,X2        NORMALIZE X2, PLACE IN X1, THIS IS THE
*                             MOST SIGNIFICANT PART 
          BX2    X7           MOVE X7  TO  X2 
          SX7    B0           SET X7 = 0, SINCE THE LEAST SIGNIFICANT 
*                             PART IS NOW IN  X2
DEW       NX2    B0,X2        NORMALIZE X2, THIS IS EITHER THE VALUE OF 
*                             MIDDLE OR LEAST SIGNFICANCE BUT WILL BE 
*                             TREAT AS THE MIDDLE VALUE 
          DX4    X1+X2        ADD X1,X2 PLACE LOWER HALF OF SUM IN X4 
          NX3    B0,X7        NORMALIZE X7, PLACE IN X3.  THIS IS EITHER
*                             THE LEAST SIGNIFICANT PART OR ZERO
          FX1    X1+X2        ADD X1,X2 PLACE VALUE IN  X1
          SA0    REG+17B      LOCATION OF POSITIVE POWERS 
          ZR     X1,DEZ       JUMP, ZERO RESULT 
          SX6    B6           SET X6 TO POWER OF 10 
          FX2    X3+X4        ADD NORMALIZED LOWEST BITS TO THE LOWER 
*                             48 BITS OF THE MORE SIGNIFICANT BITS
          MX0    70B          MASK,  56 BITS
          SB4    B0-B1        SET B4 = -1 
          DX3    X3+X4        ADD X3,X4 PLACE LOWER HALF OF SUM IN X3 
          PL     X6,DEY       JUMP IF POSITIVE POWER OF 10
          BX4    -X0          COMPLIMENT MASK (LEFT 4 BITS SET  = 15) 
          SA0    REG+36B      LOCATION OF NEGATIVE POWERS 
          IX7    X4-X6        SUBTRACT POWER OF 10 FROM 15
          BX6    X7-X4        SUBTRACT 15 FROM RESULT IN X7 
          UX1    B6,X1        UNPACK X1, B6 CONTAINS ONE"S COMPLIMENT 
*                             REPRESENTATION OF EXPONENT
*                             BIAS FOR NEGATIVE  SCALING
          SB6    B6+200B      ADD 128 TO B6 
          PX1    B6,X1        PACK X1 USING B6 AS EXPONENT
          SB6    B6-60B       SUBTRACT 48 FROM B6 
          PX2    B6,X2        PACK X2 USING B6 AS EXPONENT
          SB6    B6-60B       SUBTRACT 48 FROM B6 
          PX3    B6,X3        PACK X3 USING B6 AS EXPONENT
DEY       BX7    -X0*X6       LOGICAL PRODUCT OF -X0,X6 
*                             POWER BETWEEN   0  AND  15
          AX6    4            RIGHT SHIFT  X6, 4 PLACES 
          SA4    X7+REG-1     DETERMINE LOCATION OF POWER 
          SB6    X6           SET B6 EQUAL TO VALUE LEFT IN X6 AFTER
*                             SHIFT 
          ZR     X7,DEI+1     JUMP, NO FACTOR  10  TO  10**15 
          FX6    X4*X2        MULTIPLY POWER 10 FOR UPPER HALF
          DX0    X4*X1        MULTIPLY POWER 10 FOR LOWER HALF
          FX5    X4*X3        MULTIPLY POWER 10 FOR UPPER HALF
          DX3    X4*X2        MULTIPLY POWER 10 FOR LOWER HALF
          FX2    X0+X6        ADD FIRST UPPER AND LOWER HALVES
          ZR     B0,DEI 
* 
**********************************************************************
*                             THE FOLLOWING SECTION USES THE NEXT    *
*                             POWER OF 10 TO BRING VALUE CLOSER TO   *
*                             THE DESIRED VALUE                      *
**********************************************************************
* 
DEH       DX0    X2*X4
          FX7    X1*X4
          FX6    X3*X4
          OR     X7,PEM6      JUMP, VALUE OUT OF RANGE
          FX3    X0+X6
          FX0    X2*X5
          FX2    X2*X4
          FX3    X3+X0
          FX0    X1*X5
          DX6    X1*X5
          SA5    A5+B5
          FX3    X3+X6
          FX7    X1*X5
          DX6    X1*X4
          DX5    X2+X0
          FX0    X2+X0
          FX3    X3+X7
          FX2    X6+X0
DEI       FX1    X1*X4
          FX3    X5+X3
          DX4    X6+X0
          FX3    X3+X4
          EQ     B6,B0,DEK    JUMP, SCALING COMPLETE
          SX6    B6 
          SX0    B1 
DEJ       BX7    X0*X6        LOGICAL PRODUCT OF POWER MASK AND POWER 
*                             THE FOLLOWING CODE FINDS THE NEXT POWER 
*                             FACTOR TO BE USED 
* 
          SB4    B4+B1        ADD 1 TO B4 
          AX6    1            SHIFT X6, 1 TO RIGHT, THAT IS DROP OFF
*                             LAST POWER FACTOR 
          SA4    A0+B4        ADD B4 TO LOCATION OF THE POWERS IN  A0 
*                             AND PLACE IN X4 
          EQ     B4,B5,PEM6   JUMP, ERROR SCALING  GE  512
          SB6    X6 
          SA5    A4+B5
          NZ     X7,DEH       JUMP, THIS POWER IS A FACTOR
          NE     B6,B0,DEJ    JUMP, MORE FACTORS IN PRODUCT 
DEK       DX4    X1+X2
          FX1    X1+X2
          RX3    X4+X3
          OR     X1,PEM6
          DX2    X1+X3
          FX1    X1+X3
          OR     X1,PEM6      JUMP, VALUE OUT OF RANGE
DEZ       SA3    SIGN         SETS X3 TO ZERO IF POSITIVE, AND TO 
*                             MINUS ZERO (ALL SEVEN"S) IF NEGATIVE
*                             VALUE DESIRED 
          SB4    REG+36B
          SB5    A0 
          NE     B4,B5,DEZB   JUMP, POSITIVE SCALING
          UX1    B4,X1        REMOVE BIAS FROM RESULT 
          SB4    B4-200B
          SX4    B4+1777B 
          PX1    B4,X1
          PL     X4,DEZA      JUMP, NO UNDERFLOW
          SX1    B0 
DEZA      SB4    B4-60B 
          SX4    B4+1777B 
          PX2    B4,X2
          PL     X4,DEZB      JUMP, NO UNDERFLOW
          SX2    B0 
 DEZB     LT     B1,B3,NOR   JMP IF DOUBLE PREC. NO NEED FOR ROUNDING.
          BX4    X2 
          LX4    12D
          PL     X4,NOR      JMP IF LEFT MOST BIT IS 0. NO ROUNDING.
          UX5    B2,X1       GET EXPONENT OF UPPER PART.
          SX5    B1 
          PX5    B2,X5
          FX1    X1+X5       ROUND UPPER PART.
          OR     X1,PEM6     JMP IF OUT OF RANGE. 
 NOR      BX6    X1-X3
          BX7    X2-X3
          SA6    SINGLE 
          SA7    DOUBLE           STORE UPPER AND LOWER WORDS 
          JP     B7 
PEM6      NO
          SX7    666B        SET ERROR FLAG. SIGNIFICANCE LOST. 
          SA7    RETURNC
          JP     B7          RETURN TO CALLER 
* 
 DC$FTOF  DATA   0
          SB7    DC$FTOF     SAVE RETURN LOCATION.
          SX6    B0 
          SA6    RETURNC     SET RETURN CODE TO 0.
          SA2    X1          FLOATING PT SOURCE INTO X2.
          SB1    1
          SA3    A1+B1
          SA4    X3          LEAST SIGNIFICANT PART INTO X4.
          BX7    X4          LEAST SIGNIFICANT PART INTO X7.
          SX6    B0          INITIALIZE SIGN +VE. 
          PL     X2,SCALE 
          MX6    60          SET SIGN -VE.
          BX7    -X7         COMPLIMENT.
          BX2    -X2
 SCALE    BSS    0
          SA6    SIGN        SAVE SIGN. 
          SA3    A3+B1
          SA4    X3          X4 = SCALE FACTOR (POWER OF 10). 
          SB6    X4          B6 = SCALE FACTOR. 
          SB5    5           INITIALIZE LOOP CONTROL. 
          SA3    A3+B1
          SA4    X3 
          SB3    X4          B3 INDICATES SIGLE OR DOUBLE PRECISION.
          SX1    B0          SET MOST  SIGNIFICANT PART TO 0. 
          EQ     DEW
          END 
