*DECK S$LNGSM 
          IDENT  S$LNGSM
          TITLE  S$LNGSM -  CONVERT LARGE INTEGER TO DISPLAY
  
          MACHINE  ANY,I
  
          COMMENT  CONVERT LARGE INTEGER TO DISPLAY 
          SPACE  4
**        S$LNGSM -  CONVERT LARGE INTEGER TO DISPLAY 
* 
*         GIVEN - 
*             X4 WITH A BINARY INTEGER RIGHT-JUSTIFIED
* 
*         DOES -
*          - CONVERTS X4 INTO A DOUBLE PRECISION FLOATING 
*             POINT NUMBER IN X1 AND X2 
*          - CALLS A COPY OF COBOL5 ROUTINE C$R4S18 TO CONVERT
*             THE D.P. NUMBER INTO 18 DIGITS OF DISPLAY DATA
* 
*         SETS X1 = MOST SIGNIFICANT 8 DIGITS 
*           (NINES COMPLEMENT IF NEGATIVE)
*           (LEFT 2 DIGITS ARE ZERO OR NINE)
*         SETS X2 = LEAST SIGNIFICANT 10 DIGITS 
*           (NINES COMPLEMENT IF NEGATIVE)
* 
*         USES-  X  0 1 2 3 4 5 6 - 
*                A  - 1 2 3 4 5 - - 
*                B    * - 3 - - - 7    *B1=1
  
  
          ENTRY  S$LNGSM
          ENTRY  S$LREGS
          ENTRY  S$NEWX1
          ENTRY  S$NEWX2
 S$LNGSM  DATA   0
* FIRST, DO SOME TASKS SPECIFIC TO SORT5 I.E. CONVERT THE 
* BINARY NUMBER LYING IN X4 INTO A DOUBLE PRECISION F.P.
* NUMBER IN REGISTERS X1 AND X2.
          MX0    30 
          BX5    X0*X4       MOST SIG. DIGITS IN X5 
          BX3    -X0*X4      LEAST SIG. DIGITS IN X3
          LX5    30 
          PX5 
          NX5 
          UX5    X5,B3
          SB3    B3+30       INCREASE EXPONENT BY 30 BITS OF SIGNIF.
          PX5    X5,B3
          PX3 
          NX3 
          FX1    X5+X3
          DX2    X5+X3
          NX1 
*      PULL OFF THE SIGN INTO X0
          BX0    X1 
          AX0    59          000...000B IF +,  777...777B IF -
          BX1    X1-X0       ABSOLUTE VALUE OF MOST SIGNIFICANT PART
          BX2    X2-X0       ABSOLUTE VALUE OF LEAST SIGNIFICANT PART 
*      INCREMENT TO OFFSET MACHINE ERROR
          SA3    =.0001 
          FX4    X1+X3
          DX5    X1+X3
          NX6    B0,X4
          FX3    X5+X2
          FX5    X6+X3
          NX5    X5 
          DX4    X6+X3
          NX2    X4 
          FX1    X5+X2
          DX2    X5+X2
*      DIVIDE INPUT INTO TWO USABLE PARTS 
          SA4    TENTOM10    1.0E-10
          FX3    X1*X4       X1 / 10'10 
          BX6    X6-X6
          SA5    TENTOP10    1.0E+10
          PX6    X6 
          FX3    X3+X6       INTEGERIZE UPPER 8 DIGITS
          FX4    X3*X5       ([X1/10'10])*10'10   (MOST SIGNIFICANT)
          DX6    X3*X5       ([X1/10'10])*10'10   (LEAST SIGNIFICANT) 
          NX4    X4 
          FX4    X1-X4       MOST SIGNIFICANT PART OF LOWER 10 DIGITS 
          FX6    X2-X6       LEAST SIGNIFICANT PART OF LOWER 10 DIGITS
          NX4    X4 
          FX4    X4+X6       LOWER 10 DIGITS, BUT 
                               PERHAPS WITH AN EXTRA 10'10
          FX5    X4-X5       (LOWER 10 DIGITS) - 10'10
          NG     X5,L2       IF LOWER IS OK 
          SX6    B1          ADD 1 TO UPPER 8 DIGITS
          BX4    X5          USE LOWER - 10'10
          IX3    X3+X6
 L2       BSS    0
*         X3 = UPPER 8 DIGITS,  PACKED INTEGER FORMAT 
*         X4 = LOWER 10 DIGITS,  UNNORMALIZED FLOATING POINT
  
*      EXTRACT PAIRS OF DIGITS FROM UPPER 8 DIGITS
          SA1    FRACT8      (10.0'-8)*(2'28)+ROUNDER 
          NX3 
          RX3    X1*X3       EFFECTIVELY 0.MMMMMMMMMM*2'28
          SX1    11753B 
          LX1    48          1753000...001B 
          FX6    X3+X1       ADD ROUNDING FACTOR AND SHIFT RESULT LFT 20
          UX3    X6          0.MMMMMMMM*2'48
          BX1    X0-X0       CLEAR RESULT REGISTER
          SB3    4           4 PAIRS OF DIGITS
 L3       BSS    0
          IX6    X3+X3       (0.MMMMMMMM*2'48) * 2
          IX3    X6+X3       (0.MMMMMMMM*2'48) * 3
          LX6    1           (0.MMMMMMMM*2'48) * 4
          LX3    5           (0.MMMMMMMM*2'48) * 96 
          IX3    X3+X6       MM.MMMMMM*2'48 
          UX3    X3,B7       0.MMMMMM*2'48
          PX1    X1,B7       INSERT UPPER TWO DIGITS INTO RESULT
          LX1    12          MAKE ROOM FOR NEXT TWO DIGITS
          SB3    B3-B1       DECREMENT COUNT OF PAIRS OF DIGITS 
          NZ     B3,L3       IF MORE PAIRS TO EXTRACT,  LOOP
*      CONVERT EACH PAIR OF DIGITS INTO TWO SEPARATE DIGITS 
          SA3    M7601       76017601760176017601B
          BX6    -X3*X1       1.
          IX5    X6+X6       10.
          IX5    X5+X6       11.
          LX6    -2            .01
          IX6    X6+X5       11.01
          LX6    -4            .001101 BINARY = .203125 DECIMAL 
          BX6    -X3*X6 
          IX5    X1-X6       (10*M+N) - 2*M 
          LX6    2           8*M
          IX5    X5-X6       N
          LX6    3
          BX1    X6+X5
*      EXTRACT PAIRS OF DIGITS FROM LOWER 10 DIGITS 
          NX4 
          SA2    FRACT10     (10.0'-10)*(2'33)+ROUNDER
          RX4    X2*X4       EFFECTIVELY 0.NNNNNNNNNN*2'33
          SX2    11760B 
          LX2    48          176000...001B
          FX6    X4+X2       ADD ROUNDING FACTOR AND SHIFT RESULT LFT 15
          UX4    X6          0.NNNNNNNNNN*2'48
          BX2    X0-X0       CLEAR RESULT REGISTER
          SB3    5           5 PAIRS OF DIGITS
 L4       BSS    0
          IX6    X4+X4       (0.NNNNNNNNNN*2'48) * 2
          IX4    X6+X4       (0.NNNNNNNNNN*2'48) * 3
          LX6    1           (0.NNNNNNNNNN*2'48) * 4
          LX4    5           (0.NNNNNNNNNN*2'48) * 96 
          IX4    X4+X6       NN.NNNNNNNN*2'48 
          UX4    X4,B7       0.NNNNNNNN*2'48
          PX2    X2,B7       INSERT DIGITS INTO RESULT REGISTER 
          LX2    12          MAKE ROOM FOR NEXT TWO DIGITS
          SB3    B3-B1       DECREMENT COUNT OF PAIRS OF DIGITS 
          NZ     B3,L4       IF MORE PAIRS OF DIGITS TO EXTRACT,  LOOP
*      CONVERT EACH PAIR OF DIGITS INTO TWO SEPARATE DIGITS 
          SA3    M7601       76017601760176017601B
          BX4    -X3*X2       1.
          IX5    X4+X4       10.
          IX5    X4+X5       11.
          LX4    -2            .01
          IX4    X4+X5       11.01
          LX4    -4            .001101 BINARY = .203125 DECIMAL 
          BX4    -X3*X4 
          IX5    X2-X4       (10*M+N) - 2*M 
          LX4    2           8*M
          IX5    X5-X4       N
          LX4    3
          BX2    X4+X5
*      BIAS THE RESULTS BY DISPLAY ZERO AND APPLY THE SIGN
          SA3    =10H0000000000 
          NZ     X1,LNGSM.1 
          NZ     X2,LNGSM.1 
*    DONT COMPLEMENT ZERO 
          IX2    X2+X3
          IX1    X1+X3
          EQ     S$LNGSM
 LNGSM.1  BSS    0
          IX2    X2+X3       BIAS LEAST SIGNIFICANT 10 DIGITS BY ZERO 
          IX1    X1+X3       BIAS MOST SIGNIFICANT 8 DIGITS BY ZERO 
          BX2    X2-X0       APPLY THE SIGN TO LEAST SIGNIFICANT DIGITS 
          BX1    X1-X0       APPLY THE SIGN TO MOST SIGNIFICANT 8 DIGITS
          EQ     S$LNGSM     EXIT 
  
 TENTOM10 CON    1.0E-10
 TENTOP10 CON    1.0E+10
 FRACT8   CON    1.0E-8S28+1
 FRACT10  CON    1.0E-10S33+1 
 M7601    CON    76017601760176017601B
  
 S$LREGS  BSS    40 
 S$NEWX1  BSS    1
 S$NEWX2  BSS    1
  
          END 
