home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC6.DMS / in.adf / libsrc.lha / LIBSRC / math_doubtrans.asm < prev    next >
Encoding:
Assembly Source File  |  1994-04-15  |  5.4 KB  |  292 lines

  1.  
  2. *    Maxon C++ Library:
  3. *    Modul "math_doubtrans"
  4. *    Jens Gelhar 19.03.93, 15.04.94
  5.  
  6.     xdef    _INIT_1_MatH_DoubTRans_o,_EXIT_1_MatH_DoubTRans_o
  7.     xdef    _MathIeeeDoubTransBase,GetMathTrans
  8.     xdef    _sin,_cos,_tan,_sinh,_cosh,_tanh,_asin,_acos,_atan
  9.     xdef    _exp,_log,_log10,_sqrt,_pow,_atan2
  10.     xdef    _modf,_frexp,_ldexp,_fmod
  11.  
  12.     xref    __OpenLib,_MathIeeeDoubBasBase,_ceil,_floor
  13.  
  14. Execbase    = 4
  15.  
  16. CloseLibrary    = -414
  17. OpenLibrary    = -552
  18.  
  19. _INIT_1_MatH_DoubTRans_o:
  20.     lea mathdoubtransname(pc),a1
  21.     jsr __OpenLib
  22.     move.l d0,_MathIeeeDoubTransBase
  23.     rts
  24.  
  25. _EXIT_1_MatH_DoubTRans_o:
  26.     move.l _MathIeeeDoubTransBase,d0
  27.     beq.b ret
  28.     move.l Execbase.w,a6
  29.     move.l d0,a1
  30.     jmp CloseLibrary(a6)
  31.  
  32. GetMathTrans:
  33.     move.l _MathIeeeDoubTransBase,a6
  34.     bne.b ret
  35.     movem.l d0-d3/a0-a3,-(a7)
  36.     bsr.b _INIT_1_MatH_DoubTRans_o
  37.     movem.l (a7)+,d0-d3/a0-a3
  38.     bra.b GetMathTrans
  39. ret:    rts
  40.  
  41. _sin:    move.l a6,-(a7)
  42.     movem.l 4+4(a7),d0/d1
  43.     move.l _MathIeeeDoubTransBase,a6
  44.     jsr -36(a6)
  45.     move.l (a7)+,a6
  46.     rts
  47.  
  48. _cos:    move.l a6,-(a7)
  49.     movem.l 4+4(a7),d0/d1
  50.     move.l _MathIeeeDoubTransBase,a6
  51.     jsr -42(a6)
  52.     move.l (a7)+,a6
  53.     rts
  54.  
  55. _tan:    move.l a6,-(a7)
  56.     movem.l 4+4(a7),d0/d1
  57.     move.l _MathIeeeDoubTransBase,a6
  58.     jsr -48(a6)
  59.     move.l (a7)+,a6
  60.     rts
  61.  
  62. _asin:    move.l a6,-(a7)
  63.     movem.l 4+4(a7),d0/d1
  64.     move.l _MathIeeeDoubTransBase,a6
  65.     jsr -114(a6)
  66.     move.l (a7)+,a6
  67.     rts
  68.  
  69. _acos:    move.l a6,-(a7)
  70.     movem.l 4+4(a7),d0/d1
  71.     move.l _MathIeeeDoubTransBase,a6
  72.     jsr -120(a6)
  73.     move.l (a7)+,a6
  74.     rts
  75.  
  76. _atan:    move.l a6,-(a7)
  77.     movem.l 4+4(a7),d0/d1
  78.     move.l _MathIeeeDoubTransBase,a6
  79.     jsr -30(a6)
  80.     move.l (a7)+,a6
  81.     rts
  82.  
  83. _sinh:    move.l a6,-(a7)
  84.     movem.l 4+4(a7),d0/d1
  85.     move.l _MathIeeeDoubTransBase,a6
  86.     jsr -60(a6)
  87.     move.l (a7)+,a6
  88.     rts
  89.  
  90. _cosh:    move.l a6,-(a7)
  91.     movem.l 4+4(a7),d0/d1
  92.     move.l _MathIeeeDoubTransBase,a6
  93.     jsr -66(a6)
  94.     move.l (a7)+,a6
  95.     rts
  96.  
  97. _tanh:    move.l a6,-(a7)
  98.     movem.l 4+4(a7),d0/d1
  99.     move.l _MathIeeeDoubTransBase,a6
  100.     jsr -72(a6)
  101.     move.l (a7)+,a6
  102.     rts
  103.  
  104. _exp:    move.l a6,-(a7)
  105.     movem.l 4+4(a7),d0/d1
  106.     move.l _MathIeeeDoubTransBase,a6
  107.     jsr -78(a6)
  108.     move.l (a7)+,a6
  109.     rts
  110.  
  111. _log:    move.l a6,-(a7)
  112.     movem.l 4+4(a7),d0/d1
  113.     move.l _MathIeeeDoubTransBase,a6
  114.     jsr -84(a6)
  115.     move.l (a7)+,a6
  116.     rts
  117.  
  118. _log10:    move.l a6,-(a7)
  119.     movem.l 4+4(a7),d0/d1
  120.     move.l _MathIeeeDoubTransBase,a6
  121.     jsr -126(a6)
  122.     move.l (a7)+,a6
  123.     rts
  124.  
  125. _sqrt:    move.l a6,-(a7)
  126.     movem.l 4+4(a7),d0/d1
  127.     move.l _MathIeeeDoubTransBase,a6
  128.     jsr -96(a6)
  129.     move.l (a7)+,a6
  130.     rts
  131.  
  132. _pow:    movem.l d2/d3/a6,-(a7)
  133.     movem.l 3*4+4(a7),d0/d1;         = x
  134.     move.l _MathIeeeDoubTransBase,a6
  135.     jsr -84(a6)                     ; ln x
  136.     movem.l 3*4+12(a7),d2/d3;        = y
  137.     move.l _MathIeeeDoubBasBase,a6
  138.     jsr -78(a6)                     ; y * ln x
  139.     move.l _MathIeeeDoubTransBase,a6
  140.     jsr -78(a6)                     ; exp(...)
  141.     movem.l (a7)+,d2-d3/a6
  142.     rts
  143.  
  144.  
  145. pi_1    = $400921FB
  146. pi_2    = $54442D0F
  147.  
  148. _atan2:    movem.l d2-d3/a0-a2/a6,-(a7)
  149.     movem.l 6*4+4(a7),d0-d3
  150.     tst.l d2
  151.     bne.b at0
  152.     ; Division durch Null umgehen:
  153.     move.l #$3FF921FB,d0            ; = pi/2
  154.     move.l #$54442CF9,d1
  155.     bra.b at1
  156. at0:    move.l _MathIeeeDoubBasBase,a6
  157.     jsr -84(a6)                     ; DIV
  158.     move.l _MathIeeeDoubTransBase,a6
  159.     jsr -30(a6)
  160. at1:    tst.l 6*4+4(a7)         ; x < 0 ?
  161.     bpl.b at3               ; dann Korrektur-Rechnung
  162.     move.l #pi_1,d2
  163.     move.l #pi_2,d3
  164.     tst.l d0
  165.     bmi.b at2
  166.     ; x = x'-pi
  167.     move.l _MathIeeeDoubBasBase,a6
  168.     jsr -72(a6)
  169.     bra.b at3
  170. at2:    ; x = x'+pi
  171.     move.l _MathIeeeDoubBasBase,a6
  172.     jsr -84(a6)
  173. at3:    movem.l (a7)+,d2-d3/a0-a2/a6
  174.     rts
  175.  
  176.  
  177. _modf:    ; Stack-Parameter: double, double*
  178.     movem.l d2-d4/a0,-(a7)
  179.     movem.l 4*4+4(a7),d0/d1/a0
  180.     move.l d0,d4
  181.     beq.b modf_small
  182.     bclr #31,d4
  183.     swap d4
  184.     lsr.w #4,d4             ; Exponent
  185.     sub.w #$3FF,d4
  186.     blo.b modf_small
  187.     cmp.w #52,d4
  188.     bhs.b modf_large
  189.     move.l #$FFF00000,d2
  190.     moveq  #$0,d3
  191.     tst.w d4
  192.     beq.b modf_end
  193. modf_shift:    asr.l #1,d2
  194.     roxr.l #1,d3
  195.     subq.w #1,d4
  196.     bne.b modf_shift
  197. modf_end:    and.l d2,d0             ; d0|d1 ist Ganzzahl-Anteil
  198.     and.l d3,d1
  199.     cmp.l #0,a0
  200.     beq.b modf_1
  201.     movem.l d0/d1,(a0)
  202. modf_1:    move.l d0,d2
  203.     move.l d1,d3
  204.     movem.l 4*4+4(a7),d0/d1
  205.     move.l _MathIeeeDoubBasBase,a6
  206.     jsr -72(a6)           ; sub
  207. modf_ret:    movem.l (a7)+,d2-d4/a0
  208.     rts
  209. modf_small:    ; Betrag des Parameters < 1:
  210.     cmp.l #0,a0
  211.     beq.b modf_ret
  212.     clr.l (a0)+
  213.     clr.l (a0)+
  214.     bra.b modf_ret
  215. modf_large:    ; Betrag größer als 2^52:
  216.     cmp.l #0,a0
  217.     beq.b modf_2
  218.     movem.l d0/d1,(a0)
  219. modf_2:    moveq #0,d0
  220.     moveq #0,d1
  221.     bra.b modf_ret
  222.  
  223.  
  224. _frexp:    ; Parameter: double, int*
  225.     movem.l d2/a0,-(a7)
  226.     movem.l 2*4+4(a7),d0/d1/a0
  227.     move.l d0,d2
  228.     beq.b frexp_zero
  229.     bclr #31,d2
  230.     swap d2
  231.     lsr.w #4,d2
  232.     sub.w #$3FE,d2
  233.     ext.l d2
  234.     move.l d2,(a0)
  235.     and.l #$000FFFFF,d0
  236.     or.l  #$3FE00000,d0
  237. frexp_ret:    movem.l (a7)+,d2/a0
  238.     rts
  239. frexp_zero:    clr.l (a0)
  240.     bra.b frexp_ret
  241.  
  242.  
  243. _ldexp:    ; Parameter: double, int
  244.     move.w 4(a7),d0
  245.     beq.b ldexp_zero
  246.     move.l 12(a7),d1
  247.     bclr #15,d0
  248.     lsr.w #4,d0
  249.     ext.l d0
  250.     add.l d1,d0
  251.     cmp.l #$7FF,d0
  252.     bhi.b ldexp_overflow
  253.     swap d0
  254.     asl.l #4,d0
  255.     and.l #$800FFFFF,4(a7)
  256.     or.l 4(a7),d0
  257.     move.l 8(a7),d1
  258.     rts
  259. ldexp_overflow:    tst.l d1
  260.     bmi.b ldexp_zero
  261.     move.l #$7FFFFFFF,d0
  262.     moveq #-1,d1
  263.     rts
  264. ldexp_zero:    moveq #0,d0
  265.     moveq #0,d1
  266.     rts
  267.  
  268. _fmod:    ; x%y = y*frac(x/y)
  269.     movem.l d2-d3/a0/a6,-(a7)
  270.     movem.l 4*4+4(a7),d0-d3
  271.     move.l _MathIeeeDoubBasBase,a6
  272.     jsr -84(a6)                     ; x/y
  273.     subq.l #8,a7
  274.     move.l a7,-(a7)
  275.     movem.l d0/d1,-(a7)
  276.     bsr _modf                       ; Nachkommateil berechnen
  277.     lea 12+8(a7),a7
  278.     movem.l 4*4+12(a7),d2/d3
  279.     move.l _MathIeeeDoubBasBase,a6
  280.     jsr -78(a6)                     ; mit y multiplizieren
  281.     movem.l (a7)+,d2-d3/a0/a6
  282.     rts
  283.  
  284. mathdoubtransname:    dc.b 'mathieeedoubtrans.library',0
  285.  
  286.     SECTION D,DATA
  287.  
  288. _MathIeeeDoubTransBase:    blk.l 1
  289.  
  290.     end
  291.  
  292.