*DECK LIT2RN
          IDENT  LIT2RN 
          TITLE  LIT2RN -  CONVERT LITERAL TO REGISTER NUMERIC
          MACHINE  ANY,I
          COMMENT  "SUBSYS" 
          COMMENT  CONVERT LITERAL TO REGISTER NUMERIC
          SPACE  4
**        LIT2RN -  CONVERT LITERAL TO REGISTER NUMERIC 
* 
*         REF = 2/1, 10/LITERAL LENGTH IN CHARACTERS, 48/LITERAL ADDRESS
*         NUMLEN = DESIRED NUMERIC LENGTH OF REGISTER NUMERIC RESULT. 
*         POINT = DESIRED POINT LOCATION OF REGISTER NUMERIC RESULT.
*         SIGN = 1 IFF LITERAL MAY BE NEGATIVE. 
* 
*         LIT2RN(REF, NUMLEN, POINT, SIGN, MS, LS); 
* 
*         SETS MS = MOST SIGNIFICANT PART OF REGISTER NUMERIC RESULT
*         SETS LS = LEAST SIGNIFICANT PART OF REGISTER NUMERIC RESULT.
          TITLE  MACRO DEFINITIONS
**        NUM=X5 -  APPEND TO NUMBER THE CHARACTER IN X5
* 
*         B4 = NUMBER OF CHARACTERS LEFT TO INSERT IN X6. 
*         X6 = POSITIONED WITH LAST APPENDED CHARACTER IN BITS 5-0, 
*                AND AVAILABLE CHARACTER SLOTS = BINARY ZERO. 
*         B1 = 1
* 
*         NUM=X5
* 
*         IF X6 IS FULL (I.E. IF B4 = 0), THEN X7 IS SET TO X6, 
*           B4 IS RESET TO 10,  X6 IS RESET TO BINARY ZERO,  AND X2 = 1.
*         THE CHARACTER IN X5 IS APPENDED TO X6 IN BITS 5-0.
*         B4 IS DECREMENTED.
  
  
 NUM=X5   MACRO 
          LOCAL  NEXT 
          NZ     B4,NEXT
          BX7    X6 
          SX2    B1 
          MX6    0
          SB4    10 
 NEXT     LX6    6
          SB4    B4-B1
          BX6    X6+X5
 NUM=X5   ENDM
X5=LIT    SPACE  4
**        X5=LIT -  SET X5 TO NEXT CHARACTER FROM LITERAL 
* 
*         B2 = NUMBER OF CHARACTERS LEFT IN LITERAL.
*         B3 = NUMBER OF CHARACTERS LEFT IN CURRENT WORD OF LITERAL.
*         X0 = 77777777777777777700B
*         X1 = CURRENT WORD OF LITERAL  (NEXT CHARACTER IN BITS 59-54)
*         A1 = ADDRESS OF CURRENT WORD OF LITERAL.
*         B1 = 1
*         XYZ = ADDRESS TO JUMP TO IF NO MORE CHARACRERS IN LITERAL.
* 
*         SKIPS THE DECIMAL POINT 
*         X5=LIT EOL=XYZ
* 
*         SETS X5 = NEXT CHARACTER FROM LITERAL,
*         OR JUMPS TO XYZ.
  
  
 X5=LIT   MACROE EOL,DECPT
          LOCAL  NEXT,AGAIN,SKIPDP
 AGAIN    ZR     B2,EOL 
          NZ     B3,NEXT
          SA1    A1+B1
          SB3    10 
 NEXT     LX1    6
          SB2    B2-B1
          BX5    -X0*X1 
          SB3    B3-B1
          SX5    X5-1R. 
1         IFC    NE, DECPT
          ZR     X5,SKIPDP
          SX5    X5+1R.-1R, 
          ZR     X5,SKIPDP
          SX5    X5+1R, 
          RMT 
 SKIPDP   X5=LIT E_O_L=EOL
          EQ     DECPT
          RMT 
1         ELSE
          ZR     X5,AGAIN 
          SX5    X5+1R.-1R, 
          ZR     X5,AGAIN 
          SX5    X5+1R, 
1         ENDIF 
 X5=LIT   ENDM
          SPACE  4
**        X5=FLIT -  SET X5 TO NEXT CHARACTER FROM FLT. PT. LITERAL 
* 
*         B2 = NUMBER OF CHARACTERS LEFT IN LITERAL.
*         B3 = NUMBER OF CHARACTERS LEFT IN CURRENT WORD OF LITERAL.
*         X0 = 77777777777777777700B
*         X1 = CURRENT WORD OF LITERAL  (NEXT CHARACTER IN BITS 59-54)
*         A1 = ADDRESS OF CURRENT WORD OF LITERAL.
*         B1 = 1
*         XYZ = ADDRESS TO JUMP TO IF NO MORE CHARACRERS IN LITERAL.
* 
*         X5=FLIT EOL=XYZ 
* 
*         SETS X5 = NEXT CHARACTER FROM LITERAL,
*         OR JUMPS TO XYZ.
  
  
 X5=FLIT  MACROE EOL
          LOCAL  NEXT 
          IFC    NE, EOL  ,1
          ZR     B2,EOL 
          NZ     B3,NEXT
          SA1    A1+1        GET NEXT WORD FROM LITERAL 
          SB3    10          10 CHARACTERS LEFT IN CUURENT LITERAL WORD 
 NEXT     LX1    6           RIGHT-JUSTIFY NEXT CHARACTER 
          SB2    B2-B1       DECREMENT NO. CHARACTERS LEFT IN LITERAL 
          BX5    -X0*X1      ISOLATE CHARACTER
          SB3    B3-B1       DECREMENT NO. CHARACTERS LEFT IN CURRENT WD
 X5=FLIT  ENDM
          TITLE 
          ENTRY  LIT2RN 
 LIT2RN   CON    *           ENTRY/EXIT WORD
          SB1    1
          SX6    A1          SAVE ADDRESS OF PARAMETER LIST 
          SA6    SAVEA1 
          SA1    X1          2/1, 10/NCHARS, 30/S, 18/ADDRESS OF LITERAL
                                                S = 1 IFF NEGATIVE
          BX6    X1 
          SA6    LITREF 
          SA1    PARMLIST 
          RJ     =X_SCANLIT 
*         SETS NUMLEN = (NUMLENOF,LITERAL)
*           (LEADING ZEROS BEFORE DECIMAL POINT ARE IGNORED.) 
*         IF LITERAL IS FLOATING POINT (WITH *E*, SETS NUMLEN < 0)
*         SETS POINT = (POINTOF,LITERAL). 
*           (TRAILING ZEROS AFTER DECIMAL POINT ARE IGNORED.) 
          SA1    NUMLEN 
          SA2    POINT
          SB2    X1 
          SB3    X2 
  
          SA1    SAVEA1      X1 = ADDRESS OF PARAMETER LIST 
          SA1    X1          X1 = ADDRESS OF LITREF 
          ZR     B2,LIT2RN17 IF LITERAL IS ZERO 
          NG     B2,FLOAT    IF LITERAL HAS AN *E* EXPONENT 
  
  
*      IF (INTLENOF,LITERAL) > (INTLENOF,REGC),  THEN ERROR 
  
          SA2    A1+1        ADDRESS OF NUMLEN
          SA3    A1+2        ADDRESS OF POINT 
          SA2    X2          NUMLEN 
          SA3    X3          POINT
          SA4    A1+3        ADDRESS OF SIGN
          SA4    X4          SIGN 
          IX0    X2-X3       (INTLENOF,REGC)
          SB5    X0 
          SB6    B2-B3       (INTLENOF,LITERAL) 
*         GT     B6,B5,LIT2RNE1    IF ERROR 
*****  ACTUALLY, THE ABOVE CHECK IS ERRONEOUS SINCE ONT ONLY  **********
*****  0.1234 _ PP99 WILL GET AN ERROR,  BUT                  **********
*****  0.0034 _ PP99 WILL ALSO GET AN ERROR.                  **********
  
*      IF (POINTOF,REGC) < (POINTOF,LITERAL),  THEN ERROR 
  
          SB7    X3          (POINTOF,REGC) 
*        LT      B7,B3,LIT2RNE2 
*****  ACTUALLY, THE ABOVE CHECK IS ERRONEOUS SINCE NOT ONLY  **********
*****  1234 _ PIC 99PP WILL GET AN ERROR,  BUT                **********
*****  1200 _ PIC 99PP WILL ALSO GET AN ERROR.                **********
  
*      IF DESTINATION UNSIGNED AND LITERAL NEGATIVE,  THEN ERROR
  
          SA1    X1          2/1, 10/NCHARS, 30/S, 18/ADDRESS OF LITERAL
          UX7    B2,X1     * B2 = NUMBER OF CHARACTERS LEFT IN LITERAL
          SA1    X7        * FIRST WORD OF LITERAL
          AX7    18          1 IFF LITERAL IS NEGATIVE
          BX0    -X4*X7      1 IFF ERROR
          NZ     X0,LIT2RNE3 IF ERROR 
  
*         X1 = FIRST WORD OF LITERAL
*         X2 = (NUMLENOF,REGC)
*         X3 = (POINTOF,REGC) 
*         X4 = (SIGNOF,REGC)   (I.E. 1 IFF SIGN ALLOWED)
*         X7 = 1 IFF LITERAL IS NEGATIVE
*         B2 = NUMBER OF CHARACTERS LEFT IN LITERAL 
*         B3 = (POINTOF,LITERAL)
*         B5 = (INTLENOF,REGC)
*         B6 = (INTLENOF,LITERAL) 
*         A1 = ADDRESS OF FIRST WORD OF LITERAL 
  
*      SET UP REGISTERS FOR CONVERSION
  
 LIT2RN1  BSS    0           (RECOVER FROM ERRORS)
          SB7    B6-B5     * NUMBER OF LEADING LITERAL DIGITS TO SKIP 
          SB5    X3          (POINTOF,REGC) 
          PL     X3,LIT2RN1A IF DESTINATION NOT (E.G.) PIC 999PP
          SB5    B0+B3       (+B3 TO OFFSET LATER -B3)
 LIT2RN1A BSS    0
          BX3    X4*X7     * 1 IFF LITERAL IS NEGATIVE AND SIGN ALLOWED 
          SX4    X2-20     * -(NUMBER OF LEADING ZEROS TO INSERT) 
          SB5    B5-B3     * NUMBER OF TRAILING ZEROS TO APPEND 
          GT     B5,B0,LIT2RN2   IF APPENDING TRAILING ZEROS
          SB5    B0          DO NOT APPEND ANY TRAILING ZEROS 
 LIT2RN2  SB6    X2        * NUMBER OF DIGITS TO COPY FROM LITERAL
          GT     B7,B0,LIT2RN3   IF LITERAL LONGER THAN DESTINATION 
          SB6    X2+B7       DECREASE NUMBER OF DIGITS TO COPY
          SX4    X4+B7       INCREASE NUMBER OF LEADING ZEROS 
 LIT2RN3  SB6    B6-B5     * NUMBER OF DIGITS TO COPY FROM LITERAL
          SB4    10        * NUMBER OF CHARACTERS LEFT TO PUT INTO X6 
          MX0    -6        * 77777777777777777700B
          BX6    X6-X6     * NUMBER RESULT
          SB3    10        * NUMBER OF CHARACTERS LEFT IN CURRENT WORD
  
*         B1 = 1
*         B2 = NUMBER OF CHARACTERS LEFT IN LITERAL 
*         B3 = NUMBER OF CHARACTERS LEFT IN CURRENT WORD OF LITERAL 
*         B4 = NUMBER OF CHARACTERS LEFT IN NUMBER IN X6
*         B5 = NUMBER OF TRAILING ZEROS TO APPEND 
*         B6 = NUMBER OF DIGITS TO COPY FROM SOURCE 
*         B7 = NUMBER OF LEADING DIGITS TO SKIP 
*         X0 = 77777777777777777700B
*         X1 = CURRENT WORD OF LITERAL
*         X3 = SIGN TO BE APPLIED TO RESULT 
*         X4 = NUMBER OF LEADING ZEROS TO SET UP  (=(BCPOF,REGC)) 
*         X5 = SCRATCH  (= LATEST CHARACTER)
*         X6 = CURRENT NUMBER 
*         X7 = UPPER 10 DIGITS OF NUMBER WHILE > 10 DIGITS
*         A0 = SAVE REGISTER FOR X5,  AT LIT2RN8+2
*         A1 = ADDRESS OF CURRENT WORD OF LITERAL 
  
  
*      SKIP LEADING ZEROS 
  
 LIT2RN5  X5=LIT EOL=LIT2RN13,DECPT=LIT2RN5A
          SX2    X5-77B 
          ZR     X2,HIGHVAL  IF HIGH-VALUE,  GO PROCESS 
          SX2    X5-1R0 
          ZR     X2,LIT2RN5  IF ZERO DIGIT,  LOOP 
          SX2    X5-1R+ 
          ZR     X2,LIT2RN5  IF PLUS SIGN,  LOOP
          SX2    X5-1R+ 
          ZR     X5,LIT2RN5  IF MINUS SIGN,  LOOP 
  
*      SKIP (B7) LEADING DIGITS 
  
 LIT2RN5A BSS    0
          LE     B7,B0,LIT2RN8   IF NO SKIPPING AT ALL
          EQ     LIT2RN7     GO USE CURRENT CHARACTER IN X5 
  
 LIT2RN6  X5=LIT EOL=LIT2RN13 
 LIT2RN7  SB7    B7-B1       DECREMENT COUNT OF DIGITS TO SKIP
          NZ     B7,LIT2RN6 
          X5=LIT EOL=LIT2RN13  LEAVE WITH X5 = FIRST REAL DIGIT 
  
*      INSERT (-X4) LEADING ZEROS 
  
 LIT2RN8  BX2    X0-X0       NOTE THAT X7 DOES NOT CONTAIN NUMBER YET 
          ZR     X4,LIT2RN10 IF NO LEADING ZEROS
          SA0    X5          SAVE FIRST REAL DIGIT FROM LITERAL 
 LIT2RN9  SX5    1R0         INSERT ZERO DIGIT
          NUM=X5
          SX4    X4+B1       DECREMENT THE NEGATIVE COUNT 
          NZ     X4,LIT2RN9  IF MORE LEADING ZEROS TO SET UP,  LOOP 
          SX5    A0          RESET FIRST REAL DIGIT 
  
*      COPY (B6) DIGITS FROM LITERAL TO NUMBER
  
 LIT2RN10 ZR     B6,LIT2RN13 IF NO DIGITS TO COPY 
          EQ     LIT2RN12    GO USE CURRENT CHARACTER IN X5 
  
 LIT2RN11 X5=LIT EOL=LIT2RN13 
 LIT2RN12 NUM=X5
          SB6    B6-B1       DECREMENT COUNT OF DIGITS TO COPY
          NZ     B6,LIT2RN11 IF MORE DIGITS TO COPY,  LOOP
  
*      APPEND (B5) TRAILING ZEROS 
  
 LIT2RN13 ZR     B5,LIT2RN15 IF NO TRAILING ZEROS 
 LIT2RN14 SX5    1R0         APPEND ZERO DIGIT
          NUM=X5
          SB5    B5-B1       DECREMENT COUNT OF TRAILING ZEROS TO APPEND
          NZ     B5,LIT2RN14 IF MORE TRAILING ZEROS TO APPEND,  LOOP
  
*      APPLY SIGN TO RESULT 
  
 LIT2RN15 LX3    59          BIT 59 = 1 IFF NEGATIVE SIGN 
          AX3    59          777...777B IFF NEGATIVE,  0 IFF POSITIVE 
          BX6    X6-X3       APPLY SIGN TO X6 
          BX7    X7-X3       APPLY SIGN TO X7 
  
*      STORE RESULTS INTO PARAMETERS
  
 LIT2RN16 SA1    SAVEA1      X1 = ADDRESS OF PARAMETER LIST 
          SA2    X1+4        ADDRESS FOR MOST SIGNIFICANT PART OF RESULT
          SA3    X1+5        ADDRESS FOR LEAST SIGNIFICANT PART 
          SA7    X2          STORE MOST SIG. PART IN FIFTH PARAMETER
          SA6    X3          STORE LEAST SIG. PART IN SIXTH PARAMETER 
  
*      EXIT 
  
          EQ     LIT2RN      EXIT 
          TITLE  HIGH-VALUE 
**        HIGHVAL -  GENERATE A HIGH-VALUE
* 
*         SETS X6 = 9999999999
*         SETS X7 = 9999999999
  
  
 HIGHVAL  SA1    =10H9999999999 
          BX6    X1 
          LX7    X1 
          EQ     LIT2RN16 
          TITLE  FLOAT
**        FLOAT -  PROCESS LITERAL WITH *E* EXPONENT
* 
*         SETS X2 = 0.
*         SETS X3 = COMP-2 VALUE. 
*         EXITS TO LIT2RN16 
  
  
 FLOAT    SA1    X1          2/1, 10/NCHARS, 30/S, 18/ADDRESS 
          UX7    B2,X1       B2 = NUMBER OF CHARACTERS LEFT IN LITERAL
          SA1    X7          FIRST WORD OF LITERAL
          MX0    -6          77777777777777777700B
          SB3    10          NUMBER OF CHARACTERS LEFT IN CURRENT WORD
          BX6    X0-X0       N = 0
          MX7    0           EXPONENT = 0 
          SB5    -B0         NOTE NO DIGITS TO RIGHT OF DECIMAL POINT 
          SB4    B0          NOTE NO DECIMAL POINT YET
          SX3    B0          ASSUME SIGN OF NUMBER IS + 
  
*         X0 = 77777777777777777700B
*         X1 = CURRENT WORD OF LITERAL
*                (NEXT CHARACTER IS IN UPPER 6 BITS)
*         X2 = SIGN OF EXPONENT   (0 IF +, -0 IF -) 
*         X3 = SIGN OF NUMBER   (0 IF +, -0 IF -) 
*         X4 = SCRATCH
*         X5 = CURRENT CHARACTER FROM LITERAL 
*         X6 = CURRENT NUMBER 
*         X7 = CURRENT EXPONENT 
*         B1 = 1
*         B2 = NUMBER OF CHARACTERS LEFT IN LITERAL 
*         B3 = NUMBER OF CHARACTERS LEFT IN CURRENT WORD OF LITERAL 
*         B4 = 1 IFF DECIMAL POINT HAS BEEN REACHED 
*         B5 = -(NUMBER OF DIGITS TO RIGHT OF DECIMAL POINT)
*         A1 = ADDRESS OF CURRENT WORD OF LITERAL 
  
*      EXTRACT POSSIBLE SIGN OF MANTISSA
  
          X5=FLIT            GET FIRST CHARACTER FROM LITERAL 
          SB7    X5-1R- 
          ZR     B7,FLOATS1  IF CHARACTER IS *-*
          SB7    X5-1R+ 
          ZR     B7,FLOATS2  IF CHARACTER IS *+*
  
*      COMPUTE MANTISSA 
  
 FLOAT1   BSS    0           (RETURN FROM SETTING SIGN) 
          SB7    X5-1R. 
          ZR     B7,FLOAT2   IF DECIMAL POINT 
          SB7    X5-1R, 
          ZR     B7,FLOAT2   IF DECIMAL-POINT IS COMMA
          SB7    X5-1RE 
          ZR     B7,FLOAT3   IF CHARACTER IS *E*
  
          IX4    X6+X6       2*N
          LX6    3           8*N
          IX6    X6+X4       10*N 
          UX6    X6,B7
          SB7    B7+1777B 
          NZ     B7,FLOAT1A  IF VALUE \ 2'48
          SX4    X5-1R0      BINARY VALUE OF DIGIT
          IX6    X6+X4       10*N + BINARY VALUE OF DIGIT 
          X5=FLIT            GET NEXT CHARACTER 
          ZR     B4,FLOAT1   IF NO DECIMAL POINT FOUND YET
          SB5    B5-1        NOTE THIS DIGIT IS RIGHT OF DECIMAL POINT
          EQ     FLOAT1      GO PROCESS THIS CHARACTER
  
 FLOAT1A  AX6    X4,B1       RESET TO VALUE BEFORE FIRST OVERFLOW DIGIT 
          X5=FLIT            GET NEXT CHARACTER 
          SB7    X5-1RE 
          ZR     B7,FLOAT3   IF *E*, DONE WITH MANTISSA 
          SB7    X5-1R. 
          ZR     B7,FLOAT1B  IF DECIMAL POINT 
          SB7    X5-1R, 
          ZR     B7,FLOAT1B  IF DECIMAL-POINT IS COMMA
          NZ     B4,FLOAT1A  IF PROCESSING DIGITS TO RIGHT OF POINT 
          SB5    B5+1        COMPENSATE SKIPPED DIGIT IN EXPONENT 
          EQ     FLOAT1A     GO CHECK NEXT CHARACTER
  
 FLOAT1B  SB4    B1          NOTE DECIMAL POINT ENCOUNTERED 
          X5=FLIT            SKIP THE DECIMAL POINT 
          EQ     FLOAT1A     KEEP LOOKING FOR THE *E* 
  
  
 FLOAT2   SB4    B1          NOTE DECIMAL POINT ENCOUNTERED 
          X5=FLIT            SKIP THE DECIMAL POINT 
          EQ     FLOAT1      GO PROCESS THIS CHARACTER
  
  
*      PICK UP POSSIBLE SIGN OF EXPONENT
  
 FLOAT3   X5=FLIT            SKIP THE *E* 
          MX2    0           ASSUME SIGN OF EXPONENT IS POSITIVE
          SB7    X5-1R- 
          ZR     B7,FLOATS3  IF CHARACTER IS *-*
          SB7    X5-1R+ 
          ZR     B7,FLOATS4  IF CHARACTER IS *+*
  
*      COMPUTE THE VALUE OF THE EXPONENT
  
 FLOAT4   BSS    0           (RETURN FROM SETTING SIGN) 
          IX4    X7+X7       2*EXPONENT 
          LX7    3           8*EXPONENT 
          IX7    X7+X4       10*EXPONENT
          SX4    X5-1R0      BINARY VALUE OF DIGIT
          IX7    X7+X4       10*EXPONENT + BINARY VALUE OF DIGIT
          X5=FLIT EOL=FLOAT5 GET NEXT CHARACTER,  ELSE SKIP 
          EQ     FLOAT4      GO PROCESS THIS CHARACTER
  
  
*      END OF LITERAL;  COMBINE X6&X3 AND X7&X2 TO GET RESULT 
  
 FLOAT5   BX4    X7-X2       APPLY SIGN TO EXPONENT 
          SX7    X4+B5       EXPONENT - (NUMBER OF DIGITS TO RT. OF PT.)
          SX4    STARTEXP-1 
          SB4    STARTVAL-1  ADDRESS OF VALUE ASSOCIATED WITH X4
          PX6    X6          PACK AND NORMALIZE NUMBER
          NX6    X6 
          NG     X7,FLOAT5A  IF DIVIDING BY POWER(S) OF 10
  
 FLOAT6   SX4    X4+B1       TRUE TARGET VALUE OF EXPONENT
          SB4    B4+1        INCREMENT ADDRESS OF POWERS
          IX0    X7-X4
          NG     X0,FLOAT7   IF EXPONENT ALREADY SMALL ENOUGH 
          SA1    B4          1.0E(X4) 
          IX7    X7-X4       SET NEW EXPONENT 
          RX6    X6*X1       APPLY POWER TO NUMBER
 FLOAT7   AX4    1           P = P/2
          SB7    X4 
          NE     B7,B1,FLOAT6  IF MORE POWERS TO CHECK,  LOOP 
          ZR     X7,FLOAT8   IF EXPONENT = 0,  SKIP 
          SB7    X7 
          GT     B7,B1,FLOAT9  IF EXPONENT = 2,  GO PROCESS 
          SA1    =1.0E+1     MUST HAVE EXPONENT = 1 
          RX6    X6*X1       APPLY POWER TO NUMBER
  
 FLOAT8   MX7    0           NOTE COMP-2 LITERAL
          SA1    LITREF      BIT 18 = SIGN OF NUMBER
          LX1    59-18       BIT 59 = SIGN OF NUMBER
          AX1    59          000...000B IF +, 777...777B IF - 
          BX3    X3+X1       SIGN FROM EITHER LITREF OR SOURCE CHARS. 
          BX6    X6-X3       APPLY SIGN TO NUMBER 
          BX3    X6-X3       APPLY SIGN TO NUMBER 
          EQ     LIT2RN16    GO STORE RESULTS 
  
 FLOAT9   SA1    =1.0E+2     MULTIPLY BY 10 ' (EXPONENT=2)
          NO
          RX6    X6*X1
          EQ     FLOAT8      GO FINISH
          SPACE  4
 FLOAT5A  BX7    -X7
 FLOAT6A  SX4    X4+B1       TRUE VALUE OF P
          SB4    B4+1        INCREMENT ADDRESS OF POWERS
          IX0    X7-X4
          NG     X0,FLOAT7A  IF EXPONENT ALREADY SMALL ENOUGH 
          SA1    B4          1.0E(X4) 
          IX7    X7-X4       SET NEW EXPONENT 
          RX6    X6/X1       APPLY POWER TO NUMBER
 FLOAT7A  AX4    1           P = P/2
          SB7    X4 
          NE     B7,B1,FLOAT6A  IF MORE POWERS TO CHECK,  LOOP
          ZR     X7,FLOAT8   IF EXPONENT = 0,  SKIP 
          SB7    X7 
          GT     B7,B1,FLOAT9A  IF EXPONENT = 2,  GO PROCESS
          SA1    =1.0E+1     MUST HAVE EXPONENT = 1 
          RX6    X6/X1       APPLY POWER TO NUMBER
          EQ     FLOAT8      GO FINISH
 FLOAT9A  SA1    =1.0E+2     DIVIDE BY 10 ' (EXPONENT=2)
          NO
          RX6    X6/X1
          EQ     FLOAT8      GO FINISH
          SPACE  4
*      SET SIGN OF MANTISSA 
  
 FLOATS1  MX3    60          SET SIGN NAGATIVE
 FLOATS2  X5=FLIT            SKIP SIGN CHARACTER
          EQ     FLOAT1      RESUME NORMAL PROCESSING 
          SPACE  4
*      SET SIGN OF EXPONENT 
  
 FLOATS3  MX2    60          SET SIGN NEGATIVE
 FLOATS4  X5=FLIT            SKIP SIGN CHARACTER
          EQ     FLOAT4      RESUME NORMAL PROCESSING 
  
 STARTEXP EQU    163
 P        SET    STARTEXP 
 SUM      SET    0
  
 STARTVAL BSS    0
          NOREF  P,SUM
1         DUP    100
 M1       DECMIC P
          CON    1.0E"M1" 
 SUM      SET    SUM+P
 P        SET    P/2+1
          IFEQ   P,2,1
          STOPDUP 
1         ENDD
  
          IFLT   SUM,323,1
          ERR    INCREASE STARTEXP
          TITLE 
*      LITERAL IS ZERO;  DO NOT GENERATE POSSIBLE MINUS ZERO
  
 LIT2RN17 SA3    =10H0000000000 
          BX6    X3 
          LX7    X3 
          EQ     LIT2RN16    GO STORE PARAMETERS AND EXIT 
          SPACE  4
 SAVEA1   BSS    1           ADDRESS OF PARAMETER LIST
  
  
**     ERROR 1:  LEADING NON-ZERO DIGITS FROM LITERAL MUST BE TRUNCATED 
  
 LIT2RNE1 BSS    0
          EQ     LIT2RN1
  
  
**     ERROR 2:  TRAILING NON-ZERO DIGITS FROM LITERAL MUST BE TRUNCATED
  
 LIT2RNE2 BSS    0
          EQ     LIT2RN1
  
  
**     ERROR 3:  SIGN MUST BE STRIPPED FROM NEGATIVE LITERAL
  
 LIT2RNE3 BSS    0
          EQ     LIT2RN1     RECOVER
          SPACE  4
 PARMLIST CON    LITREF 
          CON    NUMLEN 
          CON    POINT
  
 LITREF   BSS    1           2/1, 10/LENGTH, 29/, 1/SIGN, 18/ADDRESS
 NUMLEN   BSS    1           (NUMLENOF,LITERAL) 
 POINT    BSS    1           (POINTOF,LITERAL)
          SPACE  4
          END 
