📄 main.s
字号:
ldi R17,0
ldi R18,0
ldi R19,240
xcall _spi_transfer_32
mov R12,R16
sbrc R16,0
rjmp L150
X52:
.dbline 416
; }
L147:
.dbline 418
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
movw R10,R24
.dbline 419
; msg_buffer[0] = CMD_CHIP_ERASE_ISP;
ldi R24,18
sts _msg_buffer,R24
.dbline 420
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 421
; }
xjmp L141
L140:
.dbline 425
; //////////////////////////////////////
; //CMD_PROGRAM_FLASH_ISP
; //////////////////////////////////////
; else if (cmd==CMD_PROGRAM_FLASH_ISP)
ldd R24,y+10
cpi R24,19
breq X143
xjmp L154
X143:
X53:
.dbline 426
; {
.dbline 427
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R2,_msg_buffer+1
clr R3
mov R3,R2
clr R2
std y+15,R3
std y+14,R2
.dbline 428
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
ldd R0,y+14
ldd R1,y+15
or R0,R2
or R1,R3
std y+15,R1
std y+14,R0
.dbline 429
; mode = msg_buffer[3];
lds R2,_msg_buffer+3
std y+12,R2
.dbline 432
;
; //Word Mode
; if ((mode&1) == 0)
mov R0,R2
sbrc R2,0
rjmp L159
X54:
.dbline 433
; {
.dbline 434
; for (i=0;i<block_size;i++)
clr R14
clr R15
xjmp L164
L161:
.dbline 435
; {
.dbline 438
; //If we have an uneven byte programm the
; //high byte
; if (i&1)
movw R24,R14
andi R24,1
andi R25,0
movw R12,R24
cpi R24,0
cpc R24,R25
breq L165
X55:
.dbline 439
; {
.dbline 440
; spi_transfer_8(msg_buffer[5]|(1<<3));
lds R16,_msg_buffer+5
ori R16,8
xcall _spi_transfer_8
.dbline 441
; }
xjmp L166
L165:
.dbline 443
; else
; {
.dbline 444
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
xcall _spi_transfer_8
.dbline 445
; }
L166:
.dbline 447
;
; 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 448
; 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 451
;
; //Check if we can do polling
; if (msg_buffer[8]!=msg_buffer[i+10])
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
lds R3,_msg_buffer+8
cp R3,R2
breq L169
X56:
.dbline 452
; {
.dbline 453
; 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 454
; }
xjmp L170
L169:
.dbline 457
; //If not switch the mode hard waiting
; else
; {
.dbline 458
; mode = (mode&(~0x0E)) | 0x02;
ldd R24,y+12
andi R24,241
ori R24,2
std y+12,R24
.dbline 459
; }
L170:
.dbline 463
;
; //Different polling methods
; //Hard waiting
; if ((mode&0x0E) == 0x02)
ldd R24,y+12
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 L172
X57:
.dbline 464
; {
.dbline 465
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
xcall _wait_ms
.dbline 466
; }
xjmp L173
L172:
.dbline 468
; //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 L175
X58:
.dbline 469
; {
L177:
.dbline 471
; do
; {
.dbline 474
; //If we have an uneven byte read the
; //high byte
; if (i&1)
tst R12
brne X59
tst R13
breq L180
X59:
.dbline 475
; {
.dbline 476
; spi_transfer_8(msg_buffer[7]|(1<<3));
lds R16,_msg_buffer+7
ori R16,8
xcall _spi_transfer_8
.dbline 477
; }
xjmp L181
L180:
.dbline 479
; else
; {
.dbline 480
; spi_transfer_8(msg_buffer[7]);
lds R16,_msg_buffer+7
xcall _spi_transfer_8
.dbline 481
; }
L181:
.dbline 482
; spi_transfer_16(polling_address);
ldd R16,y+2
ldd R17,y+3
xcall _spi_transfer_16
.dbline 483
; tmp=spi_transfer_8(0x00);
clr R16
xcall _spi_transfer_8
std y+21,R17
std y+20,R16
movw R0,R16
std y+18,R0
.dbline 484
; }
L178:
.dbline 485
; while (tmp==msg_buffer[8]);
lds R2,_msg_buffer+8
ldd R0,y+18
cp R0,R2
breq L177
X60:
.dbline 486
; }
xjmp L176
L175:
.dbline 488
; //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 L185
X61:
.dbline 489
; {
L187:
.dbline 490
; while (spi_transfer_32(0xF0000000)&1);
L188:
.dbline 490
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 L187
X62:
.dbline 491
; }
xjmp L186
L185:
.dbline 495
; //If something was not correct with the given mode do
; //hard waiting. Should never reach this point
; else
; {
.dbline 496
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
xcall _wait_ms
.dbline 497
; }
L186:
L176:
L173:
.dbline 500
;
; //increment (word) address only when we have an uneven (byte) address
; if (i&1) address++;
tst R12
brne X63
tst R13
breq L191
X63:
.dbline 500
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
L191:
.dbline 501
; }
L162:
.dbline 434
movw R24,R14
adiw R24,1
movw R14,R24
L164:
.dbline 434
ldd R0,y+14
ldd R1,y+15
cp R14,R0
cpc R15,R1
brsh X144
xjmp L161
X144:
X64:
.dbline 502
; }
xjmp L160
L159:
.dbline 505
; //Page Mode
; else
; {
.dbline 506
; for (i=0;i<block_size;i++)
clr R14
clr R15
xjmp L196
L193:
.dbline 507
; {
.dbline 510
; //If we have an uneven byte programm the
; //high byte
; if (i&1)
movw R24,R14
andi R24,1
andi R25,0
std y+17,R25
std y+16,R24
movw R0,R24
cpi R24,0
cpc R24,R25
breq L197
X65:
.dbline 511
; {
.dbline 512
; spi_transfer_8(msg_buffer[5]|(1<<3));
lds R16,_msg_buffer+5
ori R16,8
xcall _spi_transfer_8
.dbline 513
; }
xjmp L198
L197:
.dbline 515
; else
; {
.dbline 516
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
xcall _spi_transfer_8
.dbline 517
; }
L198:
.dbline 519
;
; 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 520
; spi_transfer_8(msg_buffer[i+10]);
movw R24,R14
adiw R24,10
std y+21,R25
std y+20,R24
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
ldd R30,y+20
ldd R31,y+21
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _spi_transfer_8
.dbline 523
;
; //Check if we can do polling
; if (msg_buffer[8]!=msg_buffer[i+10])
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
ldd R30,y+20
ldd R31,y+21
add R30,R24
adc R31,R25
ldd R2,z+0
lds R3,_msg_buffer+8
cp R3,R2
breq L201
X66:
.dbline 524
; {
.dbline 528
; //We have to check if we have an uneven byte.
; //Set the polling address to a byte address
; //so that we can poll the right location
; polling_address = (address&0xFFFF)*2;
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
lsl R2
rol R3
rol R4
rol R5
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
.dbline 529
; if (i&1) polling_address++;
ldd R0,y+16
ldd R1,y+17
tst R0
brne X67
tst R1
breq L204
X67:
.dbline 529
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
ldd R2,y+2
ldd R3,y+3
ldd R4,y+4
ldd R5,y+5
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
L204:
.dbline 530
; }
L201:
.dbline 533
;
; //increment (word) address only when we have an uneven (byte) address
; if (i&1) address++;
ldd R0,y+16
ldd R1,y+17
tst R0
brne X68
tst R1
breq L206
X68:
.dbline 533
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
L206:
.dbline 534
; }
L194:
.dbline 506
movw R24,R14
adiw R24,1
movw R14,R24
L196:
.dbline 506
ldd R0,y+14
ldd R1,y+15
cp R14,R0
cpc R15,R1
brsh X145
xjmp L193
X145:
X69:
.dbline 537
;
; //If this page is complete the bit 7 of mode will be set and we programm the page
; if (mode&0x80)
ldd R24,y+12
andi R24,128
brne X146
xjmp L208
X146:
X70:
.dbline 538
; {
.dbline 539
; spi_transfer_8(msg_buffer[6]);
lds R16,_msg_buffer+6
xcall _spi_transfer_8
.dbline 540
; spi_transfer_16(start_address&0xFFFF);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
ldd R2,y+6
ldd R3,y+7
ldd R4,y+8
ldd R5,y+9
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
xcall _spi_transfer_16
.dbline 541
; spi_transfer_8(0);
clr R16
xcall _spi_transfer_8
.dbline 544
;
; //If we have no valid polling address switch to simple wait mode
; if (polling_address==0)
ldd R2,y+2
ldd R3,y+3
ldd R4,y+4
ldd R5,y+5
clc
tst R2
cpc R3,R2
cpc R4,R2
cpc R5,R2
brne L211
X71:
.dbline 545
; {
.dbline 546
; mode = (mode&(~0x70)) | 0x10;
ldd R24,y+12
andi R24,143
ori R24,16
std y+12,R24
.dbline 547
; }
L211:
.dbline 551
;
; //Different polling methods
; //Hard waiting
; if ((mode&0x70) == 0x10)
ldd R24,y+12
clr R25
andi R24,112
andi R25,0
movw R12,R24
cpi R24,16
ldi R30,0
cpc R25,R30
brne L213
X72:
.dbline 552
; {
.dbline 553
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
xcall _wait_ms
.dbline 554
; }
xjmp L214
L213:
.dbline 556
; //Data polling
; else if ((mode&0x70) == 0x20)
movw R24,R12
cpi R24,32
ldi R30,0
cpc R25,R30
brne L216
X73:
.dbline 557
; {
L218:
.dbline 559
; do
; {
.dbline 562
; //If we have an uneven byte read the
; //high byte
; if (polling_address%2)
ldd R2,y+2
ldd R3,y+3
ldd R4,y+4
ldd R5,y+5
mov R30,R2
andi R30,1
breq L221
X74:
.dbline 563
; {
.dbline 564
; spi_transfer_8(msg_buffer[7]|(1<<3));
lds R16,_msg_buffer+7
ori R16,8
xcall _spi_transfer_8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -