ASMB,R,L,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-18120
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".CDIV" COMPLEX DIVISION
      NAM .CDIV,6 24998-1X120 REV.2013 791227 
* 
      ENT .CDIV 
      EXT .ZRNT,.ENTC,.FLUN,..FCM 
* 
*     .CDIV - COMPLEX DIVIDE. 
* 
*     CALLING SEQUENCE: Y = X1 / X2 
* 
*                   JSB .CDIV 
*                   DEF Y 
*                   DEF X1
*                   DEF X2
* 
*     METHOD:   THE MOST OFTEN QUOTED FORM OF COMPLEX DIVIDE IS:
* 
*                   (A,B)     (A*C+B*D,B*C-A*D) 
*                   -----  =  ----------------- 
*                   (C,D)          C*C+D*D
* 
*     WHICH FAILS FOR LARGE VALUES OF C OR D, EVEN THOUGH THE RESULT
*     MAY BE EASILY REPRESENTABLE.  A MODIFICATION IS USED WHICH AVOIDS 
*     THIS PROBLEM: 
* 
*                   (A,B)     (A+B*D/C,B-A*D/C) 
*                   -----  =  -----------------    IF ABS(C) > ABS(D) 
*                   (C,D)          C+D*D/C
*     AND 
* 
*                   (A,B)     (B+A*C/D,-A+B*C/D)
*                   -----    -----------------    IF ABS(C) < ABS(D)
*                   (C,D)          D+C*C/D
* 
*     NOTE THAT THE SECOND FORM IS IDENTICAL TO THE FIRST EXCEPT THAT:
* 
*                   1) "A" HAS BEEN SWITCHED WITH "B", AND "C" WITH "D".
*                   2) THE SIGN OF THE IMAGINARY PART HAS CHANGED.
* 
*     THE SECOND FORM IS COMPUTED BY PERFORMING THESE TWO OPERATIONS. 
      SKP 
*                   INITIALIZATION.  GET ADDRESSES OF A,B,C,D & RESULT. 
* 
TDB   NOP 
      ABS .CDIV-TDB 
      NOP 
T1    BSS 2 
T2    BSS 2 
T3    BSS 2 
IY    NOP 
B     NOP 
D     NOP 
Y     NOP 
A     NOP 
C     NOP 
.CDIV NOP 
      JSB .ZRNT 
      DEF LIBX
      JSB .ENTC     GET PRAMS ADDRESS 
      DEF Y 
      STA TDB+2 
      LDA Y         COMPUTE ADDRESSES OF IMAG PARTS.
      ADA =D2 
      STA IY
      LDA A 
      ADA =D2 
      STA B 
      LDA C 
      ADA =D2 
      STA D 
* 
*                   DECIDE WHICH PART OF DENOMINATOR IS BIGGER. 
* 
      DLD C,I       T1 = - EXPONENT OF C. 
      CCE,SZA,RSS   C=0 ?   (E=1) 
      ERA,SLA,ARS   IF SO, SET EXP TO -16384. 
      JSB .FLUN 
      CMA,INA 
      STA T1
      DLD D,I       GET EXP OF D. 
      CCE,SZA,RSS   D=0 ?   (E=1) 
      ERA,SLA,ARS   IF SO, SET EXP TO -16384. 
      JSB .FLUN 
      ADA T1        EXP(D) - EXP(C) 
      RAL,SLA,ERA   ABS(C) > ABS(D) ?   (E=1 IF SO) 
      JMP CDIV1     YES. USE D/C. 
      LDA A         NO. D>C. SWAP (USE OF) A & B,  C & D. 
      LDB B 
      STA B 
      STB A 
      LDA C 
      LDB D 
      STA D 
      STB C 
      SKP 
*                   PERFORM THE DIVIDE. 
* 
CDIV1 DLD D,I       T1 = D / C
      FDV C,I 
      STA T1
      STB T1+1
      FMP D,I       T2 = C+D*D/C
      FAD C,I 
      STA T2
      STB T2+1
      DLD B,I       REAL PART = (A+B*D/C) / T2
      FMP T1
      FAD A,I 
      FDV T2
      DST T3
      DLD A,I       IMAG PART = +-(B-A*D/C) / T2
      FMP T1
      FSB B,I 
      SEZ           C>D ? 
      JSB ..FCM     YES, IS (B-A*D/C).
      FDV T2
      DST IY,I
      DLD T3
      DST Y,I 
LIBX  JMP TDB+2,I 
      DEF TDB 
      DEC 0 
      END 
                                                                                                        