ASMB
      NAM SMPY,7 24306-60001 REV.2026 791205  
* 
* 
******************************************************************* 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS RESERVED.
* NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, REPRODUCED, OR
* TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR WRITTEN
* CONSENT OF HEWLETT-PACKARD COMPANY. 
******************************************************************* 
* 
* 
*     SOURCE:    24306-18017
*     RELOC:     24306-60001
* 
* 
* 
******************************************************************
* 
* 
* 
* 
*FUNCTION - MULTIPLY ONE CHARACTER STRING FIELD OF
*ARBITRARY LENGTH BY A SECOND CHARACTER STRING AND
*PLACE THE RESULT IN THE SECOND STRING
* 
*CALLING SEQUENCE 
*CALL SMPY(JSTR,J,JLAST,KSTR,K,KLAST,NER) 
* 
*ERROR CONDITIONS 
*IF KSTR DOES NOT HAVE ENOUGH POSITIONS TO ALLOW FOR
*ITS EXTENSION NER=KLAST AND SMPY TERMINATES
*IF JSTR OF KSTR CONTAINS A NON-NUMERIC CHAR IN OTHER 
*THAN THE LAST POSITION,NER=-1
* 
      ENT SMPY
      EXT .ENTR,SA2DE,SSIGN,SFILL 
      EXT S.GET,SDCAR,SDEA2,SD2D1,SD1D2 
PARAM BSS 7 
SMPY  NOP 
      JSB .ENTR     TRANSFER PARAMETERS 
      DEF PARAM 
      CLA 
      STA IERR
      LDA PARAM+2,I 
      CMA           KSTRT=K-JLAST+J-1 
      ADA PARAM+1,I 
      ADA PARAM+4,I 
      STA KSTRT 
      ADA KSTRT     BLOW=2*KSTRT-KLAST-1
      LDB PARAM+5,I BLOW IS 1ST POSITION IN KSTR
      CMB            AFTER CONVERSION TO D1 
      ADA 1 
      STA BLOW
      SSA           BLOW<0?(OVERFLOW?)
      JMP ERR1      IF SO 
      SZA           BLOW=0?(OVERFLOW?)
      JMP *+2 
      JMP ERR1      IF SO 
      JSB SA2DE     CONVERT JSTR TO D2
      DEF *+5 
      DEF PARAM,I 
      DEF PARAM+1,I 
      DEF PARAM+2,I 
      DEF IERR
      LDA IERR      ILLEGAL CHAR? 
      SZA 
      JMP ERR2      IF SO 
      JSB SA2DE     CONVERT KSTR TO D2
      DEF *+5 
      DEF PARAM+3,I 
      DEF PARAM+4,I 
      DEF PARAM+5,I 
      DEF IERR
      LDA IERR      ILLEGAL CHAR? 
      SZA 
      JMP ERR3      IF SO 
      JSB SSIGN     PICK UP SIGN OF JSTR,SEJ JSTR>=0
      DEF *+5 
      DEF PARAM,I 
      DEF PARAM+2,I 
      DEF ONE 
      DEF JSIGN     IF JSTR>=0,JSIGN=1,ELSE JSIGN=-1
      JSB SSIGN     PICK UP SIGN OF KSTR,SET KSTR>=0
      DEF *+5 
      DEF PARAM+3,I 
      DEF PARAM+5,I 
      DEF ONE 
      DEF KSIGN     IF KSTR>=0,KSIGN=1,ELSE KSIGN=-1
      CCA           IY=K-1
      ADA PARAM+4,I 
      STA IY
      JSB SFILL     LEFT FILL KSTR WITH 0 
      DEF *+5 
      DEF PARAM+3,I 
      DEF KSTRT 
      DEF IY
      DEF ZERO
      LDA PARAM+1,I JFRST=J 
      STA JFRST 
E25   JSB S.GET      JTEST=JSTR(JFRST)
      DEF *+4 
      DEF PARAM,I 
      DEF JFRST 
      DEF JTEST 
      LDA JTEST     JTEST>O?
      SSA 
      JMP AGAIN 
      SZA 
      JMP E47       IF SO 
AGAIN LDA PARAM+2,I JFRST-JLAST>=O?(JSTR=0?)
      CMA,INA 
      ADA JFRST 
      SSA,RSS 
      JMP FILL      IF SO 
      ISZ JFRST     JFRST=JFRST+1 
      JMP E25 
FILL  JSB SFILL     FILL KSTR WITH 0
      DEF *+5 
      DEF PARAM+3,I 
      DEF BLOW
      DEF PARAM+5,I 
      DEF ZERO
E40   JSB SSIGN     RESTORE SIGN OF JSTR
      DEF *+5 
      DEF PARAM,I 
      DEF PARAM+2,I 
      DEF JSIGN 
      DEF JNOW
E41   JSB SDEA2     CONVERT JSTR TO A2
      DEF *+5 
      DEF PARAM,I 
      DEF PARAM+1,I 
      DEF PARAM+2,I 
      DEF IERR
      JSB SDEA2     CONVERT KSTR TO A2
      DEF *+5 
      DEF PARAM+3,I 
      DEF BLOW
      DEF PARAM+5,I 
      DEF IERR
      JMP SMPY,I    RETURN
E47   JSB SD2D1     CONVERT KSTR TO D1
      DEF *+5 
      DEF PARAM+3,I 
      DEF KSTRT 
      DEF PARAM+5,I 
      DEF DIFF
      LDA PARAM+4,I CALCULATE WORD ADDRESS
      ADA DIFF       FOR INDICES FOR D1 FORMAT: 
      STA BKM        BKM=K+DIFF 
      LDA PARAM+5,I  BLAST=KLAST+DIFF 
      ADA DIFF
      STA BLAST 
      LDA KSTRT       BSTRT=KSTRT+DIFF
      ADA DIFF
      STA BSTRT 
E48   LDB BKM       MULT=KSTR(BKM)
      ADB PARAM+3 
      LDA 1,I 
      STA MULT
      SZA,RSS       MULT=0? 
      JMP E50       IF SO 
      SSA,RSS       MULT>0? 
      JMP E60       IF SO 
E50   LDA BLAST     BKM-BLAST>0?
      CMA,INA 
      ADA BKM 
      SSA,RSS 
      JMP CARY      IF SO 
      ISZ BKM       BKM=BKM+1 
      JMP E48 
CARY  JSB SDCAR     RESOLVE CARRIES IN KSTR 
      DEF *+5 
      DEF PARAM+3,I 
      DEF BSTRT 
      DEF BLAST 
      DEF KNOW
      JSB SD1D2     CONVERT KSTR TO D2
      DEF *+5 
      DEF PARAM+3,I 
      DEF KSTRT 
      DEF PARAM+5,I 
      DEF DIFF
      LDA JSIGN     IY=JSIGN*MSIGN
      MPY KSIGN 
      STA IY
      JSB SSIGN     MAKE IY SIGN OF KSTR
      DEF *+5 
      DEF PARAM+3,I 
      DEF PARAM+5,I 
      DEF IY
      DEF KNOW
      JMP E40 
E60   LDB BKM       KSTR(BKM)=0 
      ADB PARAM+3 
      CLA 
      STA 1,I 
      LDA PARAM+2,I KNOW=BKM+JFRST-JLAST
      CMA,INA 
      ADA JFRST 
      ADA BKM 
      STA KNOW
      LDA JFRST     JNOW=JFRST
      STA JNOW
E62   JSB S.GET      **START OF INNER LOOP**
      DEF *+4       JTEST=JSTR(JNOW)
      DEF PARAM,I 
      DEF JNOW
      DEF JTEST     KTEST=KSTR(KNOW)
      LDB KNOW      KTEST=KSTR(KNOW)
      ADB PARAM+3 
      LDA 1,I 
      STA KTEST 
      LDA MULT      *******HEART OF ALGORITHM*******
      MPY JTEST     ITEST=MULT*JTEST+KTEST
      ADA KTEST 
      LDB KNOW
      ADB PARAM+3   KSTR(KNOW)=ITEST
      STA 1,I 
      ISZ KNOW      KNOW=KNOW+1 
      LDA PARAM+2,I JNOW-JLAST>=0?
      CMA,INA 
      ADA JNOW
      SSA,RSS 
      JMP E50       IF SO 
      ISZ JNOW      JNOW=JNOW+1 
      JMP E62       **END OF INNER LOOP** 
ERR1  LDA PARAM+5,I NER=KLAST 
      STA PARAM+6,I 
      JMP SMPY,I    RETURN
ERR2  CCA        NER=-1 
      STA PARAM+6,I CONVERT JSTR TO A2
      JSB SDEA2 
      DEF *+5 
      DEF PARAM,I 
      DEF PARAM+1,I 
      DEF PARAM+2,I 
      DEF IERR
      JMP SMPY,I
ERR3  CCA           NER=-1
      STA PARAM+6,I 
      JMP E41 
ZERO  OCT 0 
ONE   OCT 1 
IERR  OCT 0 
KSTRT BSS 1 
BLOW  BSS 1 
JSIGN BSS 1 
IY    BSS 1 
JFRST BSS 1 
JTEST BSS 1 
KSIGN BSS 1 
KTEST BSS 1 
JNOW  BSS 1 
KNOW  BSS 1 
BKM   BSS 1 
BLAST BSS 1 
DIFF  BSS 1 
MULT  BSS 1 
BSTRT BSS 1 
      END 
      END$
                                                                                                                                                                                                                    