ASMB,L,R,C
* 
*  **************************************************************** 
*  * (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.        * 
*  **************************************************************** 
* 
*   NAME: PART OF MATH LIBRARY
*   SOURCE:  24998-18XXX  SEE NAM FOR LAST THREE DIGITS 
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".DMP" - DOUBLE INTEGER MULTIPLY. 
      NAM .DMP,7 24998-1X045 REV.2001 780818
* 
      ENT .DMP
* 
A     EQU 0 
B     EQU 1 
* 
*     .DMP TAKES THE PRODUCT OF TWO DOUBLE INTEGERS.  SEE ".DADS" 
*     FOR DATA FORMAT.
*     NOTE: THE INSTRUCTION "MPY" IS NOT COMPATIBLE WITH ".DMP" ! 
* 
*                   CALLING SEQUENCE: 
* 
*                   DLD <ARG1>
*                   JSB .DMP
*                   DEF <ARG2>
*                   <RETURN>
* 
*     IF OVERFLOW OCCURS, THE OVERFLOW BIT IS SET AND THE VALUE 
*     (077777,177777) IS RETURNED, ELSE OVERFLOW IS CLEARED.
*     THE E-BIT IS PRESERVED. 
      SPC 3 
*                   COPY ARGS, DECIDE WHICH IS SHORT (IN [-2**15,+2**15) ). 
* 
.DMP  NOP 
      STA ARG1      SAVE ARG 1
      STB ARG1+1
      CCA           SAVE "E". 
      ERA 
      STA E 
      LDA B         SWAP
      LDB ARG1
      ASL 16        O=0 IF SHORT
      CLE           COPY O TO E 
      SOC 
      CCE 
      LDA .DMP,I    COPY ARG 2
      ISZ .DMP
      STA ARG2      MAY BE IN (A,B) ! 
      LDA ARG1
      LDB ARG1+1
      DLD ARG2,I
      STA ARG2
      STB ARG2+1
      SWP 
      ASL 16        O=0 IF SHORT
      SKP 
*                   NOW E=0 IFF ARG1 SHORT, O=0 IFF ARG2 SHORT. 
*                   CHECK IF SIMPLE MULTIPLY OR REVERSED ORDEFR.
* 
      SOC           ARG 2 SHORT ? 
      JMP DMP1      NO. 
      SEZ,RSS       YES, ARG 1 SHORT ?
      JMP DMP4      YES, SIMPLE MULTIPLY. 
      LDA ARG1      NO, LONG*SHORT, SWITCH. 
      LDB ARG2
      STB ARG1
      STA ARG2
      LDA ARG1+1
      LDB ARG2+1
      STB ARG1+1
      STA ARG2+1
* 
*                   NOW ARG2 IS OUTSIDE [-2**15,+2**15).  ASSUME THAT 
*                   ARG1 IS IN [-2**16,+2**16).  FORM THE PRODUCT 
*                   (ARG1L)*(ARG2U,ARG2L), WHICH IS A  16-BIT UNSIGNED
*                   BY 32-BIT SIGNED MULTIPLY, YIELDING A 48-BIT SIGNED 
*                   RESULT.  THE PRODUCT CANNOT OVERFLOW. 
* 
DMP1  LDA ARG1+1    ARG1L*ARG2L 
      MPY ARG2+1
      STA RES+1 
      LDA ARG2+1    CORRECT FOR ARG2L<15> 
      SSA 
      ADB ARG1+1
      LDA ARG1+1    CORRECT FOR ARG1L<15> 
      SSA 
      ADB ARG2+1
      STB RES 
      MPY ARG2      ARG1L*ARG2U 
      CLE           FORM MIDDLE RESULT WORD.
      ADA RES 
      STA RES 
      SEZ           PROPOGATE CARRY 
      INB 
      LDA ARG1+1    CORRECT FOR ARG1L<15> 
      SSA 
      ADB ARG2
* 
*                   THE PRODUCT IS NOW IN (B,RES,RES+1).  VERIFY THAT 
*                   ARG1 IS IN [-2**16,+2**16). 
* 
      LDA ARG1      UPPER WORD MUST BE ZERO OR -1.
      SZA,RSS 
      JMP DMP3      ZERO, PRODUCT IS O.K. 
      INA,SZA 
      JMP OFL       NOT -1, OVERFLOW. 
      SKP 
*                   ARG1U = -1, CORRECT FOR IT:  SUBTRACT ARG2 * 2**16 .
*                   IF ARG2 = MAX NEG #, THE WHOLE PRODUCT OVERFLOWS. 
*                   IF NOT, THE WHOLE PRODUCT FITS IN 48 BITS.
* 
      STB ARG1      SAVE FIRST WORD RESULT. 
      LDB ARG2      NEGATE ARG2.
      LDA ARG2+1
      CMB 
      CMA,CLE,INA,SZA 
      JMP DMP2      IF NO CARRY. (E=0)
      CLE,INB       ELSE PROPOGATE. (E=0: ARG2.NE.0)
      CPB =B040000  OVERFLOW ?
      JMP OFL       YES, WHOLE THING OVERFLOWS. 
DMP2  ADA RES       ADD -ARG2 TO PRODUCT. 
      STA RES 
      SEZ 
      INB 
      ADB ARG1
* 
*                   CHECK FOR OVERFLOW, SET RESULT, EXIT. 
* 
DMP3  LDA RES       CHECK FOR OFL.
      ASL 16
      LDA B         FORM RESULT.
      LDB RES+1 
      SOS           CHECK FOR OVERFLOW. 
      JMP EXIT      NO, GO RESTORE "E". 
OFL   LDA =B77777   RETURN (077777,177777)
      CCB 
      STO           SET OVERFLOW. 
      JMP EXIT      GO RESTORE "E". 
* 
*                   SIMPLE MULTIPLY.
* 
DMP4  LDA B         ARG2L 
      MPY ARG1+1    ARG2L*ARG1L 
      SWP 
EXIT  CCE           RESTORE "E".
      ISZ E 
      CLE 
      JMP .DMP,I
* 
*                   LOCALS. 
* 
ARG1  BSS 2         ARG 1 
ARG2  BSS 2         ARG2 & RESULT 
RES   BSS 2         LAST 2 WORDS OF 48-BIT PRODUCT. 
E     BSS 1         -1 IFF E=1. 
      END 
                                                                