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 + -
显示快捷键?