ASMB,R,L,C
      HED ".FADS" 2-WORD FLOATING-POINT ADD & SUBTRACT. 
* 
*     NAME:  .FADS
*     SOURCE: 92068-18039 
*     RELOC:  PART OF 92067-16268 AND 92067-16035 
*     PGMR:   R.A.G.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  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.       *
*  ***************************************************************
* 
* 
      NAM .FADS,6 92068-1X039 REV.2013 790417 
      ENT .FAD,.FSB 
      EXT .PACK,.ZPRV 
* 
* 
*     CALLING SEQUENCE
* 
*        DLD X          DLD X 
*        JSB .FAD       JSB .FSB
*        DEF Y          DEF Y 
* 
*          FLOATING RESULT (X+Y) OR (X-Y) IN A AND B REGISTERS. 
*          "E" BIT PRESERVED. 
      SPC 3 
*                   ADD: UNPACK, GO ADD.
* 
* 
.FAD  NOP            ENTRY FOR FLOATING ADD.
      JSB .ZPRV 
      DEF LIBX
      STA A1        SAVE (A). 
      LDA .FAD      COPY ENTRY POINT. 
      STA .FSB
      LDA A1        RESTORE (A).
      JSB UNPAK     GET ARGUMENTS UNPACKED
      JMP ADMUP     GO TO COMMON SECTION
* 
*                   SUBTRACT: UNPACK, NEGATE, GO ADD. 
* 
.FSB  NOP            ENTRY FOR FSB. EXIT FOR FAD/FSB. 
      JSB .ZPRV 
      DEF LIBX
      STA A1        SAVE (A). 
      JSB UNPAK      GET ARGUMENTS UNPACKED.
      LDA A2        (A,B) = SECOND MANTISSA.
      LDB B2
      CMA           DOUBLE LENGTH TWOS COMPLEMENT.
      CMB,INB,SZB   IF LOW PART NOT ZERO, THEN ALL
      JMP FSB01       DONE. 
      SSA,INA,RSS   OTHERWISE BUMP A. IF A WAS NEGA-
      SSA,RSS        TIVE, AND REMAINS SO,
      JMP FSB01 
      RAR             THEN SHIFT IT DOWN &
      ISZ X2           BUMP THE EXPONENT. (SKIP O.K.) 
FSB01 STB B2
      STA A2
      SKP 
*                   COMMON: FIRST, ENSURE FIRST ARG HAS LARGER EXPONENT.
* 
ADMUP ISZ .FSB       BUMP RETURN ADDRESS. 
      LDA X2        COMPUTE EXPONENT DIFFERENCE.
      CMA,INA 
      ADA X1
      CMA,SSA,INA   IF ARG1 IS LARGER, GO TO ADD
      JMP ADDEM       SECTION.
      LDA A1        OTHERWISE, EXCHANGE THE ARGS. 
      LDB A2
      STA A2
      STB A1
      LDA B1
      LDB B2
      STA B2
      STB B1
      LDA X2        RE-COMPUTE EXPONENT DIFFERENCE, 
      CMA,INA       BUT DON'T NEGATE. 
      ADA X1
      LDB X2        RESET X1. 
      STB X1
* 
*                   SHIFT SMALLER ARGUMENT RIGHT. 
* 
ADDEM ADA K24       IF SHIFT COUNT IS 25 OR MORE, 
      CMA,SSA,INA,RSS  THEN IGNORE SMALLER ARGUMENT.
      JMP TAKIT 
      ADA K24       RESTORE SHIFT COUNT.
      CLE,ERA       DIVIDE BY TWO.
      SZA           WAS IT ZERO OR ONE ?
      ADA ASR00     NO, CONSTRUCT SHIFTS (ELSE NOPS)
      STA XEQ1      STORE THEM. 
      STA XEQ2
      LDB A2        (B,A) = SMALLER ARGUMENT. 
      LDA B2
XEQ1  NOP           ** VARIABLE SHIFT **
XEQ2  NOP           ** VARIABLE SHIFT **
      SEZ,CLE       EXTRA SHIFT ? 
      ASR 1         YES. DO IT. 
* 
*                   ADD LARGER ARGUMENT TO (B,A). 
* 
      ADA B1        ADD LOWERS. 
      CLO           WILL CHECK FOR OFL. 
      SEZ,RSS       CARRY OUT OF LOWER ADD ?
      JMP FAD05     NO. JUST GO ADD UPPERS. 
      CLE,SSB       YES. CHECK SIGN OF UPPER IN B.
      JMP FAD04     B<0. ADD THE CARRY TO IT. 
      ADB A1        B>=0. ADD THE OTHER UPPER,
      INB           THEN THE CARRY. 
      JMP FAD06 
FAD04 INB           ADD CARRY.
FAD05 ADB A1        ADD OTHER UPPER.
      SKP 
*                   COMPENSATE FOR MANTISSA OVERFLOW. SWAP. 
* 
FAD06 SOS           OVERFLOW ?
      JMP FAD07     NO. 
      ISZ X1        YES. BUMP EXPONENT. 
      NOP           DON'T REMOVE !! 
      ERB           AND RIGHT SHIFT.
      ERA 
FAD07 SWP 
* 
*                   PACK, RESTORE "E" & EXIT. 
* 
DONE  JSB .PACK     PACK IT.
X1    NOP 
      STA A1        RESTORE "E".
      LDA ESAVE 
      ELA 
      LDA A1
LIBX  JMP .FSB,I
      DEF .FSB
* 
*                   SHIFT > 24, JUST RETURN LARGER NUMBER.
* 
TAKIT LDA A1
      LDB B1
      JMP DONE
      SKP 
*                   COMMON UNPACK FOR ADD & SUBTRACT. 
* 
UNPAK NOP           UNPACKING SECTION 
      STB A2        (IN CASE SECOND ARG IN (A,B) )
      SZA,RSS       IF FIRST ARGUMENT = 0,
      CLB,INB       SET ITS EXPONENT TO MAX NEG.
      ERA           SAVE "E". 
      STA ESAVE 
      LDA 1         GET LO-MAN+EXP
      AND OM400     MASK OF EXP 
      STA B1        SAVE LOW PART OF ARG1 
      XOR 1         GET EXPONENT
      SLA,RAR       FORM AND POSITION 
      IOR OM200 
      STA X1        SAVE EXP. OF ARG1 
      LDA .FSB,I    (A) = ADDRESS OF SECOND ARGUMENT. 
      STA B2        BE CAREFUL. 
      LDA A1        RESTORE A,B 
      LDB A2
      DLD B2,I      GET SECOND ARGUMENT 
      STA A2        SAVE HIGH PART
      SZA,RSS       IF SECOND ARGUMENT = 0, 
      CLB,INB       SET ITS EXPONENT TO MAX NEG.
      LDA 1         GET LO-MAN+EXP
      AND OM400     MASK TO GET LO-MAN
      STA B2        SAVE LOW PART 
      XOR 1         GET EXPONENT
      SLA,RAR 
      IOR OM200 
      STA X2        SAVE EXP
      JMP UNPAK,I 
* 
*                   CONSTANTS & TEMPS.
* 
A1    NOP           UPPER OF FIRST / LARGER.
B1    NOP           LOWER OF FIRST / LARGER.
A2    NOP           UPPER OF SECOND / SMALLER.
B2    NOP           LOWER OF SECOND / SMALLER.
X2    EQU .FAD      SECOND EXPONENT.
ESAVE NOP           "E" BIT IN SIGN.
* 
K24   DEC 24
OM400 OCT -400
OM200 OCT -200
ASR00 ASR 16
* 
      END 
                                                                                                          