📄 bootloader.lst
字号:
(0131) unsigned int i;
(0132) unsigned char LocalCheckSum = 0;
FEEC 24AA CLR R10
(0133) unsigned char CheckSum = 0;
FEED 2766 CLR R22
(0134)
(0135) for (i=0;i<PageByte;i++)
FEEE 2744 CLR R20
FEEF 2755 CLR R21
FEF0 C011 RJMP 0xFF02
(0136) {
(0137) while(!IsChar());
FEF1 D093 RCALL _IsChar
FEF2 2300 TST R16
FEF3 F3E9 BEQ 0xFEF1
(0138) PageBuffer[i]=RxChar();
FEF4 D096 RCALL _RxChar
FEF5 E085 LDI R24,5
FEF6 E091 LDI R25,1
FEF7 01FA MOVW R30,R20
FEF8 0FE8 ADD R30,R24
FEF9 1FF9 ADC R31,R25
FEFA 8300 STD Z+0,R16
(0139) LocalCheckSum += PageBuffer[i];
FEFB 01FA MOVW R30,R20
FEFC 0FE8 ADD R30,R24
FEFD 1FF9 ADC R31,R25
FEFE 8020 LDD R2,Z+0
FEFF 0CA2 ADD R10,R2
FF00 5F4F SUBI R20,0xFF
FF01 4F5F SBCI R21,0xFF
FF02 3040 CPI R20,0
FF03 E0E1 LDI R30,1
FF04 075E CPC R21,R30
FF05 F358 BCS 0xFEF1
(0140) }
(0141)
(0142) while(!IsChar());
FF06 D07E RCALL _IsChar
FF07 2300 TST R16
FF08 F3E9 BEQ 0xFF06
(0143) CheckSum = RxChar();
FF09 D081 RCALL _RxChar
FF0A 2F60 MOV R22,R16
(0144) if (LocalCheckSum == CheckSum) return 1;
FF0B 16A0 CP R10,R16
FF0C F411 BNE 0xFF0F
FF0D E001 LDI R16,1
FF0E C001 RJMP 0xFF10
(0145) else return 0;
FF0F 2700 CLR R16
FF10 940EFFB9 CALL pop_gset3
FF12 9508 RET
_WriteFlash:
TempInt --> R22
i --> R20
FF13 940EFFD2 CALL push_gset2
(0146) }
(0147)
(0148) /*********************************************************/
(0149)
(0150) void WriteFlash(void)
(0151) {
(0152) unsigned int i;
(0153) unsigned int TempInt;
(0154)
(0155) for (i=0;i<PageByte;i+=2)
FF15 2744 CLR R20
FF16 2755 CLR R21
FF17 C017 RJMP 0xFF2F
(0156) {
(0157) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
FF18 E085 LDI R24,5
FF19 E091 LDI R25,1
FF1A 01FA MOVW R30,R20
FF1B 9631 ADIW R30,1
FF1C 0FE8 ADD R30,R24
FF1D 1FF9 ADC R31,R25
FF1E 8020 LDD R2,Z+0
FF1F 2433 CLR R3
FF20 2C32 MOV R3,R2
FF21 2422 CLR R2
FF22 01FA MOVW R30,R20
FF23 0FE8 ADD R30,R24
FF24 1FF9 ADC R31,R25
FF25 8160 LDD R22,Z+0
FF26 2777 CLR R23
FF27 0D62 ADD R22,R2
FF28 1D73 ADC R23,R3
(0158) fill_temp_buffer(TempInt,i); //call asm routine.
FF29 019A MOVW R18,R20
FF2A 018B MOVW R16,R22
FF2B 940EFE74 CALL _fill_temp_buffer
FF2D 5F4E SUBI R20,0xFE
FF2E 4F5F SBCI R21,0xFF
FF2F 3040 CPI R20,0
FF30 E0E1 LDI R30,1
FF31 075E CPC R21,R30
FF32 F328 BCS 0xFF18
(0159) }
(0160) if (PageAddress16) RAMPZ = 1;
FF33 90200100 LDS R2,0x100
FF35 2022 TST R2
FF36 F011 BEQ 0xFF39
FF37 E081 LDI R24,1
FF38 BF8B OUT 0x3B,R24
(0161)
(0162) write_page(PageAddress,0x03); //Perform page ERASE
FF39 E023 LDI R18,3
FF3A 91000103 LDS R16,_PageAddress
FF3C 91100104 LDS R17,_PageAddress+1
FF3E 940EFE6D CALL _write_page
(0163) write_page(PageAddress,0x05); //Perform page write
FF40 E025 LDI R18,5
FF41 91000103 LDS R16,_PageAddress
FF43 91100104 LDS R17,_PageAddress+1
FF45 940EFE6D CALL _write_page
(0164)
(0165) enableRWW();
FF47 940EFE89 CALL _enableRWW
(0166) RAMPZ = 0;
FF49 2422 CLR R2
FF4A BE2B OUT 0x3B,R2
(0167) }
FF4B 940EFFB7 CALL pop_gset2
FF4D 9508 RET
_CheckFlash:
TempInt2 --> R22
TempInt --> R10
i --> R20
FF4E 940EFFD5 CALL push_gset3
(0168)
(0169) /*********************************************************/
(0170)
(0171) char CheckFlash(void)
(0172) {
(0173) unsigned int i;
(0174) unsigned int TempInt;
(0175) unsigned int TempInt2;
(0176)
(0177) for (i=0;i<PageByte;i+=2)
FF50 2744 CLR R20
FF51 2755 CLR R21
FF52 C02A RJMP 0xFF7D
(0178) {
(0179) if (PageAddress16) RAMPZ = 1;
FF53 90200100 LDS R2,0x100
FF55 2022 TST R2
FF56 F011 BEQ 0xFF59
FF57 E081 LDI R24,1
FF58 BF8B OUT 0x3B,R24
(0180) TempInt = read_program_memory(PageAddress + i,0x00);
FF59 2722 CLR R18
FF5A 91000103 LDS R16,_PageAddress
FF5C 91100104 LDS R17,_PageAddress+1
FF5E 0F04 ADD R16,R20
FF5F 1F15 ADC R17,R21
FF60 940EFE7E CALL _read_program_memory
FF62 0158 MOVW R10,R16
(0181) RAMPZ = 0;
FF63 2422 CLR R2
FF64 BE2B OUT 0x3B,R2
(0182) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
FF65 E085 LDI R24,5
FF66 E091 LDI R25,1
FF67 01FA MOVW R30,R20
FF68 9631 ADIW R30,1
FF69 0FE8 ADD R30,R24
FF6A 1FF9 ADC R31,R25
FF6B 8020 LDD R2,Z+0
FF6C 2433 CLR R3
FF6D 2C32 MOV R3,R2
FF6E 2422 CLR R2
FF6F 01FA MOVW R30,R20
FF70 0FE8 ADD R30,R24
FF71 1FF9 ADC R31,R25
FF72 8160 LDD R22,Z+0
FF73 2777 CLR R23
FF74 0D62 ADD R22,R2
FF75 1D73 ADC R23,R3
(0183) if (TempInt != TempInt2) return 0;
FF76 1706 CP R16,R22
FF77 0717 CPC R17,R23
FF78 F011 BEQ 0xFF7B
FF79 2700 CLR R16
FF7A C007 RJMP 0xFF82
FF7B 5F4E SUBI R20,0xFE
FF7C 4F5F SBCI R21,0xFF
FF7D 3040 CPI R20,0
FF7E E0E1 LDI R30,1
FF7F 075E CPC R21,R30
FF80 F290 BCS 0xFF53
(0184) }
(0185) return 1;
FF81 E001 LDI R16,1
FF82 940EFFB9 CALL pop_gset3
FF84 9508 RET
(0186) }
(0187)
(0188) /*********************************************************/
(0189)
(0190) unsigned char IsChar(void)
(0191) {
(0192) if (UCSR0A & 0x80) return 1;
_IsChar:
FF85 9B5F SBIS 0x0B,7
FF86 C002 RJMP 0xFF89
FF87 E001 LDI R16,1
FF88 C001 RJMP 0xFF8A
(0193) return 0;
FF89 2700 CLR R16
FF8A 9508 RET
(0194) }
(0195)
(0196) /*********************************************************/
(0197)
(0198) unsigned char RxChar(void)
(0199) {
(0200) return UDR0; // Read char
_RxChar:
FF8B B10C IN R16,0x0C
FF8C 9508 RET
(0201) }
(0202)
(0203) /*********************************************************/
(0204)
(0205) void TxChar(unsigned char ch)
(0206) {
(0207) while (!(UCSR0A & 0x20)); // Wait for empty transmit buffer
_TxChar:
ch --> R16
FF8D 9B5D SBIS 0x0B,5
FF8E CFFE RJMP _TxChar
(0208) UDR0 = ch; // Write char
FF8F B90C OUT 0x0C,R16
(0209) }
FF90 9508 RET
(0210)
(0211) /*********************************************************/
(0212)
(0213) void Wait()
(0214) {
(0215) int i;
(0216)
(0217) for (i=-32000;i<32000;i++); // Minimum for 16Mhz
_Wait:
i --> R16
FF91 E000 LDI R16,0
FF92 E813 LDI R17,0x83
FF93 5F0F SUBI R16,0xFF
FF94 4F1F SBCI R17,0xFF
FF95 3000 CPI R16,0
FF96 E7ED LDI R30,0x7D
FF97 071E CPC R17,R30
FF98 F3D4 BLT 0xFF93
(0218) }
FF99 9508 RET
(0219)
(0220) /*********************************************************/
(0221)
(0222) void main(void)
(0223) {
(0224) DDRF = 0xff; // for ata
_main:
FF9A EF8F LDI R24,0xFF
FF9B 93800061 STS 0x61,R24
(0225) PORTF = 0xff;
FF9D 93800062 STS 0x62,R24
(0226) DDRG = 0x02;
FF9F E082 LDI R24,2
FFA0 93800064 STS 0x64,R24
(0227) PORTG = 0x02;
FFA2 93800065 STS 0x65,R24
(0228)
(0229) PORTE = 0x01; // Pull up on RX line
FFA4 E081 LDI R24,1
FFA5 B983 OUT 0x03,R24
(0230) UCSR0C = 0x86; // Asyn,NoParity,1StopBit,8Bit,
FFA6 E886 LDI R24,0x86
FFA7 93800095 STS 0x95,R24
(0231) UBRR0L = 16; // 8->115200 at 16Mhz // 16->57600 at 16Mhz // 25->38400bps at 16Mhz
FFA9 E180 LDI R24,0x10
FFAA B989 OUT 0x09,R24
(0232) UCSR0B = 0x18; // Rx enable Tx Enable
FFAB E188 LDI R24,0x18
FFAC B98A OUT 0x0A,R24
(0233)
(0234) RxChar();
FFAD DFDD RCALL _RxChar
(0235) TxChar('>');
FFAE E30E LDI R16,0x3E
FFAF DFDD RCALL _TxChar
(0236) Wait();
FFB0 DFE0 RCALL _Wait
(0237) if (RxChar() == '<')
FFB1 DFD9 RCALL _RxChar
FFB2 330C CPI R16,0x3C
FFB3 F411 BNE 0xFFB6
(0238) {
(0239) BootLoad();
FFB4 DEDF RCALL _BootLoad
(0240) ExecCode();
FFB5 DF2C RCALL _ExecCode
(0241) }
(0242) ExecCode();
(0243) }
FILE: <library>
FFB6 CF2B RJMP _ExecCode
pop_gset2:
FFB7 E0E2 LDI R30,2
FFB8 C006 RJMP pop
pop_gset3:
FFB9 E0E4 LDI R30,4
FFBA C004 RJMP pop
push_gset1:
FFBB 935A ST R21,-Y
FFBC 934A ST R20,-Y
FFBD 9508 RET
pop_gset1:
FFBE E0E1 LDI R30,1
pop:
FFBF 9149 LD R20,Y+
FFC0 9159 LD R21,Y+
FFC1 FDE0 SBRC R30,0
FFC2 9508 RET
FFC3 9169 LD R22,Y+
FFC4 9179 LD R23,Y+
FFC5 FDE1 SBRC R30,1
FFC6 9508 RET
FFC7 90A9 LD R10,Y+
FFC8 90B9 LD R11,Y+
FFC9 FDE2 SBRC R30,2
FFCA 9508 RET
FFCB 90C9 LD R12,Y+
FFCC 90D9 LD R13,Y+
FFCD FDE3 SBRC R30,3
FFCE 9508 RET
FFCF 90E9 LD R14,Y+
FFD0 90F9 LD R15,Y+
FFD1 9508 RET
push_gset2:
FFD2 937A ST R23,-Y
FFD3 936A ST R22,-Y
FFD4 CFE6 RJMP push_gset1
push_gset3:
FFD5 92BA ST R11,-Y
FFD6 92AA ST R10,-Y
FFD7 CFFA RJMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -