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-18XXX  SEE NAM FOR LAST THREE DIGITS 
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".XDIV"  EXTENDED PRECISION DIVIDE
      NAM .XDIV,6 24998-1X172 REV.2001 750701 
      ENT .XDIV 
      EXT .ZRNT,.XPAK 
      SPC 1 
* 
*     EXTENDED PRECISION DIVISION IS PERFORMED BY THIS ROUTINE
*     CALLING SEQUENCE: 
* 
*     JSB .XDIV 
*     DEF X 
*     DEF Y 
*     DEF Z 
*     WHERE    X = Y / Z
      SPC 2 
TDB   NOP 
      DEC 23
      NOP 
GETAD NOP 
      JMP GETAX 
GETPM NOP 
      JMP GETPX 
X1    NOP 
X2    NOP           QUOTIENT
X3    NOP 
TEM1  NOP 
TEM2  NOP           TEMPORARY 
TEM3  NOP 
Y1    NOP 
Y2    NOP           DIVIDEND
Y3    NOP 
EXPY  NOP 
Z1    NOP 
Z2    NOP           DIVISOR 
Z3    NOP 
EXPZ  NOP 
SIGN  NOP 
X     NOP           QUOTIENT
      SPC 1 
.XDIV NOP 
      JSB .ZRNT 
      DEF LIBX
      LDA *-2 
      LDB *-4 
      SSA,RSS 
      STB TDB+2     CHECK IF RE-ENTERENT OR NOT 
      JSB GETAD     GET ADDRESS OF X
      STB X         SAVE FOR LATER USE
      CLA,INA       SET SIGN NEG. 
      STA SIGN      INITIALIZE SIGN 
      LDB DEFY
      JSB GETPM     PRODUCE +ABS (Y)
      CCA           PRODUCE -ABS (Z)
      LDB DEFZ
      JSB GETPM 
      CCE,SZB       CHECK FOR 0 DIVISOR (Z) 
      JMP NZERO     NOT ZERO SO CONTINUE
      ERB,RBR       SET B-REG TO 40000B 
      STB X1        SET HI-MANTISSA TO APPROX +1
      STB EXPY      SET EXPONENT TO + INFINITY
      JMP OUTPT     PACK AND PUT IN X 
NZERO CLA,CLE 
      STA X3        INITIALIZE QUOTIENT 
      LDA =D-47 
      STA GETAD     SET SHIFT COUNT TO -47
      SPC 1 
*                 * PERFORM THE DIVIDE *
      SPC 1 
LOOP  LDB Y3        T = Y + Z 
      ADB Z3        LO-MANT Z 
      LDA Y2        MID-MANT Y
      SEZ,CLE       CARRY FROM LO-MANT? 
      INA           YES 
      ADA Z2        ADD MID-MANTS 
      STA TEM2      AND SAVE
      LDA Y1        HI-MANT Y 
      SEZ,CLE       CARRY FROM MID-MANT?
      INA           YES 
      ADA Z1        ADD HI-MANTS? 
      STA TEM1      WITH E-REG = OVERFLOW 
      STB TEM3
      SPC 1 
*      SHIFT E-REG INTO X 
      SPC 1 
      LDA X3        NOW SHIFT E-REG 
      LDB X2        INTO LEAST BIT OF X 
      ELA 
      ELB 
      STA X3
      STB X2
      LDB X1
      ELB,CLE       EXIT E-REG = 0
      STB X1
      SLA,RSS       LEAST BIT OF X = 1
      JMP SHFTY     NO
      SPC 1 
*    SET Y  =  Y  +  Z  IF  Y  +  Z  OVERFLOWED 
      SPC 1 
      LDA TEM3      YES, LET Y = Y + Z
      STA Y3
      LDA TEM2
      STA Y2
      LDA TEM1
      STA Y1
      SPC 1 
*    SHIFT Y LEFT ONE PLACE  (MPY BY 2) 
      SPC 1 
SHFTY LDA Y3        NOW SHIFT Y LEFT
      LDB Y2        ONE PLACE (MPY BY 2)
      ELA 
      ELB 
      STA Y3
      STB Y2
      LDA Y1
      ELA,CLE 
      STA Y1
      ISZ GETAD     TEST FOR END OF LOOP
      JMP LOOP
      SPC 1 
*     MOVE RESULTS TO X 
      SPC 1 
OUTPT LDA SIGN      CHECK IF SIGN CHANGE
      ERA           SAVE CHANGE IN E-REG
      LDA X         GET X'S ADDRESS 
      STA TEM1      SAVE TEMPORARY
      LDA X1
      SEZ           COMPLEMENT IF SIGN CHANGE 
      CMA 
      STA X,I       PUT IN HI-MANTISSA
      LDA X2
      SEZ 
      CMA 
      LDB X3
      SEZ 
      CMB,INB,SZB   LO-MANTISSA & CHECK IF BUMP 
      JMP PACK      NO BUMP CONTINUE
      INA,SZA       BUMP MID-MANTISSA 
      JMP PACK      NO BUMP, CONTINUE 
      ISZ X,I       BUMP HI-MANTISSA
      NOP           0 IS POSSIBLE, BUT -1 IS NOT. 
PACK  ISZ TEM1      NOW PUT IN CALLERS Z PARAM
      STA TEM1,I
      ISZ TEM1
      STB TEM1,I
      LDA EXPZ      CALCULATE EXPONENT
      CMA,INA       EXP = EXPY - EXPZ + 1 
      ADA EXPY
      INA           PLUS 1
      JSB .XPAK     PACK RESULT 
      DEF X,I       IN "X'S" PLACE
LIBX  JMP TDB+2,I 
      DEF TDB 
      DEC 0 
      SPC 1 
GETPX EQU *         ENTRY B=ADDRESS OF DESTINATION PLACE
      STB X1        SAVE DEST ADDRESS 
      INB 
      STB X2
      INB 
      STB X3
      JSB GETAD     GET DIRECT ADDRESS
      STB TEM1      SAVE ADDRESS OF Y OR Z
      LDB TEM1,I    GET HI-MAN OF Y OR Z
      XOR B         RESULTS = SIGN(Y-OR-Z,A-REG.) 
      RAL,SLA,ERA   "SIGN CHANGE NEEDED" IN E-REG 
      ISZ SIGN      MARK A CHANGE OF SIGN 
      ISZ TEM1      BUMP
      LDA TEM1,I    GET MID-MANTISSA
      SEZ           COMPLEMENT IF NEG.
      CMA 
      STA X2,I      SAVE
      ISZ TEM1      BUMP
      LDA TEM1,I    GET LO-MAN + EXPONENT 
      AND OM400     MASK OF EXPONENT
      SEZ           COMPLEMENT IF NEG.
      CMA 
      STA X3,I      AND SAVE
      SEZ           RESTORE IF CHANGED
      CMA 
      XOR TEM1,I    NOW GET EXPONENT
      SLA,RAR       POSITION EXPONENT 
      IOR OM200     MIRGE IF NEG. 
      SEZ,RSS       NEED TO COMPLEMENT HI-MAN 
      JMP DONE      NO, FINISH UP 
      CMB           COMPLEMENT & CHECK FURTHER PROC.
      ISZ X3,I      NOW DO THE INA'S
      JMP DONE
      ISZ X2,I      BUMP MID-MANTISSA 
      JMP DONE
      SSB,INB,RSS   BUMP HI-MANTISSA
      SSB,RSS       OVERFLOWED? 
      JMP DONE
      RBR           DIVIDE BY 2 AND 
      INA           BUMP EXPONENT 
DONE  ISZ X3        BUMP X3 TO EXPONENT 
      STA X3,I      STORE EXPONENT
      STB X1,I      SAVE HI-MANTISSA
      JMP GETPM,I   RETURN, B-REG = HI-MANTISSA 
      SPC 1 
GETAX EQU *         ENTRY A=DEF OF DEF PRAM 
      LDB TDB+2     RETURN A-REG = A-REG+1 &
      LDB B,I       B-REG = DIRECT ADDRESS OF PRAM
      RBL,CLE,SLB,ERB  INDIRECT?
      JMP *-2       YES, TRY AGAIN
      ISZ TDB+2     BUMP TO NEXT PARAM
      JMP GETAD,I   RETURN, E-REG = 0 
      SPC 1 
DEFZ  DEF Z1
DEFY  DEF Y1
OM200 OCT -200
OM400 OCT -400
      SPC 1 
B     EQU 1 
      END 
* 
                  