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 ".DADS" - DOUBLE INTEGER ADD & SUBTRACT.
      NAM .DADS,7 24998-1X036 REV.2001 780818 
* 
      ENT .DAD,.DSB,.DSBR 
* 
A     EQU 0 
B     EQU 1 
* 
*     .DADS ADDS OR SUBTRACTS DOUBLE INTEGERS, GIVING A DOUBLE INTEGER
*     RESULT.  THE NUMBER FORMAT IS:
*        FIRST WORD = SIGN, MSB   IN A-REG OR LOCATION K. 
*        SECOND WORD = LSB        IN B-REG OR LOCATION K+1. 
*     THE OPERATIONS PERFORMED ARE: 
*        .DAD  (A,B) _ (A,B) + MEM
*        .DSB  (A,B) _ (A,B) - MEM
*        .DSBR (A,B) _ MEM - (A,B)
* 
*     CALLING SEQUENCE: 
* 
*                   DLD <ARG1>
*                   JSB <.DAD,.DSB OR .DSBR>
*                   DEF <ARG2>
*                   <RETURN>
* 
*     IF OVERFLOW OCCURS, THE OVERFLOW BIT IS SET AND THE LEAST 
*     SIGNIFICANT 32 BITS OF THE RESULT ARE RETURNED, ELSE
*     OVERFLOW IS CLEARED.  THE "E" BIT IS CHANGED ONLY IF IT 
*     IS CLEAR AND A CARRY OUT OF BIT 31 OCCURS.
      SKP 
*                   ".DAD" AND COMMON CODE. 
* 
.DAD  NOP 
      STA ARG1      SAVE ARG 1
      STB ARG1+1
      CCA           SET FLAG. 
      STA FLAG
      ERA,CLE       SAVE E-BIT. 
      STA E 
      LDA .DAD,I    GET ARG 2 
      STA ARGP      MAY BE IN (A,B) ! 
      LDA ARG1
DAD1  DLD ARGP,I
DAD2  ISZ .DAD      SKIP ARG. 
      ADB ARG1+1    ADD LOWERS. 
      CLO           IGNORE OFL IN LOWER ADD 
      SEZ,CCE,RSS   CARRY ? 
      JMP DAD4      NO. 
      ISZ E         RESTORE E.
      CLE 
      SSA           YES. A<0 ?
      JMP DAD3      YES, ADD CARRY FIRST. 
      ADA ARG1      NO, ADD UPPERS FIRST. 
      INA           THEN CARRY
      JMP DAD6      GO CHECK FLAG.
DAD3  INA           A<0, ADD CARRY FIRST. 
      JMP DAD5
DAD4  ISZ E         RESTORE E 
      CLE 
DAD5  ADA ARG1      THEN UPPERS.
DAD6  ISZ FLAG      ADD OR E WAS SET ?
      CME           NO, BORROW = .NOT. CARRY
      JMP .DAD,I    EXIT
      SKP 
*                   ".DSBR" 
* 
.DSBR NOP 
      STB ARG1      SAVE ORIGINAL B.
      CCB           SAVE E BIT
      ERB 
      STB E 
      STB FLAG      FLAG = (ADD).OR.(E) 
      LDB ARG1
      CMA,CLE       NEGATE FIRST ARG (IN A & B) 
      CMB,INB       LEAVE E WITH CARRY INTO UPPER.
      STB ARG1+1    SAVE 2ND WD NEGATED 1ST ARG.
      LDB .DSBR     COPY ENTRY PT.
      STB .DAD
      LDB B,I       SAVE ADDR ARG.
      STB ARGP
      LDB ARG1      RESTORE ORIGINAL ARG. 
      STA ARG1      SAVE 1ST WD NEGATED 1ST ARG.
      CMA           (2ND ARG MAY BE IN (A,B) TOO) 
      JMP DAD1      FINISH USING ".DAD" 
* 
*                   ".DSB"
* 
.DSB  NOP 
      STA ARG1      SAVE ARG 1
      STB ARG1+1
      CCA           SAVE E-BIT
      ERA 
      STA E 
      STA FLAG      FLAG = (ADD).OR.(E) 
      LDA .DSB      COPY ENTRY PT 
      STA .DAD
      LDA A,I       GET SECOND ARG
      STA ARGP      MAY BE IN (A,B) ! 
      LDA ARG1
      DLD ARGP,I
      CMA,CLE       NEGATE IT 
      CMB,INB       LEAVE CARRY IN E. 
      JMP DAD2      FINISH USING ".DAD" 
* 
*                   LOCALS. 
* 
ARG1  BSS 2         TEMP FOR ARG 1 OR 2.
ARGP  BSS 1         ADDR OF ARG.
FLAG  BSS 1         -1 IFF (SUBTRACT) & (E) 
E     BSS 1         -1 IFF (E)
      END 
                                                                                                                                                                                                                                            