📄 graphic.s
字号:
; yAlt = y1;
ldd R20,y+17
.dbline 156
; for(i=0; i<=length; i++)
clr R14
xjmp L58
L55:
.dbline 157
; { y = ((m*i)/200)+y1;
.dbline 157
mov R18,R14
clr R19
movw R16,R22
xcall empy16s
ldi R18,200
ldi R19,0
xcall div16s
mov R10,R16
ldd R2,y+17
clr R3
add R10,R2
adc R11,R3
.dbline 158
; if((m*i)%200 >= 100)
mov R18,R14
clr R19
movw R16,R22
xcall empy16s
ldi R18,200
ldi R19,0
xcall mod16s
cpi R16,100
ldi R30,0
cpc R17,R30
brlt L59
.dbline 159
; y++;
inc R10
xjmp L60
L59:
.dbline 160
; else if((m*i)%200 <= -100)
mov R18,R14
clr R19
movw R16,R22
xcall empy16s
ldi R18,200
ldi R19,0
xcall mod16s
ldi R24,-100
ldi R25,-1
cp R24,R16
cpc R25,R17
brlt L61
.dbline 161
; y--;
dec R10
L61:
L60:
.dbline 163
;
; lcd_line(x1+i, yAlt, x1+i, y, mode ); /* wuff wuff recurs. */
ldd R0,y+23
std y+4,R0
std y+2,R10
mov R2,R8
add R2,R14
std y+0,R2
mov R18,R20
mov R16,R2
push R8
xcall _lcd_line
pop R8
.dbline 164
; if(length<=(y2-y1) && y1 < y2)
ldd R2,y+21
ldd R0,y+17
sub R2,R0
cp R2,R12
brlo L63
ldd R16,y+21
cp R0,R16
brsh L63
.dbline 165
; yAlt = y+1;
mov R20,R10
subi R20,255 ; addi 1
xjmp L64
L63:
.dbline 166
; else if(length<=(y1-y2) && y1 > y2)
ldd R2,y+17
ldd R0,y+21
sub R2,R0
cp R2,R12
brlo L65
ldd R16,y+17
cp R0,R16
brsh L65
.dbline 167
; yAlt = y-1;
mov R20,R10
subi R20,1
xjmp L66
L65:
.dbline 169
; else
; yAlt = y;
mov R20,R10
L66:
L64:
.dbline 170
L56:
.dbline 156
inc R14
L58:
.dbline 156
cp R12,R14
brlo X3
xjmp L55
X3:
.dbline 171
; }
; }
xjmp L53
L52:
.dbline 173
; else
; { // angle smaller 45?
.dbline 175
; // y1 must be smaller than y2
; if(y1 > y2)
ldd R0,y+21
ldd R16,y+17
cp R0,R16
brsh L67
.dbline 176
; { xTmp = x1;
.dbline 176
std y+5,R8
.dbline 177
; yTmp = y1;
ldd R0,y+17
std y+6,R0
.dbline 178
; x1 = x2;
ldd R8,y+19
.dbline 179
; y1 = y2;
ldd R0,y+21
std y+17,R0
.dbline 180
; x2 = xTmp;
ldd R0,y+5
std y+19,R0
.dbline 181
; y2 = yTmp;
ldd R0,y+6
std y+21,R0
.dbline 182
; }
L67:
.dbline 183
; length = y2-y1;
ldd R12,y+21
ldd R0,y+17
sub R12,R0
.dbline 184
; m = ((x2-x1)*200)/length;
ldd R2,y+19
sub R2,R8
ldi R24,200
mul R24,R2
movw R16,R0
mov R18,R12
clr R19
xcall div16s
movw R22,R16
.dbline 185
; yAlt = x1;
mov R20,R8
.dbline 186
; for(i=0; i<=length; i++)
clr R14
xjmp L72
L69:
.dbline 187
; { y = ((m*i)/200)+x1;
.dbline 187
mov R18,R14
clr R19
movw R16,R22
xcall empy16s
ldi R18,200
ldi R19,0
xcall div16s
mov R10,R16
mov R2,R8
clr R3
add R10,R2
adc R11,R3
.dbline 189
;
; if((m*i)%200 >= 100)
mov R18,R14
clr R19
movw R16,R22
xcall empy16s
ldi R18,200
ldi R19,0
xcall mod16s
cpi R16,100
ldi R30,0
cpc R17,R30
brlt L73
.dbline 190
; y++;
inc R10
xjmp L74
L73:
.dbline 191
; else if((m*i)%200 <= -100)
mov R18,R14
clr R19
movw R16,R22
xcall empy16s
ldi R18,200
ldi R19,0
xcall mod16s
ldi R24,-100
ldi R25,-1
cp R24,R16
cpc R25,R17
brlt L75
.dbline 192
; y--;
dec R10
L75:
L74:
.dbline 194
;
; lcd_line(yAlt, y1+i, y, y1+i, mode); /* wuff */
ldd R0,y+23
std y+4,R0
ldd R2,y+17
add R2,R14
std y+2,R2
std y+0,R10
mov R18,R2
mov R16,R20
push R8
xcall _lcd_line
pop R8
.dbline 195
; if(length<=(x2-x1) && x1 < x2)
ldd R2,y+19
sub R2,R8
cp R2,R12
brlo L77
ldd R0,y+19
cp R8,R0
brsh L77
.dbline 196
; yAlt = y+1;
mov R20,R10
subi R20,255 ; addi 1
xjmp L78
L77:
.dbline 197
; else if(length<=(x1-x2) && x1 > x2)
mov R2,R8
ldd R0,y+19
sub R2,R0
cp R2,R12
brlo L79
cp R0,R8
brsh L79
.dbline 198
; yAlt = y-1;
mov R20,R10
subi R20,1
xjmp L80
L79:
.dbline 200
; else
; yAlt = y;
mov R20,R10
L80:
L78:
.dbline 201
L70:
.dbline 186
inc R14
L72:
.dbline 186
cp R12,R14
brlo X4
xjmp L69
X4:
.dbline 202
; }
; }
L53:
.dbline 203
; }
L43:
L35:
.dbline -2
L33:
adiw R28,7
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym l yTmp 6 c
.dbsym l xTmp 5 c
.dbsym r yAlt 20 c
.dbsym r m 22 I
.dbsym r y 10 c
.dbsym r length 12 c
.dbsym r i 14 c
.dbsym l mode 23 c
.dbsym l y2 21 c
.dbsym l x2 19 c
.dbsym l y1 17 c
.dbsym r x1 8 c
.dbend
.dbfunc e lcd_circle _lcd_circle fV
; tSwitch -> R20,R21
; d -> R22
; y -> R10,R11
; x -> R12,R13
; mode -> R14
; radius -> y+15
; yCenter -> y+13
; xCenter -> y+11
.even
_lcd_circle::
xcall push_arg4
xcall push_gset5
sbiw R28,1
ldd R14,y+17
.dbline -1
.dbline 209
; }
;
;
; void lcd_circle( uint8_t xCenter, uint8_t yCenter,
; uint8_t radius, uint8_t mode)
; { int tSwitch, y, x = 0;
.dbline 209
clr R12
clr R13
.dbline 212
; uint8_t d;
;
; d = yCenter - xCenter;
ldd R22,y+13
ldd R0,y+11
sub R22,R0
.dbline 213
; y = radius;
ldd R10,y+15
clr R11
.dbline 214
; tSwitch = 3 - 2 * radius;
ldi R24,2
mov R0,R10
mul R24,R0
ldi R20,3
ldi R21,0
sub R20,R0
sbc R21,R1
xjmp L83
L82:
.dbline 217
;
; while (x <= y)
; { lcd_dot(xCenter + x, yCenter + y, mode);
.dbline 217
std y+0,R14
ldd R18,y+13
clr R19
add R18,R10
adc R19,R11
ldd R16,y+11
clr R17
add R16,R12
adc R17,R13
xcall _lcd_dot
.dbline 218
; lcd_dot(xCenter + x, yCenter - y, mode);
std y+0,R14
ldd R18,y+13
clr R19
sub R18,R10
sbc R19,R11
ldd R16,y+11
clr R17
add R16,R12
adc R17,R13
xcall _lcd_dot
.dbline 220
;
; lcd_dot(xCenter - x, yCenter + y, mode);
std y+0,R14
ldd R18,y+13
clr R19
add R18,R10
adc R19,R11
ldd R16,y+11
clr R17
sub R16,R12
sbc R17,R13
xcall _lcd_dot
.dbline 221
; lcd_dot(xCenter - x, yCenter - y, mode);
std y+0,R14
ldd R18,y+13
clr R19
sub R18,R10
sbc R19,R11
ldd R16,y+11
clr R17
sub R16,R12
sbc R17,R13
xcall _lcd_dot
.dbline 223
;
; lcd_dot(yCenter + y - d, yCenter + x, mode);
std y+0,R14
ldd R18,y+13
clr R19
add R18,R12
adc R19,R13
ldd R16,y+13
clr R17
add R16,R10
adc R17,R11
mov R2,R22
clr R3
sub R16,R2
sbc R17,R3
xcall _lcd_dot
.dbline 224
; lcd_dot(yCenter + y - d, yCenter - x, mode);
std y+0,R14
ldd R18,y+13
clr R19
sub R18,R12
sbc R19,R13
ldd R16,y+13
clr R17
add R16,R10
adc R17,R11
mov R2,R22
clr R3
sub R16,R2
sbc R17,R3
xcall _lcd_dot
.dbline 226
;
; lcd_dot(yCenter - y - d, yCenter + x, mode);
std y+0,R14
ldd R18,y+13
clr R19
add R18,R12
adc R19,R13
ldd R16,y+13
clr R17
sub R16,R10
sbc R17,R11
mov R2,R22
clr R3
sub R16,R2
sbc R17,R3
xcall _lcd_dot
.dbline 227
; lcd_dot(yCenter - y - d, yCenter - x, mode);
std y+0,R14
ldd R18,y+13
clr R19
sub R18,R12
sbc R19,R13
ldd R16,y+13
clr R17
sub R16,R10
sbc R17,R11
mov R2,R22
clr R3
sub R16,R2
sbc R17,R3
xcall _lcd_dot
.dbline 229
;
; if (tSwitch<0)
cpi R20,0
ldi R30,0
cpc R21,R30
brge L85
.dbline 230
; tSwitch += (4 * x + 6);
ldi R16,4
ldi R17,0
movw R18,R12
xcall empy16s
movw R24,R16
adiw R24,6
add R20,R24
adc R21,R25
xjmp L86
L85:
.dbline 232
; else
; { tSwitch += (4 * (x - y) + 10);
.dbline 232
movw R18,R12
sub R18,R10
sbc R19,R11
ldi R16,4
ldi R17,0
xcall empy16s
movw R24,R16
adiw R24,10
add R20,R24
adc R21,R25
.dbline 233
; y--;
movw R24,R10
sbiw R24,1
movw R10,R24
.dbline 234
; }
L86:
.dbline 235
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 236
L83:
.dbline 216
cp R10,R12
cpc R11,R13
brlt X5
xjmp L82
X5:
.dbline -2
L81:
adiw R28,1
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r tSwitch 20 I
.dbsym r d 22 c
.dbsym r y 10 I
.dbsym r x 12 I
.dbsym r mode 14 c
.dbsym l radius 15 c
.dbsym l yCenter 13 c
.dbsym l xCenter 11 c
.dbend
.dbfunc e lcd_rect _lcd_rect fV
; mode -> R14
; height -> R12
; width -> R22
; y -> R20
; x -> R10
.even
_lcd_rect::
xcall push_gset5
mov R20,R18
mov R10,R16
sbiw R28,5
ldd R22,y+15
ldd R12,y+17
ldd R14,y+19
.dbline -1
.dbline 241
; x++;
; }
; }
;
;
; void lcd_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t mode)
; { width--;
.dbline 241
dec R22
.dbline 242
; height--;
dec R12
.dbline 243
; lcd_line(x, y, x+width, y, mode); // top
std y+4,R14
std y+2,R20
mov R2,R10
add R2,R22
std y+0,R2
mov R18,R20
mov R16,R10
xcall _lcd_line
.dbline 244
; lcd_line(x, y, x, y+height, mode); // left
std y+4,R14
mov R2,R20
add R2,R12
std y+2,R2
std y+0,R10
mov R18,R20
mov R16,R10
xcall _lcd_line
.dbline 245
; lcd_line(x, y+height, x+width, y+height, mode); // bottom
std y+4,R14
mov R2,R20
add R2,R12
std y+2,R2
mov R4,R10
add R4,R22
std y+0,R4
mov R18,R2
mov R16,R10
xcall _lcd_line
.dbline 246
; lcd_line(x+width, y, x+width, y+height, mode); // right
std y+4,R14
mov R2,R20
add R2,R12
std y+2,R2
mov R2,R10
add R2,R22
std y+0,R2
mov R18,R20
mov R16,R2
xcall _lcd_line
.dbline -2
L87:
adiw R28,5
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r mode 14 c
.dbsym r height 12 c
.dbsym r width 22 c
.dbsym r y 20 c
.dbsym r x 10 c
.dbend
.dbfunc e lcd_box _lcd_box fV
; i -> R20
; mode -> R22
; height -> R10
; width -> R12
; y -> R14
; x -> y+15
.even
_lcd_box::
xcall push_arg4
xcall push_gset5
mov R14,R18
sbiw R28,5
ldd R12,y+19
ldd R10,y+21
ldd R22,y+23
.dbline -1
.dbline 250
; }
;
; void lcd_box( uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t mode)
; { uint8_t i;
.dbline 251
; if (!width) return;
tst R12
brne L89
.dbline 251
xjmp L88
L89:
.dbline 253
;
; width--;
dec R12
.dbline 255
;
; for (i=y;i<y+height;i++)
mov R20,R14
xjmp L94
L91:
.dbline 256
std y+4,R22
std y+2,R20
ldd R2,y+15
add R2,R12
std y+0,R2
mov R18,R20
ldd R16,y+15
xcall _lcd_line
L92:
.dbline 255
inc R20
L94:
.dbline 255
mov R2,R14
add R2,R10
cp R20,R2
brlo L91
.dbline -2
L88:
adiw R28,5
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r mode 22 c
.dbsym r height 10 c
.dbsym r width 12 c
.dbsym r y 14 c
.dbsym l x 15 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -