📄 main.s
字号:
.dbline 174
; msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
ldi R24,16
sts _msg_buffer,R24
.dbline 175
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 176
; PORTB &= ~(1 << PB6);
cbi 0x18,6
.dbline 177
; }
xjmp L61
L60:
.dbline 179
; //退出编程模式
; else if (cmd==CMD_LEAVE_PROGMODE_ISP) {
mov R24,R14
cpi R24,17
brne L63
.dbline 179
.dbline 180
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 181
; msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
ldi R24,17
sts _msg_buffer,R24
.dbline 182
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 184
;
; flag = 0;
sts _flag,R2
.dbline 185
; PORTB |= (1 << PB6);
sbi 0x18,6
.dbline 186
; }
xjmp L64
L63:
.dbline 196
; /*写FLASH*/
; /*
; M128一页容量为256字节,而AVRISP一帧数据为128字节。
; 为了仿止有奇数帧出现,所以必顺每一帧写入一次。
; 每页数据将写入两次,但是下一帧数据不能覆盖上一帧数据。
; 整个写入过程大概如下:
; 1、写上半页:擦除一页,写入上半页数据。
; 2、写全部页:擦除一页,写入整个页数据。
; */
; else if (cmd==CMD_PROGRAM_FLASH_ISP) {
mov R24,R14
cpi R24,19
breq X6
xjmp L66
X6:
.dbline 196
.dbline 198
; /*缓存合并处理*/
; if ((address & 0xFF) == 0x00) { /*判断是否为上半页*/
ldi R20,255
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq X7
xjmp L68
X7:
.dbline 198
.dbline 199
; boot_page_ew(address,0x03); /*擦除页*/
ldi R24,3
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 200
; wait_page_rw_ok(); /*等待擦除完成 */
xcall _wait_page_rw_ok
.dbline 202
clr R12
clr R13
xjmp L73
L70:
.dbline 202
.dbline 203
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,11
add R30,R24
adc R31,R25
ldd R10,z+0
clr R11
.dbline 204
mov R11,R10
clr R10
.dbline 205
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
add R10,R2
adc R11,R3
.dbline 206
movw R18,R10
movw R16,R12
xcall _boot_page_fill
.dbline 207
L71:
.dbline 202
movw R24,R12
adiw R24,2
movw R12,R24
L73:
.dbline 202
; /*加载上半页数据*/
; for (i = 0; i < SPM_PAGESIZE; i += 2) { /*加载上半页数据*/
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L70
.dbline 208
; temp16=msg_buffer[i+11];
; temp16<<=8;
; temp16+=msg_buffer[i+10];
; boot_page_fill(i,temp16);
; }
; }
xjmp L69
L68:
.dbline 209
; else {
.dbline 212
clr R12
clr R13
xjmp L77
L74:
.dbline 212
.dbline 213
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,11
add R30,R24
adc R31,R25
ldd R10,z+0
clr R11
.dbline 214
mov R11,R10
clr R10
.dbline 215
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
add R10,R2
adc R11,R3
.dbline 216
movw R18,R10
movw R16,R12
subi R16,128 ; offset = 128
sbci R17,255
xcall _boot_page_fill
.dbline 217
L75:
.dbline 212
movw R24,R12
adiw R24,2
movw R12,R24
L77:
.dbline 212
; /*写下半页时不擦除页*/
; /*加载上半页数据*/
; for (i = 0; i < SPM_PAGESIZE; i += 2) { /*填充在后半页,完成合并*/
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L74
.dbline 218
; temp16=msg_buffer[i+11];
; temp16<<=8;
; temp16+=msg_buffer[i+10];
; boot_page_fill(i + 128, temp16);
; }
; }
L69:
.dbline 219
; boot_page_ew(address,0x05); /*将缓冲页数据写入一个Flash页 */
ldi R24,5
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 220
; wait_page_rw_ok(); /*等待写入完成 */
xcall _wait_page_rw_ok
.dbline 221
; address+=(SPM_PAGESIZE);
ldi R20,128
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 222
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 223
; msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
ldi R24,19
sts _msg_buffer,R24
.dbline 224
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 225
; }
xjmp L67
L66:
.dbline 227
; //读FLASH
; else if (cmd==CMD_READ_FLASH_ISP) {
mov R24,R14
cpi R24,20
breq X8
xjmp L79
X8:
.dbline 227
.dbline 228
clr R12
clr R13
xjmp L84
L81:
.dbline 228
.dbline 229
clr R18
movw R2,R12
clr R4
clr R5
lds R8,_address+2
lds R9,_address+2+1
lds R6,_address
lds R7,_address+1
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R16,R6
xcall _read_program_memory
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,2
add R30,R24
adc R31,R25
std z+0,R16
.dbline 230
L82:
.dbline 228
movw R24,R12
adiw R24,1
movw R12,R24
L84:
.dbline 228
; for(i=0;i<READ_BLOCK_SIZE;i++) {
movw R24,R12
cpi R24,0
ldi R30,1
cpc R25,R30
brlo L81
.dbline 231
; msg_buffer[i+2] = read_program_memory (address+i,0x00);
; }
; address+=READ_BLOCK_SIZE;
ldi R20,0
ldi R21,1
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 232
; num_bytes = READ_BLOCK_SIZE + 3;
ldi R24,259
ldi R25,1
std y+7,R25
std y+6,R24
.dbline 233
; msg_buffer[0] = CMD_READ_FLASH_ISP;
ldi R24,20
sts _msg_buffer,R24
.dbline 234
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 235
; msg_buffer[READ_BLOCK_SIZE + 2] = STATUS_CMD_OK;
sts _msg_buffer+258,R2
.dbline 236
; }
xjmp L80
L79:
.dbline 238
; //读熔丝位
; else if (cmd==CMD_READ_FUSE_ISP) {
mov R24,R14
cpi R24,24
brne L87
.dbline 238
.dbline 239
; switch(msg_buffer[2]) {
lds R10,_msg_buffer+2
clr R11
movw R24,R10
cpi R24,80
ldi R30,0
cpc R25,R30
breq L93
cpi R24,80
ldi R30,0
cpc R25,R30
brlt L90
L97:
movw R24,R10
cpi R24,88
ldi R30,0
cpc R25,R30
breq L95
xjmp L90
X3:
.dbline 239
L93:
.dbline 241
; case 0x50:
; msg_buffer[2] = read_program_memory(0x0000,1); //读熔丝位
ldi R18,1
clr R16
clr R17
xcall _read_program_memory
sts _msg_buffer+2,R16
.dbline 242
; break;
xjmp L90
L95:
.dbline 244
; case 0x58:
; msg_buffer[2] = read_program_memory(0x0003,1); //读高熔丝位
ldi R18,1
ldi R16,3
ldi R17,0
xcall _read_program_memory
sts _msg_buffer+2,R16
.dbline 245
; break;
.dbline 247
; default:
; break;
L90:
.dbline 249
; }
; num_bytes = 4;
ldi R24,4
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 250
; msg_buffer[0] = CMD_READ_FUSE_ISP;
ldi R24,24
sts _msg_buffer,R24
.dbline 251
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 252
; msg_buffer[3] = STATUS_CMD_OK;
sts _msg_buffer+3,R2
.dbline 253
; }
xjmp L88
L87:
.dbline 255
; //写锁定位
; else if (cmd==CMD_PROGRAM_LOCK_ISP) {
mov R24,R14
cpi R24,25
brne L100
.dbline 255
.dbline 257
; //write_lock_bits (msg_buffer[4]|0xC0);
; num_bytes = 3;
ldi R24,3
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 258
; msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
ldi R24,25
sts _msg_buffer,R24
.dbline 259
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 260
; msg_buffer[2] = STATUS_CMD_OK;
sts _msg_buffer+2,R2
.dbline 261
; }
xjmp L101
L100:
.dbline 263
; //读锁定位
; else if (cmd==CMD_READ_LOCK_ISP) {
mov R24,R14
cpi R24,26
brne L104
.dbline 263
.dbline 264
; msg_buffer[2] = read_program_memory(0x0001,1);
ldi R18,1
ldi R16,1
ldi R17,0
xcall _read_program_memory
sts _msg_buffer+2,R16
.dbline 265
; num_bytes = 4;
ldi R24,4
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 266
; msg_buffer[0] = CMD_READ_LOCK_ISP;
ldi R24,26
sts _msg_buffer,R24
.dbline 267
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 268
; msg_buffer[3] = STATUS_CMD_OK;
sts _msg_buffer+3,R2
.dbline 269
; }
L104:
L101:
L88:
L80:
L67:
L64:
L61:
L58:
L52:
L39:
L36:
L30:
.dbline 271
; //传送缓冲区数据
; if (num_bytes>0) {
ldd R0,y+6
ldd R1,y+7
tst R0
brne X4
tst R1
brne X9
xjmp L109
X9:
X4:
.dbline 271
.dbline 272
; putChar(MESSAGE_START);
ldi R16,27
xcall _putChar
.dbline 273
; checkSum=MESSAGE_START;
ldi R24,27
sts _checkSum,R24
.dbline 274
; putChar(seqNum);
ldd R16,y+19
xcall _putChar
.dbline 275
; checkSum^=seqNum;
lds R2,_checkSum
ldd R0,y+19
eor R2,R0
sts _checkSum,R2
.dbline 276
; tmp=(num_bytes&0xFF00)>>8;
ldd R24,y+6
ldd R25,y+7
andi R24,0
mov R24,R25
clr R25
std y+8,R24
.dbline 277
; putChar(tmp);
mov R16,R24
xcall _putChar
.dbline 278
; checkSum^=tmp;
lds R2,_checkSum
ldd R0,y+8
eor R2,R0
sts _checkSum,R2
.dbline 279
; tmp=num_bytes&0x00FF;
ldd R24,y+6
ldd R25,y+7
andi R25,0
std y+8,R24
.dbline 280
; putChar(tmp);
mov R16,R24
xcall _putChar
.dbline 281
; checkSum^=tmp;
lds R2,_checkSum
ldd R0,y+8
eor R2,R0
sts _checkSum,R2
.dbline 282
; putChar(TOKEN);
ldi R16,14
xcall _putChar
.dbline 283
; checkSum^=TOKEN;
ldi R24,14
lds R2,_checkSum
eor R2,R24
sts _checkSum,R2
.dbline 284
clr R12
clr R13
xjmp L114
L111:
.dbline 284
.dbline 285
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _putChar
.dbline 286
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
add R30,R24
adc R31,R25
ldd R2,z+0
lds R3,_checkSum
eor R3,R2
sts _checkSum,R3
.dbline 287
L112:
.dbline 284
movw R24,R12
adiw R24,1
movw R12,R24
L114:
.dbline 284
ldd R0,y+6
ldd R1,y+7
cp R12,R0
cpc R13,R1
brlo L111
.dbline 288
lds R16,_checkSum
xcall _putChar
.dbline 289
clr R2
sts _checkSum,R2
.dbline 290
L109:
.dbline -2
L28:
adiw R28,9
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r temp16 10 i
.dbsym l start_address 2 l
.dbsym r cmd 14 c
.dbsym l tmp 8 c
.dbsym l num_bytes 6 i
.dbsym r i 12 i
.dbsym l seqNum 19 c
.dbend
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\main.c
L34:
.blkb 9
.area idata
.byte 'S,'T,'K,53,48,48,95,50,0
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\main.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -