ASMB,R,L
      HED ASCII TO FLOATING POINT SUBROUTINE
      NAM A2F,7 92425-16019 REV.1841 780927 
* 
*-------------------------------------------------------------
* 
* 
*     F. WARREN         17MAY76    REV. A 
* 
*     "C" COPYRIGHT HEWLETT-PACKARD COMPANY 1976. 
*     ALL RIGHTS RESERVED.  NO PART OF THIS PROGRAM 
*     MAY BE PHOTOCOPIED, REPRODUCED OR TRANSLATED
*     TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR 
*     WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY. 
* 
*-------------------------------------------------------------
* 
* 
* 
      ENT A2F 
* 
* 
* 
* 
****************************************************
* 
*       ASCII TO FLOATING POINT SUBROUTINE
* 
*       ADELE M. GADOL      MODIFIED FOR DTS-70 BY F. WARREN
* 
*       5/30/73             MODIFIED 1-19-76
* 
****************************************************
* 
* 
* 
*     *****  EXTERNAL SYMBOLS  *****
* 
*       ***  UTILITY ROUTINES  ***
* 
      EXT .ENTR,UNPAK,PAK 
      EXT FLOAT,.DST,.DLD,.FMP,.FAD,.FDV,..FCM
* 
* 
* 
*       ***  EXTERNAL STORAGE  ***
* 
      EXT UPBUF 
* 
* 
* 
*  SUBROUTINE TO CONVERT FROM AN ASCII NUMERIC
*  STRING TO A FLOATING POINT NUMBER. CONFORMS TO SPL'S 
*  FEXIT CONVENTIONS. 
* 
* 
*  EXTERNAL CALL ENTRY POINT
* 
*  CALLING SEQUENCE:  A2F(A(1),F,L,R) 
* 
*     A = STRING ARRAY (NUMBER STRING)
*          ANY NUMBER OF DIGITS WILL BE ACCEPTED, BUT THE 
*          ROUTINE WILL ONLY USE SIX SIGNIFICANT DIGITS.
*          NUMBER STRING CAN HAVE ANY OF THE FOLLOWING
*          FORMS:  NNNNN . . .
*                  +NNNNN . . . 
*                  -NNNNN . . . 
*          IN ADDITION A DECIMAL POINT MAY BE PLACE ANYWHERE IN 
*          THE NUMBER STRING.  E FORMAT CAN BE USED.  ANY OF THE
*          FOLLOWING MAY BE APPENDED TO NUMBER STRING:
*                      EN 
*                      E+N
*                      E-N
*                      ENN
*                      E+NN 
*                      E-NN 
* 
*         AN ILLEGAL STRING WILL BE FLAGGED BY THE E REGISTER 
*         SET AND THE A REGISTER = -1.  A AND E ARE CLEARED ON
*         SUCCESSFUL EXIT.
* 
*     F = FIRST CHARACTER TO USE
*     L = LAST CHARACTER TO USE 
* 
* 
*  INTERNAL CALL ENTRY POINT
* 
*  CALLING SEQUENCE:  JSB A2F 
*                     DEF *+6 
*                     DEF STRING ARRAY
*                     DEF FIRST CHAR. 
*                     DEF LAST CHAR.
*                     DEF RETURN VALUE
* 
* 
* 
ARR1  BSS 1 
FCH   BSS 1 
LCH   BSS 1 
RET3  BSS 1 
* 
A2F   NOP 
      JSB .ENTR     GET PARAMETERS
      DEF ARR1
      CLA 
      CLB 
      JSB .DST
      DEF RET3,I
      LDA LCH,I     FIND OUT NUMBER OF CHARACTERS TO
      CMA           BE SCANNED. 
      ADA FCH,I 
      SSA,RSS 
      JMP A2FR1     FCH > LCH.  ERROR.
      STA LCH       SAVE NEGATIVE FOR COUNTER.
      LDB FCH,I     SET UP POINTERS FOR PAK AND 
      CCE,SLB       UNPAK.
      CME 
      BRS 
      ADB ARR1
      CLA,SEZ,RSS 
      INB 
      ELB,RBR 
      STB UPBUF 
      STA SAVE2 
      STA SAVE5 
      STA SAVE6 
      STA FC
      CMA 
      STA SAVE4 
      STA LC
      STA RT3 
CON1  JSB UNPAK     GET CHARACTER.
      JSB DIG       DIGIT?
      JMP DECC      NO.  CHECK OTHER POSSIBILITIES. 
      SZB           ZERO? 
      JMP CON3      NO. 
      LDA SAVE5     YES.  IS IT A LEADING ZERO? 
      SZA,RSS 
      JMP CON11     YES.
CON3  ISZ SAVE2     COUNT DIGIT.
      ISZ FC
      LDA M7        MORE THAN SIX DIGITS? 
      ADA FC
      SSA,RSS 
      JMP CON4      YES.
      LDA 1 
      JSB FLOAT     NO.  FIGURE IN THIS DIGIT.
      JSB .DST
      DEF SAVE1 
      JSB .DLD
      DEF RET3,I
      JSB .FMP
      DEF TEN 
      JSB .FAD
      DEF SAVE1 
      JSB .DST
      DEF RET3,I
CON4  CLA,INA 
      STA SAVE5 
CON2  ISZ LCH       FINISHED SCANNING?
      JMP CON1      NO. 
      LDA SAVE2 
      SZA,RSS 
      JMP CON16 
      CPA SAVE4     WHERE IS DECIMAL POINT. 
      JMP CON6      AT END OF NUMBER. 
      LDA SAVE4 
      SSA 
      JMP CON10     NO DECIMAL POINT AT ALL.
CON6  LDA SAVE2 
      CMA,INA 
      ADA SAVE4     GET EXP.
      JMP CON5
CON16 LDA RT3 
      SSA 
      JMP A2FR1 
      JMP CON8
CON10 LDA SAVE2 
      STA SAVE4 
      JMP CON6
CON11 CLA 
      STA RT3 
      LDA SAVE4 
      SZA 
      JMP CON2
      ISZ SAVE2 
      JMP CON2
DECC  CPA .46       HAVE A DECIMAL POINT? 
      JMP DECI      YES.
      CPA .45       HAVE A MINUS SIGN?
      JMP MIN       YES.
      CPA .43       HAVE A PLUS SIGN? 
      JMP PLU       YES.
      CPA E         HAVE AN "E"?
      JMP CON2+2    YES.
      JMP A2FR1     NONE OF THESE - ERROR.
DECI  LDA LC
      SSA,RSS 
      JMP A2FR1 
      LDA SAVE2     SAVE # OF DIGITS ENCOUNTERED
      STA SAVE4     BEFORE THE DECIMAL POINT. 
      STA LC
      JMP CON2
MIN   CCA           SIGN OK.
      STA SAVE6 
PLU   LDA SAVE2     IF SIGN IS ENCOUNTERED IN 
      SZA           MIDDLE OF STRING, THEN THERE IS 
      JMP A2FR1     SOMETHING WEIRD.
      LDA RT3 
      SSA,RSS 
      JMP A2FR1 
      JMP CON2
CON7  ADA 1 
      LDB .6        MORE THEN 6 DIGITS. 
      STB SAVE2     ONLY SAVE 6 AS SIGNIFICANT. 
      JMP CON8      COMPENSATE WITH EXPONENT. 
CON5  LDB M6        NO DECIMAL POINT FOUND
      ADB FC
      SSB,RSS 
      JMP CON7
CON8  STA SAVE4     HANG ONTO EXPONENT. 
      CLA 
      STA FCH 
      CPA LCH 
      JMP CON9      NO E FORMAT.
      ISZ LCH       E FORMAT TO PROCESS.
      RSS 
      JMP A2FR1 
      JSB UNPAK     GET NEXT CHARACTER. 
      CPA .45       A "-"?
      ISZ FCH       YES.  SET SWITCH. 
      JSB DIG       NO.  DIGIT. 
      JMP CON13     NOT A DIGIT.
CON14 STB SAVE3     SAVE 1ST DIGIT. 
      CLB 
      ISZ LCH       FINISHED? 
      RSS 
      JMP CON15     YES.
      LDA M9        NO.  MULTIPLY PREVIOUS STUFF BY 
      STA SAVE2     10. 
      LDA SAVE3 
      ADA SAVE3 
      ISZ SAVE2 
      JMP *-2 
      STA SAVE3     SAVE RESULT AND GET NEXT
      JSB UNPAK     CHARACTER.
      JSB DIG       NUMBER? 
      JMP A2FR1     ERROR.
      JMP CON14+2 
CON13 ISZ LCH 
      RSS 
      JMP A2FR1 
      JSB UNPAK 
      JSB DIG 
      JMP A2FR1 
      JMP CON14 
CON15 LDA SAVE3    FIGURE WHOLE EXPONENT. 
      ADA 1 
      LDB FCH 
      SZB 
      CMA,INA 
CON9  ADA SAVE4 
      SSA,RSS       NEGATIVE? 
      JMP POS 
      STA SAVE5 
CON12 JSB .DLD
      DEF RET3,I
      JSB .FDV
      DEF TEN 
      JSB .DST
      DEF RET3,I
      SOC 
      JMP A2FR1 
      ISZ SAVE5 
      JMP CON12 
      JMP DONE
POS   CMA 
      STA SAVE5 
      JSB .DLD
      DEF RET3,I
      ISZ SAVE5 
      RSS 
      JMP DONE
      JSB .FMP
      DEF TEN 
      JSB .DST
      DEF RET3,I
      SOC 
      JMP A2FR1 
      JMP POS+2 
DONE  ISZ SAVE6 
      JMP *+4 
      JSB ..FCM 
      JSB .DST
      DEF RET3,I
      CLA,CLE,RSS 
A2FR1 CCA,CCE 
      JMP A2F,I 
DIG   NOP 
      LDB 0 
      ADB OM60
      SSB 
      JMP DIG,I 
      ADB M10 
      SSB 
      ISZ DIG 
      ADB .10 
      JMP DIG,I 
* 
*  STORAGE
* 
SAVE1 BSS 2 
SAVE2 BSS 1 
SAVE3 BSS 1 
SAVE4 BSS 1 
SAVE5 BSS 1 
SAVE6 BSS 1 
TEN   DEC 10.0
.20   DEC 20
E     OCT 105 
ERM1  DEC 3 
      ASC 2,A2F 
OM60  OCT -60 
.1    DEC 1 
.6    DEC 6 
.10   DEC 10
.43   DEC 43
.45   DEC 45
.46   DEC 46
M4    DEC -4
M6    DEC -6
M7    DEC -7
M9    DEC -9
M10   DEC -10 
B100  OCT 100 
ARR   BSS 1 
FC    BSS 1 
LC    BSS 1 
RT3   BSS 1 
* 
      END 
                                                                                                                                                                                                                                  