ftoa_slow.s

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

S
1,145
字号
	.module ftoa_slow.c
	.area text(rom, con, rel)
	.dbfile ftoa_slow.c
	.dbfunc s round_to_n_places _round_to_n_places fV
;             sp -> R20,R21
;          scale -> R10,R11
;         places -> R18,R19
;             vp -> R16,R17
	.even
_round_to_n_places:
	rcall push_xgset300C
	ldd R10,y+4
	ldd R11,y+5
	.dbline -1
	.dbline 39
; /* Adapted by Richard F. Man, ImageCraft
;  *
;  * fcvt() to support printf
;  *
;  */
; 
; // check
; // EFG_convert_B.c for original
; 
; /* Routines to convert single-precision floating-point values           */
; /* in support of printf()                                               */
; /* Orginally prepared                    2/ 4/00        E.M.Greene      */
; /* Most recent update                    2/ 9/00        E.M.Greene      */
; 
; #include <ctype.h>
; #include <math.h>
; #include <string.h>
; #include <stdlib.h>
; 
; #define OVERFLOW        TRUE
; #define scale_23        (0x800000)              /* = pow(2.0, 23.0)     */
; 
; typedef
;   struct {
;     char        mantissa_sign;
;     unsigned char scale_bin;
;     char        mantissa_BCD[8],
;                 exponent_sign,
;                 scale_BCD[2];}          EFG_data_t;
; 
; typedef union {
; 	float f;
;     long i;
; } FI_union_t;
; 
; static void EFG_convert(int z, EFG_data_t *dp);
; 
; static void round_to_n_places(unsigned char *vp, int places, unsigned char *scale)
; {
	.dbline 42
;   char *sp;
; 
;   sp = vp + places;
	mov R20,R18
	mov R21,R19
	add R20,R16
	adc R21,R17
	.dbline 43
;   *sp += 5;
	mov R30,R20
	mov R31,R21
	ldd R24,z+0
	subi R24,251    ; addi 5
	std z+0,R24
	.dbline 44
;   for (;;) {
L4:
	.dbline 44
	.dbline 45
;     if ((sp < vp) || (*sp <= 9))
	cp R20,R16
	cpc R21,R17
	brlo L10
X0:
	ldi R24,9
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	cp R24,R2
	brlo L8
X1:
L10:
	.dbline 46
;       break;
	rjmp L6
L8:
	.dbline 47
;     *sp -= 10;
	mov R30,R20
	mov R31,R21
	ldd R24,z+0
	subi R24,10
	std z+0,R24
	.dbline 48
;     if (sp > vp)
	cp R16,R30
	cpc R17,R31
	brsh L11
X2:
	.dbline 49
;       (*--sp)++;
	mov R24,R30
	mov R25,R31
	sbiw R24,1
	mov R20,R24
	mov R21,R25
	mov R30,R24
	mov R31,R25
	ldd R24,z+0
	subi R24,255    ; addi 1
	std z+0,R24
	rjmp L4
L11:
	.dbline 50
;     else {
	.dbline 51
; 	  *vp = 1;
	ldi R24,1
	mov R30,R16
	mov R31,R17
	std z+0,R24
	.dbline 52
; 	  (*scale)++;
	mov R30,R10
	mov R31,R11
	ldd R24,z+0
	subi R24,255    ; addi 1
	std z+0,R24
	.dbline 53
; 	}
	.dbline 54
;   }
	.dbline 44
	.dbline 44
	rjmp L4
L6:
	.dbline -2
L3:
	.dbline 0 ; func end
	rjmp pop_xgset300C
	.dbsym r sp 20 pc
	.dbsym r scale 10 pc
	.dbsym r places 18 I
	.dbsym r vp 16 pc
	.dbend
	.dbfunc s SP_EFG_convert _SP_EFG_convert fV
	.dbstruct 0 13 .1
	.dbfield 0 mantissa_sign c
	.dbfield 1 scale_bin c
	.dbfield 2 mantissa_BCD A[8:8]c
	.dbfield 10 exponent_sign c
	.dbfield 11 scale_BCD A[2:2]c
	.dbend
;           e10f -> y+14
;            e10 -> y+10
;              n -> R22,R23
;             sp -> R20,R21
;      int_digit -> y+6
;       mantissa -> y+2
;             dp -> R20,R21
;              z -> y+24
	.even
_SP_EFG_convert:
	rcall push_arg4
	rcall push_xgsetF00C
	sbiw R28,18
	ldd R20,y+28
	ldd R21,y+29
	.dbline -1
	.dbline 58
; }
; 
; static void SP_EFG_convert(long z, EFG_data_t *dp)
; {
	.dbline 66
;   char          *sp;
;   int           n;
;   /* double */ float       mantissa,
;                 int_digit,
;                 e10f,
;                 e10;
; 
;   memset(dp, 0, sizeof(EFG_data_t));
	ldi R24,13
	ldi R25,0
	std y+1,R25
	std y+0,R24
	clr R18
	clr R19
	mov R16,R20
	mov R17,R21
	rcall _memset
	.dbline 67
;   if (z != 0) {
	ldd R2,y+24
	ldd R3,y+25
	ldd R4,y+26
	ldd R5,y+27
	ldi R16,0
	cp R2,R16
	cpc R3,R16
	cpc R4,R16
	cpc R5,R16
	brne X7
	rjmp L14
X7:
X3:
	.dbline 67
	.dbline 68
;     mantissa = (double)((z & 0xFFFFFFl) | 0x800000l) / scale_23;
	ldi R24,255
	ldi R25,255
	ldi R26,255
	ldi R27,0
	and R2,R24
	and R3,R25
	and R4,R26
	and R5,R27
	mov R16,R4
	ori R16,128
	mov R4,R16
	mov R16,R2
	mov R17,R3
	mov R18,R4
	mov R19,R5
	rcall long2fp
	mov R2,R16
	mov R3,R17
	mov R4,R18
	mov R5,R19
	ldi R16,<L16
	ldi R17,>L16
	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 fpdiv2
	std y+2,R16
	std y+3,R17
	std y+4,R18
	std y+5,R19
	.dbline 73
; 	/* rfm unused
;     if (z < 0)
;       dp->mantissa_sign = '-';
; 	 */
;     dp->scale_bin = ((z >> 23) & 0xFF) - 127;
	ldi R24,23
	ldi R25,0
	ldd R16,y+24
	ldd R17,y+25
	ldd R18,y+26
	ldd R19,y+27
	st -y,R24
	rcall asr32
	mov R2,R16
	mov R3,R17
	mov R4,R18
	mov R5,R19
	ldi R24,255
	ldi R25,0
	ldi R26,0
	ldi R27,0
	and R2,R24
	and R3,R25
	and R4,R26
	and R5,R27
	ldi R24,127
	ldi R25,0
	ldi R26,0
	ldi R27,0
	sub R2,R24
	sbc R3,R25
	sbc R4,R26
	sbc R5,R27
	mov R30,R20
	mov R31,R21
	std z+1,R2
	.dbline 76
; #define LOG10_of_2	0.301030		/* rfm, precompute */
; 										/* log10(2.0) */
;     e10 = dp->scale_bin * LOG10_of_2;
	ldi R16,<L17
	ldi R17,>L17
	rcall lpm32
	mov R2,R16
	mov R3,R17
	mov R4,R18
	mov R5,R19
	mov R30,R20
	mov R31,R21
	adiw R30,1
	ldd R16,z+0
	clr R17
	rcall int2fp
	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 fpmul2
	std y+10,R16
	std y+11,R17
	std y+12,R18
	std y+13,R19
	.dbline 77
;     dp->scale_bin = e10;
	ldd R16,y+10
	ldd R17,y+11
	ldd R18,y+12
	ldd R19,y+13
	rcall fpint
	mov R30,R20
	mov R31,R21
	adiw R30,1
	std z+0,R16
	.dbline 78
;     e10f = e10 - dp->scale_bin;
	ldd R2,y+10
	ldd R3,y+11
	ldd R4,y+12
	ldd R5,y+13
	mov R30,R20
	mov R31,R21
	adiw R30,1
	ldd R16,z+0
	clr R17
	rcall int2fp
	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 fpsub2
	std y+14,R16
	std y+15,R17
	std y+16,R18
	std y+17,R19
	.dbline 79
;     mantissa *= exp10(e10f);
	ldd R16,y+14
	ldd R17,y+15
	ldd R18,y+16
	ldd R19,y+17
	rcall _exp10f
	mov R2,R16
	mov R3,R17
	mov R4,R18
	mov R5,R19
	ldd R16,y+2
	ldd R17,y+3
	ldd R18,y+4
	ldd R19,y+5
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	rcall fpmul2
	std y+2,R16
	std y+3,R17
	std y+4,R18
	std y+5,R19
	.dbline 80
;     if (mantissa >= 10.0) {
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	ldi R16,<L20
	ldi R17,>L20
	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
	brlt L18
X4:
	.dbline 80
	.dbline 81
;       mantissa /= 10;
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	ldi R16,<L21
	ldi R17,>L21
	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 fpdiv2
	std y+2,R16
	std y+3,R17
	std y+4,R18
	std y+5,R19
	.dbline 82
;       dp->scale_bin++;
	mov R24,R20
	mov R25,R21
	adiw R24,1
	mov R30,R24
	mov R31,R25
	ldd R24,z+0
	subi R24,255    ; addi 1
	std z+0,R24
	.dbline 83
;     }
	rjmp L19
L18:
	.dbline 84
;     else if (mantissa < 1.0) {
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	ldi R16,<L24
	ldi R17,>L24
	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
	brge L22
X5:
	.dbline 84
	.dbline 85
;       mantissa *= 10;
	ldi R16,<L21
	ldi R17,>L21
	rcall lpm32
	mov R24,R28
	mov R25,R29
	adiw R24,2
	st -y,R25
	st -y,R24
	rcall fpmul1
	std y+2,R16
	std y+3,R17
	std y+4,R18
	std y+5,R19
	.dbline 86
;       dp->scale_bin--;
	mov R24,R20
	mov R25,R21
	adiw R24,1
	mov R30,R24
	mov R31,R25
	ldd R24,z+0
	subi R24,1
	std z+0,R24
	.dbline 87
;     }
L22:
L19:
	.dbline 88
;     sp = dp->mantissa_BCD;
	subi R20,254  ; offset = 2
	sbci R21,255
	.dbline 89
;     n = 7;
	ldi R22,7
	ldi R23,0
L25:
	.dbline 90
;     do {
	.dbline 91
;       mantissa = modf(mantissa, &int_digit);
	mov R24,R28
	mov R25,R29
	adiw R24,6
	std y+1,R25
	std y+0,R24
	ldd R16,y+2
	ldd R17,y+3
	ldd R18,y+4
	ldd R19,y+5
	rcall _modff
	std y+2,R16
	std y+3,R17
	std y+4,R18
	std y+5,R19
	.dbline 92
;       *sp++ = int_digit;
	ldd R16,y+6
	ldd R17,y+7
	ldd R18,y+8
	ldd R19,y+9
	rcall fpint
	mov R30,R20
	mov R31,R21
	st Z+,R16
	mov R20,R30
	mov R21,R31
	.dbline 93
;       mantissa *= 10.0;
	ldi R16,<L20
	ldi R17,>L20
	rcall lpm32
	mov R24,R28
	mov R25,R29
	adiw R24,2
	st -y,R25
	st -y,R24
	rcall fpmul1
	std y+2,R16
	std y+3,R17
	std y+4,R18
	std y+5,R19
	.dbline 94
;     } while (n--);
L26:
	.dbline 94
	mov R10,R22
	mov R11,R23
	subi R22,1
	sbci R23,0
	tst R10
	brne L25
	tst R11
	brne L25
X6:
	.dbline 103
; 	/* rfm unused
;     if ((n = dp->scale_bin) < 0) {
;       n = -n;
;       dp->exponent_sign = '-';
;     }
;     dp->scale_BCD[0] = n / 10;
;     dp->scale_BCD[1] = n % 10;
; 	*/
;   }
L14:
	.dbline -2
L13:
	.dbline 0 ; func end
	adiw R28,18
	rcall pop_xgsetF00C
	adiw R28,4
	ret
	.dbsym l e10f 14 D
	.dbsym l e10 10 D
	.dbsym r n 22 I

⌨️ 快捷键说明

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