📄 stk500i.lst
字号:
(0499) polling_address = (address&0xFFFF)*2;
0479 EF4F LDI R20,0xFF
047A EF5F LDI R21,0xFF
047B E060 LDI R22,0
047C E070 LDI R23,0
047D 9040010E LDS R4,address+2
047F 9050010F LDS R5,address+3
0481 9020010C LDS R2,address
0483 9030010D LDS R3,address+1
0485 2224 AND R2,R20
0486 2235 AND R3,R21
0487 2246 AND R4,R22
0488 2257 AND R5,R23
0489 E042 LDI R20,2
048A E050 LDI R21,0
048B E060 LDI R22,0
048C E070 LDI R23,0
048D 925A ST R5,-Y
048E 924A ST R4,-Y
048F 923A ST R3,-Y
0490 922A ST R2,-Y
0491 018A MOVW R16,R20
0492 019B MOVW R18,R22
0493 D580 RCALL empy32s
0494 01FE MOVW R30,R28
0495 8302 STD Z+2,R16
0496 8313 STD Z+3,R17
0497 8324 STD Z+4,R18
0498 8335 STD Z+5,R19
(0500) if(i&1) polling_address++;
0499 FEC0 SBRS R12,0
049A C012 RJMP 0x04AD
049B E041 LDI R20,1
049C E050 LDI R21,0
049D E060 LDI R22,0
049E E070 LDI R23,0
049F 01FE MOVW R30,R28
04A0 8022 LDD R2,Z+2
04A1 8033 LDD R3,Z+3
04A2 8044 LDD R4,Z+4
04A3 8055 LDD R5,Z+5
04A4 0E24 ADD R2,R20
04A5 1E35 ADC R3,R21
04A6 1E46 ADC R4,R22
04A7 1E57 ADC R5,R23
04A8 01FE MOVW R30,R28
04A9 8222 STD Z+2,R2
04AA 8233 STD Z+3,R3
04AB 8244 STD Z+4,R4
04AC 8255 STD Z+5,R5
(0501) }
(0502)
(0503) //increment (word) address only when we have an uneven (byte) address
(0504) if(i&1) address++;
04AD FEC0 SBRS R12,0
04AE C018 RJMP 0x04C7
04AF E041 LDI R20,1
04B0 E050 LDI R21,0
04B1 E060 LDI R22,0
04B2 E070 LDI R23,0
04B3 9040010E LDS R4,address+2
04B5 9050010F LDS R5,address+3
04B7 9020010C LDS R2,address
04B9 9030010D LDS R3,address+1
04BB 0E24 ADD R2,R20
04BC 1E35 ADC R3,R21
04BD 1E46 ADC R4,R22
04BE 1E57 ADC R5,R23
04BF 9230010D STS address+1,R3
04C1 9220010C STS address,R2
04C3 9250010F STS address+3,R5
04C5 9240010E STS address+2,R4
04C7 01C6 MOVW R24,R12
04C8 9601 ADIW R24,1
04C9 016C MOVW R12,R24
04CA 14CA CP R12,R10
04CB 04DB CPC R13,R11
04CC F408 BCC 0x04CE
04CD CF7B RJMP 0x0449
(0505) }
(0506)
(0507) //If this page is complete the bit 7 of mode will be set and we programm the page
(0508) if(mode&0x80)
04CE FEE7 SBRS R14,7
04CF C077 RJMP 0x0547
(0509) {
(0510) spi_transfer_8(msg_buffer[6]);
04D0 9100011A LDS R16,0x11A
04D2 D4C8 RCALL _spi_transfer_8
(0511) spi_transfer_16(start_address&0xFFFF);
04D3 EF4F LDI R20,0xFF
04D4 EF5F LDI R21,0xFF
04D5 E060 LDI R22,0
04D6 E070 LDI R23,0
04D7 01FE MOVW R30,R28
04D8 8026 LDD R2,Z+6
04D9 8037 LDD R3,Z+7
04DA 8440 LDD R4,Z+8
04DB 8451 LDD R5,Z+9
04DC 2224 AND R2,R20
04DD 2235 AND R3,R21
04DE 2246 AND R4,R22
04DF 2257 AND R5,R23
04E0 0181 MOVW R16,R2
04E1 D4BF RCALL _spi_transfer_16
(0512) spi_transfer_8(0);
04E2 2700 CLR R16
04E3 D4B7 RCALL _spi_transfer_8
(0513)
(0514) //If we have no valid polling address switch to simple wait mode
(0515) if(polling_address==0)
04E4 E040 LDI R20,0
04E5 E050 LDI R21,0
04E6 E060 LDI R22,0
04E7 E070 LDI R23,0
04E8 01FE MOVW R30,R28
04E9 8022 LDD R2,Z+2
04EA 8033 LDD R3,Z+3
04EB 8044 LDD R4,Z+4
04EC 8055 LDD R5,Z+5
04ED 1624 CP R2,R20
04EE 0635 CPC R3,R21
04EF 0646 CPC R4,R22
04F0 0657 CPC R5,R23
04F1 F421 BNE 0x04F6
(0516) {
(0517) mode = (mode&(~0x70)) | 0x10;
04F2 2D8E MOV R24,R14
04F3 788F ANDI R24,0x8F
04F4 6180 ORI R24,0x10
04F5 2EE8 MOV R14,R24
(0518) }
(0519)
(0520) //Different polling methods
(0521) //Hard waiting
(0522) if((mode&0x70) == 0x10)
04F6 2D8E MOV R24,R14
04F7 7780 ANDI R24,0x70
04F8 3180 CPI R24,0x10
04F9 F429 BNE 0x04FF
(0523) {
(0524) wait_ms(msg_buffer[4]);
04FA 91000118 LDS R16,0x118
04FC 2711 CLR R17
04FD DB56 RCALL _wait_ms
(0525) }
04FE C048 RJMP 0x0547
(0526) //Data polling
(0527) else if((mode&0x70) == 0x20)
04FF 2D8E MOV R24,R14
0500 7780 ANDI R24,0x70
0501 3280 CPI R24,0x20
0502 F009 BEQ 0x0504
0503 C033 RJMP 0x0537
(0528) {
(0529) do{
(0530) //If we have an uneven byte read the
(0531) //high byte
(0532) if(polling_address%2)
0504 E041 LDI R20,1
0505 E050 LDI R21,0
0506 E060 LDI R22,0
0507 E070 LDI R23,0
0508 01FE MOVW R30,R28
0509 8022 LDD R2,Z+2
050A 8033 LDD R3,Z+3
050B 8044 LDD R4,Z+4
050C 8055 LDD R5,Z+5
050D 2224 AND R2,R20
050E 2235 AND R3,R21
050F 2246 AND R4,R22
0510 2257 AND R5,R23
0511 E040 LDI R20,0
0512 E050 LDI R21,0
0513 E060 LDI R22,0
0514 E070 LDI R23,0
0515 1624 CP R2,R20
0516 0635 CPC R3,R21
0517 0646 CPC R4,R22
0518 0657 CPC R5,R23
0519 F029 BEQ 0x051F
(0533) {
(0534) spi_transfer_8(msg_buffer[7]|(1<<3));
051A 9100011B LDS R16,0x11B
051C 6008 ORI R16,0x8
051D D47D RCALL _spi_transfer_8
(0535) }
051E C003 RJMP 0x0522
(0536) else
(0537) {
(0538) spi_transfer_8(msg_buffer[7]);
051F 9100011B LDS R16,0x11B
0521 D479 RCALL _spi_transfer_8
(0539) }
(0540) spi_transfer_16(polling_address/2);
0522 01FE MOVW R30,R28
0523 8022 LDD R2,Z+2
0524 8033 LDD R3,Z+3
0525 8044 LDD R4,Z+4
0526 8055 LDD R5,Z+5
0527 9456 LSR R5
0528 9447 ROR R4
0529 9437 ROR R3
052A 9427 ROR R2
052B 0181 MOVW R16,R2
052C D474 RCALL _spi_transfer_16
(0541) tmp=spi_transfer_8(0x00);
052D 2700 CLR R16
052E D46C RCALL _spi_transfer_8
052F 870D STD Y+13,R16
(0542) }while(tmp==msg_buffer[8]);
0530 9020011C LDS R2,0x11C
0532 840D LDD R0,Y+13
0533 1402 CP R0,R2
0534 F409 BNE 0x0536
0535 CFCE RJMP 0x0504
(0543) }
0536 C010 RJMP 0x0547
(0544) //RDY/BSY polling
(0545) else if((mode&0x70) == 0x40)
0537 2D8E MOV R24,R14
0538 7780 ANDI R24,0x70
0539 3480 CPI R24,0x40
053A F441 BNE 0x0543
(0546) {
(0547) while(spi_transfer_32(0xF0000000)&1);
053B E000 LDI R16,0
053C E010 LDI R17,0
053D E020 LDI R18,0
053E EF30 LDI R19,0xF0
053F D46D RCALL _spi_transfer_32
0540 FD00 SBRC R16,0
0541 CFF9 RJMP 0x053B
(0548) }
0542 C004 RJMP 0x0547
(0549) //If something was not correct with the given mode do
(0550) //hard waiting. Should never reach this point
(0551) else
(0552) {
(0553) wait_ms(msg_buffer[4]);
0543 91000118 LDS R16,0x118
0545 2711 CLR R17
0546 DB0D RCALL _wait_ms
(0554) }
(0555) }
(0556) }
(0557)
(0558) num_bytes = 2;
0547 E082 LDI R24,2
0548 E090 LDI R25,0
0549 879B STD Y+11,R25
054A 878A STD Y+10,R24
(0559) msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
054B E183 LDI R24,0x13
054C 93800114 STS msg_buffer,R24
(0560) msg_buffer[1] = STATUS_CMD_OK;
054E 2422 CLR R2
054F 92200115 STS msg_buffer+1,R2
(0561) }
0551 C373 RJMP 0x08C5
(0562) //////////////////////////////////////
(0563) //CMD_READ_FLASH_ISP
(0564) //////////////////////////////////////
(0565) else if(cmd==CMD_READ_FLASH_ISP)
0552 858C LDD R24,Y+12
0553 3184 CPI R24,0x14
0554 F009 BEQ 0x0556
0555 C066 RJMP 0x05BC
(0566) {
(0567) block_size = ((unsigned int)msg_buffer[1])<<8;
0556 90A00115 LDS R10,msg_buffer+1
0558 24BB CLR R11
0559 2CBA MOV R11,R10
055A 24AA CLR R10
(0568) block_size |= msg_buffer[2];
055B 90200116 LDS R2,msg_buffer+2
055D 2433 CLR R3
055E 28A2 OR R10,R2
055F 28B3 OR R11,R3
(0569) tmp = msg_buffer[3];
0560 90200117 LDS R2,msg_buffer+3
0562 862D STD Y+13,R2
(0570)
(0571) for(i=0;i<block_size;i++)
0563 24CC CLR R12
0564 24DD CLR R13
0565 C040 RJMP 0x05A6
(0572) {
(0573) //Select Low or High-Byte
(0574) if(i&1)
0566 FEC0 SBRS R12,0
0567 C004 RJMP 0x056C
(0575) {
(0576) spi_transfer_8(tmp|(1<<3));
0568 850D LDD R16,Y+13
0569 6008 ORI R16,0x8
056A D430 RCALL _spi_transfer_8
(0577) }
056B C002 RJMP 0x056E
(0578) else
(0579) {
(0580) spi_transfer_8(tmp);
056C 850D LDD R16,Y+13
056D D42D RCALL _spi_transfer_8
(0581) }
(0582)
(0583) spi_transfer_16(address&0xFFFF);
056E EF4F LDI R20,0xFF
056F EF5F LDI R21,0xFF
0570 E060 LDI R22,0
0571 E070 LDI R23,0
0572 9040010E LDS R4,address+2
0574 9050010F LDS R5,address+3
0576 9020010C LDS R2,address
0578 9030010D LDS R3,address+1
057A 2224 AND R2,R20
057B 2235 AND R3,R21
057C 2246 AND R4,R22
057D 2257 AND R5,R23
057E 0181 MOVW R16,R2
057F D421 RCALL _spi_transfer_16
(0584) msg_buffer[i+2] = spi_transfer_8(0);
0580 2700 CLR R16
0581 D419 RCALL _spi_transfer_8
0582 E184 LDI R24,0x14
0583 E091 LDI R25,1
0584 01F6 MOVW R30,R12
0585 9632 ADIW R30,2
0586 0FE8 ADD R30,R24
0587 1FF9 ADC R31,R25
0588 8300 STD Z+0,R16
(0585)
(0586) //increment (word) address only when we have an uneven (byte) address
(0587) if(i&1) address++;
0589 FEC0 SBRS R12,0
058A C018 RJMP 0x05A3
058B E041 LDI R20,1
058C E050 LDI R21,0
058D E060 LDI R22,0
058E E070 LDI R23,0
058F 9040010E LDS R4,address+2
0591 9050010F LDS R5,address+3
0593 9020010C LDS R2,address
0595 9030010D LDS R3,address+1
0597 0E24 ADD R2,R20
0598 1E35 ADC R3,R21
0599 1E46 ADC R4,R22
059A 1E57 ADC R5,R23
059B 9230010D STS address+1,R3
059D 9220010C STS address,R2
059F 9250010F STS address+3,R5
05A1 9240010E STS address+2,R4
05A3 01C6 MOVW R24,R12
05A4 9601 ADIW R24,1
05A5 016C MOVW R12,R24
05A6 14CA CP R12,R10
05A7 04DB CPC R13,R11
05A8 F408 BCC 0x05AA
05A9 CFBC RJMP 0x0566
(0588) }
(0589)
(0590) num_bytes = block_size+3;
05AA 01C5 MOVW R24,R10
05AB 9603 ADIW R24,3
05AC 879B STD Y+11,R25
05AD 878A STD Y+10,R24
(0591) msg_buffer[0] = CMD_READ_FLASH_ISP;
05AE E184 LDI R24,0x14
05AF 93800114 STS msg_buffer,R24
(0592) msg_buffer[1] = STATUS_CMD_OK;
05B1 2422 CLR R2
05B2 92200115 STS msg_buffer+1,R2
(0593) msg_buffer[block_size+2] = STATUS_CMD_OK;
05B4 E184 LDI R24,0x14
05B5 E091 LDI R25,1
05B6 01F5 MOVW R30,R10
05B7 9632 ADIW R30,2
05B8 0FE8 ADD R30,R24
05B9 1FF9 ADC R31,R25
05BA 8220 STD Z+0,R2
(0594) }
05BB C309 RJMP 0x08C5
(0595) //////////////////////////////////////
(0596) //CMD_PROGRAM_EEPROM_ISP
(0597) //////////////////////////////////////
(0598) else if(cmd==CMD_PROGRAM_EEPROM_ISP)
05BC 858C LDD R24,Y+12
05BD 3185 CPI R24,0x15
05BE F009 BEQ 0x05C0
05BF C174 RJMP 0x0734
(0599) {
(0600) block_size = ((unsigned int)msg_buffer[1])<<8;
05C0 90A00115 LDS R10,msg_buffer+1
05C2 24BB CLR R11
05C3 2CBA MOV R11,R10
05C4 24AA CLR R10
(0601) block_size |= msg_buffer[2];
05C5 90200116 LDS R2,msg_buffer+2
05C7 2433 CLR R3
05C8 28A2 OR R10,R2
05C9 28B3 OR R11,R3
(0602) mode = msg_buffer[3];
05CA 90E00117 LDS R14,msg_buffer+3
(0603)
(0604) //Byte Mode
(0605) if((mode&1) == 0)
05CC FCE0 SBRC R14,0
05CD C09B RJMP 0x0669
(0606) {
(0607) for(i=0;i<block_size;i++)
05CE 24CC CLR R12
05CF 24DD CLR R13
05D0 C093 RJMP 0x0664
(0608) {
(0609) spi_transfer_8(msg_buffer[5]);
05D1 91000119 LDS R16,0x119
05D3 D3C7 RCALL _spi_transfer_8
(0610) spi_transfer_16(address&0xFFFF);
05D4 EF4F LDI R20,0xFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -