home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / xbase / library / clipper / rettig / source / _tr_frex.asm < prev    next >
Assembly Source File  |  1990-10-21  |  3KB  |  110 lines

  1. ; _TR_FREX.ASM
  2. ;
  3. ; by Ralph Davis, Leonard Zerman
  4. ; modified by Rick Spence
  5. ;
  6. ; Placed in the public domain by Tom Rettig Associates, 10/22/1990.
  7. ;
  8. ;
  9.  
  10.          PUBLIC   __TR_FREXP
  11.  
  12. DGROUP GROUP _DATA
  13. ;***************************************************
  14. _DATA  SEGMENT  WORD PUBLIC 'DATA'
  15.  
  16. ;
  17. RETNUM   DQ   0
  18. RETNUM2  DQ   0
  19. ;
  20. _DATA  ENDS
  21. ;***************************************************
  22. ;**************************************
  23. _TR_FREX_TEXT SEGMENT BYTE PUBLIC 'CODE'
  24.          ASSUME   CS:_TR_FREX_TEXT,DS:_DATA
  25. ;--------------------------------------
  26. ;
  27. ;     Replaces Lattice library routine frexp();
  28. ;
  29. ;  C SYNTAX:  _tr_frexp(n, ip);
  30. ;
  31. ;  double _tr_frexp();
  32. ;    double n;
  33. ;    int *ip;
  34. ;
  35. ;  RETURNS:  Mantissa in pointer to double in DX:AX, Exponent in *ip
  36. ;
  37. ;  NOTE:     This routine behaves somewhat differently from the
  38. ;            Lattice routine.
  39. ;
  40. ;            Lattice normalizes the mantissa to be between 0 and 1,
  41. ;            and increases the exponent accordingly.
  42. ;
  43. ;            This routine returns the mantissa the way it is actually
  44. ;            stored, i.e., as a number between 1 and 2.  The
  45. ;            exponent is returned exactly as represented.
  46. ;
  47. ;            ALSO NOTE that zero, which is stored as 8 bytes of
  48. ;            zeroes, is returned as a mantissa of 0.000 and an
  49. ;            exponent of 0, as it is by the Lattice library routine.
  50. ;
  51. ;--------------------
  52. __TR_FREXP PROC    FAR
  53.           PUSH    BP
  54.           MOV     BP,SP
  55.           PUSH    SI
  56.           PUSH    DI
  57.           PUSH    DS
  58.           PUSH    ES
  59.           PUSH    CX
  60.           PUSH    BX
  61.           MOV     AX,WORD PTR [bp+12]
  62.           MOV     WORD PTR _DATA:RETNUM2+6,AX
  63.           MOV     AX,WORD PTR [bp+10]
  64.           MOV     WORD PTR _DATA:RETNUM2+4,AX
  65.           MOV     AX,WORD PTR [bp+8]
  66.           MOV     WORD PTR _DATA:RETNUM2+2,AX
  67.           MOV     AX,WORD PTR [bp+6]
  68.           MOV     WORD PTR _DATA:RETNUM2,AX
  69.           MOV     DX,[BP+6]    ; Load number (double precision)
  70.           MOV     CX,[BP+8]    ; into AX:BX:CX:DX
  71.           MOV     BX,[BP+10]
  72.           MOV     AX,[BP+12]
  73.           OR      AX,AX        ; Is the number zero?
  74.           JZ      FR_RET0
  75.           MOV     SI,AX        ; Isolate exponent
  76.           AND     SI,7FFFH     ; Turn off sign bit
  77.           XOR     AH,AH        ; Clear AH
  78.           OR      AX,3FF0H     ; Mantissa has 0 exponent (1.xxx * 2^0)
  79.           REPT    4
  80.           SHR     SI,1
  81.           ENDM
  82.           MOV     WORD PTR  _DATA:RETNUM2+6,AX
  83.           MOV     AX,OFFSET _DATA:RETNUM2
  84.           MOV     DX,DS      ;SEG    _DATA:RETNUM2
  85.           JMP     SHORT FR_1
  86. FR_RET0:  
  87.           MOV     AX,OFFSET _DATA:RETNUM+6 ;Return zero mantissa and exponent
  88.           MOV     DX,DS     ;SEG    _DATA:RETNUM
  89.           MOV     SI,03FFH
  90.  
  91. FR_1:
  92.           SUB     SI,03FFH     ; SI now holds exponent
  93.           LES     DI,[BP+14]   ; Pick up address for return of exponent
  94.           MOV     ES:[DI],SI   ; Store it
  95.  
  96.           POP     BX
  97.           POP     CX
  98.           POP     ES
  99.           POP     DS
  100.           POP     DI
  101.           POP     SI
  102.           POP     BP
  103.           RET
  104. __TR_FREXP ENDP
  105. ;--------------------------------------
  106. _TR_FREX_TEXT     ENDS
  107. ;**************************************
  108.           END
  109.  
  110.