📄 main.lis
字号:
00CE ; TempInt -> R20,R21
00CE ; i -> R22,R23
.even
00CE _WriteFlash::
00CE 00D0 rcall push_gset2
00D0 ;
00D0 ; }
00D0 ;
00D0 ; /*****************************************************************************/
00D0 ;
00D0 ; void WriteFlash(void)
00D0 ; {
00D0 ; unsigned int i;
00D0 ; unsigned int TempInt;
00D0 ;
00D0 ; for(i = 0 ; i < PageByte ; i += 2)
00D0 6627 clr R22
00D2 7727 clr R23
00D4 16C0 rjmp L35
00D6 L32:
00D6 80E0 ldi R24,<_PageBuffer
00D8 90E0 ldi R25,>_PageBuffer
00DA FB01 movw R30,R22
00DC 3196 adiw R30,1
00DE E80F add R30,R24
00E0 F91F adc R31,R25
00E2 2080 ldd R2,z+0
00E4 3324 clr R3
00E6 322C mov R3,R2
00E8 2224 clr R2
00EA FB01 movw R30,R22
00EC E80F add R30,R24
00EE F91F adc R31,R25
00F0 4081 ldd R20,z+0
00F2 5527 clr R21
00F4 420D add R20,R2
00F6 531D adc R21,R3
00F8 9B01 movw R18,R22
00FA 8A01 movw R16,R20
00FC 00D0 rcall _fill_temp_buffer
00FE L33:
00FE 6E5F subi R22,254 ; offset = 2
0100 7F4F sbci R23,255
0102 L35:
0102 6034 cpi R22,64
0104 E0E0 ldi R30,0
0106 7E07 cpc R23,R30
0108 30F3 brlo L32
010A ; {
010A ; TempInt = PageBuffer[i] + (PageBuffer[i+1]<<8);
010A ; fill_temp_buffer(TempInt,i); //call asm routine.
010A ; }
010A ; write_page(PageAddress,0x03); //Perform page ERASE
010A 23E0 ldi R18,3
010C 00910200 lds R16,_PageAddress
0110 10910300 lds R17,_PageAddress+1
0114 00D0 rcall _write_page
0116 ; write_page(PageAddress,0x05); //Perform page write
0116 25E0 ldi R18,5
0118 00910200 lds R16,_PageAddress
011C 10910300 lds R17,_PageAddress+1
0120 00D0 rcall _write_page
0122 ; enableRWW();
0122 00D0 rcall _enableRWW
0124 ; WDR();
0124 A895 wdr
0126 L31:
0126 00D0 rcall pop_gset2
0128 .dbline 0 ; func end
0128 0895 ret
012A ; TempInt2 -> R22,R23
012A ; TempInt -> R10,R11
012A ; i -> R20,R21
.even
012A _CheckFlash::
012A 00D0 rcall push_gset3
012C ; }
012C ;
012C ; /*****************************************************************************/
012C ;
012C ; char CheckFlash(void)
012C ; {
012C ; unsigned int i;
012C ; unsigned int TempInt;
012C ; unsigned int TempInt2;
012C ; WDR();
012C A895 wdr
012E ; for (i = 0 ; i < PageByte ; i += 2)
012E 4427 clr R20
0130 5527 clr R21
0132 21C0 rjmp L40
0134 L37:
0134 ; {
0134 ; TempInt = read_program_memory(PageAddress + i , 0x00);
0134 2227 clr R18
0136 00910200 lds R16,_PageAddress
013A 10910300 lds R17,_PageAddress+1
013E 040F add R16,R20
0140 151F adc R17,R21
0142 00D0 rcall _read_program_memory
0144 5801 movw R10,R16
0146 ; TempInt2 = PageBuffer[i] +(PageBuffer[i+1] << 8);
0146 80E0 ldi R24,<_PageBuffer
0148 90E0 ldi R25,>_PageBuffer
014A FA01 movw R30,R20
014C 3196 adiw R30,1
014E E80F add R30,R24
0150 F91F adc R31,R25
0152 2080 ldd R2,z+0
0154 3324 clr R3
0156 322C mov R3,R2
0158 2224 clr R2
015A FA01 movw R30,R20
015C E80F add R30,R24
015E F91F adc R31,R25
0160 6081 ldd R22,z+0
0162 7727 clr R23
0164 620D add R22,R2
0166 731D adc R23,R3
0168 ; if (TempInt != TempInt2) return 0;
0168 0617 cp R16,R22
016A 1707 cpc R17,R23
016C 11F0 breq L41
016E 0027 clr R16
0170 07C0 rjmp L36
0172 L41:
0172 L38:
0172 4E5F subi R20,254 ; offset = 2
0174 5F4F sbci R21,255
0176 L40:
0176 4034 cpi R20,64
0178 E0E0 ldi R30,0
017A 5E07 cpc R21,R30
017C D8F2 brlo L37
017E ; }
017E ; return 1;
017E 01E0 ldi R16,1
0180 L36:
0180 00D0 rcall pop_gset3
0182 .dbline 0 ; func end
0182 0895 ret
0184 ; CheckSum -> R22
0184 ; Data -> R10
0184 ; ByteAddress -> R12,R13
0184 ; ByteAddressLow -> R22
0184 ; ByteAddressHigh -> R10
0184 ; LocalCheckSum -> R20
.even
0184 _EEpromLoad::
0184 00D0 rcall push_gset4
0186 ; }
0186 ;
0186 ; /*****************************************************************************/
0186 ; /* EEprom Programing Code */
0186 ; /*****************************************************************************/
0186 ;
0186 ; #ifdef EEPROM
0186 ; void EEpromLoad()
0186 ; {
0186 ; unsigned char ByteAddressHigh;
0186 ; unsigned char ByteAddressLow;
0186 ; unsigned int ByteAddress;
0186 ; unsigned char Data;
0186 ; unsigned char LocalCheckSum;
0186 ; unsigned char CheckSum;
0186 ;
0186 ; TxChar(')');
0186 09E2 ldi R16,41
0188 51D0 rcall _TxChar
018A ; TxChar('!');
018A 01E2 ldi R16,33
018C 4FD0 rcall _TxChar
018E 33C0 rjmp L45
0190 L44:
0190 ; while (1)
0190 ; {
0190 ; WDR();
0190 A895 wdr
0192 ; LocalCheckSum = 0;
0192 4427 clr R20
0194 L47:
0194 L48:
0194 ;
0194 ; while(!IsChar());
0194 43D0 rcall _IsChar
0196 0023 tst R16
0198 E9F3 breq L47
019A ; ByteAddressHigh = RxChar();
019A 46D0 rcall _RxChar
019C A02E mov R10,R16
019E ; LocalCheckSum += ByteAddressHigh;
019E 400F add R20,R16
01A0 L50:
01A0 L51:
01A0 ;
01A0 ; while(!IsChar());
01A0 3DD0 rcall _IsChar
01A2 0023 tst R16
01A4 E9F3 breq L50
01A6 ; ByteAddressLow = RxChar();
01A6 40D0 rcall _RxChar
01A8 602F mov R22,R16
01AA ; LocalCheckSum += ByteAddressLow;
01AA 400F add R20,R16
01AC ;
01AC ; ByteAddress = (ByteAddressHigh<<8)+ByteAddressLow;
01AC DA2C mov R13,R10
01AE C62E mov R12,R22
01B0 ;
01B0 ; if (ByteAddress == 0xffff) return;
01B0 C601 movw R24,R12
01B2 8F3F cpi R24,255
01B4 EFEF ldi R30,255
01B6 9E07 cpc R25,R30
01B8 09F4 brne L56
01BA 1EC0 rjmp L43
01BC L55:
01BC L56:
01BC ;
01BC ; while(!IsChar());
01BC 2FD0 rcall _IsChar
01BE 0023 tst R16
01C0 E9F3 breq L55
01C2 ; Data = RxChar();
01C2 32D0 rcall _RxChar
01C4 A02E mov R10,R16
01C6 ; LocalCheckSum += Data;
01C6 400F add R20,R16
01C8 ;
01C8 ; WDR();
01C8 A895 wdr
01CA L58:
01CA L59:
01CA ;
01CA ; while(!IsChar());
01CA 28D0 rcall _IsChar
01CC 0023 tst R16
01CE E9F3 breq L58
01D0 ; CheckSum = RxChar();
01D0 2BD0 rcall _RxChar
01D2 602F mov R22,R16
01D4 ;
01D4 ; if (CheckSum == LocalCheckSum)
01D4 0417 cp R16,R20
01D6 69F4 brne L61
01D8 ; {
01D8 ; EEPROMwrite(ByteAddress, Data);
01D8 2A2D mov R18,R10
01DA 8601 movw R16,R12
01DC 0FD0 rcall _EEPROMwrite
01DE ; if (EEPROMread(ByteAddress) == Data) TxChar('!');
01DE 8601 movw R16,R12
01E0 16D0 rcall _EEPROMread
01E2 0A15 cp R16,R10
01E4 19F4 brne L63
01E6 01E2 ldi R16,33
01E8 21D0 rcall _TxChar
01EA 05C0 rjmp L62
01EC L63:
01EC ; else TxChar('@');
01EC 00E4 ldi R16,64
01EE 1ED0 rcall _TxChar
01F0 ; }
01F0 02C0 rjmp L62
01F2 L61:
01F2 ; else
01F2 ; {
01F2 ; TxChar('@');
01F2 00E4 ldi R16,64
01F4 1BD0 rcall _TxChar
01F6 ; }
01F6 L62:
01F6 L45:
01F6 CCCF rjmp L44
01F8 X2:
01F8 L43:
01F8 00D0 rcall pop_gset4
01FA .dbline 0 ; func end
01FA 0895 ret
01FC ; byte -> R18
01FC ; location -> R16,R17
.even
01FC _EEPROMwrite::
01FC ; }
01FC ; }
01FC ; #endif
01FC ;
01FC ;
01FC ;
01FC ; #ifdef EEPROM
01FC ; void EEPROMwrite( int location, unsigned char byte)
01FC ; {
01FC L66:
01FC L67:
01FC ; while (EECR & 0x02); // Wait until any earlier write is done
01FC E199 sbic 0x1c,1
01FE FECF rjmp L66
0200 ; EEAR = location;
0200 1FBB out 0x1f,R17
0202 0EBB out 0x1e,R16
0204 ; EEDR = byte;
0204 2DBB out 0x1d,R18
0206 ; EECR |= 0x04; // Set MASTER WRITE enable
0206 E29A sbi 0x1c,2
0208 ; EECR |= 0x02; // Set WRITE strobe
0208 E19A sbi 0x1c,1
020A ; WDR();
020A A895 wdr
020C L65:
020C .dbline 0 ; func end
020C 0895 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -