⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lis

📁 AVR mage8单片机的bootload程序、完整版本、本人做项目一下在用、此程序为16m晶振版本、非常好用
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .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 + -