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