📄 main.lis
字号:
04B8 82E0 ldi R24,2
04BA 90E0 ldi R25,0
04BC 9B87 std y+11,R25
04BE 8A87 std y+10,R24
04C0 .dbline 363
04C0 ; msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
04C0 81E1 ldi R24,17
04C2 80930800 sts _msg_buffer,R24
04C6 .dbline 364
04C6 ; msg_buffer[1] = STATUS_CMD_OK;
04C6 2224 clr R2
04C8 20920900 sts _msg_buffer+1,R2
04CC .dbline 365
04CC ; }
04CC 5DC5 rjmp L110
04CE L109:
04CE .dbline 369
04CE ; //////////////////////////////////////
04CE ; //CMD_CHIP_ERASE_ISP
04CE ; //////////////////////////////////////
04CE ; else if(cmd==CMD_CHIP_ERASE_ISP)
04CE 8C85 ldd R24,y+12
04D0 8231 cpi R24,18
04D2 39F5 brne L112
04D4 .dbline 370
04D4 ; {
04D4 .dbline 371
04D4 ; spi_transfer_8(msg_buffer[3]);
04D4 00910B00 lds R16,_msg_buffer+3
04D8 00D0 rcall _spi_transfer_8
04DA .dbline 372
04DA ; spi_transfer_8(msg_buffer[4]);
04DA 00910C00 lds R16,_msg_buffer+4
04DE 00D0 rcall _spi_transfer_8
04E0 .dbline 373
04E0 ; spi_transfer_8(msg_buffer[5]);
04E0 00910D00 lds R16,_msg_buffer+5
04E4 00D0 rcall _spi_transfer_8
04E6 .dbline 374
04E6 ; spi_transfer_8(msg_buffer[6]);
04E6 00910E00 lds R16,_msg_buffer+6
04EA 00D0 rcall _spi_transfer_8
04EC .dbline 378
04EC ;
04EC ; //Newer AVR's seems to have a busy bit
04EC ; //cant test this because I don't have any of these new chips
04EC ; if(msg_buffer[2]==0)
04EC 20900A00 lds R2,_msg_buffer+2
04F0 2220 tst R2
04F2 29F4 brne L123
04F4 .dbline 379
04F4 ; {
04F4 .dbline 380
04F4 ; wait_ms(msg_buffer[1]);
04F4 00910900 lds R16,_msg_buffer+1
04F8 1127 clr R17
04FA 00D0 rcall _wait_ms
04FC .dbline 381
04FC ; }
04FC 07C0 rjmp L119
04FE X5:
04FE .dbline 383
04FE ; else //if(msg_buffer[2]==1)
04FE ; {
04FE L122:
04FE .dbline 384
04FE L123:
04FE .dbline 384
04FE ; while(spi_transfer_32(0xF0000000)&1);
04FE 00E0 ldi R16,0
0500 10E0 ldi R17,0
0502 20E0 ldi R18,0
0504 30EF ldi R19,240
0506 00D0 rcall _spi_transfer_32
0508 00FD sbrc R16,0
050A F9CF rjmp L122
050C .dbline 385
050C ; }
050C L119:
050C .dbline 387
050C ;
050C ; num_bytes = 2;
050C 82E0 ldi R24,2
050E 90E0 ldi R25,0
0510 9B87 std y+11,R25
0512 8A87 std y+10,R24
0514 .dbline 388
0514 ; msg_buffer[0] = CMD_CHIP_ERASE_ISP;
0514 82E1 ldi R24,18
0516 80930800 sts _msg_buffer,R24
051A .dbline 389
051A ; msg_buffer[1] = STATUS_CMD_OK;
051A 2224 clr R2
051C 20920900 sts _msg_buffer+1,R2
0520 .dbline 390
0520 ; }
0520 33C5 rjmp L113
0522 L112:
0522 .dbline 394
0522 ; //////////////////////////////////////
0522 ; //CMD_PROGRAM_FLASH_ISP
0522 ; //////////////////////////////////////
0522 ; else if(cmd==CMD_PROGRAM_FLASH_ISP)
0522 8C85 ldd R24,y+12
0524 8331 cpi R24,19
0526 09F0 breq X11
0528 BCC1 rjmp L126
052A X11:
052A .dbline 395
052A ; {
052A .dbline 396
052A ; block_size = ((unsigned int)msg_buffer[1])<<8;
052A A0900900 lds R10,_msg_buffer+1
052E BB24 clr R11
0530 BA2C mov R11,R10
0532 AA24 clr R10
0534 .dbline 397
0534 ; block_size |= msg_buffer[2];
0534 20900A00 lds R2,_msg_buffer+2
0538 3324 clr R3
053A A228 or R10,R2
053C B328 or R11,R3
053E .dbline 398
053E ; mode = msg_buffer[3];
053E E0900B00 lds R14,_msg_buffer+3
0542 .dbline 401
0542 ;
0542 ; //Word Mode
0542 ; if((mode&1) == 0)
0542 E0FC sbrc R14,0
0544 A2C0 rjmp L131
0546 .dbline 402
0546 ; {
0546 .dbline 403
0546 ; for(i=0;i<block_size;i++)
0546 CC24 clr R12
0548 DD24 clr R13
054A 9AC0 rjmp L136
054C L133:
054C .dbline 404
054C ; {
054C .dbline 407
054C ; //If we have an uneven byte programm the
054C ; //high byte
054C ; if(i&1)
054C C0FE sbrs R12,0
054E 05C0 rjmp L137
0550 .dbline 408
0550 ; {
0550 .dbline 409
0550 ; spi_transfer_8(msg_buffer[5]|(1<<3));
0550 00910D00 lds R16,_msg_buffer+5
0554 0860 ori R16,8
0556 00D0 rcall _spi_transfer_8
0558 .dbline 410
0558 ; }
0558 03C0 rjmp L138
055A L137:
055A .dbline 412
055A ; else
055A ; {
055A .dbline 413
055A ; spi_transfer_8(msg_buffer[5]);
055A 00910D00 lds R16,_msg_buffer+5
055E 00D0 rcall _spi_transfer_8
0560 .dbline 414
0560 ; }
0560 L138:
0560 .dbline 416
0560 ;
0560 ; spi_transfer_16(address&0xFFFF);
0560 4FEF ldi R20,255
0562 5FEF ldi R21,255
0564 60E0 ldi R22,0
0566 70E0 ldi R23,0
0568 40900200 lds R4,_address+2
056C 50900300 lds R5,_address+2+1
0570 20900000 lds R2,_address
0574 30900100 lds R3,_address+1
0578 2422 and R2,R20
057A 3522 and R3,R21
057C 4622 and R4,R22
057E 5722 and R5,R23
0580 8101 movw R16,R2
0582 00D0 rcall _spi_transfer_16
0584 .dbline 417
0584 ; spi_transfer_8(msg_buffer[i+10]);
0584 80E0 ldi R24,<_msg_buffer
0586 90E0 ldi R25,>_msg_buffer
0588 F601 movw R30,R12
058A 3A96 adiw R30,10
058C E80F add R30,R24
058E F91F adc R31,R25
0590 0081 ldd R16,z+0
0592 00D0 rcall _spi_transfer_8
0594 .dbline 420
0594 ;
0594 ; //Check if we can do polling
0594 ; if(msg_buffer[8]!=msg_buffer[i+10])
0594 80E0 ldi R24,<_msg_buffer
0596 90E0 ldi R25,>_msg_buffer
0598 F601 movw R30,R12
059A 3A96 adiw R30,10
059C E80F add R30,R24
059E F91F adc R31,R25
05A0 2080 ldd R2,z+0
05A2 30901000 lds R3,_msg_buffer+8
05A6 3214 cp R3,R2
05A8 B1F0 breq L141
05AA .dbline 421
05AA ; {
05AA .dbline 422
05AA ; polling_address = address&0xFFFF;
05AA 4FEF ldi R20,255
05AC 5FEF ldi R21,255
05AE 60E0 ldi R22,0
05B0 70E0 ldi R23,0
05B2 40900200 lds R4,_address+2
05B6 50900300 lds R5,_address+2+1
05BA 20900000 lds R2,_address
05BE 30900100 lds R3,_address+1
05C2 2422 and R2,R20
05C4 3522 and R3,R21
05C6 4622 and R4,R22
05C8 5722 and R5,R23
05CA FE01 movw R30,R28
05CC 2282 std z+2,R2
05CE 3382 std z+3,R3
05D0 4482 std z+4,R4
05D2 5582 std z+5,R5
05D4 .dbline 423
05D4 ; }
05D4 04C0 rjmp L142
05D6 L141:
05D6 .dbline 426
05D6 ; //If not switch the mode hard waiting
05D6 ; else
05D6 ; {
05D6 .dbline 427
05D6 ; mode = (mode&(~0x0E)) | 0x02;
05D6 8E2D mov R24,R14
05D8 817F andi R24,241
05DA 8260 ori R24,2
05DC E82E mov R14,R24
05DE .dbline 428
05DE ; }
05DE L142:
05DE .dbline 432
05DE ;
05DE ; //Different polling methods
05DE ; //Hard waiting
05DE ; if((mode&0x0E) == 0x02)
05DE 8E2D mov R24,R14
05E0 8E70 andi R24,14
05E2 8230 cpi R24,2
05E4 29F4 brne L144
05E6 .dbline 433
05E6 ; {
05E6 .dbline 434
05E6 ; wait_ms(msg_buffer[4]);
05E6 00910C00 lds R16,_msg_buffer+4
05EA 1127 clr R17
05EC 00D0 rcall _wait_ms
05EE .dbline 435
05EE ; }
05EE 2BC0 rjmp L145
05F0 L144:
05F0 .dbline 437
05F0 ; //Data polling
05F0 ; else if((mode&0x0E) == 0x04)
05F0 8E2D mov R24,R14
05F2 8E70 andi R24,14
05F4 8430 cpi R24,4
05F6 B9F4 brne L147
05F8 .dbline 438
05F8 ; {
05F8 L149:
05F8 .dbline 439
05F8 ; do{
05F8 .dbline 442
05F8 ; //If we have an uneven byte read the
05F8 ; //high byte
05F8 ; if(i&1)
05F8 C0FE sbrs R12,0
05FA 05C0 rjmp L152
05FC .dbline 443
05FC ; {
05FC .dbline 444
05FC ; spi_transfer_8(msg_buffer[7]|(1<<3));
05FC 00910F00 lds R16,_msg_buffer+7
0600 0860 ori R16,8
0602 00D0 rcall _spi_transfer_8
0604 .dbline 445
0604 ; }
0604 03C0 rjmp L153
0606 L152:
0606 .dbline 447
0606 ; else
0606 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -