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

  1.  
  2. *    Maxon C++:
  3. *
  4. *    Library-Modul "strtodoub"
  5. *
  6. *    Jens Gelhar 28.10.91
  7.  
  8.     xdef    _strtod,strtod__PCcPPc
  9.     xdef    _atof,atof__PCc
  10.  
  11.     xref    _errno,GetDoubmath,_pwr10
  12.  
  13. i3edpNeg    = -60
  14. i3edpAdd    = -66
  15. i3edpMul    = -78
  16.  
  17. _atof:
  18. atof__PCc:    clr.l -(a7)
  19.     move.l 8(a7),-(a7)
  20.     bsr.b strtod__PCcPPc
  21.     addq.l #8,a7
  22.     rts
  23.  
  24. _strtod:
  25. strtod__PCcPPc:    ; Stack-Parameter: const char*, char**
  26.     movem.l d2/d3/d4/a0/a1/a6,-(a7)
  27.     move.l 6*4+4(a7),a0
  28.     bsr.b Conv
  29.     move.l 6*4+8(a7),d2
  30.     beq.b oikeia
  31.     subq.l #1,a0
  32.     exg d2,a0
  33.     move.l d2,(a0)
  34. oikeia:    movem.l (a7)+,d2/d3/d4/a0/a1/a6
  35.     rts
  36.  
  37. Conv:    ; von (a0) nach d0|d1
  38.     jsr GetDoubmath
  39. overrd:    move.b (a0)+,d4
  40.     beq Wargarnix
  41.     cmp.b #' ',d4
  42.     blo.b overrd
  43.     cmp.b #'-',d4
  44.     bne.b cvlr1
  45.     move.b (a0)+,d4
  46.     bsr.b cvlr2
  47.     jmp i3edpNeg(a6)
  48. cvlr1:    cmp.b #'+',d4
  49.     bne.b cvlr2
  50.     move.b (a0)+,d4
  51. cvlr2:    subq.l #1,a0
  52.     bsr DoubleIntString
  53.     moveq #0,d2
  54. cvlr3:    ; gibt's noch mehr Ziffern?
  55.     move.b (a0)+,d4
  56.     cmp.b #'0',d4
  57.     blo.b cvlr4
  58.     cmp.b #'9',d4
  59.     bhi.b cvlr4
  60.     addq.l #1,d2
  61.     bra.b cvlr3
  62. cvlr4:    tst.l d2
  63.     beq.b cvlr5
  64.     move.l a0,-(a7)
  65.     movem.l d0/d1,-(a7)
  66.     bsr Zehnhoch
  67.     movem.l (a7)+,d2/d3
  68.     jsr i3edpMul(a6)
  69.     move.l (a7)+,a0
  70.     move.b -1(a4),d4
  71. cvlr5:    cmp.b #'.',d4
  72.     bne.b cvlr7
  73.     ; Nachkommastellen:
  74.     movem.l d0/d1,-(a7)
  75.     move.l a0,-(a7)
  76.     bsr DoubleIntString
  77.     move.l a0,d2
  78.     sub.l (a7)+,d2
  79.     neg.l d2
  80.     move.l a0,-(a7)
  81.     movem.l d0/d1,-(a7)
  82.     bsr.b Zehnhoch
  83.     movem.l (a7)+,d2/d3
  84.     jsr i3edpMul(a6)
  85.     move.l (a7)+,a0
  86.     movem.l (a7)+,d2/d3
  87.     move.l a0,-(a7)
  88.     jsr i3edpAdd(a6)
  89.     move.l (a7)+,a0
  90. cvlr6:    ; noch mehr Nachkommastellen?
  91.     move.b (a0)+,d4
  92.     cmp.b #'0',d4
  93.     blo.b cvlr7
  94.     cmp.b #'9',d4
  95.     bls.b cvlr6
  96. cvlr7:    ; Exponententeil?
  97.     cmp.b #'e',d4
  98.     beq.b cvExponent
  99.     cmp.b #'E',d4
  100.     bne.b cvRet
  101. cvExponent:    movem.l d0/d1,-(a7)
  102.     cmp.b #'-',(a0)
  103.     bne.b cvPosExpo
  104.     addq.l #1,a0
  105.     bsr IntString
  106.     neg.l d0
  107.     bra.b cvExpoD0
  108. cvPosExpo:
  109.     cmp.b #'+',(a0)
  110.     bne.b cvUnsigExpo
  111.     addq.l #1,a0
  112. cvUnsigExpo:
  113.     bsr IntString
  114. cvExpoD0:    move.w d0,d2
  115.     bsr.b Zehnhoch
  116.     movem.l (a7)+,d2/d3
  117.     pea 1(a0)
  118.     jsr i3edpMul(a6)
  119.     move.l (a7)+,a0
  120. cvRet:    rts
  121.  
  122. Wargarnix:    move.l #1001,_errno
  123.     moveq #0,d0
  124.     moveq #0,d1
  125.     rts
  126.  
  127.  
  128. Zehnhoch:    ; Potenz d2
  129.     ext.l d2
  130.     move.l d2,-(a7)
  131.     jsr _pwr10
  132.     move.l (a7)+,d2
  133.     rts
  134.  
  135. DoubleIntString:    ; Ab a0 Ziffernfolge als "Double" lesen
  136.     bsr.b IntString
  137.     tst.l d0
  138.     bne.b nonzero
  139.     tst.l d1
  140.     bne.b nonzero
  141.     rts
  142. nonzero    move.l d2,-(a7)
  143.     move.l #$3FF+52,d2
  144.     exg d0,d1
  145.  
  146.     cmp.l #$00200000,d0
  147.     bhs.b zugross
  148.     ; Linksshifts:
  149. zuklein    cmp.l #$00100000,d0
  150.     bhs.b mountdoub
  151.     asl.l #1,d1
  152.     roxl.l #1,d0
  153.     subq.w #1,d2
  154.     bra.b zuklein
  155.  
  156. zugross    ; Rechstshifts:
  157.     cmp.l #$00200000,d0
  158.     blo.b mountdoub
  159.     lsr.l #1,d0
  160.     roxr.l #1,d1
  161.     addq.w #1,d2
  162.     bra.b zugross
  163. mountdoub
  164.     swap d2
  165.     asl.l #4,d2
  166.     and.l #$000FFFFF,d0
  167.     or.l d2,d0
  168.     move.l (a7)+,d2
  169.     rts
  170.  
  171. IntString:    ; Ab a0 "int" lesen, nach d0|d1
  172.     moveq #0,d0
  173.     moveq #0,d1
  174.     move.l d4,-(a7)
  175. intsLoop
  176.     ; d0|d1 *= 10:
  177.     moveq #0,d4
  178.     move.b (a0)+,d4
  179.     sub.b #'0',d4
  180.     cmp.w #9,d4
  181.     bhi.b intsEnd
  182.     move.l d0,-(a7)
  183.     move.l d1,-(a7)
  184.     asl.l #1,d0
  185.     roxl.l #1,d1
  186.     asl.l #1,d0
  187.     roxl.l #1,d1
  188.     add.l (a7)+,d1
  189.     add.l (a7)+,d0
  190.     bhs.b intscarry
  191.     addq.l #1,d1
  192. intscarry
  193.     asl.l #1,d0
  194.     roxl.l #1,d1
  195.     add.l d4,d0
  196.     bhs.b intscarry1
  197.     addq.l #1,d1
  198. intscarry1
  199.     cmp.l #$7FFFFFFF/5,d1
  200.     bls.b intsLoop
  201.  
  202.     addq.l #1,a0
  203. intsEnd    move.l (a7)+,d4
  204.     subq.l #1,a0
  205.     rts
  206.  
  207.     end
  208.