*COMDECK  COMCFG  - CONVERT FLOATING POINT NUMBER TO G (DISPLAY) FORMAT.
          B1=1
          TITLE  CFG - CONVERT FLOATING POINT NUMBER TO G (DISPLAY) FORM
,AT.
          COMMENT CONVERT FLOATING POINT NUMBER TO G (DISPLAY) FORMAT.
 CFG      SPACE  4,8
***       CFG  -  CONVERT FLOATING POINT NUMBER TO G (DISPLAY) FORMAT.
* 
*         R. H. GOODELL.     77/01/24.
* 
*         CFG CONVERTS A BINARY FLOATING POINT NUMBER TO A DISPLAY
*         FORMAT SIMILAR TO A *G20.12* SPECIFICATION IN FORTRAN.
* 
*         PROC  CFG  (I, E, L, A).
* 
*         ITEM  I  R.        ITEM VALUE TO BE CONVERTED.
*         ITEM  E  I.        EXPONENT LETTER INDICATOR - 1 = E, 2 = D.
*         ITEM  L  I.        LENGTH (IN CHARACTERS) OF RESULT.
*         ITEM  A  C (20).   CONVERSION RESULT, LEFT JUSTIFIED. 
 DATA     SPACE  4,8
*         LOCAL DATA. 
  
  
 AB       BSS    2           ASSEMBLY BUFFER FOR CONVERSION 
 EV       BSS    1           EXPONENT VALUE 
 PA       BSS    1           PARAMETER LIST ADDRESS 
 SN       BSS    1           SIGN CHARACTER 
  
 D        EQU    13          NUMBER OF DIGITS IN COEFFICIENT
 CFG      SPACE  4,8
*         CFG  -  CONTROL ROUTINE.
  
  
 CFG      SUBR   =           ENTRY/EXIT 
          SB1    1           (B1) = CONSTANT 1
          SA2    X1          VALUE OF I 
          SX6    A1          SAVE PARAMETER LIST ADDRESS
          NX7    X2          MAKE SURE (I) IS NORMALISED
          SA6    PA 
          NZ,X7  CFG1        IF (I) NOT ZERO
          SA7    EV 
          SB2    B1 
          MX1    0           HANDLE (I) = 0   -   PRINT 0.0 
          SB3    3
          SA7    SN 
          EQ     CFG3 
 CFG1     AX2    59 
          BX1    X7-X2       ABS (I)
          SX3    1R--1R0
          BX7    X2*X3       SN = 0 IF +, OR 1R--1R0 IF - 
          SA7    SN 
          RJ     SCALE       REDUCE (I) TO COEFFICIENT AND EXPONENT 
          SB7    X7-D+1 
          SB3    D+1         (B3) = TOTAL DIGITS INCLUDING DEC POINT
          MI,X7  CFG2        IF EXPONENT < 0 OR > FIELD WIDTH 
          PL,B7  CFG2        THEN GO PROCESS AS -E- FORMAT
          SX6    B0 
          SA6    EV          PROCESS AS -F- FORMAT, NO EXPONENT 
          SB2    X7+B1       (B2) = NUMBER OF DIGITS BEFORE DEC POINT 
          RJ     ROUND       ROUND COEFFICIENT TO D DIGITS
          SB2    B2+X7       ADJUST DIGIT COUNT IF CARRY OVERFLOW 
          SB3    B3+X7
          EQ     CFG3 
 CFG2     SB2    X7          SAVE EXPONENT FOR -E- FORMAT 
          RJ     ROUND       ROUND COEFFICIENT TO D DIGITS
          SX7    B2+X7       ADJUST EXPONENT IF CARRY OVERFLOW
          SB2    B1          ONE DIGIT BEFORE DECIMAL POINT 
          SA7    EV          SAVE EXPONENT VALUE
 CFG3     SA2    SN          ALL PATHS REJOIN HERE
          SA5    CFGZ        (X5) = DISPLAY ZEROS 
          SB6    B0          (B6) = ASSEMBLY WORD INDEX 
          SB7    60-6        (B7) = CHARACTER POSITION
          LX2    -6 
          IX6    X5+X2       (X6) = ASSEMBLY
          ZR,X2  CFG4        IF NO SIGN 
          SB7    B7-6        POSITION AFTER SIGN CHARACTER
 CFG4     RJ     FCD         FORMAT COEFFICIENT DIGITS
          RJ     FEX         FORMAT EXPONENT IF ANY 
          SA6    AB+B6       STORE ASSEMBLY WORD
          SX2    B7-60+6
          SX3    6           CHARACTERS IN LAST WORD = (54-B7)/6
          IX4    X2/X3
          SA1    PA          PARAMETER LIST ADDRESS 
          SX2    B6 
          SX6    10          CHARACTERS IN FIRST WORD(S) = 10*B6
          IX7    X2*X6
          SA2    X1+2        LOC OF L 
          SA1    A2+B1       LOC OF A 
          IX6    X7-X4       TOTAL CHARACTER COUNT
          SA3    AB 
          BX4    X5 
          ZR,B6  CFG5        IF ONLY ONE WORD 
          SA4    A3+B1
 CFG5     SA6    X2          STORE CONVERSION LENGTH INTO L 
          BX7    X3 
          LX6    X4          MOVE ASSEMBLY BUFFER TO A
          SA7    X1 
          SA6    X1+B1
          JP     EXIT.       RETURN 
  
 CFGZ     CON    10H0000000000
 CFG      SPACE  4,8
*         CONSTANT TABLES.
  
  
 CFGA     CON    289
          CON    1.0E+289 
          CON    212
          CON    1.0E+212 
          CON    135
          CON    1.0E+135 
          CON    58 
          CON    1.0E+58
          CON    -18
          CON    1.0E-18
          CON    -96
          CON    1.0E-96
          CON    -173 
          CON    1.0E-173 
          CON    -250 
          CON    1.0E-250 
          CON    0
          CON    3.41757925747345E-227
  
 CFGM     CON    1.0E0       MINUS POWERS OF TEN, ROUNDED  DOWN 
          CON    1.0E-1-1 
          CON    1.0E-2-1 
          CON    1.0E-3-1 
          CON    1.0E-4 
          CON    1.0E-5 
          CON    1.0E-6 
          CON    1.0E-7 
          CON    1.0E-8-1 
          CON    1.0E-9-1 
          CON    1.0E-10-1
          CON    1.0E-11-1
          CON    1.0E-12-1
          CON    1.0E-13
          CON    1.0E-14-1
          CON    1.0E-15-1
          CON    1.0E-16-1
          CON    1.0E-17-1
          CON    1.0E-18
          CON    1.0E-19
          CON    1.0E-20
  
 CFGP     CON    1.0E0       PLUS POWERS OF TEN 
          CON    1.0E1
          CON    1.0E2
          CON    1.0E3
          CON    1.0E4
          CON    1.0E5
          CON    1.0E6
          CON    1.0E7
          CON    1.0E8
          CON    1.0E9
          CON    1.0E10 
          CON    1.0E11 
          CON    1.0E12 
          CON    1.0E13 
          CON    1.0E14 
          CON    1.0E15 
          CON    1.0E16 
          CON    1.0E17 
          CON    1.0E18 
          CON    1.0E19 
          CON    1.0E20 
          CON    1.0E21 
 FCD      SPACE  4,8
**        FCD  -  FORMAT COEFFICIENT DIGITS.
* 
*         ENTRY  (X1) = COEFFICIENT, FIXED POINT WITH 54-BIT FRACTION.
*                (B2) = NUMBER OF DIGITS TO PRECEDE DECIMAL POINT.
*                (B3) = TOTAL NUMBER OF DIGITS INCLUDING DECIMAL POINT. 
*                (X5) = DISPLAY ZEROS.
*                (X6) = CURRENT WORD OF ASSEMBLY. 
*                (B6) = ASSEMBLY WORD INDEX.
*                (B7) = NEXT CHARACTER POSITION, I.E. 54,48,...,6,0.
* 
*         EXIT   (X6, B6, B7)  UPDATED. 
*                (X5) = SPACES. 
  
  
 FCD      SUBR               ENTRY/EXIT 
          MX7    6
          SB3    B3-B2
 FCD1     BX2    -X7*X1      FRACTION 
          IX3    X2+X2       2* 
          LX2    3           8* 
          BX4    X7*X1       DIGIT
          ZR,B2  FCD2        IF ALL DIGITS DONE 
          LX4    B7          POSITION DIGIT 
          IX1    X2+X3       10*
          SB7    B7-6 
          SB2    B2-B1       COUNT DIGITS 
          LX4    6
          IX6    X6+X4       ADD TO ASSEMBLY
          PL,B7  FCD1        IF WORD NOT FULL, LOOP 
          SA6    AB+B6       STORE ASSEMBLY WORD
          SB7    60-6 
          SB6    B6+B1       START NEW WORD 
          LX6    X5 
          NZ,B2  FCD1        LOOP 
 FCD2     ZR,B3  FCD3        IF FRACTION DONE 
          SX2    1R.-1R0+1R 
          RJ     ICH         INSERT DECIMAL POINT 
          SB2    B3-B1       NUMBER OF FRACTION DIGITS
          SB3    B0 
          GE,B2,B1  FCD1     IF ANY 
 FCD3     IX3    X6-X5       PROCEED TO REMOVE TRAILING ZEROS 
          SA1    FCDA 
          SA2    A6 
          NZ,X3  FCD4        IF CURRENT WORD NOT ALL ZEROS
          BX6    X2          BACK UP TO PRECEDING WORD
          SB6    B6-B1
 FCD4     SX2    B1 
          BX3    X6-X5       CHANGE ALL ZEROS TO 00 
          IX4    X3-X2       FIND LOWEST BIT SET
          BX2    -X4+X3 
          SB2    60-5 
          BX1    X1*X2       BUILD MASK FOR TRAILING NON-00 CHARACTERS
          LX2    X1,B2
          IX3    X1-X2
          BX1    X1+X3
          MX3    -6 
          BX1    -X1         MASK FOR TRAILING ZEROS
          CX2    X1 
          SB7    X2 
          AX4    X6,B7       GET RIGHTMOST NON-ZERO CHARACTER 
          BX2    -X3*X4 
          SB2    X2-1R. 
          NZ,B2  FCD5        IF NOT DECIMAL POINT 
          SB7    B7-6        KEEP ONE ZERO AFTER DECIMAL POINT
          AX1    6
          PL,B7  FCD5        IF NOT AT WORD BOUNDARY
          BX6    X5 
          MX1    6
          SB7    60-6        SET NEXT WORD
          SB6    B6+B1
          BX1    -X1
 FCD5     SA5    FCDB        (X5) = SPACES
          BX2    -X1*X6 
          SB7    B7-6 
          BX1    X1*X5       REPLACE TRAILING ZEROS WITH SPACES 
          IX6    X2+X1
          SA6    AB+B6
          PL,B7  EXIT.       IF WORD NOT FULL 
          SB7    60-6 
          SB6    B6+B1       START NEW WORD 
          BX6    X5 
          JP     EXIT.       RETURN 
  
 FCDA     CON    40404040404040404040B
 FCDB     CON    10H
 FEX      SPACE  4,8
**        FEX  -  FORMAT EXPONENT, IF ANY.
  
  
 FEX      SUBR               ENTRY/EXIT 
          SA2    PA          PARAMETER LIST ADDRESS 
          SA1    EV          EXPONENT VALUE 
          SA3    X2+B1       LOC OF SECOND ARGUMENT (E) 
          SX2    1RD
          SA4    X3          VALUE OF E 
          SX3    1R+         SET EXPONENT SIGN
          SB2    X4-2 
          PL,X1  FEX1        IF EXPONENT IS POSITIVE
          SX3    1R-
 FEX1     ZR,B2  FEX2        IF *D* WANTED
          SX2    1RE
          ZR,X1  EXIT.       IF *E* AND VALUE IS ZERO 
 FEX2     RJ     ICH         INSERT CHARACTER D OR E
          SX2    X3 
          RJ     ICH         INSERT CHARACTER + OR -
          BX2    X1 
          SX7    100
          AX2    59 
          BX1    X1-X2       ABS (EV) 
          SB2    X1-10
          LX2    X1 
          MI,B2  FEX4        IF ONLY ONE DIGIT
          IX3    X2/X7,B2    GET HUNDREDS DIGIT 
          ZR,X3  FEX3        IF NO HUNDREDS 
          SX7    100
          IX4    X3*X7       REDUCE VALUE 
          IX1    X1-X4
          SX2    X3+1R0 
          RJ     ICH         INSERT CHARACTER 
 FEX3     BX2    X1 
          SX7    10 
          IX3    X2/X7,B2    GET TENS DIGIT 
          SX7    10 
          IX4    X3*X7       REDUCE VALUE 
          IX1    X1-X4
          SX2    X3+1R0 
          RJ     ICH         INSERT CHARACTER 
 FEX4     SX2    X1+1R0      UNITS DIGIT
          RJ     ICH         INSERT CHARACRER 
          JP     EXIT.
 ICH      SPACE  4,8
**        ICH  -  INSERT CHARACTER. 
* 
*         ENTRY  (X2) = THE CHARACTER, IN 1R FORMAT.
*                (X5) = SPACES. 
*                (X6) = CURRENT WORD OF ASSEMBLY. 
*                (B6) = ASSEMBLY WORD INDEX.
*                (B7) = NEXT CHARACTER POSITION.
* 
*         EXIT   (X6, B6, B7)  UPDATED. 
  
  
 ICH      SUBR               ENTRY/EXIT 
          PL,B7  ICH1        IF WORD NOT FULL 
          SA6    AB+B6       STORE ASSEMBLY WORD
          SB6    B6+B1
          SB7    60-6        START NEW WORD 
          LX6    X5 
 ICH1     SX2    X2-1R       INSERT NEW CHARACTER 
          LX2    B7 
          IX6    X6+X2
          SB7    B7-6        ADJUST CHARACTER POSITION
          JP     EXIT.
 ROUND    SPACE  4,8
**        ROUND  -  ROUND COEFFICIENT FOR DECIMAL DIGITS. 
* 
*         ENTRY  (X1) = COEFFICIENT, 1.0 .LE. VALUE .LT. 10.0.
* 
*         EXIT   (X1) = COEFFICIENT AS UNSIGNED BINARY FIXED (6,54).
*                (X7) = 1 IF ROUNDING CAUSED CARRY, ELSE 0. 
  
  
 ROUND    SUBR               ENTRY/EXIT 
          SX2    D           NUMBER OF DIGITS WANTED
          MX3    -4 
          BX4    -X3*X2      D MOD 16 
          AX2    4           D / 16 
          SA3    CFGM+X4     SMALL PART 
          SA4    RNDA+X2     BIG PART 
          FX2    X3*X4
          RX1    X1+X2       ADD ROUNDING VALUE 
          SX3    2S10        FORCE ROUND UP 
          UX1,B7
          SB6    B7+54       MAKE COEFFICIENT FIXED POINT 
          LX2    X1,B6       WITH 54-BIT FRACTION 
          IX1    X2+X3
          UX4,B7 X1          CHECK FOR OVERFLOW 
          SB6    B7+1777B-10S6
          SX7    B0 
          MI,B6  EXIT.       IF < 10.0
          SX1    B1 
          BX7    X1 
          LX1    54          OVERFLOW, RETURN 1.0 
          JP     EXIT.
  
  
 RNDA     CON    5.0+5       ROUNDING FACTORS 
          CON    5.0E-16+5
          CON    5.0E-32+5
 SCALE    SPACE  4,8
**        SCALE  -  REDUCE GIVEN NUMBER TO COEFFICIENT AND EXPONENT.
* 
*         ENTRY  (X1) = THE NUMBER. 
* 
*         EXIT   (X1) = COEFFICIENT.
*                (X7) = EXPONENT. 
* 
*         THE RESULTS ARE SUCH THAT 
* 
*                      1.0  .LE.  (X1)  .LT.  10.0,  AND
*                      (X1) * 10.0 ** (X7)  = ORIGINAL NUMBER.
  
  
 SCALE    SUBR               ENTRY/EXIT 
          UX6,B2 X1 
          SX2    B2+2360B 
          AX2    8           (EXP+2360B)/256 = SUBSCRIPT FOR CFGA 
          SB2    X2-4 
          SA3    CFGP+1      =10.0
          NZ,B2  SCA1        IF NOT  1E-55 TO 1E+18 
          IX4    X1-X3
          SB3    -20         BEGIN EXPONENT 
          MI,X4  SCA3        IF  1E-55 TO 1E+1
 SCA1     LX2    1
          SA3    CFGA+X2     OFFSET FOR EXPONENT
          SA4    A3+B1       10.0**N / 2**N 
          SB3    X3-20       BEGIN EXPONENT 
          NZ,X3  SCA2        IF NOT 1E-324
          SX3    -324 
          SB3    B3+X3       SPECIAL CASE - MACHINE CAN HOLD
          LX3    48          5E-324 BUT NOT 1E-324
          IX1    X1+X3
 SCA2     FX1    X1*X4       REDUCE NUMBER TO 1E-79 TO 1E+1 
          ZR,X1  SCA6 
 SCA3     SA3    CFGM+19     MULTIPLY BY 1E+20 UNTIL NUMBER 
          SA4    CFGP+20     IS AT LEAST 1E-19
          IX2    X1-X3
          SB3    B3+20       TALLY EXPONENT 
          MI,X2  SCA2        IF STILL LESS THAN 1E-19, LOOP 
          SA3    CFGP+0      =1.0 
          IX4    X1-X3
          PL,X4  SCA5        IF NOT LESS THAN 1E0 
          UX2,B2 X1 
          SX3    B2+54B      NUMBER IS NOW 1E-19 TO 1E+1
          BX4    -X3
          LX3    2           COMPUTE APPROXIMATE LOG10
          IX4    X4-X3         =  - ((EXP+54B)*5)/16 - 2
          AX4    4
          SA2    CFGM+X4-1   =1E-N
          IX3    X1-X2
          MI,X3  SCA4        IF CORRECT LOG10 
          SX4    X4-1 
 SCA4     SA2    CFGP+X4     MULTIPLY NUMBER BY 1E+N
          SB3    B3+X4       TALLY EXPONENT 
          FX1    X1*X2
          BX3    X1          CHECK FOR NUMBER EQUAL TO
          AX3    45          0.9999999999999999ENNN 
          SX2    X3-1.0/1S45
          SX4    B1          IF SO, MULTIPLY BY TEN 
          MI,X2  SCA4 
 SCA5     SX7    -B3         (X7) = EXPONENT
          JP     EXIT.
 SCA6     SX7    B0          NUMBER = MACHINE ZERO
          JP     EXIT.
  
  
          END 
