home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / MAXONC3_6OF8.DMS / in.adf / LIBSRC.LHA / LIBSRC / math_doubletostr.asm < prev    next >
Encoding:
Assembly Source File  |  1994-04-15  |  5.6 KB  |  347 lines

  1.  
  2. *    Maxon C++ Library:
  3. *    Modul "math_doubletostr"
  4. *    Jens Gelhar 17.10.91, 15.04.94
  5.  
  6.  
  7.     xdef    _doubletostr,DoubleToFixed,DoubleToExpo
  8.  
  9.     xref    GetDoubmath
  10.     xref    Expo10,Pwr10
  11.  
  12. i3edpAdd    = -66
  13. i3edpMul    = -78
  14.  
  15. _doubletostr:    ; Stackparameter: Doppelwort, Bufferadresse, Stellen.W
  16.     movem.l d1-d7/a0-a6,-(a7)
  17.     movem.l 14*4+4(a7),d0/d1/a5
  18.     move.w  14*4+4+3*4(a7),d2
  19.     bsr.b    DoubletoStr
  20.     move.l    a5,d0
  21.     movem.l    (a7)+,d1-d7/a0-a6
  22.     rts
  23.  
  24. DoubleToFixed:    ; Zahl d0|d1, Buffer a2, d2 Nachkommastellen
  25.     move.l a2,a5
  26.     bsr Sign
  27.     bra.b doitFix
  28.  
  29. DoubleToExpo:    ; Zahl d0|d1, Buffer a2, d2 Nachkommastellen
  30.     move.l a2,a5
  31.     bsr Sign
  32.     addq.w #1,d2
  33.     bra doitExpo
  34.  
  35. DoubletoStr:    ; Zahl d0|d1, Buffer a5, ±d2 Stellen
  36.     move.l a5,a2
  37.     bsr Sign
  38.     tst.w d2
  39.     bne.b dbstFixed
  40.     tst.l d0
  41.     bne.b dbst1
  42.     move.b #'0',(a2)+
  43. dbstEnd    clr.b (a2)
  44.     rts
  45. dbst1    moveq #15,d2
  46.     bsr DoubDigString
  47.     cmp.w #4,d2
  48.     bge.b dbst2
  49.     cmp.w #-1,d2
  50.     blt.b dbst2
  51.     move.w d2,d0
  52.     bsr AnotherInsertKomma
  53. dbst1a    cmp.b #'0',-1(a2)
  54.     bne.b dbst1b
  55.     subq.l #1,a2
  56.     bra.b dbst1a
  57. dbst1b    cmp.b #'.',-1(a2)
  58.     bne.b dbstEnd
  59.     subq.l #1,a2
  60.     bra.b dbstEnd
  61. dbst2    move.w d2,d1
  62.     bsr DoubExponentiere
  63.     bra.b dbstEnd
  64.  
  65. dbstFixed:    ; Festpunkt-Darstellung
  66.     tst.w d2
  67.     bmi.b dbstExpo
  68. doitFix    tst.l d0
  69.     beq.b dbst3
  70.     jsr Expo10
  71.     cmp.w #20,d4
  72.     bge.b dbst1
  73.     cmp.w #-20,d4
  74.     blt.b dbst1
  75.     add.w d4,d2
  76.     addq.w #1,d2
  77.     move.w d2,-(a7)
  78.     cmp.w #16,d2
  79.     blt.b dbst3c
  80.     moveq #16,d2
  81. dbst3c    bsr.b DoubDigString
  82.     move.w (a7)+,d4
  83.     cmp.w #30,d4
  84.     bhs.b dbst3e
  85.     sub.w #16,d4
  86.     bls.b dbst3e
  87. dbst3d    move.b #'0',(a2)+
  88.     subq.w #1,d4
  89.     bne.b dbst3d
  90. dbst3e    move.w d2,d0
  91.     bsr AnotherInsertKomma
  92.     bra dbstEnd
  93.  
  94. dbst3    ; "0" in Festpunkt-Darstellung
  95.     move.b #'0',(a2)+
  96.     tst.w d2
  97.     beq dbstEnd
  98.     move.b #'.',(a2)+
  99. dbst3loop
  100.     move.b #'0',(a2)+
  101.     subq.w #1,d2
  102.     bne.b dbst3loop
  103.     bra dbstEnd
  104.  
  105. dbstExpo:
  106.     neg.w d2
  107. doitExpo:
  108.     tst.l d0
  109.     bne.b dbstr7
  110.     move.w d2,d0
  111.     moveq #0,d2
  112. dbstr6    move.b #'0',(a2)+
  113.     subq.w #1,d0
  114.     beq.b dbstr9
  115.     cmp.w #30,d0
  116.     bhs.b dbstr9
  117.     bra.b dbstr6
  118. dbstr7    ; Zahl <> 0
  119.     cmp.w #16,d2
  120.     bls.b dbstr7a
  121.     moveq #16,d2
  122. dbstr7a    bsr.b DoubDigString
  123.     move.w (a7),d0
  124.     neg.w d0
  125.     cmp.w #30,d0
  126.     bhs.b dbstr9
  127. dbstr8    cmp.w #16,d0
  128.     bls.b dbstr9
  129.     move.b #'0',(a2)+
  130.     subq.w #1,d0
  131.     bra.b dbstr8
  132. dbstr9    move.w d2,d1
  133.     bra DoubExponentiere
  134.  
  135. DoubDigString:    ; Ziffern von d0||d1, d2 Stück, nach (a2)+ schreiben
  136.     ; lg nach d2
  137.  
  138.     move.w d2,-(a7)
  139.  
  140.     ; Auf [d2] absolute Stellen runden
  141.     move.w d2,-(a7)
  142.     jsr Expo10
  143.     move.w d4,d2
  144.     sub.w (a7)+,d2
  145.     addq.w #1,d2
  146.     movem.l d0/d1,-(a7)
  147.     jsr Pwr10       ; Zehnerpotenz für Rundung
  148.     tst.l d0
  149.     beq.b dbdst1
  150.     sub.l #$00100000,d0
  151. dbdst1    jsr GetDoubmath
  152.     movem.l (a7)+,d2/d3
  153.     jsr i3edpAdd(a6)
  154.  
  155.     ; Zahl ist gerundet, Ziffernanzahl liegt auf Stack
  156.     jsr Expo10
  157.     move.w (a7)+,d2
  158.     move.w d4,-(a7)       ; Logarithmus merken!
  159.     move.w d2,-(a7)
  160.     sub.w d4,d2
  161.     subq.w #1,d2
  162.     movem.l d0/d1,-(a7)
  163.     jsr Pwr10
  164.     jsr GetDoubmath
  165.     movem.l (a7)+,d2/d3
  166.     jsr i3edpMul(a6)   ; normieren...
  167.     bsr MyFix          ; und nach Ganzzahl
  168.     move.w (a7)+,d2
  169.  
  170.     ; Ziffern von integer d0/d1, mind. d2 Stck., nach (a2)+
  171.     clr.w -(a7)
  172.     subq.w #1,d2
  173. dbdst2    bsr.b DoubDivmod10
  174.     add.b #'0',d4
  175.     move.w d4,-(a7)
  176.     subq.w #1,d2
  177.     bpl.b dbdst2
  178.     tst.l d0
  179.     bne.b dbdst2
  180.     tst.l d1
  181.     bne.b dbdst2
  182. dbdst3    move.w (a7)+,d4
  183.     beq.b ddst3
  184.     move.b d4,(a2)+
  185.     bra.b dbdst3
  186. ddst3    move.w (a7)+,d2
  187.     clr.b (a2)
  188.     rts
  189.  
  190.  
  191. DoubDivmod10:    ; d0||d1 durch 10 teilen, div -> d0||d1, mod --> d4
  192.     movem.l d2/d3,-(a7)
  193.     move.l d0,d2
  194.     move.l d1,d3
  195.     move.w d0,-(a7)
  196.     clr.w d0
  197.     swap d0
  198.     divu #10,d0
  199.     move.w (a7)+,d0
  200.     divu #10,d0
  201.     move.w d1,-(a7)
  202.     swap d1
  203.     move.w d1,d0
  204.     divu #10,d0
  205.     move.w (a7)+,d0
  206.     divu #10,d0
  207.     swap d0
  208.     move.w d0,d4   ; d0 = modulo
  209.  
  210.     move.l d2,d0
  211.     clr.w d0
  212.     swap d0
  213.     divu #10,d0
  214.     swap d0        ; Bits 63:48
  215.  
  216.     swap d2
  217.     move.w d0,d2
  218.     swap d2
  219.     divu #10,d2
  220.     move.w d2,d0   ; Bits 47:32
  221.  
  222.     swap d3
  223.     move.w d3,d2
  224.     divu #10,d2
  225.     swap d2
  226.     move.l d2,d1  ; Bits 31:16
  227.  
  228.     move.w d2,d3
  229.     swap d3
  230.     divu #10,d3
  231.     move.w d3,d1        ; Bits 15:0
  232.  
  233.     movem.l (a7)+,d2/d3
  234.     rts
  235.  
  236. DoubExponentiere:    ; String 1(a5) ... (a2) in Expo-Darstellung bringen
  237.     ; Exponent d1
  238.     move.b #'e',(a2)+
  239.     move.b #'+',(a2)+
  240.     tst.w d2
  241.     bpl.b dexpoti1
  242.     move.b #'-',-1(a2)
  243.     neg.w d2
  244. dexpoti1    ext.l d2
  245.     divu #10,d2
  246.     move.w d2,d3
  247.     ext.l d3
  248.     divu #10,d3
  249.     add.b #'0',d3
  250.     move.b d3,(a2)+
  251.     swap d3
  252.     add.b #'0',d3
  253.     move.b d3,(a2)+
  254.     swap d2
  255.     add.b #'0',d2
  256.     move.b d2,(a2)+
  257.     clr.b (a2)
  258.     moveq #0,d0
  259.     cmp.b #'e',2(a5)
  260.     bne.b AnotherInsertKomma
  261.     rts    ; bei nur einer Stelle keinen Punkt
  262.  
  263. AnotherInsertKomma:
  264.     ; in Ziffernfolge in String a5 ab Pos. d0 Komma einfügen
  265.     lea 2(a5,d0.w),a0
  266.     tst.w d0
  267.     bpl.b ainskomm2
  268.     lea 1(a5),a0
  269. ainskomm0
  270.     addq.w #1,d0
  271.     bpl.b ainskomm1
  272.     bsr.b aInsa0a2
  273.     move.b #'0',(a0)
  274.     bra.b ainskomm0
  275. ainskomm1
  276.     bsr.b aInsa0a2
  277.     move.b #'.',(a0)
  278.     bsr.b aInsa0a2
  279.     move.b #'0',(a0)
  280.     rts
  281. ainskomm2    ; d0 > 0
  282.     cmp.l a2,a0
  283.     bhi.b ainskomm3
  284.     beq.b ainskomm4
  285.     ; Punkt liegt in Ziffernfolge
  286.     bsr.b aInsa0a2
  287.     move.b #'.',(a0)
  288. ainskomm4
  289.     rts
  290. ainskomm3    ; Punkt hinter Ziffernfolge
  291.     move.b #'0',(a2)+  ; Nullen anhängen
  292.     cmp.l a0,a2
  293.     blo.b ainskomm3
  294.     rts
  295.  
  296. aInsa0a2    ; ab a0 bis a2 ein Byte einfügen
  297.     addq.l #1,a2
  298.     move.l a2,a1
  299. ainsa0a2a
  300.     cmp.l a0,a1
  301.     bls.b ainsa0a2b
  302.     move.b -(a1),1(a1)
  303.     bra.b ainsa0a2a
  304. ainsa0a2b
  305.     rts
  306.  
  307. MyFix:    ; IEEEDPFix-Ersatz: nach 64Bit-Integer
  308.     movem.l d2/d3,-(a7)
  309.     move.l d0,d2
  310.     moveq #20,d3
  311.     lsr.l d3,d2
  312.     and.w #$7FF,d2      ; d2 = Exponent
  313.     cmp.w #$3FF,d2
  314.     bhs.b myfx1
  315.     moveq #0,d0
  316.     moveq #0,d1
  317.     bra.b myfx9
  318. myfx1    and.l #$FFFFF,d0   ; Mantisse
  319.     bset #20,d0        ; hidden Bit
  320.     sub.w #$3FF+52,d2
  321.     tst.w d2
  322.     beq.b myfx9
  323.     bpl.b myfx3
  324. myfx2    lsr.l #1,d0
  325.     roxr.l #1,d1
  326.     addq.w #1,d2
  327.     bne.b myfx2
  328.     bra.b myfx9
  329. myfx3    asl.l #1,d1
  330.     roxl.l #1,d0
  331.     subq.w #1,d2
  332.     bne.b myfx3
  333. myfx9    movem.l (a7)+,d2/d3
  334.     rts
  335.  
  336. Sign:    jsr GetDoubmath
  337.     move.b #' ',(a2)+
  338.     tst.l d0
  339.     bpl.b Positiv
  340.     bclr #31,d0
  341.     tst.l d0
  342.     beq.b Positiv
  343.     move.b #'-',-1(a2)
  344. Positiv    rts
  345.  
  346.     end
  347.