*DECK SCANLIT 
          IDENT  SCANLIT
          TITLE  SCANLIT -  SCAN NUMERIC LITERAL
          TITLE  PRESCAN -  SCAN LITERAL FOR NUMLEN, POINT, SIGN
          MACHINE  ANY,I
          COMMENT  "SUBSYS" 
          COMMENT  SCAN LITERAL TO SET NUMLEN, POINT, SIGN
          SPACE  4
**        SCANLIT -  SCAN NUMERIC LITERAL 
* 
*         LITREF = 2/1, 10/LENGTH, 29/, 1/SIGN, 18/ADDRESS
*         SCANLIT(LITREF, NUMLEN, POINT)
* 
*         SETS NUMLEN = NUMERIC LENGTH OF LITERAL.
*           (LEADING ZEROS BEFORE DECIMAL POINT ARE IGNORED.) 
*           IF LITERAL IS EXTFLOAT  (I.E. CONTAINS AN *E*), 
*             SETS NUMLEN < 0.
*         SETS POINT = POINT LOCATION OF LITERAL. 
*           (TRAILING ZEROS AFTER DECIMAL POINT ARE IGNORED.) 
*           (E.G. (POINTOF,123.45000) = 2)
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.
*         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=LIT EOL=XYZ
* 
*         SETS X5 = NEXT CHARACTER FROM LITERAL,
*         OR JUMPS TO XYZ.
  
  
 X5=LIT   MACROE EOL
          LOCAL  NEXT 
          ZR     B2,EOL 
          NZ     B3,NEXT
          SA1    A1+B1
          SB3    10 
 NEXT     LX1    6
          SB2    B2-B1
          BX5    -X0*X1 
          SB3    B3-B1
          SX4    X5-1RE 
          ZR     X4,FLOAT 
 X5=LIT   ENDM
          EJECT 
          ENTRY  SCANLIT
 SCANLIT  CON    *           ENTRY/EXIT WORD
          SB1    1           CONSTANT 1 
          SB7    A1          SAVE A1
          SA1    X1          2/1, 10/LENGTH, 29/, 1/SIGN, 18/ADDRESS
          SX2    B0          NUMBER OF DIGITS = 0 
          SB6    -B1         NOTE NO DECIMAL POINT YET
          MX0    -6          77777777777777777700B
          SB4    B0          ASSUME POSITIVE SIGN 
          SB5    B0          NUMBER OF CONSECUTIVE ZEROS = 0
          UX1    X1,B2       NUMBER OF CHARACTERS IN LITERAL
          SA1    X1          FIRST WORD OF LITERAL
          SB3    10          NUMBER OF CHARACTERS LEFT IN X1
  
*      SKIP LEADING ZEROS BEFORE DECIMAL POINT
  
 PRESCAN1 X5=LIT EOL=PRESCAN7 
          SX4    X5-1R0 
          ZR     X4,PRESCAN1 IF CHARACTER IS ZERO,  LOOP
          EQ     PRESCAN3    GO PROCESS REST OF LITERAL 
  
*      PROCESS REST OF LITERAL
  
 PRESCAN2 X5=LIT EOL=PRESCAN7 
 PRESCAN3 SX4    X5-1R0 
          ZR     X4,PRESCAN4 IF CHARACTER IS ZERO DIGIT 
          SX4    X5-1R. 
          ZR     X4,PRESCAN5 IF CHARACTER IS DECIMAL POINT
          SX4    X5-1R, 
          ZR     X4,PRESCAN5 IF CHARACTER IS DECIMAL-POINT (IS COMMA) 
          SX4    X5-1R+ 
          ZR     X5,PRESCAN2 IF POSITIVE SIGN CHARACTER,  SKIP
          SX4    X5-1R- 
          ZR     X4,PRESCAN6 IF NEGATIVE SIGN CHARACTER 
  
*      CURRENT CHARACTER MUST BE DECIMAL DIGIT
  
          SB5    B0          NUMBER OF CONSECUTIVE ZEROS = 0
          SX2    X2+B1       INCREMENT TOTAL NUMBER OF DIGITS 
          EQ     PRESCAN2    GO FOR NEXT CHARACTER
  
  
*      CURRENT CHARACTER IS ZERO DIGIT
  
 PRESCAN4 SB5    B5+B1       INCREMENT NUMBER OF CONSECUTIVE ZEROS
          SX2    X2+B1       INCREMENT TOTAL NUMBER OF DIGITS 
          EQ     PRESCAN2    GO FOR NEXT CHARACTER
  
  
*      CURRENT CHARACTER MUST BE DECIMAL POINT
  
 PRESCAN5 SB5    B0          NUMBER OF CONSECUTIVE ZEROS = 0
          SB6    X2          NOTE POSITION OF DECIMAL POINT 
          EQ     PRESCAN2    GO FOR NEXT CHARACTER
  
  
*      CURRENT CHARACTER IS NEGATIVE SIGN CHARACTER 
  
 PRESCAN6 SB4    B1          NOTE NEGATIVE SIGN 
          EQ     PRESCAN2    GO FOR NEXT CHARACTER
  
  
*      COMPUTE FINAL RESULTS:    E.G.         B2  B3  B5 _ NUMLEN  POINT
*                                             --  --  --   ------  -----
*                                123.00        6   3   3      3      0
*                                0123.456000   9   3   3      6      3
*                                00012300.0    6   5   1      5      0
*                                .00012300     8   0   2      6      6
*                                123.0001      7   3   0      7      4
*                                123.00010     8   3   1      7      4
*                                .000          3   0   3      0      0
*                                000           0  -1   0      0      0
*                                01230         4  -1   1      4      0
  
 PRESCAN7 SX4    B6+B1
          SB2    X2 
          NZ     X4,PRESCAN8 IF DECIMAL POINT ENCOUNTERED 
          SB3    B0          (POINTOF,LITERAL) = 0
          EQ     SCANLIT9 
  
 PRESCAN8 SB2    B2-B5       IGNORE TRAILING ZEROS
          SB3    B2-B6       (POINTOF,LITERAL) = NO. OF DIGITS TO 
                               RIGHT OF DECIMAL POINT 
 SCANLIT9 SA1    B7+B1       ADDRESS FOR (NUMLENOF,LITERAL) 
          SX6    B2          (NUMLENOF,LITERAL) 
          SA6    X1          STORE
          SA1    A1+B1       ADDRESS FOR (POINTOF,LITERAL)
          SX6    B3          (POINTOF,LITERAL)
          SA6    X1          STORE
          EQ     SCANLIT     EXIT 
  
  
*                            LITERAL CONATINS AN *E*
 FLOAT    SB2    -1          SET NUMLEN < 0 
          EQ     SCANLIT9    GO STORE RESULT
          SPACE  4
          END 
