📄 simpleio.s
字号:
pop R5
pop R4
.dbline 137
; }
rjmp L57
L56:
.dbline 139
; else
; {
.dbline 140
; width -= bi;
ldd R0,y+54
ldd R1,y+55
sub R0,R4
sbc R1,R5
std y+55,R1
std y+54,R0
.dbline 141
; if (!left) PutRepChar(fill, width);
ldd R0,y+40
ldd R1,y+41
tst R0
brne L58
tst R1
brne L58
X5:
.dbline 141
ldd R18,y+54
ldd R19,y+55
ldd R16,y+56
push R4
push R5
rcall _PutRepChar
pop R5
pop R4
L58:
.dbline 142
; PutStringReverse(buffer, bi);
movw R18,R4
movw R16,R28
rcall _PutStringReverse
.dbline 143
; if (left) PutRepChar(fill, width);
ldd R0,y+40
ldd R1,y+41
tst R0
brne X6
tst R1
breq L60
X6:
.dbline 143
ldd R18,y+54
ldd R19,y+55
ldd R16,y+56
rcall _PutRepChar
L60:
.dbline 144
L57:
.dbline -2
L25:
adiw R28,42
rcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r negative 14 S
.dbsym l left 40 S
.dbsym l buffer 0 A[40:40]c
.dbsym r digit 22 S
.dbsym r bi 4 I
.dbsym r uvalue 20 i
.dbsym l fill 56 c
.dbsym l width 54 I
.dbsym l radix 52 I
.dbsym r value 22 I
.dbend
.dbfunc s FormatItem _FormatItem fpc
; fill -> R14
; leftjust -> R20,R21
; fieldwidth -> y+3
; radix -> R10,R11
; c -> R12
; a -> y+17
; f -> y+15
.even
_FormatItem:
rcall push_arg4
rcall push_gset5
sbiw R28,5
.dbline -1
.dbline 149
; }
; }
;
;
; static char *FormatItem(char *f, int a)
; {
.dbline 151
; char c;
; int fieldwidth = 0;
clr R0
clr R1
std y+4,R1
std y+3,R0
.dbline 152
; int leftjust = FALSE;
clr R20
clr R21
.dbline 153
; int radix = 0;
clr R10
clr R11
.dbline 154
; char fill = ' ';
ldi R24,32
mov R14,R24
.dbline 156
;
; if (*f == '0') fill = '0';
ldd R30,y+15
ldd R31,y+16
ldd R24,z+0
cpi R24,48
breq X18
rjmp L66
X18:
.dbline 156
ldi R24,48
mov R14,R24
rjmp L66
L65:
.dbline 158
; while ((c = *f++)!=0)
; {
.dbline 159
; if (c >= '0' && c <= '9')
mov R24,R12
cpi R24,48
brlo L68
ldi R24,57
cp R24,R12
brlo L68
.dbline 160
; {
.dbline 161
; fieldwidth = (fieldwidth * 10) + (c - '0');
ldi R16,10
ldi R17,0
ldd R18,y+3
ldd R19,y+4
rcall empy16s
movw R2,R16
mov R24,R12
clr R25
sbiw R24,48
add R2,R24
adc R3,R25
std y+4,R3
std y+3,R2
.dbline 162
; }
rjmp L69
L68:
.dbline 164
; else
; {
.dbline 165
; switch (c)
mov R22,R12
clr R23
cpi R22,88
ldi R30,0
cpc R23,R30
brne X19
rjmp L93
X19:
ldi R24,88
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L96
L95:
cpi R22,37
ldi R30,0
cpc R23,R30
brne X20
rjmp L74
X20:
ldi R24,37
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L98
L97:
cpi R22,0
cpc R22,R23
brne X21
rjmp L73
X21:
X10:
rjmp L70
L98:
cpi R22,45
ldi R30,0
cpc R23,R30
brne X22
rjmp L75
X22:
rjmp L70
L96:
cpi R22,105
ldi R30,0
cpc R23,R30
brne X23
rjmp L90
X23:
ldi R24,105
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L100
L99:
cpi R22,99
ldi R30,0
cpc R23,R30
brne X24
rjmp L76
X24:
cpi R22,100
ldi R30,0
cpc R23,R30
brne X25
rjmp L90
X25:
rjmp L70
L100:
cpi R22,111
ldi R30,0
cpc R23,R30
brne X26
rjmp L94
X26:
cpi R22,111
ldi R30,0
cpc R23,R30
brge X27
rjmp L70
X27:
L101:
cpi R22,115
ldi R30,0
cpc R23,R30
brne X28
rjmp L83
X28:
cpi R22,117
ldi R30,0
cpc R23,R30
brne X29
rjmp L91
X29:
cpi R22,120
ldi R30,0
cpc R23,R30
brne X30
rjmp L92
X30:
rjmp L70
X11:
.dbline 166
; {
L73:
.dbline 168
; case '\000':
; return(--f);
ldd R24,y+15
ldd R25,y+16
sbiw R24,1
std y+16,R25
std y+15,R24
movw R16,R24
rjmp L62
L74:
.dbline 170
; case '%':
; putchar('%');
ldi R16,37
rcall _putchar
.dbline 171
; return(f);
ldd R16,y+15
ldd R17,y+16
rjmp L62
L75:
.dbline 172
; case '-': leftjust = TRUE;
ldi R20,1
ldi R21,0
.dbline 173
; break;
rjmp L71
L76:
.dbline 175
; case 'c':
; {
.dbline 176
; if (leftjust) putchar(a & 0x7f);
cpi R20,0
cpc R20,R21
breq L77
X12:
.dbline 176
ldd R16,y+17
ldd R17,y+18
andi R16,127
andi R17,0
rcall _putchar
L77:
.dbline 177
; if (fieldwidth > 0) PutRepChar(fill, fieldwidth - 1);
clr R2
clr R3
ldd R0,y+3
ldd R1,y+4
cp R2,R0
cpc R3,R1
brge L79
.dbline 177
movw R18,R0
subi R18,1
sbci R19,0
mov R16,R14
rcall _PutRepChar
L79:
.dbline 178
; if (!leftjust) putchar(a & 0x7f);
cpi R20,0
cpc R20,R21
brne L81
X13:
.dbline 178
ldd R16,y+17
ldd R17,y+18
andi R16,127
andi R17,0
rcall _putchar
L81:
.dbline 179
; return(f);
ldd R16,y+15
ldd R17,y+16
rjmp L62
L83:
.dbline 182
; }
; case 's':
; {
.dbline 183
; if (leftjust) putstr((char *) a);
cpi R20,0
cpc R20,R21
breq L84
X14:
.dbline 183
ldd R16,y+17
ldd R17,y+18
rcall _putstr
L84:
.dbline 184
; if (fieldwidth > strlen((char *) a))
ldd R16,y+17
ldd R17,y+18
rcall _strlen
ldd R0,y+3
ldd R1,y+4
cp R16,R0
cpc R17,R1
brge L86
.dbline 185
; PutRepChar(fill, fieldwidth - strlen((char *)a));
ldd R16,y+17
ldd R17,y+18
rcall _strlen
ldd R18,y+3
ldd R19,y+4
sub R18,R16
sbc R19,R17
mov R16,R14
rcall _PutRepChar
L86:
.dbline 186
; if (!leftjust) putstr((char *) a);
cpi R20,0
cpc R20,R21
brne L88
X15:
.dbline 186
ldd R16,y+17
ldd R17,y+18
rcall _putstr
L88:
.dbline 187
; return(f);
ldd R16,y+15
ldd R17,y+16
rjmp L62
L90:
.dbline 191
; }
; case 'd':
; case 'i':
; radix = -10;break;
ldi R24,-10
ldi R25,-1
movw R10,R24
.dbline 191
rjmp L71
L91:
.dbline 193
; case 'u':
; radix = 10;break;
ldi R24,10
ldi R25,0
movw R10,R24
.dbline 193
rjmp L71
L92:
.dbline 195
; case 'x':
; radix = 16;break;
ldi R24,16
ldi R25,0
movw R10,R24
.dbline 195
rjmp L71
L93:
.dbline 197
; case 'X':
; radix = 16;break;
ldi R24,16
ldi R25,0
movw R10,R24
.dbline 197
rjmp L71
L94:
.dbline 199
; case 'o':
; radix = 8;break;
ldi R24,8
ldi R25,0
movw R10,R24
.dbline 199
rjmp L71
L70:
.dbline 201
; default :
; radix = 3;break;/* unknown switch! */
ldi R24,3
ldi R25,0
movw R10,R24
.dbline 201
L71:
.dbline 203
; }
; }
L69:
.dbline 204
; if (radix) break;
tst R10
brne X16
tst R11
breq L102
X16:
.dbline 204
rjmp L67
L102:
.dbline 205
L66:
.dbline 157
ldd R30,y+15
ldd R31,y+16
ld R2,Z+
std y+16,R31
std y+15,R30
mov R12,R2
tst R12
breq X31
rjmp L65
X31:
L67:
.dbline 206
; }
; if (leftjust) fieldwidth = -fieldwidth;
cpi R20,0
cpc R20,R21
breq L104
X17:
.dbline 206
ldd R24,y+3
ldd R25,y+4
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
std y+4,R25
std y+3,R24
L104:
.dbline 207
; PutNumber(a, radix, fieldwidth, fill);
std y+2,R14
ldd R0,y+3
ldd R1,y+4
std y+1,R1
std y+0,R0
movw R18,R10
ldd R16,y+17
ldd R17,y+18
rcall _PutNumber
.dbline 208
; return(f);
ldd R16,y+15
ldd R17,y+16
.dbline -2
L62:
adiw R28,5
rcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r fill 14 c
.dbsym r leftjust 20 I
.dbsym l fieldwidth 3 I
.dbsym r radix 10 I
.dbsym r c 12 c
.dbsym l a 17 I
.dbsym l f 15 pc
.dbend
.dbfunc e printf _printf fV
; argP -> R20,R21
; f -> y+2
.even
_printf::
rcall push_arg4
rcall push_gset1
.dbline -1
.dbline 216
; }
;
; #define vaStart(list, param) list = (char*)((int)¶m + sizeof(param))
; #define vaArg(list, type) ((type *)(list += sizeof(type)))[-1]
; #define vaEnd(list)
;
; void printf(char *f, ...) /* variable arguments */
; {
.dbline 219
; char *argP;
;
; vaStart(argP,f); /* point at the end of the format string */
movw R20,R28
subi R20,254 ; offset = 2
sbci R21,255
subi R20,254 ; offset = 2
sbci R21,255
rjmp L108
L107:
.dbline 221
; while (*f)
; { /* this works because args are all ints */
.dbline 222
; if (*f == '%')
ldd R30,y+2
ldd R31,y+3
ldd R24,z+0
cpi R24,37
brne L110
.dbline 223
; f = FormatItem(f + 1, vaArg(argP, int));
movw R24,R20
adiw R24,2
movw R20,R24
movw R30,R24
sbiw R30,2
ldd R18,z+0
ldd R19,z+1
ldd R16,y+2
ldd R17,y+3
subi R16,255 ; offset = 1
sbci R17,255
rcall _FormatItem
std y+3,R17
std y+2,R16
rjmp L111
L110:
.dbline 225
; else
; putchar(*f++);
ldd R30,y+2
ldd R31,y+3
ld R16,Z+
std y+3,R31
std y+2,R30
rcall _putchar
L111:
.dbline 226
L108:
.dbline 220
ldd R30,y+2
ldd R31,y+3
ldd R2,z+0
tst R2
brne L107
.dbline 227
; }
; vaEnd(argP);
.dbline -2
L106:
rcall pop_gset1
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r argP 20 pc
.dbsym l f 2 pc
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -