ASMB,R,L,C HED <> NAM BADEC,7 92101-16020 REV.1650 * * * ************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. ALL RIGHTS * * RESERVED. NO * PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ************************************************************** * ENT D. SUB,D.ADD,D.MPY,D.DIV,D.EDT * EXT .ENTR,SADD,SSUB,SMPY,SDIV,SEDIT,SMOVE * ********************************************** * * * DECIMAL STRING BASIC INTERFACE PACKAGE * * * ********************************************** * JSTR NOP KSTR NOP AERR NOP D.ADD NOP JSB .ENTR DEF JSTR * CLA STA AERR,I INITIALIZE ERROR INDICATOR LDA JSTR,I GET STRING CHARACTER COUNT STA JEND SAVE AS STRING END LDA KSTR,I GET CHARACTER COUNT OF 2ND STRING STA KEND SAVE AS STRING END ISZ JSTR SKIP TO NEXT WORD OF EACH STRING ISZ KSTR JSB SADD CALL STRING ADD DEF *+8 DEF JSTR,I JSTR DEF .1 IS ADDED TO DEF JEND KSTR DEF KSTR,I DEF .1 DEF KEND DEF AERR,I JMP D.ADD,I RETURN * * * * LSTR NOP MSTR NOP SERR NOP D.SUB NOP JSB .ENTR DEF LSTR * CLA STA SERR,I INITIALIZE ERROR INDICATOR LDA LSTR,I GET STRING CHARACTER COUNT STA JEND SAVE AS STRING END LDA MSTR,I GET CHARACTER COUNT OF 2ND STRING STA KEND SAVE AS STRING END ISZ LSTR SKIP TO NEXT WORD OF EACH STRING ISZ MSTR JSB SSUB CALL STRING SUBTRACT DEF *+8 DEF LSTR,I LST DEF .1 IS SUBTRACTED FROM DEF JEND MSTR DEF MSTR,I DEF .1 DEF KEND DEF SERR,I JMP D.SUB,I RETURN * * * * RSTR NOP SSTR NOP MERR NOP D.MPY NOP JSB .ENTR DEF RSTR * CLA STA MERR,I INITIALIZE ERROR INDICATOR LDA RSTR,I GET STRING CHARACTER COUNT STA JEND SAVE AS STRING END LDA SSTR,I GET CHARACTER COUNT OF 2ND STRING STA KEND SAVE AS STRING END ISZ RSTR SKIP TO NEXT WORD OF EACH STRING ISZ SSTR * LDA JEND COMPUTE EXTRA WORK SPACE ALS REQUIRED FOR THE COMPUTATION ADA KEND N1-(2*JEND)+KEND+1 INA STA N1 ADA KEND N2=(2*JEND)+(2*KEND) ADA M1 STA N2 * JSB SMOVE CALL STRING MOVE DEF *+6 DEF SSTR,I SSTR DEF .1 IS MOVED TO DEF KEND KTEMP DEF KTEMP DEF N1 * JSB SMPY CALL STRING MULTIPLY DEF *+8 DEF RSTR,I RSTR DEF .1 IS MULTIPLIED BY DEF JEND SSTR (IN KTEMP) DEF KTEMP DEF N1 DEF N2 DEF MERR,I * LDB MERR,I TEST ERROR INDICATOR LDA 1 SAVE IN A-REGISTER CMB,INB TEST FOR SMPY OVERFLOW ADB N2 (MERR=N2) SZB,RSS JMP OVFL YES SZA TEST FOR OTHER SMPY ERRORS JMP EXIT2 YES, ERROR RETURN LDA JEND CMA,INA ADA N1 STA N3 N3=N1-JEND * CMA,INA COMPUTE LENGTH OF PRODUCT ADA N2 INA STA LEN SAVE AS RESULT STRING CHAR COUNT LDB PTRS,I GET ADDRESS OF RESULT STRING CMB,INB SUBTRACT FROM ADDRESS OF ERR PARM ADB PTRM,I BLS DOUBLE TO GET SPACE IN CHARACTERS CMA,INA ADB 0 COMPARE DIFFERENCE (DIM SPACE) SSB WITH SPACE NEEDED FOR PRODUCT JMP OVFL NOT ENOUGH SPACE - OVERFLOW * JSB SMOVE CALL STRING MOVE DEF *+6 DEF KTEMP KTEMP DEF N3 IS MOVED TO DEF N2 SSTR DEF SSTR,I DEF .1 * LDA LEN GET LENGTH OF RESULT LDB SSTR GET STRING ADDRESS ADB M1 GET ADDRESS OF FIRST WORD STA 1,I STORE IN FIRST WORD OF STRING CLA,RSS SET MERR=0 OVFL LDA KEND SET MERR=KEND STA MERR,I * EXIT2 JMP D.MPY,I RETURN * * * * * * GSTR NOP HSTR NOP DERR NOP REM NOP D.DIV NOP JSB .ENTR DEF GSTR * CLA STA DERR,I INITIALIZE ERROR INDICATOR STA REM,I INITIALIZE REMAINDER INDICATOR LDA GSTR,I GET STRING CHARACTER COUNT STA JEND SAVE AS STRING END LDA HSTR,I GET CHARACTER COUNT OF 2ND STRING STA KEND SAVE AS STRING END ISZ GSTR ISZ HSTR * * LDA JEND COMPUTE EXTRA WORK SPACE ALS REQUIRED FOR THE COMPUTATION ADA KEND N1=(2*JEND)+KEND+1 INA STA N1 ADA KEND N2=(2*JEND)+(2*KEND) ADA M1 STA N2 * JSB SMOVE CALL STRING MOVE DEF *+6 DEF HSTR,I HSTR DEF .1 IS MOVED TO DEF KEND KTEMP DEF KTEMP DEF N1 * JSB SDIV CALL STRING DIVIDE DEF *+8 DEF GSTR,I GSTR DEF .1 IS DIVIDED INTO DEF JEND HSTR (IN KTEMP) DEF KTEMP DEF N1 DEF N2 DEF DERR,I * LDB DERR,I TEST ERROR INDICATOR LDA 1 SAVE IN A-REGISTER CMB,INB TEST FOR SDIV OVERFLOW ADB N2 (DERR-N2) SZB,RSS JMP OVFL2 YES SZA TEST FOR OTHER SDIV ERRORS JMP EXIT YES, ERROR RETURN LDA JEND CMA,INA ADA N1 STA N3 N3=N1-JEND * CMA,INA COMPUTE LENGTH OF QUOTIENT ADA N2 INA STA LEN SAVE AS RESULT STRING CHAR COUNT LDB PTRH,I GET ADDRESS OF RESULT STRING CMB,INB SUBTRACT FROM ADDRESS OF ERR PARM ADB PTRD,I BLS DOUBLE TO GET SPACE IN CHARACTERS CMA,INA ADB 0 COMPARE DIFFERENCE (DIM SPACE) SSB WITH SPACE NEEDED FOR QUOTIENT JMP OVFL2 NOT ENOUGH SPACE - OVERFLOW * JSB SMOVE CALL STRING MOVE DEF *+6 DEF KTEMP RESULT IN KTEMP DEF N3 IS MOVED TO DEF N2 HSTR DEF HSTR,I DEF .1 * LDA LEN GET LENGTH OF RESULT LDB HSTR GET STRING ADDRESS ADB M1 GET ADDRESS OF FIRST WORD STA 1,I * LDB JEND GET DIVISOR STRING CHAR. COUNT ADB M1 (JEND-1) IS RELATIVE LOCATION OF CMD,INB REMAINDER IN THE RESULT STRING ADB 0 CHARACTER COUNT - (JEND-1) STB REM,I POSITION OF REMAINDER IN RESULT CLA,RSS SET DERR=0 OVFL2 LDA KEND SET DERR=KEND STA DERR,I * EXIT JMP D.DIV,I RETURN * * * * PSTR NOP QSTR NOP EERR NOP D.EDT NOP ENTRY JSB .ENTR GET PARAMETERS DEF PSTR LDA PSTR,I GET STRING CHARACTER COUNT STA JEND SAVE AS STRING END LDB,QSTR,I GET CHAR COUNT OF 2ND STRING CMA,INA TEST IF PSTR GREATER THAN QSTR ADA 1 SSA JMP OVFL3 YES, ERROR RETURN STB KEND NO, SAVE AS STRING END ISZ PSTR SKIP TO NEXT WORD OF EACH STRING ISZ QSTR * JSB SEDIT CALL STRING EDIT ROUTINE DEF *+7 DEF PSTR,I PSTR IS EDITED DEF .1 USING EDIT MASK DEF JEND IN QSTR DEF QSTR,I RESULT IN QSTR DEF .1 DEF KEND CLB SET ERROR INDICATOR TO ZERO OVFL3 STB EERR,I RETURN 0 OR KEND AS ERROR NUMBER * JMP D.EDT,I RETURN * * * * M1 DEC -1 .1 DEC 1 N1 BSS 1 N2 BSS 1 N3 BSS 1 KTEMP BSS 1020 JEND BSS 1 KEND BSS 1 LEN BSS 1 PTRD DEF DERR PTRH DEF HSTR PTRM DEF MERR PTRS DEF SSTR * END