📄 main.s
字号:
.dbline -1
.dbline 162
; }
;
; /*****************************************************************************/
;
; char CheckFlash(void)
; {
.dbline 167
; unsigned char i;
; unsigned int TempInt;
; unsigned int TempInt2;
;
; for (i=0;i<PageByte;i+=2)
clr R10
xjmp L40
L37:
.dbline 168
; {
.dbline 169
; TempInt = read_program_memory(PageAddress + i,0x00);
clr R18
mov R2,R10
clr R3
lds R16,_PageAddress
lds R17,_PageAddress+1
add R16,R2
adc R17,R3
xcall _read_program_memory
movw R22,R16
.dbline 170
; TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
ldi R24,<_PageBuffer+1
ldi R25,>_PageBuffer+1
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R20,z+0
clr R21
add R20,R2
adc R21,R3
.dbline 171
; if (TempInt != TempInt2)
cp R16,R20
cpc R17,R21
breq L42
.dbline 172
; return 0;
clr R16
xjmp L36
L42:
.dbline 173
L38:
.dbline 167
mov R24,R10
subi R24,254 ; addi 2
mov R10,R24
L40:
.dbline 167
mov R24,R10
cpi R24,128
brlo L37
.dbline 174
; }
; return 1;
ldi R16,1
.dbline -2
L36:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r TempInt2 20 i
.dbsym r TempInt 22 i
.dbsym r i 10 c
.dbend
.dbfunc e IsChar _IsChar fc
.even
_IsChar::
.dbline -1
.dbline 180
; }
; /*****************************************************************************/
; /* Serial Port Code */
; /*****************************************************************************/
; unsigned char IsChar(void)
; {
.dbline 181
; if(UCSRA & 0x80)
sbis 0xb,7
rjmp L45
.dbline 182
; return 1;
ldi R16,1
xjmp L44
L45:
.dbline 184
; else
; return 0;
clr R16
.dbline -2
L44:
.dbline 0 ; func end
ret
.dbend
.dbfunc e RecChar _RecChar fc
.even
_RecChar::
.dbline -1
.dbline 189
; }
; /*****************************************************************************/
; /* 字符输入函数 */
; unsigned char RecChar(void)
; {
L48:
.dbline 190
L49:
.dbline 190
; while(!(UCSRA & 0x80));
sbis 0xb,7
rjmp L48
.dbline 191
; return UDR;
in R16,0xc
.dbline -2
L47:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SendChar _SendChar fV
; c -> R16
.even
_SendChar::
.dbline -1
.dbline 195
; }
; /*****************************************************************************/
; void SendChar(unsigned char c)
; {
L52:
.dbline 196
L53:
.dbline 196
; while (!(UCSRA&(1<<UDRE)));
sbis 0xb,5
rjmp L52
.dbline 197
; UDR=c;
out 0xc,R16
.dbline -2
L51:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e delay _delay fV
; i -> R16,R17
.even
_delay::
.dbline -1
.dbline 200
; }
; void delay(void)
; {
.dbline 202
clr R16
clr R17
xjmp L59
L56:
.dbline 202
L57:
.dbline 202
subi R16,255 ; offset = 1
sbci R17,255
L59:
.dbline 202
; unsigned int i;
; for (i=0;i<65530;i++);
cpi R16,250
ldi R30,255
cpc R17,R30
brlo L56
.dbline -2
L55:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e ExecCode _ExecCode fV
.even
_ExecCode::
.dbline -1
.dbline 207
; }
;
; /*****************************************************************************/
; void ExecCode(void)
; {
.dbline 211
; #ifdef RAMPZ_FLAG
; RAMPZ = 0;
; #endif
; INTVECREG=0x01; //中断向量表移位允许
ldi R24,1
out 0x3b,R24
.dbline 212
; INTVECREG=0x00; //中断向量指向应用程序区
clr R2
out 0x3b,R2
.dbline 213
; asm("jmp 0x0000");
jmp 0x0000
.dbline -2
L60:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; BootFlag -> R20
.even
_main::
.dbline -1
.dbline 217
; }
;
; void main(void)
; {
.dbline 221
; unsigned char BootFlag;
;
; #ifdef InteClk //如果使用内部时钟,读取时钟校准值
; OSCCAL=read_flash(OscAddress);
ldi R16,8191
ldi R17,31
xcall _read_flash
out 0x31,R16
.dbline 224
; #endif
;
; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
ldi R24,134
out 0x20,R24
.dbline 225
; UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
ldi R24,24
out 0xa,R24
.dbline 226
; UBRR = BAU;
ldi R24,23
out 0x9,R24
.dbline 229
;
;
; SendChar('>'); //通知PC机,BOOT下载准备就绪
ldi R16,62
xcall _SendChar
.dbline 230
; delay(); //延时等待PC机响应
xcall _delay
.dbline 231
; delay();
xcall _delay
.dbline 232
; delay();
xcall _delay
.dbline 233
; delay();
xcall _delay
.dbline 234
; delay();
xcall _delay
.dbline 235
; delay();
xcall _delay
.dbline 236
; delay();
xcall _delay
.dbline 237
; delay();
xcall _delay
.dbline 239
;
; BootFlag=UDR;
in R20,0xc
.dbline 240
; if (BootFlag == '<')
cpi R20,60
brne L62
.dbline 241
; {
.dbline 242
; SendChar(ChipType);
ldi R16,49
xcall _SendChar
L64:
.dbline 243
L65:
.dbline 243
; while (RecChar()!='N');
xcall _RecChar
cpi R16,78
brne L64
.dbline 244
; SendChar(BootSize);
ldi R16,100
xcall _SendChar
L67:
.dbline 245
L68:
.dbline 245
; while (RecChar()!='N');
xcall _RecChar
cpi R16,78
brne L67
.dbline 246
; SendChar(BootVer);
ldi R16,102
xcall _SendChar
xjmp L71
L70:
.dbline 248
; while (1)
; {
.dbline 249
; switch (RecChar())
xcall _RecChar
mov R20,R16
clr R21
cpi R20,69
ldi R30,0
cpc R21,R30
breq L77
cpi R20,69
ldi R30,0
cpc R21,R30
brlt L74
L81:
cpi R20,87
ldi R30,0
cpc R21,R30
breq L76
xjmp L74
X3:
.dbline 250
; {
L76:
.dbline 251
; case 'W': FlashLoad(); break;
xcall _FlashLoad
.dbline 251
xjmp L74
L77:
.dbline 252
; case 'E': {
.dbline 253
; SendChar('E'); //通知PC机,进入运用程序区
ldi R16,69
xcall _SendChar
L78:
.dbline 254
L79:
.dbline 254
; while (RecChar()!='N');
xcall _RecChar
cpi R16,78
brne L78
.dbline 255
; ExecCode();
xcall _ExecCode
.dbline 256
; } break;
.dbline 256
.dbline 257
; default : break;
L74:
.dbline 259
L71:
.dbline 247
xjmp L70
X4:
.dbline 260
; }
; }
; }
L62:
.dbline 261
; SendChar('E'); //通知PC机,进入运用程序区
ldi R16,69
xcall _SendChar
.dbline 263
; //while (RecChar()!='N');
; delay();
xcall _delay
.dbline 264
; delay();
xcall _delay
.dbline 265
; delay();
xcall _delay
.dbline 266
; delay();
xcall _delay
.dbline 267
; ExecCode();
xcall _ExecCode
.dbline -2
L61:
.dbline 0 ; func end
ret
.dbsym r BootFlag 20 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\桌面\AVR_BO~1.2\bootloader\main.c
_PageAddress::
.blkb 2
.dbsym e PageAddress _PageAddress i
_RealPageAddress::
.blkb 2
.dbsym e RealPageAddress _RealPageAddress i
_PageBuffer::
.blkb 128
.dbsym e PageBuffer _PageBuffer A[128:128]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -