*DECK DB$CDEC 
          IDENT  DB$CDEC
          TITLE  DB$CDEC  --  CONVERT BINARY TO DECIMAL, LEADING ZEROS
          COMMENT  CONVERT BINARY TO DECIMAL, LEADING ZEROS 
*#
* *   DB$CDEC -- CONVERT BINARY TO DECIMAL       PAGE  1
* *              WITH LEADING ZEROS.
* *   BOB MCALLESTER                             DATE  04/13/81 
* 
* DC  PURPOSE 
* 
*     CONVERT A BINARY NUMBER TO A DISPLAY CODED DECIMAL NUMBER.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
* 
*     FUNC DB$CDEC(BINARY,LENGTH) C(10);
* 
*     BINARY                 A NUMBER IN INTEGER FORMAT.
* 
*     LENGTH                 THE NUMBER OF CHARACTERS IN THE FIELD THAT 
*                            IS TO RECEIVE THE DISPLAY CODED OUTPUT.
*                            LENGTH MUST BE GREATER THAN ZERO AND 
*                            NO GREATER THAN TEN. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE DECIMAL VALUE IS RETURNED AS A FUNCTION VALUE (X6). 
*     IF THE CONVERTED DECIMAL VALUE EXCEEDS 'LENGTH' DIGITS, 
*     THEN ASTERISKS ARE RETURNED.
* 
* DC  CALLING ROUTINES
* 
*     THIS IS A UTILITY PROCEDURE THAT IS CALLED BY MANY ROUTINES.
* 
* DC  CALLED ROUTINES 
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     THE OUTPUT IS A TEN CHARACTER STRING. 
*     THE CONVERTED DISPLAY CODED NUMBER IS CONTAINED, RIGHT JUSTIFIED, 
*     IN THE LEFT MOST 'LENGTH' CHARACTERS OF THAT STRING.
* 
*     ALL INSIGNIFICANT CHARACTER POSITIONS CONTAIN ZEROS.
*     THIS INCLUDES THE LEADING POSITIONS AND THE REMAINDER OF THE TEN
*     CHARACTERS BEYOND THE FIRST 'LENGTH' CHARACTERS.
* 
*     IF THE NUMBER OF SIGNIFICANT CHARACTERS EXCEEDS 'LENGTH', 
*     THEN A STRING OF TEN ASTERISKS IS RETURNED. 
* 
*     ASTERISKS ARE ALSO RETURNED IF 'BINARY' IS NEGATIVE.
*#
  
  
*     THE CONVERSION ROUTINE IS TAKEN FROM THE COMPASS COMMON DECK
*     COMCCDD.
          SPACE  5,10 
          ENTRY  DB$CDEC
  
DB$CDEC   EQ   *+1S17 
          SB1    1
          SA2    A1+B1       (X2) = LOCATION OF LENGTH PARAMETER
          SA1    X1          (X1) = BINARY NUMBER 
          SA2    X2          (X2) = LENGTH (CHARACTERS) 
          PX1    X1 
          IX3    X2+X2       (X3) = LENGTH *2 
          LX2    3           (X2) = LENGTH *8 
          MI     X1,CDEC2    NEGATIVE NUMBERS ARE NOT CONVERTED 
          SB4    60 
          IX3    X3-X2       (X3) = NEGATIVE BIT LENGTH 
          SB2    X3+B4       (B2) = INITIAL SHIFT COUNT 
          SA2    CDECA       (X2) = .1P48+1 
          SA3    A2+B1       (X3) = 10.P
          SA4    A3+B1       (X4) = INITIAL ASSEMBLY (ZEROS)
          SB3    6
          SPACE  3,10 
*         CONVERSION LOOP 
  
CDEC1     DX6    X1*X2       COMPUTE QUOTIENT (FRACTIONAL PART) 
          FX1    X1*X2                        (INTEGER PART)
          LX4    -6          SHIFT ASSEMBLY 
          UX7    X1          CHECK QUOTIENT 
          FX6    X6*X3       EXTRACT REMAINDER DIGIT
          SB2    B2+B3       ADJUST SHIFT COUNT 
          SX6    X6          CLEAR EXPONENT 
          IX4    X6+X4       ADD DIGIT TO ASSEMBLY
          NZ     X7,CDEC1    LOOP TIL QUOTIENT IS ZERO
  
*         POSITION THE RESULTING DECIMAL NUMBER.
  
          LX4    -6 
          LX6    X4,B2
  
*         CHECK FOR OVERFLOW
  
          GE     B4,B2,DB$CDEC  EXIT, RESULT IS WITHIN BOUNDS 
  
CDEC2     BSS    0
          SA5    STARS
          BX6    X5          RETURN ASTERISKS 
          EQ     DB$CDEC
  
CDECA     CON    0.1P48+1 
          CON    10.P 
          CON    10H0000000000
STARS     CON    10H**********
  
          END 
