home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 3 / CD_Magazyn_EXEC_nr_3.iso / Recent / game / wb / Klotz.lha / Klotz / src / MathUtils.asm < prev    next >
Assembly Source File  |  1998-02-18  |  3KB  |  153 lines

  1. *
  2. *   $VER: MathUtils.asm 0.2 (15.8.93)
  3. *
  4. * MatheFunktionen in Utility sichern alle Adress-Register
  5. * und benötigen Base nicht in a6
  6. CALLx macro
  7.     xref _LVO\1
  8.     jsr  _LVO\1(a0)
  9.     endm
  10.  
  11. LDiv
  12. *   Langwort-Division
  13. *   =>    d0  :    Divident
  14. *    d1  :    Divisor
  15. *   <=    d0  :    Quotient
  16.     push    a0/d1
  17.     bsr     LDivMod
  18.     pop     a0/d1
  19.     rts
  20.  
  21. LMod
  22. *   Langwort-Modulo
  23. *   =>    d0  :    Divident
  24. *    d1  :    Divisor
  25. *   <=    d0  :    Modulo
  26.     push    a0/d1
  27.     bsr     LDivMod
  28.     move.l  d1,d0
  29.     pop     a0/d1
  30.     rts
  31. LMul
  32. *   Langwort-Muliplikation
  33. *   =>    d0  :    Faktor
  34. *    d1  :    Faktor
  35. *   <=    d0  :    Produkt
  36.     push    a0/d1
  37.     bsr     _FetchBase
  38.     CALLx    UMult32
  39.     pop     a0/d1
  40.     rts
  41.  
  42. LDivMod
  43.     bsr     _FetchBase
  44.     CALLx    UDivMod32
  45.     rts
  46. _FetchBase
  47.     copy.l  UtlBase,a0
  48.     rts
  49. *
  50. *  FixedMath Versuche (7.10.94)
  51. *
  52. *   Format $xxxxyyyy, wobei xxxx Vorkomma yyyy Nachkomma in HEX
  53. *   Noch keine negativen Werte
  54. *   Alles Schrott ( ungetestet)
  55. *   Na ja, Müll vielleicht
  56. ToFixed
  57. *  => d0.w Integer
  58. *  <= d0.l Fixed
  59.     swap    d0
  60.     move.w  #0,d0   Nachkomma löschen (keine Rundung - dazu Test auf "Negativ")
  61.     rts
  62. FromFixed
  63. *  => d0.l Fixed
  64. *  <= d0.w Integer
  65.     tst.w   d0
  66.     bmi     .addone
  67.     clr.w   d0
  68.     swap    d0
  69.     rts
  70. .addone
  71.     clr.w   d0
  72.     swap    d0
  73.     addq.w  #1,d0
  74.     rts
  75. FixedMul
  76. *   => d0,d1 Fixed
  77. *   <=    d0 : d0*d1
  78.     push    d2-d5
  79.     moveq   #0,d4
  80.     moveq   #0,d5
  81.     move.l  d0,d2
  82.     move.w  d4,d2
  83.     swap    d2        Vorkomma1
  84.     move.l  d1,d3
  85.     move.w  d5,d3
  86.     swap    d3        Vorkomma2
  87.     move.w  d0,d4    Nachkomma1
  88.     move.w  d1,d5    Nachkomma2
  89.     move.l  d3,d1
  90. *      Zahl1 * V2
  91.     move.l  d3,d1
  92.     bsr     LMul
  93.     move.l  d0,d3
  94. *      V1    * N2
  95.     move.l  d5,d0
  96.     move.l  d2,d1
  97.     bsr     LMul
  98.     move.l  d0,d2
  99. *     (N1    * N2) >>16
  100.     move.l  d5,d0
  101.     move.l  d4,d1
  102.     bsr     LMul
  103.     move.l  d0,d4
  104.     move.w  #0,d4
  105.     swap    d4
  106.     add.l   d3,d2
  107.     add.l   d4,d2
  108.     move.l  d2,d0
  109.     pop     d2-d5
  110.     rts
  111. FixedInv
  112. *    Scheint IO zu sein
  113. * => d0 : Fixed
  114. * <= d0 : 1/Fixed ( -1 für Fixed = 0)
  115. *
  116.     move.l  d0,d1
  117.     lsr.l   #8,d1        ; >>8
  118.     beq.s   .DivDurchNull
  119.     move.l  #$01000000,d0   ; Fixed 1<<8
  120.     bra     LDiv
  121. .DivDurchNull
  122.     moveq   #-1,d0
  123.     rts
  124. FixedDiv
  125. *   => d0,d1
  126. *   <= d0/d1
  127.     push    d0
  128.     move.l  d1,d0
  129.     bsr     FixedInv
  130.     pop     d1
  131.     bra     FixedMul
  132.     ifne 0
  133. FixedPow
  134. *   => d0 : Fixed
  135. *      d1 : Integer
  136.     tst.l   d1
  137.     bgt     .todo
  138.     moveq   #1,d0
  139.     swap    d0
  140.     rts
  141. .todo
  142.     push    d2/d3
  143.     move.l  d1,d3
  144.     subq.l  #1,d3
  145.     move.l  d0,d2
  146. .loop
  147.     move.l  d2,d1
  148.     bsr     FixedMul
  149.     dbra    d3,.loop
  150.     pop     d2/d3
  151.     rts
  152.     endc
  153.