📄 main.lst
字号:
00B0 2700 CLR R16
00B1 D0C8 RCALL pop_gset3
00B2 9508 RET
_WriteFlash:
TempInt --> R20
i --> R22
00B3 D0DF RCALL push_gset2
(0130) }
(0131)
(0132) /*****************************************************************************/
(0133) void WriteFlash(void)
(0134) {
(0135) unsigned int i;
(0136) unsigned int TempInt;
(0137) for (i=0;i<PageByte;i+=2)
00B4 2766 CLR R22
00B5 2777 CLR R23
00B6 C01A RJMP 0x00D1
(0138) {
(0139) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
00B7 E684 LDI R24,0x64
00B8 E090 LDI R25,0
00B9 2FE6 MOV R30,R22
00BA 2FF7 MOV R31,R23
00BB 9631 ADIW R30,1
00BC 0FE8 ADD R30,R24
00BD 1FF9 ADC R31,R25
00BE 8020 LDD R2,Z+0
00BF 2433 CLR R3
00C0 2C32 MOV R3,R2
00C1 2422 CLR R2
00C2 2FE6 MOV R30,R22
00C3 2FF7 MOV R31,R23
00C4 0FE8 ADD R30,R24
00C5 1FF9 ADC R31,R25
00C6 8140 LDD R20,Z+0
00C7 2755 CLR R21
00C8 0D42 ADD R20,R2
00C9 1D53 ADC R21,R3
(0140) fill_temp_buffer(TempInt,i); //call asm routine.
00CA 2F26 MOV R18,R22
00CB 2F37 MOV R19,R23
00CC 2F04 MOV R16,R20
00CD 2F15 MOV R17,R21
00CE DF57 RCALL _fill_temp_buffer
00CF 5F6E SUBI R22,0xFE
00D0 4F7F SBCI R23,0xFF
00D1 3860 CPI R22,0x80
00D2 E0E0 LDI R30,0
00D3 077E CPC R23,R30
00D4 F310 BCS 0x00B7
(0141) }
(0142) write_page(PageAddress,0x03); //擦除页
00D5 E023 LDI R18,3
00D6 91000060 LDS R16,_PageAddress
00D8 91100061 LDS R17,_PageAddress+1
00DA DF45 RCALL _write_page
(0143) write_page(PageAddress,0x05); //写页数据
00DB E025 LDI R18,5
00DC 91000060 LDS R16,_PageAddress
00DE 91100061 LDS R17,_PageAddress+1
00E0 DF3F RCALL _write_page
(0144)
(0145) enableRWW();
00E1 DF58 RCALL _enableRWW
(0146) }
00E2 D095 RCALL pop_gset2
00E3 9508 RET
_CheckFlash:
TempInt2 --> R20
TempInt --> R22
i --> R10
00E4 D0B1 RCALL push_gset3
(0147)
(0148) /*****************************************************************************/
(0149)
(0150) char CheckFlash(void)
(0151) {
(0152) unsigned char i;
(0153) unsigned int TempInt;
(0154) unsigned int TempInt2;
(0155)
(0156) for (i=0;i<PageByte;i+=2)
00E5 24AA CLR R10
00E6 C028 RJMP 0x010F
(0157) {
(0158) TempInt = read_program_memory(PageAddress + i,0x00);
00E7 2722 CLR R18
00E8 2C2A MOV R2,R10
00E9 2433 CLR R3
00EA 91000060 LDS R16,_PageAddress
00EC 91100061 LDS R17,_PageAddress+1
00EE 0D02 ADD R16,R2
00EF 1D13 ADC R17,R3
00F0 DF42 RCALL _read_program_memory
00F1 2F60 MOV R22,R16
00F2 2F71 MOV R23,R17
(0159) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
00F3 E685 LDI R24,0x65
00F4 E090 LDI R25,0
00F5 2DEA MOV R30,R10
00F6 27FF CLR R31
00F7 0FE8 ADD R30,R24
00F8 1FF9 ADC R31,R25
00F9 8020 LDD R2,Z+0
00FA 2433 CLR R3
00FB 2C32 MOV R3,R2
00FC 2422 CLR R2
00FD E684 LDI R24,0x64
00FE E090 LDI R25,0
00FF 2DEA MOV R30,R10
0100 27FF CLR R31
0101 0FE8 ADD R30,R24
0102 1FF9 ADC R31,R25
0103 8140 LDD R20,Z+0
0104 2755 CLR R21
0105 0D42 ADD R20,R2
0106 1D53 ADC R21,R3
(0160) if (TempInt != TempInt2)
0107 1704 CP R16,R20
0108 0715 CPC R17,R21
0109 F011 BEQ 0x010C
(0161) return 0;
010A 2700 CLR R16
010B C007 RJMP 0x0113
010C 2D8A MOV R24,R10
010D 5F8E SUBI R24,0xFE
010E 2EA8 MOV R10,R24
010F 2D8A MOV R24,R10
0110 3880 CPI R24,0x80
0111 F2A8 BCS 0x00E7
(0162) }
(0163) return 1;
0112 E001 LDI R16,1
0113 D066 RCALL pop_gset3
0114 9508 RET
(0164) }
(0165) /*****************************************************************************/
(0166) /* Serial Port Code */
(0167) /*****************************************************************************/
(0168) unsigned char IsChar(void)
(0169) {
(0170) if(UCSRA & 0x80)
_IsChar:
0115 9B5F SBIS 0x0B,7
0116 C002 RJMP 0x0119
(0171) return 1;
0117 E001 LDI R16,1
0118 C001 RJMP 0x011A
(0172) else
(0173) return 0;
0119 2700 CLR R16
011A 9508 RET
(0174) }
(0175) /*****************************************************************************/
(0176) /* 字符输入函数 */
(0177) unsigned char RecChar(void)
(0178) {
(0179) while(!(UCSRA & 0x80));
_RecChar:
011B 9B5F SBIS 0x0B,7
011C CFFE RJMP _RecChar
(0180) return UDR;
011D B10C IN R16,0x0C
011E 9508 RET
(0181) }
(0182) /*****************************************************************************/
(0183) void SendChar(unsigned char c)
(0184) {
(0185) while (!(UCSRA&(1<<UDRE)));
_SendChar:
c --> R16
011F 9B5D SBIS 0x0B,5
0120 CFFE RJMP _SendChar
(0186) UDR=c;
0121 B90C OUT 0x0C,R16
(0187) }
0122 9508 RET
(0188) void delay(void)
(0189) {
(0190) unsigned int i;
(0191) for (i=0;i<65530;i++);
_delay:
i --> R16
0123 2700 CLR R16
0124 2711 CLR R17
0125 C002 RJMP 0x0128
0126 5F0F SUBI R16,0xFF
0127 4F1F SBCI R17,0xFF
0128 3F0A CPI R16,0xFA
0129 EFEF LDI R30,0xFF
012A 071E CPC R17,R30
012B F3D0 BCS 0x0126
(0192) }
012C 9508 RET
(0193)
(0194) /*****************************************************************************/
(0195) void ExecCode(void)
(0196) {
(0197) #ifdef RAMPZ_FLAG
(0198) RAMPZ = 0;
(0199) #endif
(0200) INTVECREG=0x01; //中断向量表移位允许
_ExecCode:
012D E081 LDI R24,1
012E BF8B OUT 0x3B,R24
(0201) INTVECREG=0x00; //中断向量指向应用程序区
012F 2422 CLR R2
0130 BE2B OUT 0x3B,R2
(0202) asm("jmp 0x0000");
0131 940C0000 JMP __text_start
(0203) }
0133 9508 RET
(0204)
(0205) void main(void)
(0206) {
(0207) unsigned char BootFlag;
(0208)
(0209) #ifdef InteClk //如果使用内部时钟,读取时钟校准值
(0210) OSCCAL=read_flash(OscAddress);
_main:
BootFlag --> R20
0134 EF0F LDI R16,0xFF
0135 E11F LDI R17,0x1F
0136 DEF7 RCALL _read_flash
0137 BF01 OUT 0x31,R16
(0211) #endif
(0212)
(0213) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
0138 E886 LDI R24,0x86
0139 BD80 OUT 0x20,R24
(0214) UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
013A E188 LDI R24,0x18
013B B98A OUT 0x0A,R24
(0215) UBRR = BAU;
013C E187 LDI R24,0x17
013D B989 OUT 0x09,R24
(0216)
(0217)
(0218) SendChar('>'); //通知PC机,BOOT下载准备就绪
013E E30E LDI R16,0x3E
013F DFDF RCALL _SendChar
(0219) delay(); //延时等待PC机响应
0140 DFE2 RCALL _delay
(0220) delay();
0141 DFE1 RCALL _delay
(0221) delay();
0142 DFE0 RCALL _delay
(0222) delay();
0143 DFDF RCALL _delay
(0223) delay();
0144 DFDE RCALL _delay
(0224) delay();
0145 DFDD RCALL _delay
(0225) delay();
0146 DFDC RCALL _delay
(0226) delay();
0147 DFDB RCALL _delay
(0227)
(0228) BootFlag=UDR;
0148 B14C IN R20,0x0C
(0229) if (BootFlag == '<')
0149 334C CPI R20,0x3C
014A F531 BNE 0x0171
(0230) {
(0231) SendChar(ChipType);
014B E301 LDI R16,0x31
014C DFD2 RCALL _SendChar
(0232) while (RecChar()!='N');
014D DFCD RCALL _RecChar
014E 340E CPI R16,0x4E
014F F7E9 BNE 0x014D
(0233) SendChar(BootSize);
0150 E604 LDI R16,0x64
0151 DFCD RCALL _SendChar
(0234) while (RecChar()!='N');
0152 DFC8 RCALL _RecChar
0153 340E CPI R16,0x4E
0154 F7E9 BNE 0x0152
(0235) SendChar(BootVer);
0155 E606 LDI R16,0x66
0156 DFC8 RCALL _SendChar
0157 C018 RJMP 0x0170
(0236) while (1)
(0237) {
(0238) switch (RecChar())
0158 DFC2 RCALL _RecChar
0159 2F40 MOV R20,R16
015A 2755 CLR R21
015B 3445 CPI R20,0x45
015C E0E0 LDI R30,0
015D 075E CPC R21,R30
015E F059 BEQ 0x016A
015F 3445 CPI R20,0x45
0160 E0E0 LDI R30,0
0161 075E CPC R21,R30
0162 F06C BLT 0x0170
0163 3547 CPI R20,0x57
0164 E0E0 LDI R30,0
0165 075E CPC R21,R30
0166 F009 BEQ 0x0168
0167 C008 RJMP 0x0170
(0239) {
(0240) case 'W': FlashLoad(); break;
0168 DEDC RCALL _FlashLoad
0169 C006 RJMP 0x0170
(0241) case 'E': {
(0242) SendChar('E'); //通知PC机,进入运用程序区
016A E405 LDI R16,0x45
016B DFB3 RCALL _SendChar
(0243) while (RecChar()!='N');
016C DFAE RCALL _RecChar
016D 340E CPI R16,0x4E
016E F7E9 BNE 0x016C
(0244) ExecCode();
016F DFBD RCALL _ExecCode
0170 CFE7 RJMP 0x0158
(0245) } break;
(0246) default : break;
(0247) }
(0248) }
(0249) }
(0250) SendChar('E'); //通知PC机,进入运用程序区
0171 E405 LDI R16,0x45
0172 DFAC RCALL _SendChar
(0251) //while (RecChar()!='N');
(0252) delay();
0173 DFAF RCALL _delay
(0253) delay();
0174 DFAE RCALL _delay
(0254) delay();
0175 DFAD RCALL _delay
(0255) delay();
0176 DFAC RCALL _delay
(0256) ExecCode();
(0257) }
FILE: <library>
0177 CFB5 RJMP _ExecCode
pop_gset2:
0178 E0E2 LDI R30,2
0179 C006 RJMP pop
pop_gset3:
017A E0E4 LDI R30,4
017B C004 RJMP pop
push_gset1:
017C 935A ST R21,-Y
017D 934A ST R20,-Y
017E 9508 RET
pop_gset1:
017F E0E1 LDI R30,1
pop:
0180 9149 LD R20,Y+
0181 9159 LD R21,Y+
0182 FDE0 SBRC R30,0
0183 9508 RET
0184 9169 LD R22,Y+
0185 9179 LD R23,Y+
0186 FDE1 SBRC R30,1
0187 9508 RET
0188 90A9 LD R10,Y+
0189 90B9 LD R11,Y+
018A FDE2 SBRC R30,2
018B 9508 RET
018C 90C9 LD R12,Y+
018D 90D9 LD R13,Y+
018E FDE3 SBRC R30,3
018F 9508 RET
0190 90E9 LD R14,Y+
0191 90F9 LD R15,Y+
0192 9508 RET
push_gset2:
0193 937A ST R23,-Y
0194 936A ST R22,-Y
0195 CFE6 RJMP push_gset1
push_gset3:
0196 92BA ST R11,-Y
0197 92AA ST R10,-Y
0198 CFFA RJMP push_gset2
lsl16:
0199 2322 TST R18
019A F021 BEQ 0x019F
019B 0F00 LSL R16
019C 1F11 ROL R17
019D 952A DEC R18
019E CFFA RJMP lsl16
019F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -