📄 main.s
字号:
_CheckFlash::
xcall push_xgset303C
.dbline -1
.dbline 177
; }
;
; /*****************************************************************************/
;
; char CheckFlash(void)
; {
.dbline 182
; unsigned char i;
; unsigned int TempInt;
; unsigned int TempInt2;
;
; for (i=0;i<PageByte;i+=2)
clr R20
xjmp L29
L26:
.dbline 183
; {
.dbline 184
; TempInt = read_program_memory(PageAddress + i,0x00);
clr R18
mov R2,R20
clr R3
lds R16,_PageAddress
lds R17,_PageAddress+1
add R16,R2
adc R17,R3
xcall _read_program_memory
movw R10,R16
.dbline 185
; TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
ldi R24,<_PageBuffer+1
ldi R25,>_PageBuffer+1
mov R30,R20
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,R20
clr R31
add R30,R24
adc R31,R25
ldd R12,z+0
clr R13
add R12,R2
adc R13,R3
.dbline 186
; if (TempInt != TempInt2) return 0;
cp R16,R12
cpc R17,R13
breq L31
X8:
.dbline 186
clr R16
xjmp L25
L31:
.dbline 187
; }
L27:
.dbline 182
subi R20,254 ; addi 2
L29:
.dbline 182
cpi R20,128
brlo L26
X9:
.dbline 188
; return 1;
ldi R16,1
.dbline -2
L25:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r TempInt2 12 i
.dbsym r TempInt 10 i
.dbsym r i 20 c
.dbend
.dbfunc e RecChar _RecChar fc
.even
_RecChar::
.dbline -1
.dbline 194
; }
;
; /*****************************************************************************/
; /* 字符输入函数 */
; unsigned char RecChar(void)
; {
L34:
.dbline 195
; while(!(UCSR0A & 0x80));
L35:
.dbline 195
lds R2,192
sbrs R2,7
rjmp L34
X10:
.dbline 196
; return UDR0;
lds R16,198
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SendChar _SendChar fV
; c -> R16
.even
_SendChar::
.dbline -1
.dbline 200
; }
; /*****************************************************************************/
; void SendChar(unsigned char c)
; {
L38:
.dbline 201
; while (!(UCSR0A&(1<<UDRE0)));
L39:
.dbline 201
lds R2,192
sbrs R2,5
rjmp L38
X11:
.dbline 202
; UDR0=c;
sts 198,R16
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e delay _delay fV
; i -> R16,R17
.even
_delay::
.dbline -1
.dbline 205
; }
; void delay(void)
; {
.dbline 207
; unsigned int i;
; for (i=0;i<65530;i++);
clr R16
clr R17
xjmp L45
L42:
.dbline 207
L43:
.dbline 207
subi R16,255 ; offset = 1
sbci R17,255
L45:
.dbline 207
ldi R24,250
ldi R25,255
ldi R26,0
ldi R27,0
movw R2,R16
clr R4
clr R5
cp R2,R24
cpc R3,R25
cpc R4,R26
cpc R5,R27
brlt L42
X12:
.dbline -2
L41:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e ExecCode _ExecCode fV
.even
_ExecCode::
.dbline -1
.dbline 212
; }
;
; /*****************************************************************************/
; void ExecCode(void)
; {
.dbline 213
; MCUCR=(1<<IVCE); //中断向量表移位允许
ldi R24,1
out 0x35,R24
.dbline 214
; MCUCR=0X00; //中断向量指向应用程序区
clr R2
out 0x35,R2
.dbline 215
; asm("jmp 0x0000");
jmp 0x0000
.dbline -2
L46:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; iTry -> R20
; TempInt -> R22,R23
; BootFlag -> R22
.even
_main::
.dbline -1
.dbline 219
; }
;
; void main(void)
; {
.dbline 239
; unsigned char BootFlag;
; unsigned int TempInt;
; char iTry;
;
; #ifdef InteClk //如果使用内部时钟,读取时钟校准值
; OSCCAL=read_flash(OscAddress);
; #endif
;
; #ifdef W0
; //pei 拷贝W0的PortInit
; PORTB = 0x0F;//rfslp,fs123=1
; DDRB = 0xFF;//bit1=output
; PORTC = 0x21;//0x20;//rfrst=1,not reset!
; DDRC = 0x7F;
; PORTD = 0x0C;
; DDRD = 0xF0;
; #else
; #endif
;
; UCSR0C=(1<<UCSZ01)|(1<<UCSZ00); //8位数据+1位停止(1<<URSEL)|
ldi R24,6
sts 194,R24
.dbline 240
; UCSR0B = (1<<RXEN0)|(1<<TXEN0); //允许串口发送和接收
ldi R24,24
sts 193,R24
.dbline 241
; UBRR0 = BAU;
ldi R24,51
ldi R25,0
sts 196+1,R25
sts 196,R24
.dbline 243
;
; iTry=20;
ldi R20,20
L48:
.dbline 249
; STARTBOOT://pei未下载程序时重复等待
; #ifdef W0
; PORTC=PORTC^0x03;//指示灯闪烁
; #endif
;
; SendChar('>'); //通知PC机,BOOT下载准备就绪
ldi R16,62
xcall _SendChar
.dbline 250
; delay(); //延时等待PC机响应
xcall _delay
.dbline 251
; BootFlag=UDR0;
lds R22,198
.dbline 252
; if (BootFlag == '<')
cpi R22,60
brne L49
X13:
.dbline 253
; {
.dbline 254
; SendChar(ChipType); //芯片版本信息
ldi R16,49
xcall _SendChar
.dbline 255
; SendChar(BootSize);
ldi R16,99
xcall _SendChar
.dbline 256
; SendChar(BootVer);
ldi R16,103
xcall _SendChar
xjmp L52
L51:
.dbline 258
; while (1)
; {
.dbline 259
; switch (RecChar())
xcall _RecChar
mov R22,R16
clr R23
cpi R22,69
ldi R30,0
cpc R23,R30
breq L58
X14:
cpi R22,69
ldi R30,0
cpc R23,R30
brlt L55
X15:
L59:
cpi R22,87
ldi R30,0
cpc R23,R30
breq L57
X16:
xjmp L55
L57:
.dbline 261
; {
; case 'W': FlashLoad();
xcall _FlashLoad
.dbline 262
; break;
xjmp L55
L58:
.dbline 263
; case 'E': {
.dbline 264
; SendChar('E'); //通知PC机,进入运用程序区
ldi R16,69
xcall _SendChar
.dbline 265
; ExecCode();
xcall _ExecCode
.dbline 266
; } break;
.dbline 266
.dbline 267
; default : break;
L55:
.dbline 269
; }
; }
L52:
.dbline 257
xjmp L51
L49:
.dbline 271
; }
; SendChar('E');
ldi R16,69
xcall _SendChar
.dbline 273
;
; TempInt = read_program_memory(0,0);//pei
clr R18
clr R16
clr R17
xcall _read_program_memory
movw R22,R16
.dbline 274
; if (TempInt==0xFFFF) goto STARTBOOT;
cpi R16,255
ldi R30,255
cpc R17,R30
brne L60
X17:
.dbline 274
xjmp L48
L60:
.dbline 275
; else{ iTry--;
.dbline 275
dec R20
.dbline 276
; if (iTry>0) goto STARTBOOT;}
ldi R24,0
cp R24,R20
brsh L62
X18:
.dbline 276
xjmp L48
L62:
.dbline 276
.dbline 278
;
; ExecCode();//执行用户区程序
xcall _ExecCode
.dbline -2
L47:
.dbline 0 ; func end
ret
.dbsym r iTry 20 c
.dbsym r TempInt 22 i
.dbsym r BootFlag 22 c
.dbend
.area bss(ram, con, rel)
.dbfile F:\程序\新建文~1\BootLoad_88可用\main.c
_PageAddress::
.blkb 2
.dbsym e PageAddress _PageAddress i
_PageBuffer::
.blkb 128
.dbsym e PageBuffer _PageBuffer A[128:128]c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -