4 ; Author: George Gallant
7 ; This routine provides a floating point to ascii conversion.
8 ; It was written support the SDCC project.
12 ; extern void g_ftoa(data char *buf, float num, char precision);
14 ; The routine is NOT reenterant but expects the entire parameter list
15 ; to be placed on the stack.
17 ; Notes: 1. measured 105usec to convert -65535.996 on a 20MHz 18f252
18 ; 2. Software stack can not cross a RAM page boundary
21 list r=dec, n=96, st=off, mm=off
44 _g_ftoa: movff FSR2H,POSTDEC1
75 movff POSTINC2,FSR0L ;get the low byte of buf pointer
78 movff POSTINC2,man+0 ;get the low byte of float
98 ; Shift the mantissa left or right by the expondent
100 movf exp,w ;get the expondent
101 sublw 127 ;subtract the bais
102 bz @4 ;skip shifting if zero
103 bn @3 ;shift left if neg
105 @2: bcf STATUS,C ;otherwise, shift right
124 @4: rlcf r+2,w ;extract bit 23
125 rlcf r+3,f ;shift rest of whole number
139 movff r+0,x+0 ;temp copy
143 bcf STATUS,C ;mult by 2
149 bcf STATUS,C ;mult by 4
155 movf x+0,w ;mult by 5
164 rlcf r+2,w ;div by 0x400000
165 rlcf r+3,f ;or just extract bits 24-22
169 movf r+3,w ;this is the bcd value
170 addlw 0x30 ;convert to ascii
171 movwf POSTINC0 ;and save in memory
173 bcf STATUS,C ;mult by 2
181 clrf POSTINC0 ;pack a nullbyte at the end
195 movff man+3, POSTDEC1
196 movff man+2, POSTDEC1
197 movff man+1, POSTDEC1
198 movff man+0, POSTDEC1