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

  1.  
  2. *    Maxon C++ Library:
  3. *    Modul "math_64Bit"
  4. *    Jens Gelhar 02.09.92, 15.04.94
  5.  
  6.     xdef    lib_64bit_add,lib_64bit_sub
  7.     xdef    lib_64bit_neg,lib_64bit_cmp
  8.     xdef    lib_64bit_mult,lib_64bit_multS
  9.     xdef    lib_64bit_div,lib_64bit_divS
  10.     xdef    lib_64bit_mod,lib_64bit_modS
  11.     xdef    _vlongtostr,_uvlongtostr
  12.  
  13.     xref    exit__i,uintmult
  14.  
  15. lib_64bit_add:    ; d0|d1 += d2|d3
  16.     add.l d2,d0
  17.     bhs.b .1
  18.     addq.l #1,d1
  19. .1    add.l d3,d1
  20.     rts
  21.  
  22. lib_64bit_sub:    ; d0|d1 -= d2|d3
  23.     sub.l d2,d0
  24.     bhs.b .1
  25.     subq.l #1,d1
  26. .1    sub.l d3,d1
  27.     rts
  28.  
  29. lib_64bit_neg:    ; d0|d1
  30.     movem.l d2/d3,-(a7)
  31.     move.l d0,d2
  32.     move.l d1,d3
  33.     moveq #0,d0
  34.     moveq #0,d1
  35.     bsr.b lib_64bit_sub
  36.     movem.l (a7)+,d2/d3
  37.     rts
  38.  
  39. Neg64bitd23:    ; d0|d3
  40.     exg d0,d2
  41.     exg d1,d3
  42.     bsr.b lib_64bit_neg
  43.     exg d0,d2
  44.     exg d1,d3
  45.     rts
  46.  
  47. lib_64bit_multS:    ; vorzeichenbehaftet:
  48.     tst.l d1
  49.     bpl.b m64s1
  50.     bsr.b lib_64bit_neg
  51.     tst.l d3
  52.     bpl.b m64sNeg
  53.     bsr.b Neg64bitd23
  54.     bra.b lib_64bit_mult
  55. m64s1:    tst.l d3
  56.     bpl.b lib_64bit_mult
  57.     bsr.b Neg64bitd23
  58. m64sNeg:    bsr.b lib_64bit_mult
  59.     bra.b lib_64bit_neg
  60.  
  61.  
  62. lib_64bit_mult:    ; d0|d1 *= d2|d3
  63.     movem.l d4-d7,-(a7)
  64.     exg d1,d3               ; d1 in d3 retten
  65.     move.l d0,d6            ; d0 in d6 retten
  66.     jsr uintmult
  67.     move.l d0,d5            ; d5 = d0*d3
  68.     move.l d3,d0
  69.     move.l d2,d1
  70.     jsr uintmult
  71.     add.l d5,d0             ; d0 = d0*d3 + d1*d2
  72.     exg d6,d0               ;    nach d6 retten
  73.     move.l d2,d1
  74.     ; d0|d1 = d0*d2 berechnen:
  75.  
  76.     ; d0|d1 = d0*d1, Trash d4/d5/d7
  77.     move.l d0,d4
  78.     swap d4
  79.     mulu d1,d4              ; d4 = H0*L1
  80.     move.l d1,d7
  81.     swap d7
  82.     mulu d0,d7              ; d7 = L0*H1
  83.     moveq #0,d5
  84.     add.l d7,d4
  85.     bhs.b mul1
  86.     move.l #$10000,d5
  87. mul1    swap d4
  88.     move.w d4,d5
  89.     clr.w d4                ; d4|d5 = (H0*L1 + L0*H1)'
  90.     move.l d0,d7
  91.     mulu d1,d7              ; d7 = L0+L1
  92.     swap d0
  93.     swap d1
  94.     mulu d0,d1              ; d1 = H0*H1
  95.     move.l d7,d0            ; d0|d1 = L0*L1 + (H0*H1)''
  96.     add.l d5,d1
  97.     add.l d4,d0
  98.     bhs.b mul2
  99.     addq.l #1,d1
  100. mul2    ; Hi-Longwords addieren:
  101.     add.l d6,d1             ; d0|d1 = d0*d2 + [d0*d3 + d1*d2]'
  102.     movem.l (a7)+,d4-d7
  103.     rts
  104.  
  105.  
  106. lib_64bit_divS:    ; vorzeichenbehaftet dividieren
  107.     tst.l d1
  108.     bmi.b d64bs1
  109.     tst.l d3
  110.     bpl.b lib_64bit_div
  111.     bsr Neg64bitd23
  112.     bra.b d64bs3
  113. d64bs1    bsr lib_64bit_neg
  114.     tst.l d3
  115.     bpl.b d64bs2
  116.     bsr Neg64bitd23
  117.     bra.b lib_64bit_div
  118. d64bs2    bsr.b lib_64bit_div
  119. d64bs3    bsr lib_64bit_neg
  120.     bra Neg64bitd23
  121.  
  122. lib_64bit_div:    ; d0|d1 /= d2|d3, d2|d3 = d0|d1 % d2|d3
  123.     movem.l d4-d7/a0,-(a7)
  124.     lea 65.w,a0             ; Schleifenzähler
  125.     moveq #0,d4
  126.     moveq #0,d5             ; d4|d5: Hi-Bits von d0|d1
  127.     moveq #0,d6
  128.     moveq #0,d7             ; d6|d7: Ergebnis
  129.     tst.l d2
  130.     bne.b d64bLoop
  131.     tst.l d3
  132.     bne.b d64bLoop
  133.     move.l #9999,-(a7)
  134.     jsr exit__i
  135. d64bLoop
  136.     subq.l #1,a0
  137.     cmp.l #0,a0
  138.     beq.b d64bEnd
  139.     asl.l #1,d6
  140.     roxl.l #1,d7
  141.     asl.l #1,d0
  142.     roxl.l #1,d1
  143.     roxl.l #1,d4
  144.     roxl.l #1,d5
  145.     cmp.l d3,d5
  146.     blo.b d64bLoop
  147.     bhi.b d64b1
  148.     cmp.l d2,d4
  149.     blo.b d64bLoop
  150. d64b1    ; subtrahieren:
  151.     sub.l d2,d4
  152.     bhs.b d64b2
  153.     subq.l #1,d5
  154. d64b2    sub.l d3,d5
  155.     ; Erg. inkrementieren:
  156.     addq.l #1,d6
  157.     bne.b d64bLoop
  158.     addq.l #1,d7
  159.     bra.b d64bLoop
  160. d64bEnd    move.l d6,d0
  161.     move.l d7,d1
  162.     move.l d4,d2
  163.     move.l d5,d3
  164.     movem.l (a7)+,d4-d7/a0
  165.     rts
  166.  
  167. lib_64bit_mod:
  168.     bsr.b lib_64bit_div
  169.     move.l d2,d0
  170.     move.l d3,d1
  171.     rts
  172.  
  173. lib_64bit_modS:
  174.     bsr lib_64bit_divS
  175.     move.l d2,d0
  176.     move.l d3,d1
  177.     rts
  178.  
  179. lib_64bit_cmp:    ; cmp.d d2|d3, d0|d1
  180.     cmp.l d3,d1
  181.     bne.b cmp64b1
  182.     cmp.l d2,d0
  183.     beq.b cmp64b1
  184.     ; Zahlen unterscheiden sich nur in untersten 64 Bit
  185.     swap d0
  186.     swap d2
  187.     move.w d0,d1
  188.     move.w d2,d3
  189.     bra.b lib_64bit_cmp
  190. cmp64b1    rts
  191.  
  192. ConvDecimal:    ; a0 -> d0|d1
  193.     moveq #0,d0
  194.     moveq #0,d1
  195. coDc1    moveq #0,d4
  196.     move.b (a0)+,d4
  197.     sub.b #'0',d4
  198.     cmp.w #10,d4
  199.     bhs.b coDc2
  200.     moveq #10,d2
  201.     moveq #0,d3
  202.     bsr lib_64bit_mult
  203.     add.l d4,d0
  204.     bhs.b coDc1
  205.     addq.l #1,d1
  206.     bra.b coDc1
  207. coDc2    rts
  208.  
  209. _vlongtostr:    ; Stack-Parameter: Doppelwort, Buffer.L, Base.W
  210.     tst.l 4+4(a7)
  211.     bpl.b _uvlongtostr
  212.     movem.l d1-d4/a0,-(a7)
  213.     movem.l 20+4(a7),d0/d1/a0
  214.     bsr lib_64bit_neg
  215.     move.b #'-',(a0)+
  216.     bra.b ltsIn
  217.  
  218. _uvlongtostr:
  219.     movem.l d1-d4/a0,-(a7)
  220.     movem.l 20+4(a7),d0/d1/a0
  221. ltsIn
  222.     moveq #0,d4
  223.     move.w 20+4+12(a7),d4           ; Basis
  224.     clr.w -(a7)
  225. ltsLoop    move.l d4,d2
  226.     moveq #0,d3
  227.     bsr lib_64bit_div
  228.     add.w #'0',d2
  229.     cmp.w #'9',d2
  230.     bls.b lts1
  231.     add.w #'a'-'0'-10,d2
  232. lts1    move.w d2,-(a7)
  233.     tst.l d0
  234.     bne.b ltsLoop
  235.     tst.l d1
  236.     bne.b ltsLoop
  237. ltsCopy    move.w (a7)+,d0
  238.     move.b d0,(a0)+
  239.     bne.b ltsCopy
  240.     movem.l (a7)+,d1-d4/a0
  241.     move.l 4+8(a7),d0
  242.     rts
  243.  
  244.     end
  245.