📄 me.lst
字号:
(0153) if (x1 < x2) {dx = x2 - x1; sx = +1;}
0297 8C0A LDD R0,Y+26
0298 1406 CP R0,R6
0299 F438 BCC 0x02A1
029A 2C26 MOV R2,R6
029B 1820 SUB R2,R0
029C 822D STD Y+5,R2
029D 2400 CLR R0
029E 9403 INC R0
029F 860B STD Y+11,R0
02A0 C005 RJMP 0x02A6
(0154) else {dx = x1 - x2; sx = -1;}
02A1 8C2A LDD R2,Y+26
02A2 1826 SUB R2,R6
02A3 822D STD Y+5,R2
02A4 EF8F LDI R24,0xFF
02A5 878B STD Y+11,R24
(0155) if (y1 < y2) {dy = y2 - y1; sy = +1;}
02A6 8C0C LDD R0,Y+28
02A7 1408 CP R0,R8
02A8 F438 BCC 0x02B0
02A9 2C28 MOV R2,R8
02AA 1820 SUB R2,R0
02AB 8629 STD Y+9,R2
02AC 2400 CLR R0
02AD 9403 INC R0
02AE 820E STD Y+6,R0
02AF C005 RJMP 0x02B5
(0156) else {dy = y1 - y2; sy = -1;}
02B0 8C2C LDD R2,Y+28
02B1 1828 SUB R2,R8
02B2 8629 STD Y+9,R2
02B3 EF8F LDI R24,0xFF
02B4 838E STD Y+6,R24
(0157)
(0158)
(0159) if(dx > dy)swap=0;
02B5 8409 LDD R0,Y+9
02B6 810D LDD R16,Y+5
02B7 1600 CP R0,R16
02B8 F418 BCC 0x02BC
02B9 2400 CLR R0
02BA 860C STD Y+12,R0
02BB C003 RJMP 0x02BF
(0160) else swap= 1;
02BC 2400 CLR R0
02BD 9403 INC R0
02BE 860C STD Y+12,R0
(0161) if (swap) {
02BF 840C LDD R0,Y+12
02C0 2000 TST R0
02C1 F061 BEQ 0x02CE
(0162) glcdDoSwapCoord(x1, y1);
02C2 8D4A LDD R20,Y+26
02C3 8C0C LDD R0,Y+28
02C4 8E0A STD Y+26,R0
02C5 8F4C STD Y+28,R20
(0163) glcdDoSwapCoord(dx, dy);
02C6 814D LDD R20,Y+5
02C7 8409 LDD R0,Y+9
02C8 820D STD Y+5,R0
02C9 8749 STD Y+9,R20
(0164) glcdDoSwapCoord(sx, sy);
02CA 854B LDD R20,Y+11
02CB 800E LDD R0,Y+6
02CC 860B STD Y+11,R0
02CD 834E STD Y+6,R20
(0165) }
(0166)
(0167) e = dy - dx + dy;
02CE 802D LDD R2,Y+5
02CF 2433 CLR R3
02D0 8449 LDD R4,Y+9
02D1 2455 CLR R5
02D2 1842 SUB R4,R2
02D3 0853 SBC R5,R3
02D4 8429 LDD R2,Y+9
02D5 2433 CLR R3
02D6 0C42 ADD R4,R2
02D7 1C53 ADC R5,R3
02D8 825C STD Y+4,R5
02D9 824B STD Y+3,R4
(0168) x3 = x1;
02DA 8C0A LDD R0,Y+26
02DB 820F STD Y+7,R0
(0169) y3 = y1;
02DC 8C0C LDD R0,Y+28
02DD 8608 STD Y+8,R0
(0170) x2 = x1;
02DE 8C6A LDD R6,Y+26
(0171) y2 = y1;
02DF 8C8C LDD R8,Y+28
(0172) /* Diese Loop ist suboptimal. Man k鰊nte mehr rausholen wenn man die Hardware besser ausnutzen w黵de, aber
(0173) dann w鋜e diese Routine eben nicht mehr Hardwareunabh鋘gig so wie jetzt. */
(0174) for (i = 0; i <= dx; i++) {
02E0 2400 CLR R0
02E1 860A STD Y+10,R0
02E2 C071 RJMP 0x0354
(0175) if ((x1 != x2) & (y1 != y2)) {
02E3 8C0A LDD R0,Y+26
02E4 1406 CP R0,R6
02E5 F021 BEQ 0x02EA
02E6 E081 LDI R24,1
02E7 E090 LDI R25,0
02E8 016C MOVW R12,R24
02E9 C002 RJMP 0x02EC
02EA 24CC CLR R12
02EB 24DD CLR R13
02EC 8C0C LDD R0,Y+28
02ED 1408 CP R0,R8
02EE F021 BEQ 0x02F3
02EF E081 LDI R24,1
02F0 E090 LDI R25,0
02F1 015C MOVW R10,R24
02F2 C002 RJMP 0x02F5
02F3 24AA CLR R10
02F4 24BB CLR R11
02F5 0116 MOVW R2,R12
02F6 202A AND R2,R10
02F7 203B AND R3,R11
02F8 2022 TST R2
02F9 F411 BNE 0x02FC
02FA 2033 TST R3
02FB F131 BEQ 0x0322
(0176) if (swap) {
02FC 840C LDD R0,Y+12
02FD 2000 TST R0
02FE F049 BEQ 0x0308
(0177) glcdDoSwapCoord(x2, y2);
02FF 866D STD Y+13,R6
0300 2C68 MOV R6,R8
0301 848D LDD R8,Y+13
(0178) glcdDoSwapCoord(x3, y3);
0302 800F LDD R0,Y+7
0303 860E STD Y+14,R0
0304 8408 LDD R0,Y+8
0305 820F STD Y+7,R0
0306 840E LDD R0,Y+14
0307 8608 STD Y+8,R0
(0179) }
(0180) glcdDoCheckCoord(x2, x3);
0308 800F LDD R0,Y+7
0309 1406 CP R0,R6
030A F420 BCC 0x030F
030B 866F STD Y+15,R6
030C 806F LDD R6,Y+7
030D 840F LDD R0,Y+15
030E 820F STD Y+7,R0
(0181) glcdDoCheckCoord(y2, y3);
030F 8408 LDD R0,Y+8
0310 1408 CP R0,R8
0311 F418 BCC 0x0315
0312 2D68 MOV R22,R8
0313 2C80 MOV R8,R0
0314 8768 STD Y+8,R22
(0182) glcdDoFillRect(x2, y2, x3, y3);
0315 8408 LDD R0,Y+8
0316 820A STD Y+2,R0
0317 800F LDD R0,Y+7
0318 8208 STD Y+0,R0
0319 2D28 MOV R18,R8
031A 2D06 MOV R16,R6
031B 930F PUSH R16
031C 932F PUSH R18
031D DDC8 RCALL _glcdDoFillRect
031E 908F POP R8
031F 906F POP R6
(0183) x2 = x1;
0320 8C6A LDD R6,Y+26
(0184) y2 = y1;
0321 8C8C LDD R8,Y+28
(0185) };
(0186) x3 = x1;
0322 8C0A LDD R0,Y+26
0323 820F STD Y+7,R0
(0187) y3 = y1;
0324 8C0C LDD R0,Y+28
0325 8608 STD Y+8,R0
0326 C012 RJMP 0x0339
(0188) while (e >= 0) {
(0189) y1 += sy;
0327 8C0C LDD R0,Y+28
0328 810E LDD R16,Y+6
0329 0E00 ADD R0,R16
032A 8E0C STD Y+28,R0
(0190) e -= dx;
032B 802D LDD R2,Y+5
032C 2433 CLR R3
032D 800B LDD R0,Y+3
032E 801C LDD R1,Y+4
032F 1802 SUB R0,R2
0330 0813 SBC R1,R3
0331 821C STD Y+4,R1
0332 820B STD Y+3,R0
(0191) e -= dx;
0333 802D LDD R2,Y+5
0334 2433 CLR R3
0335 1802 SUB R0,R2
0336 0813 SBC R1,R3
0337 821C STD Y+4,R1
0338 820B STD Y+3,R0
0339 818B LDD R24,Y+3
033A 819C LDD R25,Y+4
033B 3080 CPI R24,0
033C E0E0 LDI R30,0
033D 079E CPC R25,R30
033E F744 BGE 0x0327
(0192) }
(0193) x1 += sx;
033F 8C0A LDD R0,Y+26
0340 850B LDD R16,Y+11
0341 0E00 ADD R0,R16
0342 8E0A STD Y+26,R0
(0194) e += dy;
0343 8429 LDD R2,Y+9
0344 2433 CLR R3
0345 800B LDD R0,Y+3
0346 801C LDD R1,Y+4
0347 0C02 ADD R0,R2
0348 1C13 ADC R1,R3
0349 821C STD Y+4,R1
034A 820B STD Y+3,R0
(0195) e += dy;
034B 8429 LDD R2,Y+9
034C 2433 CLR R3
034D 0C02 ADD R0,R2
034E 1C13 ADC R1,R3
034F 821C STD Y+4,R1
0350 820B STD Y+3,R0
0351 840A LDD R0,Y+10
0352 9403 INC R0
0353 860A STD Y+10,R0
0354 800D LDD R0,Y+5
0355 850A LDD R16,Y+10
0356 1600 CP R0,R16
0357 F008 BCS 0x0359
0358 CF8A RJMP 0x02E3
(0196) }
(0197) if (swap) {
0359 840C LDD R0,Y+12
035A 2000 TST R0
035B F039 BEQ 0x0363
(0198) glcdDoSwapCoord(x2, y2);
035C 2D46 MOV R20,R6
035D 2C68 MOV R6,R8
035E 2E84 MOV R8,R20
(0199) glcdDoSwapCoord(x3, y3);
035F 80EF LDD R14,Y+7
0360 8408 LDD R0,Y+8
0361 820F STD Y+7,R0
0362 86E8 STD Y+8,R14
(0200) }
(0201) glcdDoCheckCoord(x2, x3);
0363 800F LDD R0,Y+7
0364 1406 CP R0,R6
0365 F418 BCC 0x0369
0366 2CE6 MOV R14,R6
0367 2C60 MOV R6,R0
0368 82EF STD Y+7,R14
(0202) glcdDoCheckCoord(y2, y3);
0369 8408 LDD R0,Y+8
036A 1408 CP R0,R8
036B F418 BCC 0x036F
036C 2CE8 MOV R14,R8
036D 2C80 MOV R8,R0
036E 86E8 STD Y+8,R14
(0203) glcdDoFillRect(x2, y2, x3, y3);
036F 8408 LDD R0,Y+8
0370 820A STD Y+2,R0
0371 800F LDD R0,Y+7
0372 8208 STD Y+0,R0
0373 2D28 MOV R18,R8
0374 2D06 MOV R16,R6
0375 DD70 RCALL _glcdDoFillRect
(0204) }
(0205) }
(0206) }
0376 9660 ADIW R28,0x10
0377 D91D RCALL pop_gset5
0378 9624 ADIW R28,4
0379 9508 RET
_glcdDoPixelLine:
fill --> Y+15
y --> R22
x2 --> R10
x1 --> R20
037A D93C RCALL push_gset5
037B 0159 MOVW R10,R18
037C 01A8 MOVW R20,R16
037D 9723 SBIW R28,3
037E 856D LDD R22,Y+13
037F 857E LDD R23,Y+14
(0207)
(0208) /* Hilfsfunktion f黵 Ellipsen */
(0209) void glcdDoPixelLine(unsigned int x1, unsigned int x2, unsigned int y, unsigned char fill) {
(0210)
(0211) if ((y >= glcd_Clip.Y1 ) & (y <= glcd_Clip.Y2)) {
0380 90200070 LDS R2,_glcd_Clip+1
0382 2433 CLR R3
0383 1562 CP R22,R2
0384 0573 CPC R23,R3
0385 F020 BCS 0x038A
0386 E081 LDI R24,1
0387 E090 LDI R25,0
0388 017C MOVW R14,R24
0389 C002 RJMP 0x038C
038A 24EE CLR R14
038B 24FF CLR R15
038C 90200072 LDS R2,_glcd_Clip+3
038E 2433 CLR R3
038F 1626 CP R2,R22
0390 0637 CPC R3,R23
0391 F020 BCS 0x0396
0392 E081 LDI R24,1
0393 E090 LDI R25,0
0394 016C MOVW R12,R24
0395 C002 RJMP 0x0398
0396 24CC CLR R12
0397 24DD CLR R13
0398 0117 MOVW R2,R14
0399 202C AND R2,R12
039A 203D AND R3,R13
039B 2022 TST R2
039C F419 BNE 0x03A0
039D 2033 TST R3
039E F409 BNE 0x03A0
039F C05E RJMP 0x03FE
(0212) if (x1 < glcd_Clip.X1) {x1 = glcd_Clip.X1;} else {
03A0 9020006F LDS R2,_glcd_Clip
03A2 2433 CLR R3
03A3 1542 CP R20,R2
03A4 0553 CPC R21,R3
03A5 F418 BCC 0x03A9
03A6 2D42 MOV R20,R2
03A7 2755 CLR R21
03A8 C014 RJMP 0x03BD
(0213) if (x1 > glcd_Clip.X2) {return;} else {
03A9 90200071 LDS R2,_glcd_Clip+2
03AB 2433 CLR R3
03AC 1624 CP R2,R20
03AD 0635 CPC R3,R21
03AE F408 BCC 0x03B0
03AF C04E RJMP 0x03FE
(0214) if (cfg&0x8000) {
03B0 9020006B LDS R2,_cfg
03B2 9030006C LDS R3,_cfg+1
03B4 FE37 SBRS R3,7
03B5 C005 RJMP 0x03BB
(0215) RGBToChar(cfg);
03B6 0181 MOVW R16,R2
03B7 D803 RCALL _RGBToChar
(0216) point(x1, y);
03B8 019B MOVW R18,R22
03B9 018A MOVW R16,R20
03BA D808 RCALL _point
(0217) }
(0218) x1++;
03BB 5F4F SUBI R20,0xFF
03BC 4F5F SBCI R21,0xFF
(0219) }
(0220) }
(0221) if (x2 < glcd_Clip.X1) {return;} else {
03BD 9020006F LDS R2,_glcd_Clip
03BF 2433 CLR R3
03C0 14A2 CP R10,R2
03C1 04B3 CPC R11,R3
03C2 F408 BCC 0x03C4
03C3 C03A RJMP 0x03FE
(0222) if (x2 > glcd_Clip.X2) {x2 = glcd_Clip.X2;} else {
03C4 90200071 LDS R2,_glcd_Clip+2
03C6 2433 CLR R3
03C7 142A CP R2,R10
03C8 043B CPC R3,R11
03C9 F418 BCC 0x03CD
03CA 2CA2 MOV R10,R2
03CB 24BB CLR R11
03CC C00E RJMP 0x03DB
(0223) if (cfg&0x8000) {
03CD 9020006B LDS R2,_cfg
03CF 9030006C LDS R3,_cfg+1
03D1 FE37 SBRS R3,7
03D2 C005 RJMP 0x03D8
(0224) RGBToChar(cfg);
03D3 0181 MOVW R16,R2
03D4 D7E6 RCALL _RGBToChar
(0225) point(x2, y);
03D5 019B MOVW R18,R22
03D6 0185 MOVW R16,R10
03D7 D7EB RCALL _point
(0226) }
(0227) x2--;
03D8 01C5 MOVW R24,R10
03D9 9701 SBIW R24,1
03DA 015C MOVW R10,R24
(0228) }
(0229) }
(0230) if ((fill) & (cbk&0x8000) & (x1 <= x2)) {
03DB 16A4 CP R10,R20
03DC 06B5 CPC R11,R21
03DD F020 BCS 0x03E2
03DE E081 LDI R24,1
03DF E090 LDI R25,0
03E0 016C MOVW R12,R24
03E1 C002 RJMP 0x03E4
03E2 24CC CLR R12
03E3 24DD CLR R13
03E4 9180006D LDS R24,_cbk
03E6 9190006E LDS R25,_cbk+1
03E8 7080 ANDI R24,0
03E9 7890 ANDI R25,0x80
03EA 842F LDD R2,Y+15
03EB 2433 CLR R3
03EC 2228 AND R2,R24
03ED 2239 AND R3,R25
03EE 202C AND R2,R12
03EF 203D AND R3,R13
03F0 2022 TST R2
03F1 F411 BNE 0x03F4
03F2 2033 TST R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -