📄 main.lis
字号:
0510 ; num_bytes = 2;
0510 82E0 ldi R24,2
0512 90E0 ldi R25,0
0514 5C01 movw R10,R24
0516 .dbline 394
0516 ; msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
0516 81E1 ldi R24,17
0518 80930800 sts _msg_buffer,R24
051C .dbline 395
051C ; msg_buffer[1] = STATUS_CMD_OK;
051C 2224 clr R2
051E 20920900 sts _msg_buffer+1,R2
0522 .dbline 396
0522 ; }
0522 49C6 xjmp L138
0524 L137:
0524 .dbline 400
0524 ; //////////////////////////////////////
0524 ; //CMD_CHIP_ERASE_ISP
0524 ; //////////////////////////////////////
0524 ; else if (cmd==CMD_CHIP_ERASE_ISP)
0524 8A85 ldd R24,y+10
0526 8231 cpi R24,18
0528 69F5 brne L140
052A X50:
052A .dbline 401
052A ; {
052A .dbline 402
052A ; spi_transfer_8(msg_buffer[3]);
052A 00910B00 lds R16,_msg_buffer+3
052E 0E940000 xcall _spi_transfer_8
0532 .dbline 403
0532 ; spi_transfer_8(msg_buffer[4]);
0532 00910C00 lds R16,_msg_buffer+4
0536 0E940000 xcall _spi_transfer_8
053A .dbline 404
053A ; spi_transfer_8(msg_buffer[5]);
053A 00910D00 lds R16,_msg_buffer+5
053E 0E940000 xcall _spi_transfer_8
0542 .dbline 405
0542 ; spi_transfer_8(msg_buffer[6]);
0542 00910E00 lds R16,_msg_buffer+6
0546 0E940000 xcall _spi_transfer_8
054A .dbline 409
054A ;
054A ; //Newer AVR's seems to have a busy bit
054A ; //cant test this because I don't have any of these new chips
054A ; if (msg_buffer[2]==0)
054A 20900A00 lds R2,_msg_buffer+2
054E 2220 tst R2
0550 31F4 brne L151
0552 X51:
0552 .dbline 410
0552 ; {
0552 .dbline 411
0552 ; wait_ms(msg_buffer[1]);
0552 00910900 lds R16,_msg_buffer+1
0556 1127 clr R17
0558 0E940000 xcall _wait_ms
055C .dbline 412
055C ; }
055C 09C0 xjmp L147
055E L150:
055E .dbline 415
055E ; else //if(msg_buffer[2]==1)
055E ; {
055E ; while (spi_transfer_32(0xF0000000)&1);
055E L151:
055E .dbline 415
055E 00E0 ldi R16,0
0560 10E0 ldi R17,0
0562 20E0 ldi R18,0
0564 30EF ldi R19,240
0566 0E940000 xcall _spi_transfer_32
056A C02E mov R12,R16
056C 00FD sbrc R16,0
056E F7CF rjmp L150
0570 X52:
0570 .dbline 416
0570 ; }
0570 L147:
0570 .dbline 418
0570 ;
0570 ; num_bytes = 2;
0570 82E0 ldi R24,2
0572 90E0 ldi R25,0
0574 5C01 movw R10,R24
0576 .dbline 419
0576 ; msg_buffer[0] = CMD_CHIP_ERASE_ISP;
0576 82E1 ldi R24,18
0578 80930800 sts _msg_buffer,R24
057C .dbline 420
057C ; msg_buffer[1] = STATUS_CMD_OK;
057C 2224 clr R2
057E 20920900 sts _msg_buffer+1,R2
0582 .dbline 421
0582 ; }
0582 19C6 xjmp L141
0584 L140:
0584 .dbline 425
0584 ; //////////////////////////////////////
0584 ; //CMD_PROGRAM_FLASH_ISP
0584 ; //////////////////////////////////////
0584 ; else if (cmd==CMD_PROGRAM_FLASH_ISP)
0584 8A85 ldd R24,y+10
0586 8331 cpi R24,19
0588 09F0 breq X143
058A F5C1 xjmp L154
058C X143:
058C X53:
058C .dbline 426
058C ; {
058C .dbline 427
058C ; block_size = ((unsigned int)msg_buffer[1])<<8;
058C 20900900 lds R2,_msg_buffer+1
0590 3324 clr R3
0592 322C mov R3,R2
0594 2224 clr R2
0596 3F86 std y+15,R3
0598 2E86 std y+14,R2
059A .dbline 428
059A ; block_size |= msg_buffer[2];
059A 20900A00 lds R2,_msg_buffer+2
059E 3324 clr R3
05A0 0E84 ldd R0,y+14
05A2 1F84 ldd R1,y+15
05A4 0228 or R0,R2
05A6 1328 or R1,R3
05A8 1F86 std y+15,R1
05AA 0E86 std y+14,R0
05AC .dbline 429
05AC ; mode = msg_buffer[3];
05AC 20900B00 lds R2,_msg_buffer+3
05B0 2C86 std y+12,R2
05B2 .dbline 432
05B2 ;
05B2 ; //Word Mode
05B2 ; if ((mode&1) == 0)
05B2 022C mov R0,R2
05B4 20FC sbrc R2,0
05B6 CAC0 rjmp L159
05B8 X54:
05B8 .dbline 433
05B8 ; {
05B8 .dbline 434
05B8 ; for (i=0;i<block_size;i++)
05B8 EE24 clr R14
05BA FF24 clr R15
05BC C0C0 xjmp L164
05BE L161:
05BE .dbline 435
05BE ; {
05BE .dbline 438
05BE ; //If we have an uneven byte programm the
05BE ; //high byte
05BE ; if (i&1)
05BE C701 movw R24,R14
05C0 8170 andi R24,1
05C2 9070 andi R25,0
05C4 6C01 movw R12,R24
05C6 8030 cpi R24,0
05C8 8907 cpc R24,R25
05CA 31F0 breq L165
05CC X55:
05CC .dbline 439
05CC ; {
05CC .dbline 440
05CC ; spi_transfer_8(msg_buffer[5]|(1<<3));
05CC 00910D00 lds R16,_msg_buffer+5
05D0 0860 ori R16,8
05D2 0E940000 xcall _spi_transfer_8
05D6 .dbline 441
05D6 ; }
05D6 04C0 xjmp L166
05D8 L165:
05D8 .dbline 443
05D8 ; else
05D8 ; {
05D8 .dbline 444
05D8 ; spi_transfer_8(msg_buffer[5]);
05D8 00910D00 lds R16,_msg_buffer+5
05DC 0E940000 xcall _spi_transfer_8
05E0 .dbline 445
05E0 ; }
05E0 L166:
05E0 .dbline 447
05E0 ;
05E0 ; spi_transfer_16(address&0xFFFF);
05E0 4FEF ldi R20,255
05E2 5FEF ldi R21,255
05E4 60E0 ldi R22,0
05E6 70E0 ldi R23,0
05E8 40900200 lds R4,_address+2
05EC 50900300 lds R5,_address+2+1
05F0 20900000 lds R2,_address
05F4 30900100 lds R3,_address+1
05F8 2422 and R2,R20
05FA 3522 and R3,R21
05FC 4622 and R4,R22
05FE 5722 and R5,R23
0600 8101 movw R16,R2
0602 0E940000 xcall _spi_transfer_16
0606 .dbline 448
0606 ; spi_transfer_8(msg_buffer[i+10]);
0606 C701 movw R24,R14
0608 0A96 adiw R24,10
060A 998B std y+17,R25
060C 888B std y+16,R24
060E 80E0 ldi R24,<_msg_buffer
0610 90E0 ldi R25,>_msg_buffer
0612 E889 ldd R30,y+16
0614 F989 ldd R31,y+17
0616 E80F add R30,R24
0618 F91F adc R31,R25
061A 0081 ldd R16,z+0
061C 0E940000 xcall _spi_transfer_8
0620 .dbline 451
0620 ;
0620 ; //Check if we can do polling
0620 ; if (msg_buffer[8]!=msg_buffer[i+10])
0620 80E0 ldi R24,<_msg_buffer
0622 90E0 ldi R25,>_msg_buffer
0624 E889 ldd R30,y+16
0626 F989 ldd R31,y+17
0628 E80F add R30,R24
062A F91F adc R31,R25
062C 2080 ldd R2,z+0
062E 30901000 lds R3,_msg_buffer+8
0632 3214 cp R3,R2
0634 A9F0 breq L169
0636 X56:
0636 .dbline 452
0636 ; {
0636 .dbline 453
0636 ; polling_address = address&0xFFFF;
0636 4FEF ldi R20,255
0638 5FEF ldi R21,255
063A 60E0 ldi R22,0
063C 70E0 ldi R23,0
063E 40900200 lds R4,_address+2
0642 50900300 lds R5,_address+2+1
0646 20900000 lds R2,_address
064A 30900100 lds R3,_address+1
064E 2422 and R2,R20
0650 3522 and R3,R21
0652 4622 and R4,R22
0654 5722 and R5,R23
0656 2A82 std y+2,R2
0658 3B82 std y+3,R3
065A 4C82 std y+4,R4
065C 5D82 std y+5,R5
065E .dbline 454
065E ; }
065E 04C0 xjmp L170
0660 L169:
0660 .dbline 457
0660 ; //If not switch the mode hard waiting
0660 ; else
0660 ; {
0660 .dbline 458
0660 ; mode = (mode&(~0x0E)) | 0x02;
0660 8C85 ldd R24,y+12
0662 817F andi R24,241
0664 8260 ori R24,2
0666 8C87 std y+12,R24
0668 .dbline 459
0668 ; }
0668 L170:
0668 .dbline 463
0668 ;
0668 ; //Different polling methods
0668 ; //Hard waiting
0668 ; if ((mode&0x0E) == 0x02)
0668 8C85 ldd R24,y+12
066A 9927 clr R25
066C 8E70 andi R24,14
066E 9070 andi R25,0
0670 998B std y+17,R25
0672 888B std y+16,R24
0674 8230 cpi R24,2
0676 E0E0 ldi R30,0
0678 9E07 cpc R25,R30
067A 31F4 brne L172
067C X57:
067C .dbline 464
067C ; {
067C .dbline 465
067C ; wait_ms(msg_buffer[4]);
067C 00910C00 lds R16,_msg_buffer+4
0680 1127 clr R17
0682 0E940000 xcall _wait_ms
0686 .dbline 466
0686 ; }
0686 3CC0 xjmp L173
0688 L172:
0688 .dbline 468
0688 ; //Data polling
0688 ; else if ((mode&0x0E) == 0x04)
0688 8889 ldd R24,y+16
068A 9989 ldd R25,y+17
068C 8430 cpi R24,4
068E E0E0 ldi R30,0
0690 9E07 cpc R25,R30
0692 F9F4 brne L175
0694 X58:
0694 .dbline 469
0694 ; {
0694 L177:
0694 .dbline 471
0694 ; do
0694 ; {
0694 .dbline 474
0694 ; //If we have an uneven byte read the
0694 ; //high byte
0694 ; if (i&1)
0694 CC20 tst R12
0696 11F4 brne X59
0698 DD20 tst R13
069A 31F0 breq L180
069C X59:
069C .dbline 475
069C ; {
069C .dbline 476
069C ; spi_transfer_8(msg_buffer[7]|(1<<3));
069C 00910F00 lds R16,_msg_buffer+7
06A0 0860 ori R16,8
06A2 0E940000 xcall _spi_transfer_8
06A6 .dbline 477
06A6 ; }
06A6 04C0 xjmp L181
06A8 L180:
06A8 .dbline 479
06A8 ; else
06A8 ; {
06A8 .dbline 480
06A8 ; spi_transfer_8(msg_buffer[7]);
06A8 00910F00 lds R16,_msg_buffer+7
06AC 0E940000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -