📄 main.lis
字号:
0316 ; msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
0316 80E1 ldi R24,16
0318 80930000 sts _msg_buffer,R24
031C .dbline 175
031C ; msg_buffer[1] = STATUS_CMD_OK;
031C 2224 clr R2
031E 20920100 sts _msg_buffer+1,R2
0322 .dbline 176
0322 ; PORTB &= ~(1 << PB6);
0322 C698 cbi 0x18,6
0324 .dbline 177
0324 ; }
0324 58C1 xjmp L61
0326 L60:
0326 .dbline 179
0326 ; //退出编程模式
0326 ; else if (cmd==CMD_LEAVE_PROGMODE_ISP) {
0326 8E2D mov R24,R14
0328 8131 cpi R24,17
032A 71F4 brne L63
032C .dbline 179
032C .dbline 180
032C ; num_bytes = 2;
032C 82E0 ldi R24,2
032E 90E0 ldi R25,0
0330 9F83 std y+7,R25
0332 8E83 std y+6,R24
0334 .dbline 181
0334 ; msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
0334 81E1 ldi R24,17
0336 80930000 sts _msg_buffer,R24
033A .dbline 182
033A ; msg_buffer[1] = STATUS_CMD_OK;
033A 2224 clr R2
033C 20920100 sts _msg_buffer+1,R2
0340 .dbline 184
0340 ;
0340 ; flag = 0;
0340 20920000 sts _flag,R2
0344 .dbline 185
0344 ; PORTB |= (1 << PB6);
0344 C69A sbi 0x18,6
0346 .dbline 186
0346 ; }
0346 47C1 xjmp L64
0348 L63:
0348 .dbline 196
0348 ; /*写FLASH*/
0348 ; /*
0348 ; M128一页容量为256字节,而AVRISP一帧数据为128字节。
0348 ; 为了仿止有奇数帧出现,所以必顺每一帧写入一次。
0348 ; 每页数据将写入两次,但是下一帧数据不能覆盖上一帧数据。
0348 ; 整个写入过程大概如下:
0348 ; 1、写上半页:擦除一页,写入上半页数据。
0348 ; 2、写全部页:擦除一页,写入整个页数据。
0348 ; */
0348 ; else if (cmd==CMD_PROGRAM_FLASH_ISP) {
0348 8E2D mov R24,R14
034A 8331 cpi R24,19
034C 09F0 breq X6
034E 9EC0 xjmp L66
0350 X6:
0350 .dbline 196
0350 .dbline 198
0350 ; /*缓存合并处理*/
0350 ; if ((address & 0xFF) == 0x00) { /*判断是否为上半页*/
0350 4FEF ldi R20,255
0352 50E0 ldi R21,0
0354 60E0 ldi R22,0
0356 70E0 ldi R23,0
0358 40900200 lds R4,_address+2
035C 50900300 lds R5,_address+2+1
0360 20900000 lds R2,_address
0364 30900100 lds R3,_address+1
0368 2422 and R2,R20
036A 3522 and R3,R21
036C 4622 and R4,R22
036E 5722 and R5,R23
0370 40E0 ldi R20,0
0372 50E0 ldi R21,0
0374 60E0 ldi R22,0
0376 70E0 ldi R23,0
0378 2416 cp R2,R20
037A 3506 cpc R3,R21
037C 4606 cpc R4,R22
037E 5706 cpc R5,R23
0380 09F0 breq X7
0382 30C0 xjmp L68
0384 X7:
0384 .dbline 198
0384 .dbline 199
0384 ; boot_page_ew(address,0x03); /*擦除页*/
0384 83E0 ldi R24,3
0386 8883 std y+0,R24
0388 20910200 lds R18,_address+2
038C 30910300 lds R19,_address+2+1
0390 00910000 lds R16,_address
0394 10910100 lds R17,_address+1
0398 0E940000 xcall _boot_page_ew
039C .dbline 200
039C ; wait_page_rw_ok(); /*等待擦除完成 */
039C 0E940000 xcall _wait_page_rw_ok
03A0 .dbline 202
03A0 CC24 clr R12
03A2 DD24 clr R13
03A4 19C0 xjmp L73
03A6 L70:
03A6 .dbline 202
03A6 .dbline 203
03A6 80E0 ldi R24,<_msg_buffer
03A8 90E0 ldi R25,>_msg_buffer
03AA F601 movw R30,R12
03AC 3B96 adiw R30,11
03AE E80F add R30,R24
03B0 F91F adc R31,R25
03B2 A080 ldd R10,z+0
03B4 BB24 clr R11
03B6 .dbline 204
03B6 BA2C mov R11,R10
03B8 AA24 clr R10
03BA .dbline 205
03BA F601 movw R30,R12
03BC 3A96 adiw R30,10
03BE E80F add R30,R24
03C0 F91F adc R31,R25
03C2 2080 ldd R2,z+0
03C4 3324 clr R3
03C6 A20C add R10,R2
03C8 B31C adc R11,R3
03CA .dbline 206
03CA 9501 movw R18,R10
03CC 8601 movw R16,R12
03CE 0E940000 xcall _boot_page_fill
03D2 .dbline 207
03D2 L71:
03D2 .dbline 202
03D2 C601 movw R24,R12
03D4 0296 adiw R24,2
03D6 6C01 movw R12,R24
03D8 L73:
03D8 .dbline 202
03D8 ; /*加载上半页数据*/
03D8 ; for (i = 0; i < SPM_PAGESIZE; i += 2) { /*加载上半页数据*/
03D8 C601 movw R24,R12
03DA 8038 cpi R24,128
03DC E0E0 ldi R30,0
03DE 9E07 cpc R25,R30
03E0 10F3 brlo L70
03E2 .dbline 208
03E2 ; temp16=msg_buffer[i+11];
03E2 ; temp16<<=8;
03E2 ; temp16+=msg_buffer[i+10];
03E2 ; boot_page_fill(i,temp16);
03E2 ; }
03E2 ; }
03E2 23C0 xjmp L69
03E4 L68:
03E4 .dbline 209
03E4 ; else {
03E4 .dbline 212
03E4 CC24 clr R12
03E6 DD24 clr R13
03E8 1BC0 xjmp L77
03EA L74:
03EA .dbline 212
03EA .dbline 213
03EA 80E0 ldi R24,<_msg_buffer
03EC 90E0 ldi R25,>_msg_buffer
03EE F601 movw R30,R12
03F0 3B96 adiw R30,11
03F2 E80F add R30,R24
03F4 F91F adc R31,R25
03F6 A080 ldd R10,z+0
03F8 BB24 clr R11
03FA .dbline 214
03FA BA2C mov R11,R10
03FC AA24 clr R10
03FE .dbline 215
03FE F601 movw R30,R12
0400 3A96 adiw R30,10
0402 E80F add R30,R24
0404 F91F adc R31,R25
0406 2080 ldd R2,z+0
0408 3324 clr R3
040A A20C add R10,R2
040C B31C adc R11,R3
040E .dbline 216
040E 9501 movw R18,R10
0410 8601 movw R16,R12
0412 0058 subi R16,128 ; offset = 128
0414 1F4F sbci R17,255
0416 0E940000 xcall _boot_page_fill
041A .dbline 217
041A L75:
041A .dbline 212
041A C601 movw R24,R12
041C 0296 adiw R24,2
041E 6C01 movw R12,R24
0420 L77:
0420 .dbline 212
0420 ; /*写下半页时不擦除页*/
0420 ; /*加载上半页数据*/
0420 ; for (i = 0; i < SPM_PAGESIZE; i += 2) { /*填充在后半页,完成合并*/
0420 C601 movw R24,R12
0422 8038 cpi R24,128
0424 E0E0 ldi R30,0
0426 9E07 cpc R25,R30
0428 00F3 brlo L74
042A .dbline 218
042A ; temp16=msg_buffer[i+11];
042A ; temp16<<=8;
042A ; temp16+=msg_buffer[i+10];
042A ; boot_page_fill(i + 128, temp16);
042A ; }
042A ; }
042A L69:
042A .dbline 219
042A ; boot_page_ew(address,0x05); /*将缓冲页数据写入一个Flash页 */
042A 85E0 ldi R24,5
042C 8883 std y+0,R24
042E 20910200 lds R18,_address+2
0432 30910300 lds R19,_address+2+1
0436 00910000 lds R16,_address
043A 10910100 lds R17,_address+1
043E 0E940000 xcall _boot_page_ew
0442 .dbline 220
0442 ; wait_page_rw_ok(); /*等待写入完成 */
0442 0E940000 xcall _wait_page_rw_ok
0446 .dbline 221
0446 ; address+=(SPM_PAGESIZE);
0446 40E8 ldi R20,128
0448 50E0 ldi R21,0
044A 60E0 ldi R22,0
044C 70E0 ldi R23,0
044E 40900200 lds R4,_address+2
0452 50900300 lds R5,_address+2+1
0456 20900000 lds R2,_address
045A 30900100 lds R3,_address+1
045E 240E add R2,R20
0460 351E adc R3,R21
0462 461E adc R4,R22
0464 571E adc R5,R23
0466 30920100 sts _address+1,R3
046A 20920000 sts _address,R2
046E 50920300 sts _address+2+1,R5
0472 40920200 sts _address+2,R4
0476 .dbline 222
0476 ; num_bytes = 2;
0476 82E0 ldi R24,2
0478 90E0 ldi R25,0
047A 9F83 std y+7,R25
047C 8E83 std y+6,R24
047E .dbline 223
047E ; msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
047E 83E1 ldi R24,19
0480 80930000 sts _msg_buffer,R24
0484 .dbline 224
0484 ; msg_buffer[1] = STATUS_CMD_OK;
0484 2224 clr R2
0486 20920100 sts _msg_buffer+1,R2
048A .dbline 225
048A ; }
048A A5C0 xjmp L67
048C L66:
048C .dbline 227
048C ; //读FLASH
048C ; else if (cmd==CMD_READ_FLASH_ISP) {
048C 8E2D mov R24,R14
048E 8431 cpi R24,20
0490 09F0 breq X8
0492 4AC0 xjmp L79
0494 X8:
0494 .dbline 227
0494 .dbline 228
0494 CC24 clr R12
0496 DD24 clr R13
0498 1DC0 xjmp L84
049A L81:
049A .dbline 228
049A .dbline 229
049A 2227 clr R18
049C 1601 movw R2,R12
049E 4424 clr R4
04A0 5524 clr R5
04A2 80900200 lds R8,_address+2
04A6 90900300 lds R9,_address+2+1
04AA 60900000 lds R6,_address
04AE 70900100 lds R7,_address+1
04B2 620C add R6,R2
04B4 731C adc R7,R3
04B6 841C adc R8,R4
04B8 951C adc R9,R5
04BA 8301 movw R16,R6
04BC 0E940000 xcall _read_program_memory
04C0 80E0 ldi R24,<_msg_buffer
04C2 90E0 ldi R25,>_msg_buffer
04C4 F601 movw R30,R12
04C6 3296 adiw R30,2
04C8 E80F add R30,R24
04CA F91F adc R31,R25
04CC 0083 std z+0,R16
04CE .dbline 230
04CE L82:
04CE .dbline 228
04CE C601 movw R24,R12
04D0 0196 adiw R24,1
04D2 6C01 movw R12,R24
04D4 L84:
04D4 .dbline 228
04D4 ; for(i=0;i<READ_BLOCK_SIZE;i++) {
04D4 C601 movw R24,R12
04D6 8030 cpi R24,0
04D8 E1E0 ldi R30,1
04DA 9E07 cpc R25,R30
04DC F0F2 brlo L81
04DE .dbline 231
04DE ; msg_buffer[i+2] = read_program_memory (address+i,0x00);
04DE ; }
04DE ; address+=READ_BLOCK_SIZE;
04DE 40E0 ldi R20,0
04E0 51E0 ldi R21,1
04E2 60E0 ldi R22,0
04E4 70E0 ldi R23,0
04E6 40900200 lds R4,_address+2
04EA 50900300 lds R5,_address+2+1
04EE 20900000 lds R2,_address
04F2 30900100 lds R3,_address+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -