📄 avrboot_m8_16.lst
字号:
1EF7 1D53 ADC R21,R3
(0164) if (TempInt != TempInt2) return 0;
1EF8 1704 CP R16,R20
1EF9 0715 CPC R17,R21
1EFA F011 BEQ 0x1EFD
1EFB 2700 CLR R16
1EFC C007 RJMP 0x1F04
1EFD 2D8A MOV R24,R10
1EFE 5F8E SUBI R24,0xFE
1EFF 2EA8 MOV R10,R24
1F00 2D8A MOV R24,R10
1F01 3880 CPI R24,0x80
1F02 F2A8 BCS 0x1ED8
(0165) }
(0166) return 1;
1F03 E001 LDI R16,1
1F04 940E1F93 CALL pop_gset3
1F06 9508 RET
(0167) }
(0168)
(0169) /*****************************************************************************/
(0170) /* 字符输入函数 */
(0171) unsigned char RecChar(void)
(0172) {
(0173) while(!(UCSRA & 0x80));
_RecChar:
1F07 9B5F SBIS 0x0B,7
1F08 CFFE RJMP _RecChar
(0174) return UDR;
1F09 B10C IN R16,0x0C
1F0A 9508 RET
(0175) }
(0176) /*****************************************************************************/
(0177) void SendChar(unsigned char c)
(0178) {
(0179) while (!(UCSRA&(1<<UDRE)));
_SendChar:
c --> R16
1F0B 9B5D SBIS 0x0B,5
1F0C CFFE RJMP _SendChar
(0180) UDR=c;
1F0D B90C OUT 0x0C,R16
(0181) }
1F0E 9508 RET
(0182) void delay(void)
(0183) {
(0184) unsigned int i;
(0185) for (i=0;i<65530;i++);
_delay:
i --> R16
1F0F 2700 CLR R16
1F10 2711 CLR R17
1F11 C002 RJMP 0x1F14
1F12 5F0F SUBI R16,0xFF
1F13 4F1F SBCI R17,0xFF
1F14 3F0A CPI R16,0xFA
1F15 EFEF LDI R30,0xFF
1F16 071E CPC R17,R30
1F17 F3D0 BCS 0x1F12
(0186) }
1F18 9508 RET
(0187)
(0188) /*****************************************************************************/
(0189) void ExecCode(void)
(0190) {
(0191) GICR=0X01; //中断向量表移位允许
_ExecCode:
1F19 E081 LDI R24,1
1F1A BF8B OUT 0x3B,R24
(0192) GICR=0X00; //中断向量指向应用程序区
1F1B 2422 CLR R2
1F1C BE2B OUT 0x3B,R2
(0193) asm("jmp 0x0000");
1F1D 940C0000 JMP 0x0
(0194) }
1F1F 9508 RET
(0195)
(0196) void main(void)
(0197) {
(0198) unsigned char BootFlag;
(0199)
(0200) #ifdef InteClk //如果使用内部时钟,读取时钟校准值
(0201) OSCCAL=read_flash(OscAddress);
_main:
BootFlag --> R20
1F20 EF0F LDI R16,0xFF
1F21 E11F LDI R17,0x1F
1F22 940E1F79 CALL _read_flash
1F24 BF01 OUT 0x31,R16
(0202) #endif
(0203)
(0204) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
1F25 E886 LDI R24,0x86
1F26 BD80 OUT 0x20,R24
(0205) UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
1F27 E188 LDI R24,0x18
1F28 B98A OUT 0x0A,R24
(0206) UBRR = BAU;
1F29 E383 LDI R24,0x33
1F2A B989 OUT 0x09,R24
(0207)
(0208) SendChar('>'); //通知PC机,BOOT下载准备就绪
1F2B E30E LDI R16,0x3E
1F2C DFDE RCALL _SendChar
(0209) delay(); //延时等待PC机响应
1F2D DFE1 RCALL _delay
(0210) delay();
1F2E DFE0 RCALL _delay
(0211) delay();
1F2F DFDF RCALL _delay
(0212) delay();
1F30 DFDE RCALL _delay
(0213) delay();
1F31 DFDD RCALL _delay
(0214) delay();
1F32 DFDC RCALL _delay
(0215) delay();
1F33 DFDB RCALL _delay
(0216) delay();
1F34 DFDA RCALL _delay
(0217) BootFlag=UDR;
1F35 B14C IN R20,0x0C
(0218) if (BootFlag == '<')
1F36 334C CPI R20,0x3C
1F37 F009 BEQ 0x1F39
1F38 C02F RJMP 0x1F68
(0219) {
(0220) SendChar(ChipType);
1F39 E301 LDI R16,0x31
1F3A DFD0 RCALL _SendChar
(0221) delay(); //延时等待PC机响应
1F3B DFD3 RCALL _delay
(0222) delay();
1F3C DFD2 RCALL _delay
(0223) delay();
1F3D DFD1 RCALL _delay
(0224) delay();
1F3E DFD0 RCALL _delay
(0225) delay();
1F3F DFCF RCALL _delay
(0226) delay();
1F40 DFCE RCALL _delay
(0227) SendChar(BootSize);
1F41 E603 LDI R16,0x63
1F42 DFC8 RCALL _SendChar
(0228) delay(); //延时等待PC机响应
1F43 DFCB RCALL _delay
(0229) delay();
1F44 DFCA RCALL _delay
(0230) delay();
1F45 DFC9 RCALL _delay
(0231) delay();
1F46 DFC8 RCALL _delay
(0232) delay();
1F47 DFC7 RCALL _delay
(0233) delay();
1F48 DFC6 RCALL _delay
(0234) SendChar(BootVer);
1F49 E606 LDI R16,0x66
1F4A DFC0 RCALL _SendChar
(0235) delay(); //延时等待PC机响应
1F4B DFC3 RCALL _delay
(0236) delay();
1F4C DFC2 RCALL _delay
(0237) delay();
1F4D DFC1 RCALL _delay
(0238) delay();
1F4E DFC0 RCALL _delay
(0239) delay();
1F4F DFBF RCALL _delay
(0240) delay();
1F50 DFBE RCALL _delay
1F51 C015 RJMP 0x1F67
(0241) while (1)
(0242) {
(0243) switch (RecChar())
1F52 DFB4 RCALL _RecChar
1F53 2F40 MOV R20,R16
1F54 2755 CLR R21
1F55 3445 CPI R20,0x45
1F56 E0E0 LDI R30,0
1F57 075E CPC R21,R30
1F58 F059 BEQ 0x1F64
1F59 3445 CPI R20,0x45
1F5A E0E0 LDI R30,0
1F5B 075E CPC R21,R30
1F5C F054 BLT 0x1F67
1F5D 3547 CPI R20,0x57
1F5E E0E0 LDI R30,0
1F5F 075E CPC R21,R30
1F60 F009 BEQ 0x1F62
1F61 C005 RJMP 0x1F67
(0244) {
(0245) case 'W': FlashLoad(); break;
1F62 DEEB RCALL _FlashLoad
1F63 C003 RJMP 0x1F67
(0246) case 'E': {
(0247) SendChar('E'); //通知PC机,进入运用程序区
1F64 E405 LDI R16,0x45
1F65 DFA5 RCALL _SendChar
(0248) ExecCode();
1F66 DFB2 RCALL _ExecCode
1F67 CFEA RJMP 0x1F52
(0249) } break;
(0250) default : break;
(0251) }
(0252) }
(0253) }
(0254) SendChar('E'); //通知PC机,进入运用程序区
1F68 E405 LDI R16,0x45
1F69 DFA1 RCALL _SendChar
(0255) ExecCode();
(0256) }
1F6A CFAE RJMP _ExecCode
FILE: E:\icc\peter\BootLoad\assembly.s
(0001) .text
(0002)
(0003) SPMCR = 0x57 ;RWW区忙标志,读RWW区允许,允许写程序存储区
(0004)
(0005) ; void write_page (unsigned int adr, unsigned char function);
(0006) ; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
(0007) _write_page::
(0008) XCALL __WAIT_SPMEN__
_write_page:
1F6B D01F RCALL 0x1F8B
(0009) movw r30, r16 ;move address to z pointer (R31 = ZH, R30 = ZL)
1F6C 01F8 MOVW R30,R16
(0010) STS SPMCR, R18 ;argument 2 decides function
1F6D 93200057 STS 0x57,R18
(0011) SPM ;perform pagewrite
1F6F 95E8 SPM
(0012) RET
1F70 9508 RET
(0013)
(0014) ;-----------------------------------------
(0015)
(0016) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0017) ; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
(0018) _fill_temp_buffer::
(0019) XCALL __WAIT_SPMEN__
_fill_temp_buffer:
1F71 D019 RCALL 0x1F8B
(0020) movw r30, r18 ;move adress to z pointer (R31=ZH R30=ZL)
1F72 01F9 MOVW R30,R18
(0021) movw r0, r16 ;move data to reg 0 and 1
1F73 0108 MOVW R0,R16
(0022) LDI R19, 0x01
1F74 E031 LDI R19,1
(0023) STS SPMCR, R19
1F75 93300057 STS 0x57,R19
(0024) SPM ;Store program memory
1F77 95E8 SPM
(0025) RET
1F78 9508 RET
(0026)
(0027) ;-----------------------------------------
(0028)
(0029) ;unsigned char read_flash(unsigned int add);
(0030) _read_flash::
(0031) mov r31,r17
_read_flash:
1F79 2FF1 MOV R31,R17
(0032) mov r30,r16
1F7A 2FE0 MOV R30,R16
(0033) lpm r16,z
1F7B 9104 LPM R16,0(Z)
(0034) clr r17
1F7C 2711 CLR R17
(0035) ret
1F7D 9508 RET
(0036)
(0037) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0038) _read_program_memory::
(0039) movw r30, r16 ;move adress to z pointer
_read_program_memory:
1F7E 01F8 MOVW R30,R16
(0040) SBRC R18, 0 ;read lockbits? (second argument = 0x09)
1F7F FD20 SBRC R18,0
(0041) STS SPMCR, R18 ;if so, place second argument in SPMEN register
1F80 93200057 STS 0x57,R18
(0042) LPM r16, Z+
1F82 9105 LPM R16,Z+
(0043) LPM r17, Z
1F83 9114 LPM R17,0(Z)
(0044) RET
1F84 9508 RET
(0045)
(0046) ;-----------------------------------------
(0047)
(0048) _enableRWW::
(0049) XCALL __WAIT_SPMEN__
_enableRWW:
1F85 D005 RCALL 0x1F8B
(0050) LDI R27,0x11
1F86 E1B1 LDI R27,0x11
(0051) STS SPMCR,R27
1F87 93B00057 STS 0x57,R27
(0052) SPM
1F89 95E8 SPM
(0053) RET
1F8A 9508 RET
(0054)
(0055) ;-----------------------------------------
(0056)
(0057) __WAIT_SPMEN__:
(0058) LDS R27,SPMCR ; load SPMCR to R27
1F8B 91B00057 LDS R27,0x57
(0059) SBRC R27,0 ; check SPMEN flag
1F8D FDB0 SBRC R27,0
(0060) RJMP __WAIT_SPMEN__ ; wait for SPMEN flag cleared
1F8E CFFC RJMP 0x1F8B
(0061) RET
FILE: <library>
1F8F 9508 RET
pop_gset2:
1F90 E0E2 LDI R30,2
1F91 940C1F9A JMP pop
pop_gset3:
1F93 E0E4 LDI R30,4
1F94 940C1F9A JMP pop
push_gset1:
1F96 935A ST R21,-Y
1F97 934A ST R20,-Y
1F98 9508 RET
pop_gset1:
1F99 E0E1 LDI R30,1
pop:
1F9A 9149 LD R20,Y+
1F9B 9159 LD R21,Y+
1F9C FDE0 SBRC R30,0
1F9D 9508 RET
1F9E 9169 LD R22,Y+
1F9F 9179 LD R23,Y+
1FA0 FDE1 SBRC R30,1
1FA1 9508 RET
1FA2 90A9 LD R10,Y+
1FA3 90B9 LD R11,Y+
1FA4 FDE2 SBRC R30,2
1FA5 9508 RET
1FA6 90C9 LD R12,Y+
1FA7 90D9 LD R13,Y+
1FA8 FDE3 SBRC R30,3
1FA9 9508 RET
1FAA 90E9 LD R14,Y+
1FAB 90F9 LD R15,Y+
1FAC 9508 RET
push_gset2:
1FAD 937A ST R23,-Y
1FAE 936A ST R22,-Y
1FAF 940C1F96 JMP push_gset1
push_gset3:
1FB1 92BA ST R11,-Y
1FB2 92AA ST R10,-Y
1FB3 940C1FAD JMP push_gset2
lsl16:
1FB5 2322 TST R18
1FB6 F021 BEQ 0x1FBB
1FB7 0F00 LSL R16
1FB8 1F11 ROL R17
1FB9 952A DEC R18
1FBA CFFA RJMP lsl16
1FBB 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -