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