📄 main.s
字号:
.dbline 565
; }
xjmp L222
L221:
.dbline 567
; else
; {
.dbline 568
; spi_transfer_8(msg_buffer[7]);
lds R16,_msg_buffer+7
xcall _spi_transfer_8
.dbline 569
; }
L222:
.dbline 570
; spi_transfer_16(polling_address/2);
ldd R2,y+2
ldd R3,y+3
ldd R4,y+4
ldd R5,y+5
lsr R5
ror R4
ror R3
ror R2
movw R16,R2
xcall _spi_transfer_16
.dbline 571
; tmp=spi_transfer_8(0x00);
clr R16
xcall _spi_transfer_8
mov R14,R16
.dbline 572
; }
L219:
.dbline 573
; while (tmp==msg_buffer[8]);
lds R2,_msg_buffer+8
cp R14,R2
breq L218
X75:
.dbline 574
; }
xjmp L217
L216:
.dbline 576
; //RDY/BSY polling
; else if ((mode&0x70) == 0x40)
movw R24,R12
cpi R24,64
ldi R30,0
cpc R25,R30
brne L226
X76:
.dbline 577
; {
L228:
.dbline 578
; while (spi_transfer_32(0xF0000000)&1);
L229:
.dbline 578
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,240
xcall _spi_transfer_32
mov R12,R16
sbrc R16,0
rjmp L228
X77:
.dbline 579
; }
xjmp L227
L226:
.dbline 583
; //If something was not correct with the given mode do
; //hard waiting. Should never reach this point
; else
; {
.dbline 584
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
xcall _wait_ms
.dbline 585
; }
L227:
L217:
L214:
.dbline 586
; }
L208:
.dbline 587
; }
L160:
.dbline 589
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
movw R10,R24
.dbline 590
; msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
ldi R24,19
sts _msg_buffer,R24
.dbline 591
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 592
; }
xjmp L155
L154:
.dbline 596
; //////////////////////////////////////
; //CMD_READ_FLASH_ISP
; //////////////////////////////////////
; else if (cmd==CMD_READ_FLASH_ISP)
ldd R24,y+10
cpi R24,20
breq X147
xjmp L233
X147:
X78:
.dbline 597
; {
.dbline 598
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R2,_msg_buffer+1
clr R3
mov R3,R2
clr R2
std y+13,R3
std y+12,R2
.dbline 599
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
ldd R0,y+12
ldd R1,y+13
or R0,R2
or R1,R3
std y+13,R1
std y+12,R0
.dbline 600
; tmp = msg_buffer[3];
lds R2,_msg_buffer+3
std y+14,R2
.dbline 602
;
; for (i=0;i<block_size;i++)
clr R14
clr R15
xjmp L241
L238:
.dbline 603
; {
.dbline 605
; //Select Low or High-Byte
; if (i&1)
movw R24,R14
andi R24,1
andi R25,0
movw R12,R24
cpi R24,0
cpc R24,R25
breq L242
X79:
.dbline 606
; {
.dbline 607
; spi_transfer_8(tmp|(1<<3));
ldd R16,y+14
ori R16,8
xcall _spi_transfer_8
.dbline 608
; }
xjmp L243
L242:
.dbline 610
; else
; {
.dbline 611
; spi_transfer_8(tmp);
ldd R16,y+14
xcall _spi_transfer_8
.dbline 612
; }
L243:
.dbline 614
;
; spi_transfer_16(address&0xFFFF);
ldi R20,255
ldi R21,255
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
movw R16,R2
xcall _spi_transfer_16
.dbline 615
; msg_buffer[i+2] = spi_transfer_8(0);
clr R16
xcall _spi_transfer_8
std y+17,R17
std y+16,R16
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R14
adiw R30,2
add R30,R24
adc R31,R25
movw R0,R16
std z+0,R0
.dbline 618
;
; //increment (word) address only when we have an uneven (byte) address
; if (i&1) address++;
tst R12
brne X80
tst R13
breq L244
X80:
.dbline 618
ldi R20,1
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
L244:
.dbline 619
; }
L239:
.dbline 602
movw R24,R14
adiw R24,1
movw R14,R24
L241:
.dbline 602
ldd R0,y+12
ldd R1,y+13
cp R14,R0
cpc R15,R1
brsh X148
xjmp L238
X148:
X81:
.dbline 621
;
; num_bytes = block_size+3;
movw R24,R0
adiw R24,3
movw R10,R24
.dbline 622
; msg_buffer[0] = CMD_READ_FLASH_ISP;
ldi R24,20
sts _msg_buffer,R24
.dbline 623
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 624
; msg_buffer[block_size+2] = STATUS_CMD_OK;
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R0
adiw R30,2
add R30,R24
adc R31,R25
std z+0,R2
.dbline 625
; }
xjmp L234
L233:
.dbline 629
; //////////////////////////////////////
; //CMD_PROGRAM_EEPROM_ISP
; //////////////////////////////////////
; else if (cmd==CMD_PROGRAM_EEPROM_ISP)
ldd R24,y+10
cpi R24,21
breq X149
xjmp L247
X149:
X82:
.dbline 630
; {
.dbline 631
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R2,_msg_buffer+1
clr R3
mov R3,R2
clr R2
std y+13,R3
std y+12,R2
.dbline 632
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
ldd R0,y+12
ldd R1,y+13
or R0,R2
or R1,R3
std y+13,R1
std y+12,R0
.dbline 633
; mode = msg_buffer[3];
lds R2,_msg_buffer+3
std y+14,R2
.dbline 636
;
; //Byte Mode
; if ((mode&1) == 0)
mov R0,R2
sbrc R2,0
rjmp L252
X83:
.dbline 637
; {
.dbline 638
; for (i=0;i<block_size;i++)
clr R14
clr R15
xjmp L257
L254:
.dbline 639
; {
.dbline 640
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
xcall _spi_transfer_8
.dbline 641
; spi_transfer_16(address&0xFFFF);
ldi R20,255
ldi R21,255
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
movw R16,R2
xcall _spi_transfer_16
.dbline 642
; spi_transfer_8(msg_buffer[i+10]);
movw R24,R14
adiw R24,10
movw R12,R24
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _spi_transfer_8
.dbline 645
;
; //Check if we can do polling
; if ((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
add R30,R24
adc R31,R25
ldd R12,z+0
lds R2,_msg_buffer+8
cp R12,R2
breq L259
X84:
lds R2,_msg_buffer+9
cp R12,R2
breq L259
X85:
.dbline 646
; {
.dbline 647
; polling_address = address&0xFFFF;
ldi R20,255
ldi R21,255
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
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
.dbline 648
; }
xjmp L260
L259:
.dbline 651
; //If not switch the mode hard waiting
; else
; {
.dbline 652
; mode = (mode&(~0x0E)) | 0x02;
ldd R24,y+14
andi R24,241
ori R24,2
std y+14,R24
.dbline 653
; }
L260:
.dbline 657
;
; //Different polling methods
; //Hard waiting
; if ((mode&0x0E) == 0x02)
ldd R24,y+14
clr R25
andi R24,14
andi R25,0
std y+17,R25
std y+16,R24
cpi R24,2
ldi R30,0
cpc R25,R30
brne L263
X86:
.dbline 658
; {
.dbline 659
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
xcall _wait_ms
.dbline 660
; }
xjmp L264
L263:
.dbline 662
; //Data polling
; else if ((mode&0x0E) == 0x04)
ldd R24,y+16
ldd R25,y+17
cpi R24,4
ldi R30,0
cpc R25,R30
brne L266
X87:
.dbline 663
; {
L268:
.dbline 665
; do
; {
.dbline 666
; spi_transfer_8(msg_buffer[7]);
lds R16,_msg_buffer+7
xcall _spi_transfer_8
.dbline 667
; spi_transfer_16(polling_address);
ldd R16,y+2
ldd R17,y+3
xcall _spi_transfer_16
.dbline 668
; tmp=spi_transfer_8(0x00);
clr R16
xcall _spi_transfer_8
mov R12,R16
std y+18,R12
.dbline 669
; }
L269:
.dbline 670
; while ((tmp==msg_buffer[8])||(tmp==msg_buffer[9]));
lds R2,_msg_buffer+8
ldd R0,y+18
cp R0,R2
breq L268
X88:
lds R2,_msg_buffer+9
cp R0,R2
breq L268
X89:
.dbline 671
; }
xjmp L267
L266:
.dbline 673
; //RDY/BSY polling
; else if ((mode&0x0E) == 0x08)
ldd R24,y+16
ldd R25,y+17
cpi R24,8
ldi R30,0
cpc R25,R30
brne L274
X90:
.dbline 674
; {
L276:
.dbline 675
; while (spi_transfer_32(0xF0000000)&1);
L277:
.dbline 675
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,240
xcall _spi_transfer_32
std y+17,R17
std y+16,R16
movw R0,R16
sbrc R16,0
rjmp L276
X91:
.dbline 676
; }
xjmp L275
L274:
.dbline 680
; //If something was not correct with the given mode do
; //hard waiting. Should never reach this point
; else
; {
.dbline 681
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
xcall _wait_ms
.dbline 682
; }
L275:
L267:
L264:
.dbline 685
;
; //increment address
; address++;
ldi R20,1
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 686
; }
L255:
.dbline 638
movw R24,R14
adiw R24,1
movw R14,R24
L257:
.dbline 638
ldd R0,y+12
ldd R1,y+13
cp R14,R0
cpc R15,R1
brsh X150
xjmp L254
X150:
X92:
.dbline 687
; }
xjmp L253
L252:
.dbline 690
; //Page Mode
; else
; {
.dbline 691
; for (i=0;i<block_size;i++)
clr R14
clr R15
xjmp L283
L280:
.dbline 692
; {
.dbline 693
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
xcall _spi_transfer_8
.dbline 694
; spi_transfer_16(address&0xFFFF);
ldi R20,255
ldi R21,255
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
movw R16,R2
xcall _spi_transfer_16
.dbline 695
; spi_transfer_8(msg_buffer[i+10]);
movw R24,R14
adiw R24,10
std y+17,R25
std y+16,R24
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
ldd R30,y+16
ldd R31,y+17
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _spi_transfer_8
.dbline 698
;
; //Check if we can do polling
; if ((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
ldd R30,y+16
ldd R31,y+17
add R30,R24
adc R31,R25
ldd R2,z+0
std y+17,R3
std y+16,R2
lds R2,_msg_buffer+8
ldd R0,y+16
ldd R1,y+17
cp R0,R2
breq L285
X93:
lds R2,_msg_buffer+9
cp R0,R2
breq L285
X94:
.dbline 699
; {
.dbline 700
; polling_address = address&0xFFFF;
ldi R20,255
ldi R21,255
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
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
.dbline 701
; }
L285:
.dbline 704
;
; //increment (word) address only when we have an uneven (byte) address
; address++;
ldi R20,1
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 705
; }
L281:
.dbline 691
movw R24,R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -