ftoa_slow.s

来自「从iccavr7中破解得到的lib库源代码」· S 代码 · 共 1,145 行 · 第 1/2 页

S
1,145
字号
	.dbsym r sp 20 pc
	.dbsym l int_digit 6 D
	.dbsym l mantissa 2 D
	.dbsym r dp 20 pS[.1]
	.dbsym l z 24 L
	.dbend
	.area bss(ram, con, rel)
	.dbfile ftoa_slow.c
L29:
	.blkb 9
	.area text(rom, con, rel)
	.dbfile ftoa_slow.c
	.dbfunc e fcvt _fcvt fpc
	.dbunion 0 4 .2
	.dbfield 0 f D
	.dbfield 0 i L
	.dbend
	.dbsym s sp L29 A[9:9]c
;              x -> y+15
;              d -> y+2
;              i -> R22,R23
;              n -> R20,R21
;           sign -> y+33
;      dec_scale -> y+31
;        ndigits -> R10,R11
;              v -> y+25
	.even
_fcvt::
	rcall push_arg4
	rcall push_xgsetF00C
	sbiw R28,19
	ldd R10,y+29
	ldd R11,y+30
	.dbline -1
	.dbline 107
; }
; 
; char *fcvt(float v, int ndigits, int *dec_scale, int *sign)
; {
	.dbline 113
;   int           i, n;
;   FI_union_t    x;
;   EFG_data_t    d;
;   static unsigned char   sp[8+1];
; 
;     memset(sp, '\0', 8+1);
	ldi R24,9
	ldi R25,0
	std y+1,R25
	std y+0,R24
	clr R18
	clr R19
	ldi R16,<L29
	ldi R17,>L29
	rcall _memset
	.dbline 114
;     x.f = v;
	ldd R2,y+25
	ldd R3,y+26
	ldd R4,y+27
	ldd R5,y+28
	std y+15,R2
	std y+16,R3
	std y+17,R4
	std y+18,R5
	.dbline 115
;     SP_EFG_convert(x.i, &d);
	mov R24,R28
	mov R25,R29
	adiw R24,2
	std y+1,R25
	std y+0,R24
	ldd R16,y+15
	ldd R17,y+16
	ldd R18,y+17
	ldd R19,y+18
	rcall _SP_EFG_convert
	.dbline 116
; 	memcpy(sp, d.mantissa_BCD, 8);
	ldi R24,8
	ldi R25,0
	std y+1,R25
	std y+0,R24
	mov R18,R28
	mov R19,R29
	subi R18,252  ; offset = 4
	sbci R19,255
	ldi R16,<L29
	ldi R17,>L29
	rcall _memcpy
	.dbline 117
; 	if (ndigits)
	tst R10
	brne X8
	tst R11
	breq L31
X8:
	.dbline 118
; 	  {
	.dbline 119
; 	  n = ndigits + d.scale_bin+1;
	ldd R2,y+3
	clr R3
	mov R20,R10
	mov R21,R11
	add R20,R2
	adc R21,R3
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 120
; 	  if (0 <= n && n <= 7)
	clr R2
	cp R20,R2
	cpc R21,R3
	brlt L34
X9:
	ldi R24,7
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L34
X10:
	.dbline 121
; 		round_to_n_places(sp, n+1, &d.scale_bin);
	mov R24,R28
	mov R25,R29
	adiw R24,3
	std y+1,R25
	std y+0,R24
	mov R18,R20
	mov R19,R21
	subi R18,255  ; offset = 1
	sbci R19,255
	ldi R16,<L29
	ldi R17,>L29
	rcall _round_to_n_places
	rjmp L40
L34:
	.dbline 123
; 	  else
; 	  	n = 7;
	ldi R20,7
	ldi R21,0
	.dbline 124
; 	  }
	rjmp L40
L31:
	.dbline 126
; 	else
; 	  n = 7;
	ldi R20,7
	ldi R21,0
	.dbline 129
; 
; 	/* find the rightmost nonzeroes */
;     for (; 0 <= n && sp[n] == 0; --n)
	rjmp L40
L37:
	.dbline 130
; 	  ;
L38:
	.dbline 129
	subi R20,1
	sbci R21,0
L40:
	.dbline 129
	clr R2
	clr R3
	cp R20,R2
	cpc R21,R3
	brlt L41
X11:
	ldi R24,<L29
	ldi R25,>L29
	mov R30,R20
	mov R31,R21
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	breq L37
X12:
L41:
	.dbline 131
;     for (i = 0; i <= n; i++)
	clr R22
	clr R23
	rjmp L45
L42:
	.dbline 132
; 	  sp[i] += '0';
	ldi R24,<L29
	ldi R25,>L29
	mov R2,R22
	mov R3,R23
	add R2,R24
	adc R3,R25
	mov R30,R2
	mov R31,R3
	ldd R24,z+0
	subi R24,208    ; addi 48
	std z+0,R24
L43:
	.dbline 131
	subi R22,255  ; offset = 1
	sbci R23,255
L45:
	.dbline 131
	cp R20,R22
	cpc R21,R23
	brge L42
X13:
	.dbline 133
;     sp[n+1] = 0;
	ldi R24,<L29+1
	ldi R25,>L29+1
	mov R30,R20
	mov R31,R21
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 135
; 
;     *dec_scale = d.scale_bin + 1;
	ldd R24,y+3
	clr R25
	adiw R24,1
	ldd R30,y+31
	ldd R31,y+32
	std z+1,R25
	std z+0,R24
	.dbline 136
;   *sign = (x.i < 0);    /* what ^%&$&( purpose is served by this????    */
	ldi R24,0
	ldi R25,0
	ldi R26,0
	ldi R27,0
	ldd R2,y+15
	ldd R3,y+16
	ldd R4,y+17
	ldd R5,y+18
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	brge L48
X14:
	ldi R20,1
	ldi R21,0
	rjmp L49
L48:
	clr R20
	clr R21
L49:
	ldd R30,y+33
	ldd R31,y+34
	std z+1,R21
	std z+0,R20
	.dbline 137
;   return sp;
	ldi R16,<L29
	ldi R17,>L29
	.dbline -2
L28:
	.dbline 0 ; func end
	adiw R28,19
	rcall pop_xgsetF00C
	adiw R28,4
	ret
	.dbsym l x 15 S[.2]
	.dbsym l d 2 S[.1]
	.dbsym r i 22 I
	.dbsym r n 20 I
	.dbsym l sign 33 pI
	.dbsym l dec_scale 31 pI
	.dbsym r ndigits 10 I
	.dbsym l v 25 D
	.dbend
	.area bss(ram, con, rel)
	.dbfile ftoa_slow.c
L51:
	.blkb 11
	.area text(rom, con, rel)
	.dbfile ftoa_slow.c
	.dbfunc e ftoa _ftoa fpc
	.dbsym s sbuf L51 A[11:11]c
;           sign -> y+8
;          scale -> y+6
;            buf -> R20,R21
;              s -> R10,R11
;         status -> y+18
;              f -> y+14
	.even
_ftoa::
	rcall push_arg4
	rcall push_xgset300C
	sbiw R28,10
	.dbline -1
	.dbline 142
; }
; 
; /* buf should be at least 8+3=11 bytes long... */
; char *ftoa(float f, int *status)
; 	{
	.dbline 147
;     int scale, sign;
; 	char *s, *buf;
; 	static char sbuf[11];
; 
; 	*status = 0;
	clr R2
	clr R3
	ldd R30,y+18
	ldd R31,y+19
	std z+1,R3
	std z+0,R2
	.dbline 148
; 	if (f == 0.0)
	ldd R2,y+14
	ldd R3,y+15
	ldd R4,y+16
	ldd R5,y+17
	ldi R16,<L54
	ldi R17,>L54
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	mov R16,R2
	mov R17,R3
	mov R18,R4
	mov R19,R5
	rcall fpcmp2
	brne L52
X15:
	.dbline 149
;     	{
	.dbline 150
; 		sbuf[0] = '0'; sbuf[1] = '.'; sbuf[2] = '0'; sbuf[3] = 0;
	ldi R24,48
	sts L51,R24
	.dbline 150
	ldi R24,46
	sts L51+1,R24
	.dbline 150
	ldi R24,48
	sts L51+2,R24
	.dbline 150
	clr R2
	sts L51+3,R2
	.dbline 151
;         return sbuf;
	ldi R16,<L51
	ldi R17,>L51
	rjmp L50
L52:
	.dbline 153
;         }
; 	buf = sbuf;
	ldi R20,<L51
	ldi R21,>L51
	.dbline 154
;     s = fcvt(f, 0, &scale, &sign);
	mov R24,R28
	mov R25,R29
	adiw R24,8
	std y+5,R25
	std y+4,R24
	mov R24,R28
	mov R25,R29
	adiw R24,6
	std y+3,R25
	std y+2,R24
	clr R2
	clr R3
	std y+1,R3
	std y+0,R2
	ldd R16,y+14
	ldd R17,y+15
	ldd R18,y+16
	ldd R19,y+17
	rcall _fcvt
	mov R10,R16
	mov R11,R17
	.dbline 155
; 	if (sign)
	ldd R2,y+8
	ldd R3,y+9
	tst R2
	brne X16
	tst R3
	breq L58
X16:
	.dbline 156
; 		*buf++ = '-';
	ldi R24,45
	mov R30,R20
	mov R31,R21
	st Z+,R24
	mov R20,R30
	mov R21,R31
L58:
	.dbline 157
; 	if (scale <= 0)
	clr R2
	clr R3
	ldd R4,y+6
	ldd R5,y+7
	cp R2,R4
	cpc R3,R5
	brge X21
	rjmp L66
X21:
X17:
	.dbline 158
; 		{
	.dbline 159
; 		*buf++ = '0';
	ldi R24,48
	mov R30,R20
	mov R31,R21
	st Z+,R24
	.dbline 160
; 		*buf++ = '.';
	ldi R24,46
	st Z+,R24
	mov R20,R30
	mov R21,R31
	rjmp L63
L62:
	.dbline 162
; 		while (scale)
; 			{
	.dbline 163
; 			*buf++ = '0';
	ldi R24,48
	mov R30,R20
	mov R31,R21
	st Z+,R24
	mov R20,R30
	mov R21,R31
	.dbline 164
; 			scale++;
	ldd R24,y+6
	ldd R25,y+7
	adiw R24,1
	std y+7,R25
	std y+6,R24
	.dbline 165
; 			}
L63:
	.dbline 161
	ldd R2,y+6
	ldd R3,y+7
	tst R2
	brne L62
	tst R3
	brne L62
X18:
	.dbline 166
; 		}
	rjmp L69
L65:
	.dbline 170
; 	else
; 		{
; 		while (scale)
; 			{
	.dbline 171
; 			*buf++ = *s++;
	mov R30,R10
	mov R31,R11
	mov R26,R20
	mov R27,R21
	ld R0,Z+
	mov R10,R30
	mov R11,R31
	st X+,R0
	mov R20,R26
	mov R21,R27
	.dbline 172
; 			scale--;
	ldd R24,y+6
	ldd R25,y+7
	sbiw R24,1
	std y+7,R25
	std y+6,R24
	.dbline 173
; 			}
L66:
	.dbline 169
	ldd R2,y+6
	ldd R3,y+7
	tst R2
	brne L65
	tst R3
	brne L65
X19:
	.dbline 174
; 		*buf++ = '.';
	ldi R24,46
	mov R30,R20
	mov R31,R21
	st Z+,R24
	mov R20,R30
	mov R21,R31
	.dbline 175
; 		}
	rjmp L69
L68:
	.dbline 177
; 	while (*s)
; 		*buf++ = *s++;
	mov R30,R10
	mov R31,R11
	mov R26,R20
	mov R27,R21
	ld R0,Z+
	mov R10,R30
	mov R11,R31
	st X+,R0
	mov R20,R26
	mov R21,R27
L69:
	.dbline 176
	mov R30,R10
	mov R31,R11
	ldd R2,z+0
	tst R2
	brne L68
X20:
	.dbline 178
; 	*buf = 0;
	clr R2
	mov R30,R20
	mov R31,R21
	std z+0,R2
	.dbline 179
; 	return sbuf;
	ldi R16,<L51
	ldi R17,>L51
	.dbline -2
L50:
	.dbline 0 ; func end
	adiw R28,10
	rcall pop_xgset300C
	adiw R28,4
	ret
	.dbsym l sign 8 I
	.dbsym l scale 6 I
	.dbsym r buf 20 pc
	.dbsym r s 10 pc
	.dbsym l status 18 pI
	.dbsym l f 14 D
	.dbend
	.area lit(rom, con, rel)
L54:
	.word 0x0,0x0
L24:
	.word 0x0,0x3f80
L21:
	.word 0x0,0x4120
L20:
	.word 0x0,0x4120
L17:
	.word 0x209b,0x3e9a
L16:
	.word 0x0,0x4b00
; 	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?