📄 graphic.lis
字号:
00CC 422F mov R20,R18
00CE 4695 lsr R20
00D0 4695 lsr R20
00D2 4695 lsr R20
00D4 .dbline 84
00D4 ; bitnum = y & 0x07;
00D4 622F mov R22,R18
00D6 6770 andi R22,7
00D8 .dbline 85
00D8 ; bitmask = l_mask_array[bitnum]; // bitmask = ( 1 << (y & 0x07) );
00D8 80E0 ldi R24,<_l_mask_array
00DA 90E0 ldi R25,>_l_mask_array
00DC E62F mov R30,R22
00DE FF27 clr R31
00E0 E80F add R30,R24
00E2 F91F adc R31,R25
00E4 6081 ldd R22,z+0
00E6 .dbline 86
00E6 ; pBuffer = &(l_display_array[yByte][x]);
00E6 80E8 ldi R24,128
00E8 849F mul R24,R20
00EA 1001 movw R2,R0
00EC 80E0 ldi R24,<_l_display_array
00EE 90E0 ldi R25,>_l_display_array
00F0 280E add R2,R24
00F2 391E adc R3,R25
00F4 402F mov R20,R16
00F6 5527 clr R21
00F8 420D add R20,R2
00FA 531D adc R21,R3
00FC .dbline 87
00FC ; switch (mode)
00FC AE80 ldd R10,y+6
00FE BB24 clr R11
0100 AA20 tst R10
0102 11F4 brne X0
0104 BB20 tst R11
0106 79F0 breq L31
0108 X0:
0108 C501 movw R24,R10
010A 8130 cpi R24,1
010C E0E0 ldi R30,0
010E 9E07 cpc R25,R30
0110 29F0 breq L30
0112 8230 cpi R24,2
0114 E0E0 ldi R30,0
0116 9E07 cpc R25,R30
0118 69F0 breq L32
011A 10C0 xjmp L28
011C X1:
011C .dbline 88
011C ; { case LCD_MODE_SET:
011C L30:
011C .dbline 89
011C ; *pBuffer |= bitmask;
011C FA01 movw R30,R20
011E 2080 ldd R2,z+0
0120 262A or R2,R22
0122 2082 std z+0,R2
0124 .dbline 90
0124 ; break;
0124 0BC0 xjmp L28
0126 L31:
0126 .dbline 92
0126 ; case LCD_MODE_CLEAR:
0126 ; *pBuffer &= ~bitmask;
0126 262E mov R2,R22
0128 2094 com R2
012A FA01 movw R30,R20
012C 3080 ldd R3,z+0
012E 3220 and R3,R2
0130 3082 std z+0,R3
0132 .dbline 93
0132 ; break;
0132 04C0 xjmp L28
0134 L32:
0134 .dbline 95
0134 FA01 movw R30,R20
0136 2080 ldd R2,z+0
0138 2626 eor R2,R22
013A 2082 std z+0,R2
013C .dbline 96
013C .dbline 97
013C L28:
013C .dbline -2
013C L23:
013C 0E940000 xcall pop_gset3
0140 .dbline 0 ; func end
0140 0895 ret
0142 .dbsym r pBuffer 20 pc
0142 .dbsym r bitmask 22 c
0142 .dbsym r yByte 20 c
0142 .dbsym r bitnum 22 c
0142 .dbsym l mode 6 c
0142 .dbsym r y 18 c
0142 .dbsym r x 16 c
0142 .dbend
0142 .dbfunc e lcd_line _lcd_line fV
0142 ; yTmp -> y+6
0142 ; xTmp -> y+5
0142 ; yAlt -> R20
0142 ; m -> R22,R23
0142 ; y -> R10
0142 ; length -> R12
0142 ; i -> R14
0142 ; mode -> y+23
0142 ; y2 -> y+21
0142 ; x2 -> y+19
0142 ; y1 -> y+17
0142 ; x1 -> R8
.even
0142 _lcd_line::
0142 3A93 st -y,r19
0144 2A93 st -y,r18
0146 0E940000 xcall push_gset5
014A 802E mov R8,R16
014C 2797 sbiw R28,7
014E .dbline -1
014E .dbline 105
014E ; case LCD_MODE_XOR:
014E ; *pBuffer ^= bitmask;
014E ; break;
014E ; default: break;
014E ; }
014E ; }
014E ;
014E ;
014E ; /* line- and circle-function from a KS0108-library by F. Thiele */
014E ;
014E ; void lcd_line( uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t mode )
014E ; { uint8_t length, xTmp, yTmp, i, y, yAlt;
014E .dbline 108
014E ; int16_t m;
014E ;
014E ; if(x1 == x2)
014E 0B88 ldd R0,y+19
0150 8014 cp R8,R0
0152 F9F4 brne L34
0154 .dbline 109
0154 ; { // vertical line
0154 .dbline 111
0154 ; // x1|y1 must be the upper point
0154 ; if(y1 > y2)
0154 0D88 ldd R0,y+21
0156 0989 ldd R16,y+17
0158 0016 cp R0,R16
015A 50F4 brsh L36
015C .dbline 112
015C ; { xTmp = x1;
015C .dbline 112
015C 8D82 std y+5,R8
015E .dbline 113
015E ; yTmp = y1;
015E 0988 ldd R0,y+17
0160 0E82 std y+6,R0
0162 .dbline 114
0162 ; x1 = x2;
0162 8B88 ldd R8,y+19
0164 .dbline 115
0164 ; y1 = y2;
0164 0D88 ldd R0,y+21
0166 098A std y+17,R0
0168 .dbline 116
0168 ; x2 = xTmp;
0168 0D80 ldd R0,y+5
016A 0B8A std y+19,R0
016C .dbline 117
016C ; y2 = yTmp;
016C 0E80 ldd R0,y+6
016E 0D8A std y+21,R0
0170 .dbline 118
0170 ; }
0170 L36:
0170 .dbline 119
0170 ; length = y2-y1;
0170 CD88 ldd R12,y+21
0172 0988 ldd R0,y+17
0174 C018 sub R12,R0
0176 .dbline 120
0176 ; for(i=0; i<=length; i++)
0176 EE24 clr R14
0178 09C0 xjmp L41
017A L38:
017A .dbline 121
017A 0F88 ldd R0,y+23
017C 0882 std y+0,R0
017E 2989 ldd R18,y+17
0180 2E0D add R18,R14
0182 082D mov R16,R8
0184 0F93 push R16
0186 99DF xcall _lcd_dot
0188 8F90 pop R8
018A L39:
018A .dbline 120
018A E394 inc R14
018C L41:
018C .dbline 120
018C CE14 cp R12,R14
018E A8F7 brsh L38
0190 .dbline 122
0190 ; lcd_dot(x1, y1+i, mode);
0190 ; }
0190 18C1 xjmp L35
0192 L34:
0192 .dbline 123
0192 ; else if(y1 == y2)
0192 0988 ldd R0,y+17
0194 0D89 ldd R16,y+21
0196 0016 cp R0,R16
0198 E9F4 brne L42
019A .dbline 124
019A ; { // horizontal line
019A .dbline 126
019A ; // x1|y1 must be the left point
019A ; if(x1 > x2)
019A 0B88 ldd R0,y+19
019C 0814 cp R0,R8
019E 50F4 brsh L44
01A0 .dbline 127
01A0 ; { xTmp = x1;
01A0 .dbline 127
01A0 8D82 std y+5,R8
01A2 .dbline 128
01A2 ; yTmp = y1;
01A2 0988 ldd R0,y+17
01A4 0E82 std y+6,R0
01A6 .dbline 129
01A6 ; x1 = x2;
01A6 8B88 ldd R8,y+19
01A8 .dbline 130
01A8 ; y1 = y2;
01A8 0D88 ldd R0,y+21
01AA 098A std y+17,R0
01AC .dbline 131
01AC ; x2 = xTmp;
01AC 0D80 ldd R0,y+5
01AE 0B8A std y+19,R0
01B0 .dbline 132
01B0 ; y2 = yTmp;
01B0 0E80 ldd R0,y+6
01B2 0D8A std y+21,R0
01B4 .dbline 133
01B4 ; }
01B4 L44:
01B4 .dbline 135
01B4 ;
01B4 ; length = x2-x1;
01B4 CB88 ldd R12,y+19
01B6 C818 sub R12,R8
01B8 .dbline 136
01B8 ; for(i=0; i<=length; i++)
01B8 EE24 clr R14
01BA 09C0 xjmp L49
01BC L46:
01BC .dbline 137
01BC 0F88 ldd R0,y+23
01BE 0882 std y+0,R0
01C0 2989 ldd R18,y+17
01C2 082D mov R16,R8
01C4 0E0D add R16,R14
01C6 8F92 push R8
01C8 78DF xcall _lcd_dot
01CA 8F90 pop R8
01CC L47:
01CC .dbline 136
01CC E394 inc R14
01CE L49:
01CE .dbline 136
01CE CE14 cp R12,R14
01D0 A8F7 brsh L46
01D2 .dbline 139
01D2 ; lcd_dot(x1+i, y1, mode);
01D2 ;
01D2 ; }
01D2 F7C0 xjmp L43
01D4 L42:
01D4 .dbline 141
01D4 ; else
01D4 ; { // x1 must be smaller than x2
01D4 .dbline 142
01D4 ; if(x1 > x2)
01D4 0B88 ldd R0,y+19
01D6 0814 cp R0,R8
01D8 50F4 brsh L50
01DA .dbline 143
01DA ; { xTmp = x1;
01DA .dbline 143
01DA 8D82 std y+5,R8
01DC .dbline 144
01DC ; yTmp = y1;
01DC 0988 ldd R0,y+17
01DE 0E82 std y+6,R0
01E0 .dbline 145
01E0 ; x1 = x2;
01E0 8B88 ldd R8,y+19
01E2 .dbline 146
01E2 ; y1 = y2;
01E2 0D88 ldd R0,y+21
01E4 098A std y+17,R0
01E6 .dbline 147
01E6 ; x2 = xTmp;
01E6 0D80 ldd R0,y+5
01E8 0B8A std y+19,R0
01EA .dbline 148
01EA ; y2 = yTmp;
01EA 0E80 ldd R0,y+6
01EC 0D8A std y+21,R0
01EE .dbline 149
01EE ; }
01EE L50:
01EE .dbline 151
01EE ;
01EE ; if((y2-y1) >= (x2-x1) || (y1-y2) >= (x2-x1))
01EE 282C mov R2,R8
01F0 3324 clr R3
01F2 4B88 ldd R4,y+19
01F4 5524 clr R5
01F6 4218 sub R4,R2
01F8 5308 sbc R5,R3
01FA 2988 ldd R2,y+17
01FC 3324 clr R3
01FE 6D88 ldd R6,y+21
0200 7724 clr R7
0202 6218 sub R6,R2
0204 7308 sbc R7,R3
0206 6414 cp R6,R4
0208 7504 cpc R7,R5
020A 54F4 brge L54
020C 2D88 ldd R2,y+21
020E 3324 clr R3
0210 6988 ldd R6,y+17
0212 7724 clr R7
0214 6218 sub R6,R2
0216 7308 sbc R7,R3
0218 6414 cp R6,R4
021A 7504 cpc R7,R5
021C 0CF4 brge X2
021E 63C0 xjmp L52
0220 X2:
0220 L54:
0220 .dbline 152
0220 ; { // angle larger or equal 45?
0220 .dbline 153
0220 ; length = x2-x1; // not really the length :)
0220 CB88 ldd R12,y+19
0222 C818 sub R12,R8
0224 .dbline 154
0224 ; m = ((y2-y1)*200)/length;
0224 2D88 ldd R2,y+21
0226 0988 ldd R0,y+17
0228 2018 sub R2,R0
022A 88EC ldi R24,200
022C 829D mul R24,R2
022E 8001 movw R16,R0
0230 2C2D mov R18,R12
0232 3327 clr R19
0234 0E940000 xcall div16s
0238 B801 movw R22,R16
023A .dbline 155
023A ; yAlt = y1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -