📄 fat16.lst
字号:
1421 06bc 0FB6 in __tmp_reg__,__SREG__
1422 06be F894 cli
1423 06c0 DEBF out __SP_H__,r29
1424 06c2 0FBE out __SREG__,__tmp_reg__
1425 06c4 CDBF out __SP_L__,r28
1426 06c6 DF91 pop r29
1427 06c8 CF91 pop r28
1428 06ca 1F91 pop r17
1429 06cc 0F91 pop r16
1430 06ce FF90 pop r15
1431 06d0 EF90 pop r14
1432 06d2 DF90 pop r13
1433 06d4 CF90 pop r12
1434 06d6 BF90 pop r11
1435 06d8 AF90 pop r10
1436 06da 9F90 pop r9
1437 06dc 8F90 pop r8
1438 06de 7F90 pop r7
1439 06e0 6F90 pop r6
1440 06e2 0895 ret
1441 /* epilogue end (size=21) */
1442 /* function CreateFile size 152 (109) */
1452 .Lscope21:
1458 .global ReadFile
1460 ReadFile:
211:FAT16.c **** }
212:FAT16.c **** //-------------------------------------------------------------------------
213:FAT16.c **** //读文件
214:FAT16.c **** uint8_t ReadFile(uint8_t Name[11],uint32_t Start,uint32_t len,uint8_t *p){
1462 .LM131:
1463 /* prologue: frame size=40 */
1464 06e4 3F92 push r3
1465 06e6 4F92 push r4
1466 06e8 5F92 push r5
1467 06ea 6F92 push r6
1468 06ec 7F92 push r7
1469 06ee 8F92 push r8
1470 06f0 9F92 push r9
1471 06f2 AF92 push r10
1472 06f4 BF92 push r11
1473 06f6 CF92 push r12
1474 06f8 DF92 push r13
1475 06fa EF92 push r14
1476 06fc FF92 push r15
1477 06fe 0F93 push r16
1478 0700 1F93 push r17
1479 0702 CF93 push r28
1480 0704 DF93 push r29
1481 0706 CDB7 in r28,__SP_L__
1482 0708 DEB7 in r29,__SP_H__
1483 070a A897 sbiw r28,40
1484 070c 0FB6 in __tmp_reg__,__SREG__
1485 070e F894 cli
1486 0710 DEBF out __SP_H__,r29
1487 0712 0FBE out __SREG__,__tmp_reg__
1488 0714 CDBF out __SP_L__,r28
1489 /* prologue end (size=25) */
1490 0716 5A01 movw r10,r20
1491 0718 6B01 movw r12,r22
1492 071a 0BA3 std Y+35,r16
1493 071c 1CA3 std Y+36,r17
1494 071e 2DA3 std Y+37,r18
1495 0720 3EA3 std Y+38,r19
1496 0722 F8A6 std Y+40,r15
1497 0724 EFA2 std Y+39,r14
215:FAT16.c **** uint16_t BytePerClus,ClusID,m,dirIndex;
216:FAT16.c **** uint32_t LBA;
217:FAT16.c **** uint8_t i;
218:FAT16.c **** DIR FileDir;
219:FAT16.c ****
220:FAT16.c **** if(GetFileID(Name,&FileDir,&dirIndex)==0)return SD_FAIL;//文件不存在
1499 .LM132:
1500 0726 AE01 movw r20,r28
1501 0728 4F5D subi r20,lo8(-(33))
1502 072a 5F4F sbci r21,hi8(-(33))
1503 072c BE01 movw r22,r28
1504 072e 6F5F subi r22,lo8(-(1))
1505 0730 7F4F sbci r23,hi8(-(1))
1506 0732 0E94 0000 call GetFileID
1507 0736 8823 tst r24
1508 0738 19F4 brne .L101
1510 .LM133:
1511 073a 81E0 ldi r24,lo8(1)
1512 073c 90E0 ldi r25,hi8(1)
1513 073e 99C0 rjmp .L100
1514 .L101:
221:FAT16.c ****
222:FAT16.c **** BytePerClus=BPB_SecPerClus*BPB_BytesPerSec; //每簇的字节数
1516 .LM134:
1517 0740 8091 0000 lds r24,BPB_SecPerClus
1518 0744 282F mov r18,r24
1519 0746 3327 clr r19
1520 0748 8091 0000 lds r24,BPB_BytesPerSec
1521 074c 9091 0000 lds r25,(BPB_BytesPerSec)+1
1522 0750 289F mul r18,r24
1523 0752 A001 movw r20,r0
1524 0754 299F mul r18,r25
1525 0756 500D add r21,r0
1526 0758 389F mul r19,r24
1527 075a 500D add r21,r0
1528 075c 1124 clr r1
223:FAT16.c **** m=Start/BytePerClus; //计算开始位置包含的簇数
1530 .LM135:
1531 075e 3A01 movw r6,r20
1532 0760 8824 clr r8
1533 0762 9924 clr r9
1534 0764 C601 movw r24,r12
1535 0766 B501 movw r22,r10
1536 0768 A401 movw r20,r8
1537 076a 9301 movw r18,r6
1538 076c 0E94 0000 call __udivmodsi4
1539 0770 8901 movw r16,r18
224:FAT16.c **** ClusID=FileDir.FilePosit.Start; //文件的开始簇号
1541 .LM136:
1542 0772 4B8C ldd r4,Y+27
1543 0774 5C8C ldd r5,Y+28
225:FAT16.c **** for(i=0;i<m;i++)ClusID=ReadFAT(ClusID); //计算开始位置所在簇的簇号
1545 .LM137:
1546 0776 3324 clr r3
1547 0778 232B or r18,r19
1548 077a 51F0 breq .L117
1549 .L105:
1550 077c C201 movw r24,r4
1551 077e 0E94 0000 call ReadFAT
1552 0782 2C01 movw r4,r24
1553 0784 3394 inc r3
1554 0786 832D mov r24,r3
1555 0788 9927 clr r25
1556 078a 8017 cp r24,r16
1557 078c 9107 cpc r25,r17
1558 078e B0F3 brlo .L105
1559 .L117:
226:FAT16.c **** i=(Start%BytePerClus)/BPB_BytesPerSec; //计算开始位置所在扇区的簇内偏移
1561 .LM138:
1562 0790 C601 movw r24,r12
1563 0792 B501 movw r22,r10
1564 0794 A401 movw r20,r8
1565 0796 9301 movw r18,r6
1566 0798 0E94 0000 call __udivmodsi4
1567 079c 5B01 movw r10,r22
1568 079e 6C01 movw r12,r24
1569 07a0 8091 0000 lds r24,BPB_BytesPerSec
1570 07a4 9091 0000 lds r25,(BPB_BytesPerSec)+1
1571 07a8 7C01 movw r14,r24
1572 07aa 0027 clr r16
1573 07ac 1127 clr r17
1574 07ae C601 movw r24,r12
1575 07b0 B501 movw r22,r10
1576 07b2 A801 movw r20,r16
1577 07b4 9701 movw r18,r14
1578 07b6 0E94 0000 call __udivmodsi4
1579 07ba 322E mov r3,r18
227:FAT16.c **** LBA=ClusConvLBA(ClusID)+i; //计算开始位置的逻辑扇区号
1581 .LM139:
1582 07bc C201 movw r24,r4
1583 07be 0E94 0000 call ClusConvLBA
1584 07c2 3B01 movw r6,r22
1585 07c4 4C01 movw r8,r24
1586 07c6 630C add r6,r3
1587 07c8 711C adc r7,__zero_reg__
1588 07ca 811C adc r8,__zero_reg__
1589 07cc 911C adc r9,__zero_reg__
228:FAT16.c **** m=(Start%BytePerClus)%BPB_BytesPerSec; //计算开始位置在扇区内偏移
1591 .LM140:
1592 07ce C601 movw r24,r12
1593 07d0 B501 movw r22,r10
1594 07d2 A801 movw r20,r16
1595 07d4 9701 movw r18,r14
1596 07d6 0E94 0000 call __udivmodsi4
1597 07da DC01 movw r26,r24
1598 07dc CB01 movw r24,r22
1599 07de 8C01 movw r16,r24
1600 .L106:
1601 .L123:
229:FAT16.c ****
230:FAT16.c **** READ:
231:FAT16.c **** for(;i<BPB_SecPerClus;i++){
1603 .LM141:
1604 07e0 8091 0000 lds r24,BPB_SecPerClus
1605 07e4 3816 cp r3,r24
1606 07e6 B8F5 brsh .L119
232:FAT16.c **** ReadFatBlock(LBA++);
1608 .LM142:
1609 07e8 D401 movw r26,r8
1610 07ea C301 movw r24,r6
1611 07ec 0894 sec
1612 07ee 611C adc r6,__zero_reg__
1613 07f0 711C adc r7,__zero_reg__
1614 07f2 811C adc r8,__zero_reg__
1615 07f4 911C adc r9,__zero_reg__
1616 07f6 BC01 movw r22,r24
1617 07f8 CD01 movw r24,r26
1618 07fa 0E94 0000 call ReadFatBlock
233:FAT16.c **** for(;m<BPB_BytesPerSec;m++){
1620 .LM143:
1621 07fe 8091 0000 lds r24,BPB_BytesPerSec
1622 0802 9091 0000 lds r25,(BPB_BytesPerSec)+1
1623 0806 0817 cp r16,r24
1624 0808 1907 cpc r17,r25
1625 080a 08F5 brsh .L121
1626 080c F801 movw r30,r16
1627 080e E050 subi r30,lo8(-(BUFFER))
1628 0810 F040 sbci r31,hi8(-(BUFFER))
1629 .L114:
234:FAT16.c **** *p++=BUFFER[m];
1631 .LM144:
1632 0812 8191 ld r24,Z+
1633 0814 AFA1 ldd r26,Y+39
1634 0816 B8A5 ldd r27,Y+40
1635 0818 8D93 st X+,r24
1636 081a B8A7 std Y+40,r27
1637 081c AFA3 std Y+39,r26
235:FAT16.c **** if(--len==0)return SD_SUCC; //如果读取完成就退出
1639 .LM145:
1640 081e 8BA1 ldd r24,Y+35
1641 0820 9CA1 ldd r25,Y+36
1642 0822 ADA1 ldd r26,Y+37
1643 0824 BEA1 ldd r27,Y+38
1644 0826 0197 sbiw r24,1
1645 0828 A109 sbc r26,__zero_reg__
1646 082a B109 sbc r27,__zero_reg__
1647 082c 8BA3 std Y+35,r24
1648 082e 9CA3 std Y+36,r25
1649 0830 ADA3 std Y+37,r26
1650 0832 BEA3 std Y+38,r27
1651 0834 0097 sbiw r24,0
1652 0836 A105 cpc r26,__zero_reg__
1653 0838 B105 cpc r27,__zero_reg__
1654 083a C9F0 breq .L122
1656 .LM146:
1657 083c 0F5F subi r16,lo8(-(1))
1658 083e 1F4F sbci r17,hi8(-(1))
1659 0840 8091 0000 lds r24,BPB_BytesPerSec
1660 0844 9091 0000 lds r25,(BPB_BytesPerSec)+1
1661 0848 0817 cp r16,r24
1662 084a 1907 cpc r17,r25
1663 084c 10F3 brlo .L114
1664 .L121:
236:FAT16.c **** }
237:FAT16.c **** m=0;
1666 .LM147:
1667 084e 00E0 ldi r16,lo8(0)
1668 0850 10E0 ldi r17,hi8(0)
1670 .LM148:
1671 0852 3394 inc r3
1672 0854 C5CF rjmp .L123
1673 .L119:
238:FAT16.c **** }
239:FAT16.c **** i=0;
1675 .LM149:
1676 0856 3324 clr r3
240:FAT16.c **** ClusID=ReadFAT(ClusID); //下一簇簇号
1678 .LM150:
1679 0858 C201 movw r24,r4
1680 085a 0E94 0000 call ReadFAT
1681 085e 2C01 movw r4,r24
241:FAT16.c **** LBA=ClusConvLBA(ClusID);
1683 .LM151:
1684 0860 0E94 0000 call ClusConvLBA
1685 0864 DC01 movw r26,r24
1686 0866 CB01 movw r24,r22
1687 0868 3C01 movw r6,r24
1688 086a 4D01 movw r8,r26
242:FAT16.c **** goto READ;
1690 .LM152:
1691 086c B9CF rjmp .L123
1692 .L122:
1694 .LM153:
1695 086e 80E0 ldi r24,lo8(0)
1696 0870 90E0 ldi r25,hi8(0)
1697 .L100:
1698 /* epilogue: frame size=40 */
1699 0872 A896 adiw r28,40
1700 0874 0FB6 in __tmp_reg__,__SREG__
1701 0876 F894 cli
1702 0878 DEBF out __SP_H__,r29
1703 087a 0FBE out __SREG__,__tmp_reg__
1704 087c CDBF out __SP_L__,r28
1705 087e DF91 pop r29
1706 0880 CF91 pop r28
1707 0882 1F91 pop r17
1708 0884 0F91 pop r16
1709 0886 FF90 pop r15
1710 0888 EF90 pop r14
1711 088a DF90 pop r13
1712 088c CF90 pop r12
1713 088e BF90 pop r11
1714 0890 AF90 pop r10
1715 0892 9F90 pop r9
1716 0894 8F90 pop r8
1717 0896 7F90 pop r7
1718 0898 6F90 pop r6
1719 089a 5F90 pop r5
1720 089c 4F90 pop r4
1721 089e 3F90 pop r3
1722 08a0 0895 ret
1723 /* epilogue end (size=24) */
1724 /* function ReadFile size 223 (174) */
1735 .Lscope22:
1741 .global WriteFile
1743 WriteFile:
243:FAT16.c **** }
244:FAT16.c **** //-------------------------------------------------------------------------
245:FAT16.c **** //写文件
246:FAT16.c **** uint8_t WriteFile(uint8_t Name[11],uint32_t Start,uint32_t len,uint8_t *p){
1745 .LM154:
1746 /* prologue: frame size=40 */
1747 08a2 3F92 push r3
1748 08a4 4F92 push r4
1749 08a6 5F92 push r5
1750 08a8 6F92 push r6
1751 08aa 7F92 push r7
1752 08ac 8F92 push r8
1753 08ae 9F92 push r9
1754 08b0 AF92 push r10
1755 08b2 BF92 push r11
1756 08b4 CF92 push r12
1757 08b6 DF92 push r13
1758 08b8 EF92 push r14
1759 08ba FF92 push r15
1760 08bc 0F93 push r16
1761 08be 1F93 push r17
1762 08c0 CF93 push r28
176
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -