📄 testh.lst
字号:
0EEF 2D0A MOV R16,R10
0EF0 2711 CLR R17
0EF1 DE0F RCALL _point
(0240) if(dx*(y1-y)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
0EF2 842B LDD R2,Y+11
0EF3 2433 CLR R3
0EF4 2D2A MOV R18,R10
0EF5 2733 CLR R19
0EF6 1922 SUB R18,R2
0EF7 0933 SBC R19,R3
0EF8 018A MOVW R16,R20
0EF9 940E1CA8 CALL empy16s
0EFB 0118 MOVW R2,R16
0EFC 2C4C MOV R4,R12
0EFD 2455 CLR R5
0EFE 852D LDD R18,Y+13
0EFF 2733 CLR R19
0F00 1924 SUB R18,R4
0F01 0935 SBC R19,R5
0F02 018B MOVW R16,R22
0F03 940E1CA8 CALL empy16s
0F05 1502 CP R16,R2
0F06 0513 CPC R17,R3
0F07 F410 BCC 0x0F0A
(0241) y--;
0F08 94CA DEC R12
0F09 C001 RJMP 0x0F0B
(0242) else x++;
0F0A 94A3 INC R10
0F0B 840F LDD R0,Y+15
0F0C 140A CP R0,R10
0F0D F018 BCS 0x0F11
0F0E 8809 LDD R0,Y+17
0F0F 14C0 CP R12,R0
0F10 F6E0 BCC 0x0EED
(0243)
(0244) }
(0245) }
0F11 9621 ADIW R28,1
0F12 940E1CC1 CALL pop_gset5
0F14 9624 ADIW R28,4
0F15 9508 RET
_xuline:
dy --> R20
dx --> R22
x --> R10
y --> R12
color --> R14
y2 --> Y+17
x2 --> Y+15
y1 --> Y+13
x1 --> Y+11
0F16 940E1C51 CALL push_arg4
0F18 940E1CE7 CALL push_gset5
0F1A 9721 SBIW R28,1
0F1B 88EB LDD R14,Y+19
(0246) }
(0247) /******************两点间画虚线**********************/
(0248) void xuline(char x1,char y1,char x2,char y2,char color)
(0249) {
(0250) char x,y;
(0251) unsigned int dx,dy;
(0252) if(x1>x2)
0F1C 840F LDD R0,Y+15
0F1D 850B LDD R16,Y+11
0F1E 1600 CP R0,R16
0F1F F440 BCC 0x0F28
(0253) {
(0254) x=x2;
0F20 2CA0 MOV R10,R0
(0255) y=y2;
0F21 88C9 LDD R12,Y+17
(0256) x2=x1;
0F22 2E00 MOV R0,R16
0F23 860F STD Y+15,R0
(0257) y2=y1;
0F24 840D LDD R0,Y+13
0F25 8A09 STD Y+17,R0
(0258) x1=x;
0F26 86AB STD Y+11,R10
(0259) y1=y;
0F27 86CD STD Y+13,R12
(0260) }//保证(x,y)从最靠近屏幕左侧开始开始。
(0261) point(x1,y1,color);
0F28 82E8 STD Y+0,R14
0F29 852D LDD R18,Y+13
0F2A 850B LDD R16,Y+11
0F2B 2711 CLR R17
0F2C DDD4 RCALL _point
(0262) x=x1;
0F2D 84AB LDD R10,Y+11
(0263) y=y1;
0F2E 84CD LDD R12,Y+13
(0264) dx=x2-x1;
0F2F 2C2A MOV R2,R10
0F30 2433 CLR R3
0F31 856F LDD R22,Y+15
0F32 2777 CLR R23
0F33 1962 SUB R22,R2
0F34 0973 SBC R23,R3
(0265) if(dx==0)//直线与y轴平行
0F35 F529 BNE 0x0F5B
(0266) {
(0267) if(y1<y2)
0F36 840D LDD R0,Y+13
0F37 8909 LDD R16,Y+17
0F38 1600 CP R0,R16
0F39 F4E8 BCC 0x0F57
(0268) {
(0269) for(;y<=y2;y++)
0F3A C00C RJMP 0x0F47
(0270) {
(0271) if(y%3!=0)//每画两点空出一点
0F3B E013 LDI R17,3
0F3C 2D0C MOV R16,R12
0F3D 940E1C90 CALL mod8u
0F3F 2300 TST R16
0F40 F029 BEQ 0x0F46
(0272) point(x,y,color);
0F41 82E8 STD Y+0,R14
0F42 2D2C MOV R18,R12
0F43 2D0A MOV R16,R10
0F44 2711 CLR R17
0F45 DDBB RCALL _point
0F46 94C3 INC R12
0F47 8809 LDD R0,Y+17
0F48 140C CP R0,R12
0F49 F788 BCC 0x0F3B
(0273) }
(0274) }
0F4A C0A3 RJMP 0x0FEE
(0275) else
(0276) {
(0277) for(;y>=y2;y--)
(0278) {
(0279) if(y%3!=0)
0F4B E013 LDI R17,3
0F4C 2D0C MOV R16,R12
0F4D 940E1C90 CALL mod8u
0F4F 2300 TST R16
0F50 F029 BEQ 0x0F56
(0280) point(x,y,color);
0F51 82E8 STD Y+0,R14
0F52 2D2C MOV R18,R12
0F53 2D0A MOV R16,R10
0F54 2711 CLR R17
0F55 DDAB RCALL _point
0F56 94CA DEC R12
0F57 8809 LDD R0,Y+17
0F58 14C0 CP R12,R0
0F59 F788 BCC 0x0F4B
(0281) }
(0282) }
(0283) }
0F5A C093 RJMP 0x0FEE
(0284) else if(y1==y2)//直线与X轴平行
0F5B 840D LDD R0,Y+13
0F5C 8909 LDD R16,Y+17
0F5D 1600 CP R0,R16
0F5E F521 BNE 0x0F83
(0285) {
(0286) if(x>x1)
0F5F 840B LDD R0,Y+11
0F60 140A CP R0,R10
0F61 F4E8 BCC 0x0F7F
(0287) {
(0288) for(;x<=x2;x++)
0F62 C00C RJMP 0x0F6F
(0289) {
(0290) if(x%3!=0)//每画两点空出一点
0F63 E013 LDI R17,3
0F64 2D0A MOV R16,R10
0F65 940E1C90 CALL mod8u
0F67 2300 TST R16
0F68 F029 BEQ 0x0F6E
(0291) point(x,y,color);
0F69 82E8 STD Y+0,R14
0F6A 2D2C MOV R18,R12
0F6B 2D0A MOV R16,R10
0F6C 2711 CLR R17
0F6D DD93 RCALL _point
0F6E 94A3 INC R10
0F6F 840F LDD R0,Y+15
0F70 140A CP R0,R10
0F71 F788 BCC 0x0F63
(0292) }
(0293) }
0F72 C07B RJMP 0x0FEE
(0294) else
(0295) {
(0296) for(;x>=x2;x--)
(0297) {
(0298) if(x%3!=0)
0F73 E013 LDI R17,3
0F74 2D0A MOV R16,R10
0F75 940E1C90 CALL mod8u
0F77 2300 TST R16
0F78 F029 BEQ 0x0F7E
(0299) point(x,y,color);
0F79 82E8 STD Y+0,R14
0F7A 2D2C MOV R18,R12
0F7B 2D0A MOV R16,R10
0F7C 2711 CLR R17
0F7D DD83 RCALL _point
0F7E 94AA DEC R10
0F7F 840F LDD R0,Y+15
0F80 14A0 CP R10,R0
0F81 F788 BCC 0x0F73
(0300) }
(0301) }
(0302) }
0F82 C06B RJMP 0x0FEE
(0303) else if(y1<y2)//直线与x轴夹角小于90°
0F83 840D LDD R0,Y+13
0F84 8909 LDD R16,Y+17
0F85 1600 CP R0,R16
0F86 F590 BCC 0x0FB9
(0304) {
(0305) dy=y2-y1;
0F87 2C20 MOV R2,R0
0F88 2433 CLR R3
0F89 2F40 MOV R20,R16
0F8A 2755 CLR R21
0F8B 1942 SUB R20,R2
0F8C 0953 SBC R21,R3
0F8D C024 RJMP 0x0FB2
(0306)
(0307) while(x<=x2&&y<=y2)
(0308) {
(0309) if(x%3!=0)
0F8E E013 LDI R17,3
0F8F 2D0A MOV R16,R10
0F90 940E1C90 CALL mod8u
0F92 2300 TST R16
0F93 F029 BEQ 0x0F99
(0310) point(x,y,color);
0F94 82E8 STD Y+0,R14
0F95 2D2C MOV R18,R12
0F96 2D0A MOV R16,R10
0F97 2711 CLR R17
0F98 DD68 RCALL _point
(0311) if(dx*(y-y1)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
0F99 842B LDD R2,Y+11
0F9A 2433 CLR R3
0F9B 2D2A MOV R18,R10
0F9C 2733 CLR R19
0F9D 1922 SUB R18,R2
0F9E 0933 SBC R19,R3
0F9F 018A MOVW R16,R20
0FA0 940E1CA8 CALL empy16s
0FA2 0118 MOVW R2,R16
0FA3 844D LDD R4,Y+13
0FA4 2455 CLR R5
0FA5 2D2C MOV R18,R12
0FA6 2733 CLR R19
0FA7 1924 SUB R18,R4
0FA8 0935 SBC R19,R5
0FA9 018B MOVW R16,R22
0FAA 940E1CA8 CALL empy16s
0FAC 1502 CP R16,R2
0FAD 0513 CPC R17,R3
0FAE F410 BCC 0x0FB1
(0312) y++;
0FAF 94C3 INC R12
0FB0 C001 RJMP 0x0FB2
(0313) else x++;
0FB1 94A3 INC R10
0FB2 840F LDD R0,Y+15
0FB3 140A CP R0,R10
0FB4 F018 BCS 0x0FB8
0FB5 8809 LDD R0,Y+17
0FB6 140C CP R0,R12
0FB7 F6B0 BCC 0x0F8E
(0314)
(0315) }
(0316) }
0FB8 C035 RJMP 0x0FEE
(0317) else if(y1>y2)//直线于y轴夹角大于90°
0FB9 8809 LDD R0,Y+17
0FBA 850D LDD R16,Y+13
0FBB 1600 CP R0,R16
0FBC F588 BCC 0x0FEE
(0318) {
(0319) dy=y1-y2;
0FBD 2C20 MOV R2,R0
0FBE 2433 CLR R3
0FBF 2F40 MOV R20,R16
0FC0 2755 CLR R21
0FC1 1942 SUB R20,R2
0FC2 0953 SBC R21,R3
0FC3 C024 RJMP 0x0FE8
(0320) while(x<=x2&&y>=y2)
(0321) {
(0322) if(x%3!=0)
0FC4 E013 LDI R17,3
0FC5 2D0A MOV R16,R10
0FC6 940E1C90 CALL mod8u
0FC8 2300 TST R16
0FC9 F029 BEQ 0x0FCF
(0323) point(x,y,color);
0FCA 82E8 STD Y+0,R14
0FCB 2D2C MOV R18,R12
0FCC 2D0A MOV R16,R10
0FCD 2711 CLR R17
0FCE DD32 RCALL _point
(0324) if(dx*(y1-y)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
0FCF 842B LDD R2,Y+11
0FD0 2433 CLR R3
0FD1 2D2A MOV R18,R10
0FD2 2733 CLR R19
0FD3 1922 SUB R18,R2
0FD4 0933 SBC R19,R3
0FD5 018A MOVW R16,R20
0FD6 940E1CA8 CALL empy16s
0FD8 0118 MOVW R2,R16
0FD9 2C4C MOV R4,R12
0FDA 2455 CLR R5
0FDB 852D LDD R18,Y+13
0FDC 2733 CLR R19
0FDD 1924 SUB R18,R4
0FDE 0935 SBC R19,R5
0FDF 018B MOVW R16,R22
0FE0 940E1CA8 CALL empy16s
0FE2 1502 CP R16,R2
0FE3 0513 CPC R17,R3
0FE4 F410 BCC 0x0FE7
(0325) y--;
0FE5 94CA DEC R12
0FE6 C001 RJMP 0x0FE8
(0326) else x++;
0FE7 94A3 INC R10
0FE8 840F LDD R0,Y+15
0FE9 140A CP R0,R10
0FEA F018 BCS 0x0FEE
0FEB 8809 LDD R0,Y+17
0FEC 14C0 CP R12,R0
0FED F6B0 BCC 0x0FC4
(0327)
(0328) }
(0329) }
0FEE 9621 ADIW R28,1
0FEF 940E1CC1 CALL pop_gset5
0FF1 9624 ADIW R28,4
0FF2 9508 RET
_linex:
dy --> R20
dx --> R22
x --> R10
y --> R12
color --> R14
y2 --> Y+17
x2 --> Y+15
y1 --> Y+13
x1 --> Y+11
0FF3 940E1C51 CALL push_arg4
0FF5 940E1CE7 CALL push_gset5
0FF7 9721 SBIW R28,1
0FF8 88EB LDD R14,Y+19
(0330) }
(0331) /**************两点间画带颜色直线,画船专用,避免维度线被覆盖*******************/
(0332) void linex(char x1,char y1,char x2,char y2,char color)
(0333) {
(0334) char x,y;
(0335) unsigned int dx,dy;
(0336) if(x1>x2)
0FF9 840F LDD R0,Y+15
0FFA 850B LDD R16,Y+11
0FFB 1600 CP R0,R16
0FFC F440 BCC 0x1005
(0337) {
(0338) x=x2;
0FFD 2CA0 MOV R10,R0
(0339) y=y2;
0FFE 88C9 LDD R12,Y+17
(0340) x2=x1;
0FFF 2E00 MOV R0,R16
1000 860F STD Y+15,R0
(0341) y2=y1;
1001 840D LDD R0,Y+13
1002 8A09 STD Y+17,R0
(0342) x1=x;
1003 86AB STD Y+11,R10
(0343) y1=y;
1004 86CD STD Y+13,R12
(0344) }//保证(x,y)从最靠近屏幕左侧开始开始。
(0345) if(y1>120)//画的该点不在维度线上,则画该点
1005 E788 LDI R24,0x78
1006 840D LDD R0,Y+13
1007 1580 CP R24,R0
1008 F498 BCC 0x101C
(0346) {
(0347) if((y1-120)%40!=0&&x1%40!=0)
1009 E218 LDI R17,0x28
100A 2D00 MOV R16,R0
100B 5708 SUBI R16,0x78
100C 940E1C90 CALL mod8u
100E 2300 TST R16
100F F121 BEQ 0x1034
1010 E218 LDI R17,0x28
1011 850B LDD R16,Y+11
1012 940E1C90 CALL mod8u
1014 2300 TST R16
1015 F0F1 BEQ 0x1034
(0348) point(x1,y1,color);
1016 82E8 STD Y+0,R14
1017 852D LDD R18,Y+13
1018 850B LDD R16,Y+11
1019 2711 CLR R17
101A DCE6 RCALL _point
(0349) }
101B C018 RJMP 0x1034
(0350) else
(0351) {
(0352) if((120-y1)%40!=0&&x1%40!=0)
101C 842D LDD R2,Y+13
101D 2433 CLR R3
101E E708 LDI R16,0x78
101F E010 LDI R17,0
1020 1902 SUB R16,R2
1021 0913 SBC R17,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -