📄 me.lst
字号:
(0166) x2--;
03EA 2F26 MOV R18,R22
03EB 5F2F SUBI R18,0xFF
03EC 2F04 MOV R16,R20
(0167) y2--;
(0168) glcdSetPixel(x1, y1);
03ED DE88 RCALL _glcdDoFillRect
03EE 2D8C MOV R24,R12
03EF 5081 SUBI R24,1
03F0 838A STD Y+2,R24
03F1 82A8 STD Y+0,R10
03F2 2F26 MOV R18,R22
(0169) glcdSetPixel(x2, y1);
03F3 5F2F SUBI R18,0xFF
03F4 2D0A MOV R16,R10
(0170) glcdSetPixel(x1, y2);
03F5 DE80 RCALL _glcdDoFillRect
03F6 82CA STD Y+2,R12
03F7 2D8A MOV R24,R10
03F8 5081 SUBI R24,1
03F9 8388 STD Y+0,R24
03FA 2F26 MOV R18,R22
03FB 2F04 MOV R16,R20
03FC 5F0F SUBI R16,0xFF
(0171) glcdSetPixel(x2, y2);
03FD DE78 RCALL _glcdDoFillRect
03FE 9623 ADIW R28,3
03FF 940E1003 CALL pop_gset5
0401 9508 RET
_glcdLine:
t --> R14
t --> R14
t --> R14
t --> R20
t --> R22
t --> Y+15
t --> Y+14
t --> Y+13
t --> R20
t --> R20
t --> R20
swap --> Y+12
sx --> Y+11
i --> Y+10
dy --> Y+9
y3 --> Y+8
x3 --> Y+7
sy --> Y+6
dx --> Y+5
e --> Y+3
y2 --> R8
x2 --> R6
y1 --> Y+28
x1 --> Y+26
0402 940E0FAD CALL push_arg4
0404 940E1029 CALL push_gset5
(0172) }
0406 9760 SBIW R28,0x10
0407 8C6E LDD R6,Y+30
0408 A088 LDD R8,Y+32
0409 9020006D LDS R2,_cofg
040B 9030006E LDS R3,_cofg+1
(0173) if (cobk&0x8000) {
(0174) RGBToChar(cobk);
040D FE37 SBRS R3,7
040E C106 RJMP 0x0515
040F 0181 MOVW R16,R2
0410 926F PUSH R6
0411 928F PUSH R8
0412 D732 RCALL _RGBToChar
0413 908F POP R8
0414 906F POP R6
(0175) glcdDoFillRect(x1, y1 +1, x1, y2 -1);
(0176) glcdDoFillRect(x2, y1 +1, x2, y2 -1);
(0177) glcdDoFillRect(x1 +1, y1, x2 -1, y2);
(0178) }
(0179) }
(0180)
(0181) void glcdLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) {
(0182) unsigned char swap,i;
0415 8C0A LDD R0,Y+26
0416 1406 CP R0,R6
0417 F419 BNE 0x041B
0418 E061 LDI R22,1
0419 E070 LDI R23,0
041A C002 RJMP 0x041D
(0183) unsigned char dx, dy, sx, sy;
041B 2766 CLR R22
041C 2777 CLR R23
041D 8C0C LDD R0,Y+28
041E 1408 CP R0,R8
041F F419 BNE 0x0423
0420 E041 LDI R20,1
(0184) int e;
0421 E050 LDI R21,0
0422 C002 RJMP 0x0425
0423 2744 CLR R20
0424 2755 CLR R21
0425 011B MOVW R2,R22
0426 2A24 OR R2,R20
0427 2A35 OR R3,R21
0428 2022 TST R2
0429 F411 BNE 0x042C
042A 2033 TST R3
042B F051 BEQ 0x0436
042C 828A STD Y+2,R8
042D 8268 STD Y+0,R6
042E 8D2C LDD R18,Y+28
042F 8D0A LDD R16,Y+26
0430 926F PUSH R6
0431 928F PUSH R8
0432 DEDA RCALL _glcdFillRect
0433 908F POP R8
0434 906F POP R6
0435 C0DF RJMP 0x0515
0436 8C0A LDD R0,Y+26
0437 1406 CP R0,R6
(0185) unsigned char x3;
0438 F438 BCC 0x0440
0439 2C26 MOV R2,R6
043A 1820 SUB R2,R0
043B 822D STD Y+5,R2
043C 2400 CLR R0
043D 9403 INC R0
043E 860B STD Y+11,R0
043F C005 RJMP 0x0445
0440 8C2A LDD R2,Y+26
(0186) unsigned char y3;
0441 1826 SUB R2,R6
(0187) if (cofg&0x8000) {
(0188) RGBToChar(cofg);
(0189) if ((x1 == x2) | (y1 == y2)) {
(0190) glcdFillRect(x1, y1, x2, y2);
0442 822D STD Y+5,R2
0443 EF8F LDI R24,0xFF
0444 878B STD Y+11,R24
0445 8C0C LDD R0,Y+28
0446 1408 CP R0,R8
0447 F438 BCC 0x044F
0448 2C28 MOV R2,R8
0449 1820 SUB R2,R0
044A 8629 STD Y+9,R2
044B 2400 CLR R0
(0191) } else {
044C 9403 INC R0
044D 820E STD Y+6,R0
044E C005 RJMP 0x0454
044F 8C2C LDD R2,Y+28
0450 1828 SUB R2,R8
(0192)
0451 8629 STD Y+9,R2
0452 EF8F LDI R24,0xFF
0453 838E STD Y+6,R24
0454 8409 LDD R0,Y+9
0455 810D LDD R16,Y+5
0456 1600 CP R0,R16
0457 F418 BCC 0x045B
0458 2400 CLR R0
0459 860C STD Y+12,R0
045A C003 RJMP 0x045E
(0193)
045B 2400 CLR R0
045C 9403 INC R0
045D 860C STD Y+12,R0
045E 840C LDD R0,Y+12
045F 2000 TST R0
(0194)
(0195) if (x1 < x2) {dx = x2 - x1; sx = +1;}
(0196) else {dx = x1 - x2; sx = -1;}
0460 F061 BEQ 0x046D
0461 8D4A LDD R20,Y+26
0462 8C0C LDD R0,Y+28
0463 8E0A STD Y+26,R0
0464 8F4C STD Y+28,R20
0465 814D LDD R20,Y+5
0466 8409 LDD R0,Y+9
(0197) if (y1 < y2) {dy = y2 - y1; sy = +1;}
0467 820D STD Y+5,R0
0468 8749 STD Y+9,R20
0469 854B LDD R20,Y+11
(0198) else {dy = y1 - y2; sy = -1;}
046A 800E LDD R0,Y+6
046B 860B STD Y+11,R0
046C 834E STD Y+6,R20
(0199)
046D 802D LDD R2,Y+5
046E 2433 CLR R3
046F 8449 LDD R4,Y+9
0470 2455 CLR R5
(0200)
0471 1842 SUB R4,R2
0472 0853 SBC R5,R3
0473 8429 LDD R2,Y+9
0474 2433 CLR R3
(0201) if(dx > dy)swap=0;
0475 0C42 ADD R4,R2
0476 1C53 ADC R5,R3
0477 825C STD Y+4,R5
0478 824B STD Y+3,R4
(0202) else swap= 1;
(0203) if (swap) {
(0204) glcdDoSwapCoord(x1, y1);
0479 8C0A LDD R0,Y+26
047A 820F STD Y+7,R0
047B 8C0C LDD R0,Y+28
047C 8608 STD Y+8,R0
047D 8C6A LDD R6,Y+26
047E 8C8C LDD R8,Y+28
047F 2400 CLR R0
0480 860A STD Y+10,R0
0481 C071 RJMP 0x04F3
0482 8C0A LDD R0,Y+26
0483 1406 CP R0,R6
0484 F021 BEQ 0x0489
(0205) glcdDoSwapCoord(dx, dy);
0485 E081 LDI R24,1
0486 E090 LDI R25,0
(0206) glcdDoSwapCoord(sx, sy);
0487 016C MOVW R12,R24
0488 C002 RJMP 0x048B
(0207) }
0489 24CC CLR R12
(0208)
048A 24DD CLR R13
(0209) e = dy - dx + dy;
(0210) x3 = x1;
(0211) y3 = y1;
048B 8C0C LDD R0,Y+28
048C 1408 CP R0,R8
048D F021 BEQ 0x0492
(0212) x2 = x1;
048E E081 LDI R24,1
048F E090 LDI R25,0
0490 015C MOVW R10,R24
0491 C002 RJMP 0x0494
0492 24AA CLR R10
0493 24BB CLR R11
0494 0116 MOVW R2,R12
0495 202A AND R2,R10
0496 203B AND R3,R11
0497 2022 TST R2
0498 F411 BNE 0x049B
0499 2033 TST R3
049A F131 BEQ 0x04C1
049B 840C LDD R0,Y+12
049C 2000 TST R0
049D F049 BEQ 0x04A7
049E 866D STD Y+13,R6
049F 2C68 MOV R6,R8
04A0 848D LDD R8,Y+13
04A1 800F LDD R0,Y+7
04A2 860E STD Y+14,R0
04A3 8408 LDD R0,Y+8
04A4 820F STD Y+7,R0
04A5 840E LDD R0,Y+14
04A6 8608 STD Y+8,R0
(0213) y2 = y1;
04A7 800F LDD R0,Y+7
04A8 1406 CP R0,R6
04A9 F420 BCC 0x04AE
(0214) /* Diese Loop ist suboptimal. Man k鰊nte mehr rausholen wenn man die Hardware besser ausnutzen w黵de, aber
04AA 866F STD Y+15,R6
04AB 806F LDD R6,Y+7
04AC 840F LDD R0,Y+15
(0215) dann w鋜e diese Routine eben nicht mehr Hardwareunabh鋘gig so wie jetzt. */
04AD 820F STD Y+7,R0
04AE 8408 LDD R0,Y+8
04AF 1408 CP R0,R8
04B0 F418 BCC 0x04B4
04B1 2D68 MOV R22,R8
04B2 2C80 MOV R8,R0
(0216) for (i = 0; i <= dx; i++) {
(0217) if ((x1 != x2) & (y1 != y2)) {
04B3 8768 STD Y+8,R22
04B4 8408 LDD R0,Y+8
04B5 820A STD Y+2,R0
04B6 800F LDD R0,Y+7
04B7 8208 STD Y+0,R0
04B8 2D28 MOV R18,R8
04B9 2D06 MOV R16,R6
(0218) if (swap) {
04BA 930F PUSH R16
04BB 932F PUSH R18
04BC DDB9 RCALL _glcdDoFillRect
04BD 908F POP R8
04BE 906F POP R6
04BF 8C6A LDD R6,Y+26
(0219) glcdDoSwapCoord(x2, y2);
04C0 8C8C LDD R8,Y+28
04C1 8C0A LDD R0,Y+26
04C2 820F STD Y+7,R0
04C3 8C0C LDD R0,Y+28
04C4 8608 STD Y+8,R0
04C5 C012 RJMP 0x04D8
04C6 8C0C LDD R0,Y+28
04C7 810E LDD R16,Y+6
04C8 0E00 ADD R0,R16
04C9 8E0C STD Y+28,R0
04CA 802D LDD R2,Y+5
(0220) glcdDoSwapCoord(x3, y3);
04CB 2433 CLR R3
(0221) }
04CC 800B LDD R0,Y+3
(0222) glcdDoCheckCoord(x2, x3);
(0223) glcdDoCheckCoord(y2, y3);
04CD 801C LDD R1,Y+4
04CE 1802 SUB R0,R2
(0224) glcdDoFillRect(x2, y2, x3, y3);
04CF 0813 SBC R1,R3
04D0 821C STD Y+4,R1
04D1 820B STD Y+3,R0
(0225) x2 = x1;
(0226) y2 = y1;
04D2 802D LDD R2,Y+5
04D3 2433 CLR R3
04D4 1802 SUB R0,R2
04D5 0813 SBC R1,R3
(0227) };
04D6 821C STD Y+4,R1
04D7 820B STD Y+3,R0
04D8 818B LDD R24,Y+3
04D9 819C LDD R25,Y+4
04DA 3080 CPI R24,0
04DB E0E0 LDI R30,0
04DC 079E CPC R25,R30
04DD F744 BGE 0x04C6
(0228) x3 = x1;
04DE 8C0A LDD R0,Y+26
04DF 850B LDD R16,Y+11
04E0 0E00 ADD R0,R16
04E1 8E0A STD Y+26,R0
04E2 8429 LDD R2,Y+9
04E3 2433 CLR R3
04E4 800B LDD R0,Y+3
04E5 801C LDD R1,Y+4
04E6 0C02 ADD R0,R2
04E7 1C13 ADC R1,R3
04E8 821C STD Y+4,R1
04E9 820B STD Y+3,R0
(0229) y3 = y1;
(0230) while (e >= 0) {
04EA 8429 LDD R2,Y+9
04EB 2433 CLR R3
04EC 0C02 ADD R0,R2
04ED 1C13 ADC R1,R3
(0231) y1 += sy;
04EE 821C STD Y+4,R1
04EF 820B STD Y+3,R0
04F0 840A LDD R0,Y+10
04F1 9403 INC R0
04F2 860A STD Y+10,R0
04F3 800D LDD R0,Y+5
04F4 850A LDD R16,Y+10
04F5 1600 CP R0,R16
(0232) e -= dx;
04F6 F008 BCS 0x04F8
04F7 CF8A RJMP 0x0482
04F8 840C LDD R0,Y+12
04F9 2000 TST R0
04FA F039 BEQ 0x0502
04FB 2D46 MOV R20,R6
04FC 2C68 MOV R6,R8
04FD 2E84 MOV R8,R20
04FE 80EF LDD R14,Y+7
04FF 8408 LDD R0,Y+8
0500 820F STD Y+7,R0
0501 86E8 STD Y+8,R14
0502 800F LDD R0,Y+7
0503 1406 CP R0,R6
(0233) e -= dx;
(0234) }
0504 F418 BCC 0x0508
0505 2CE6 MOV R14,R6
0506 2C60 MOV R6,R0
(0235) x1 += sx;
0507 82EF STD Y+7,R14
0508 8408 LDD R0,Y+8
0509 1408 CP R0,R8
(0236) e += dy;
050A F418 BCC 0x050E
050B 2CE8 MOV R14,R8
050C 2C80 MOV R8,R0
050D 86E8 STD Y+8,R14
(0237) e += dy;
(0238) }
050E 8408 LDD R0,Y+8
050F 820A STD Y+2,R0
0510 800F LDD R0,Y+7
0511 8208 STD Y+0,R0
0512 2D28 MOV R18,R8
0513 2D06 MOV R16,R6
(0239) if (swap) {
0514 DD61 RCALL _glcdDoFillRect
0515 9660 ADIW R28,0x10
0516 940E1003 CALL pop_gset5
0518 9624 ADIW R28,4
0519 9508 RET
(0240) glcdDoSwapCoord(x2, y2);
_glcdDoPixelLine:
fill --> Y+15
y --> R22
x2 --> R10
x1 --> R20
051A 940E1029 CALL push_gset5
051C 0159 MOVW R10,R18
051D 01A8 MOVW R20,R16
051E 9723 SBIW R28,3
051F 856D LDD R22,Y+13
0520 857E LDD R23,Y+14
(0241) glcdDoSwapCoord(x3, y3);
(0242) }
(0243) glcdDoCheckCoord(x2, x3);
0521 90200086 LDS R2,_glcd_Clip+1
0523 2433 CLR R3
0524 1562 CP R22,R2
0525 0573 CPC R23,R3
0526 F020 BCS 0x052B
0527 E081 LDI R24,1
0528 E090 LDI R25,0
0529 017C MOVW R14,R24
052A C002 RJMP 0x052D
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -