📄 stk500i.lst
字号:
(0362) num_bytes = 2;
02F2 E082 LDI R24,2
02F3 E090 LDI R25,0
02F4 879B STD Y+11,R25
02F5 878A STD Y+10,R24
(0363) msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
02F6 E181 LDI R24,0x11
02F7 93800074 STS msg_buffer,R24
(0364) msg_buffer[1] = STATUS_CMD_OK;
02F9 2422 CLR R2
02FA 92200075 STS msg_buffer+1,R2
(0365) }
02FC C55D RJMP 0x085A
(0366) //////////////////////////////////////
(0367) //CMD_CHIP_ERASE_ISP
(0368) //////////////////////////////////////
(0369) else if(cmd==CMD_CHIP_ERASE_ISP)
02FD 858C LDD R24,Y+12
02FE 3182 CPI R24,0x12
02FF F539 BNE 0x0327
(0370) {
(0371) spi_transfer_8(msg_buffer[3]);
0300 91000077 LDS R16,msg_buffer+3
0302 D5EE RCALL _spi_transfer_8
(0372) spi_transfer_8(msg_buffer[4]);
0303 91000078 LDS R16,0x78
0305 D5EB RCALL _spi_transfer_8
(0373) spi_transfer_8(msg_buffer[5]);
0306 91000079 LDS R16,0x79
0308 D5E8 RCALL _spi_transfer_8
(0374) spi_transfer_8(msg_buffer[6]);
0309 9100007A LDS R16,0x7A
030B D5E5 RCALL _spi_transfer_8
(0375)
(0376) //Newer AVR's seems to have a busy bit
(0377) //cant test this because I don't have any of these new chips
(0378) if(msg_buffer[2]==0)
030C 90200076 LDS R2,msg_buffer+2
030E 2022 TST R2
030F F429 BNE 0x0315
(0379) {
(0380) wait_ms(msg_buffer[1]);
0310 91000075 LDS R16,msg_buffer+1
0312 2711 CLR R17
0313 DD48 RCALL _wait_ms
(0381) }
0314 C007 RJMP 0x031C
(0382) else //if(msg_buffer[2]==1)
(0383) {
(0384) while(spi_transfer_32(0xF0000000)&1);
0315 E000 LDI R16,0
0316 E010 LDI R17,0
0317 E020 LDI R18,0
0318 EF30 LDI R19,0xF0
0319 D5E8 RCALL _spi_transfer_32
031A FD00 SBRC R16,0
031B CFF9 RJMP 0x0315
(0385) }
(0386)
(0387) num_bytes = 2;
031C E082 LDI R24,2
031D E090 LDI R25,0
031E 879B STD Y+11,R25
031F 878A STD Y+10,R24
(0388) msg_buffer[0] = CMD_CHIP_ERASE_ISP;
0320 E182 LDI R24,0x12
0321 93800074 STS msg_buffer,R24
(0389) msg_buffer[1] = STATUS_CMD_OK;
0323 2422 CLR R2
0324 92200075 STS msg_buffer+1,R2
(0390) }
0326 C533 RJMP 0x085A
(0391) //////////////////////////////////////
(0392) //CMD_PROGRAM_FLASH_ISP
(0393) //////////////////////////////////////
(0394) else if(cmd==CMD_PROGRAM_FLASH_ISP)
0327 858C LDD R24,Y+12
0328 3183 CPI R24,0x13
0329 F009 BEQ 0x032B
032A C1BC RJMP 0x04E7
(0395) {
(0396) block_size = ((unsigned int)msg_buffer[1])<<8;
032B 90A00075 LDS R10,msg_buffer+1
032D 24BB CLR R11
032E 2CBA MOV R11,R10
032F 24AA CLR R10
(0397) block_size |= msg_buffer[2];
0330 90200076 LDS R2,msg_buffer+2
0332 2433 CLR R3
0333 28A2 OR R10,R2
0334 28B3 OR R11,R3
(0398) mode = msg_buffer[3];
0335 90E00077 LDS R14,msg_buffer+3
(0399)
(0400) //Word Mode
(0401) if((mode&1) == 0)
0337 FCE0 SBRC R14,0
0338 C0A2 RJMP 0x03DB
(0402) {
(0403) for(i=0;i<block_size;i++)
0339 24CC CLR R12
033A 24DD CLR R13
033B C09A RJMP 0x03D6
(0404) {
(0405) //If we have an uneven byte programm the
(0406) //high byte
(0407) if(i&1)
033C FEC0 SBRS R12,0
033D C005 RJMP 0x0343
(0408) {
(0409) spi_transfer_8(msg_buffer[5]|(1<<3));
033E 91000079 LDS R16,0x79
0340 6008 ORI R16,0x8
0341 D5AF RCALL _spi_transfer_8
(0410) }
0342 C003 RJMP 0x0346
(0411) else
(0412) {
(0413) spi_transfer_8(msg_buffer[5]);
0343 91000079 LDS R16,0x79
0345 D5AB RCALL _spi_transfer_8
(0414) }
(0415)
(0416) spi_transfer_16(address&0xFFFF);
0346 EF4F LDI R20,0xFF
0347 EF5F LDI R21,0xFF
0348 E060 LDI R22,0
0349 E070 LDI R23,0
034A 9040006E LDS R4,address+2
034C 9050006F LDS R5,address+3
034E 9020006C LDS R2,address
0350 9030006D LDS R3,address+1
0352 2224 AND R2,R20
0353 2235 AND R3,R21
0354 2246 AND R4,R22
0355 2257 AND R5,R23
0356 0181 MOVW R16,R2
0357 D59E RCALL _spi_transfer_16
(0417) spi_transfer_8(msg_buffer[i+10]);
0358 E784 LDI R24,0x74
0359 E090 LDI R25,0
035A 01F6 MOVW R30,R12
035B 963A ADIW R30,0xA
035C 0FE8 ADD R30,R24
035D 1FF9 ADC R31,R25
035E 8100 LDD R16,Z+0
035F D591 RCALL _spi_transfer_8
(0418)
(0419) //Check if we can do polling
(0420) if(msg_buffer[8]!=msg_buffer[i+10])
0360 E784 LDI R24,0x74
0361 E090 LDI R25,0
0362 01F6 MOVW R30,R12
0363 963A ADIW R30,0xA
0364 0FE8 ADD R30,R24
0365 1FF9 ADC R31,R25
0366 8020 LDD R2,Z+0
0367 9030007C LDS R3,0x7C
0369 1432 CP R3,R2
036A F0B1 BEQ 0x0381
(0421) {
(0422) polling_address = address&0xFFFF;
036B EF4F LDI R20,0xFF
036C EF5F LDI R21,0xFF
036D E060 LDI R22,0
036E E070 LDI R23,0
036F 9040006E LDS R4,address+2
0371 9050006F LDS R5,address+3
0373 9020006C LDS R2,address
0375 9030006D LDS R3,address+1
0377 2224 AND R2,R20
0378 2235 AND R3,R21
0379 2246 AND R4,R22
037A 2257 AND R5,R23
037B 01FE MOVW R30,R28
037C 8222 STD Z+2,R2
037D 8233 STD Z+3,R3
037E 8244 STD Z+4,R4
037F 8255 STD Z+5,R5
(0423) }
0380 C004 RJMP 0x0385
(0424) //If not switch the mode hard waiting
(0425) else
(0426) {
(0427) mode = (mode&(~0x0E)) | 0x02;
0381 2D8E MOV R24,R14
0382 7F81 ANDI R24,0xF1
0383 6082 ORI R24,2
0384 2EE8 MOV R14,R24
(0428) }
(0429)
(0430) //Different polling methods
(0431) //Hard waiting
(0432) if((mode&0x0E) == 0x02)
0385 2D8E MOV R24,R14
0386 708E ANDI R24,0xE
0387 3082 CPI R24,2
0388 F429 BNE 0x038E
(0433) {
(0434) wait_ms(msg_buffer[4]);
0389 91000078 LDS R16,0x78
038B 2711 CLR R17
038C DCCF RCALL _wait_ms
(0435) }
038D C02B RJMP 0x03B9
(0436) //Data polling
(0437) else if((mode&0x0E) == 0x04)
038E 2D8E MOV R24,R14
038F 708E ANDI R24,0xE
0390 3084 CPI R24,4
0391 F4B9 BNE 0x03A9
(0438) {
(0439) do{
(0440) //If we have an uneven byte read the
(0441) //high byte
(0442) if(i&1)
0392 FEC0 SBRS R12,0
0393 C005 RJMP 0x0399
(0443) {
(0444) spi_transfer_8(msg_buffer[7]|(1<<3));
0394 9100007B LDS R16,0x7B
0396 6008 ORI R16,0x8
0397 D559 RCALL _spi_transfer_8
(0445) }
0398 C003 RJMP 0x039C
(0446) else
(0447) {
(0448) spi_transfer_8(msg_buffer[7]);
0399 9100007B LDS R16,0x7B
039B D555 RCALL _spi_transfer_8
(0449) }
(0450) spi_transfer_16(polling_address);
039C 01FE MOVW R30,R28
039D 8102 LDD R16,Z+2
039E 8113 LDD R17,Z+3
039F D556 RCALL _spi_transfer_16
(0451) tmp=spi_transfer_8(0x00);
03A0 2700 CLR R16
03A1 D54F RCALL _spi_transfer_8
03A2 870D STD Y+13,R16
(0452) }while(tmp==msg_buffer[8]);
03A3 9020007C LDS R2,0x7C
03A5 840D LDD R0,Y+13
03A6 1402 CP R0,R2
03A7 F351 BEQ 0x0392
(0453) }
03A8 C010 RJMP 0x03B9
(0454) //RDY/BSY polling
(0455) else if((mode&0x0E) == 0x08)
03A9 2D8E MOV R24,R14
03AA 708E ANDI R24,0xE
03AB 3088 CPI R24,0x8
03AC F441 BNE 0x03B5
(0456) {
(0457) while(spi_transfer_32(0xF0000000)&1);
03AD E000 LDI R16,0
03AE E010 LDI R17,0
03AF E020 LDI R18,0
03B0 EF30 LDI R19,0xF0
03B1 D550 RCALL _spi_transfer_32
03B2 FD00 SBRC R16,0
03B3 CFF9 RJMP 0x03AD
(0458) }
03B4 C004 RJMP 0x03B9
(0459) //If something was not correct with the given mode do
(0460) //hard waiting. Should never reach this point
(0461) else
(0462) {
(0463) wait_ms(msg_buffer[4]);
03B5 91000078 LDS R16,0x78
03B7 2711 CLR R17
03B8 DCA3 RCALL _wait_ms
(0464) }
(0465)
(0466) //increment (word) address only when we have an uneven (byte) address
(0467) if(i&1) address++;
03B9 FEC0 SBRS R12,0
03BA C018 RJMP 0x03D3
03BB E041 LDI R20,1
03BC E050 LDI R21,0
03BD E060 LDI R22,0
03BE E070 LDI R23,0
03BF 9040006E LDS R4,address+2
03C1 9050006F LDS R5,address+3
03C3 9020006C LDS R2,address
03C5 9030006D LDS R3,address+1
03C7 0E24 ADD R2,R20
03C8 1E35 ADC R3,R21
03C9 1E46 ADC R4,R22
03CA 1E57 ADC R5,R23
03CB 9230006D STS address+1,R3
03CD 9220006C STS address,R2
03CF 9250006F STS address+3,R5
03D1 9240006E STS address+2,R4
03D3 01C6 MOVW R24,R12
03D4 9601 ADIW R24,1
03D5 016C MOVW R12,R24
03D6 14CA CP R12,R10
03D7 04DB CPC R13,R11
03D8 F408 BCC 0x03DA
03D9 CF62 RJMP 0x033C
(0468) }
(0469) }
03DA C101 RJMP 0x04DC
(0470) //Page Mode
(0471) else
(0472) {
(0473) for(i=0;i<block_size;i++)
03DB 24CC CLR R12
03DC 24DD CLR R13
03DD C081 RJMP 0x045F
(0474) {
(0475) //If we have an uneven byte programm the
(0476) //high byte
(0477) if(i&1)
03DE FEC0 SBRS R12,0
03DF C005 RJMP 0x03E5
(0478) {
(0479) spi_transfer_8(msg_buffer[5]|(1<<3));
03E0 91000079 LDS R16,0x79
03E2 6008 ORI R16,0x8
03E3 D50D RCALL _spi_transfer_8
(0480) }
03E4 C003 RJMP 0x03E8
(0481) else
(0482) {
(0483) spi_transfer_8(msg_buffer[5]);
03E5 91000079 LDS R16,0x79
03E7 D509 RCALL _spi_transfer_8
(0484) }
(0485)
(0486) spi_transfer_16(address&0xFFFF);
03E8 EF4F LDI R20,0xFF
03E9 EF5F LDI R21,0xFF
03EA E060 LDI R22,0
03EB E070 LDI R23,0
03EC 9040006E LDS R4,address+2
03EE 9050006F LDS R5,address+3
03F0 9020006C LDS R2,address
03F2 9030006D LDS R3,address+1
03F4 2224 AND R2,R20
03F5 2235 AND R3,R21
03F6 2246 AND R4,R22
03F7 2257 AND R5,R23
03F8 0181 MOVW R16,R2
03F9 D4FC RCALL _spi_transfer_16
(0487) spi_transfer_8(msg_buffer[i+10]);
03FA E784 LDI R24,0x74
03FB E090 LDI R25,0
03FC 01F6 MOVW R30,R12
03FD 963A ADIW R30,0xA
03FE 0FE8 ADD R30,R24
03FF 1FF9 ADC R31,R25
0400 8100 LDD R16,Z+0
0401 D4EF RCALL _spi_transfer_8
(0488)
(0489) //Check if we can do polling
(0490) if(msg_buffer[8]!=msg_buffer[i+10])
0402 E784 LDI R24,0x74
0403 E090 LDI R25,0
0404 01F6 MOVW R30,R12
0405 963A ADIW R30,0xA
0406 0FE8 ADD R30,R24
0407 1FF9 ADC R31,R25
0408 8020 LDD R2,Z+0
0409 9030007C LDS R3,0x7C
040B 1432 CP R3,R2
040C F409 BNE 0x040E
040D C034 RJMP 0x0442
(0491) {
(0492) //We have to check if we have an uneven byte.
(0493) //Set the polling address to a byte address
(0494) //so that we can poll the right location
(0495) polling_address = (address&0xFFFF)*2;
040E EF4F LDI R20,0xFF
040F EF5F LDI R21,0xFF
0410 E060 LDI R22,0
0411 E070 LDI R23,0
0412 9040006E LDS R4,address+2
0414 9050006F LDS R5,address+3
0416 9020006C LDS R2,address
0418 9030006D LDS R3,address+1
041A 2224 AND R2,R20
041B 2235 AND R3,R21
041C 2246 AND R4,R22
041D 2257 AND R5,R23
041E E042 LDI R20,2
041F E050 LDI R21,0
0420 E060 LDI R22,0
0421 E070 LDI R23,0
0422 925A ST R5,-Y
0423 924A ST R4,-Y
0424 923A ST R3,-Y
0425 922A ST R2,-Y
0426 018A MOVW R16,R20
0427 019B MOVW R18,R22
0428 D540 RCALL empy32s
0429 01FE MOVW R30,R28
042A 8302 STD Z+2,R16
042B 8313 STD Z+3,R17
042C 8324 STD Z+4,R18
042D 8335 STD Z+5,R19
(0496) if(i&1) polling_address++;
042E FEC0 SBRS R12,0
042F C012 RJMP 0x0442
0430 E041 LDI R20,1
0431 E050 LDI R21,0
0432 E060 LDI R22,0
0433 E070 LDI R23,0
0434 01FE MOVW R30,R28
0435 8022 LDD R2,Z+2
0436 8033 LDD R3,Z+3
0437 8044 LDD R4,Z+4
0438 8055 LDD R5,Z+5
0439 0E24 ADD R2,R20
043A 1E35 ADC R3,R21
043B 1E46 ADC R4,R22
043C 1E57 ADC R5,R23
043D 01FE MOVW R30,R28
043E 8222 STD Z+2,R2
043F 8233 STD Z+3,R3
0440 8244 STD Z+4,R4
0441 8255 STD Z+5,R5
(0497) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -