home *** CD-ROM | disk | FTP | other *** search
-
- * RealOut change real number to ASCII string
- *
- * IN
- * d0 real number
- * d1 number of mantissa digits - 1
- * a0 pointer to begin of buffer
- * OUT
- * a0 pointer to end of buffer
- *
- * written by E. Lenz
- * Johann-Fichte-Strasse 11
- * 8 Munich 40
- * Germany
-
- ***** exec *****
-
- _AbsExecBase equ 4
- _LVOCloseLibrary equ -$19e
- _LVOOpenLibrary equ -$228
-
- ****** mathffp ******
-
- _LVOSPFix equ -$1e
- _LVOSPFlt equ -$24
- _LVOSPCmp equ -$2a
- _LVOSPSub equ -$48
- _LVOSPMul equ -$4e
- _LVOSPDiv equ -$54
-
- one equ $80000041
- ten equ $a0000044
-
-
- XDEF RealOut
-
- RealOut movem.l d4-d7/a1/a3/a6,-(a7) save used registers
- movea.l a0,a3 save input data
- move.l d0,d7
- move.l d1,d4
- move.l #ten,d5
- moveq #0,d6 exponent = 0
- move.l _AbsExecBase,a6
- lea FfpName(pc),a1 open mathffp library
- moveq #0,d0
- jsr _LVOOpenLibrary(a6)
- movea.l d0,a6
- tst.l d0
- beq exit
-
- ; first step - get sign of number
-
- tst.l d7 throw out zero
- beq.s reduced
-
- tst.b d7
- bpl.s ispos
- move.b #'-',(a3)+
- bclr #7,d7 dirty _LVOSPAbs
-
- ; second step get exponent i.e. reduce to 1 <= < 10
-
- ispos move.l d7,d1
- move.l #one,d0
- jsr _LVOSPCmp(a6)
- tst.l d0
- bmi.s less one > value?
- move.l d7,d1
- move.l d5,d0
- jsr _LVOSPCmp(a6)
- tst.l d0
- bmi.s reduced ten > value?
-
- move.l d5,d1
- move.l d7,d0
- jsr _LVOSPDiv(a6) divide by ten
- addq.l #1,d6
- gopos move.l d0,d7
- bra.s ispos
-
- less move.l d5,d1
- move.l d7,d0
- jsr _LVOSPMul(a6) multiply by ten
- subq.l #1,d6
- bra.s gopos
-
- ; 3rd step write mantissa
-
- reduced move.l d7,d0
- bsr.s numeral
- move.b #'.',(a3)+
- mant jsr _LVOSPFlt(a6)
- move.l d0,d1
- move.l d7,d0
- jsr _LVOSPSub(a6)
- move.l d5,d1
- jsr _LVOSPMul(a6)
- move.l d0,d7
- bsr.s numeral
- dbra d4,mant
-
- ; now write exponent
-
- move.b #'E',(a3)+
- tst.b d6
- bpl.s none
- move.b #'-',(a3)+
- neg.b d6
- none cmp.b #10,d6
- blt.s nofirst
- moveq #0,d1
- flop subi.b #10,d6
- addq.b #1,d1
- cmp.b #10,d6
- bge.s flop
- bsr.s num1
- nofirst move.b d6,d1
- bsr.s num1
- clr.b (a3)
-
- exit move.l a6,d1
- beq.s noFfp
- move.l _AbsExecBase,a6 close mathffp library
- movea.l d1,a1
- jsr _LVOCloseLibrary(a6)
- noFfp movea.l a3,a0
- movem.l (a7)+,d4-d7/a1/a3/a6
- rts
-
- numeral jsr _LVOSPFix(a6)
- move.b d0,d1
- num1 addi.b #'0',d1
- move.b d1,(a3)+
- rts
-
- FfpName dc.b 'mathffp.library',0
- even
- end
-