📄 fat.txt
字号:
GetFolderCluster PROC
00079c e59f1748 LDR r1,|L1.3820|
0007a0 e7910000 LDR r0,[r1,r0] ;0
0007a4 e12fff1e BX lr ;0
ENDP
SearchFolder PROC
;;;1595 BYTE SearchFolder(DWORD cluster,WORD *addr)
;;;1596 {
0007a8 e92d4ff8 PUSH {r3-r11,lr}
;;;1597 BYTE *buffer;
;;;1598 //BYTE buff[3];
;;;1599 DWORD sector;
;;;1600 //DWORD cluster;
;;;1601 DWORD tempclust;
;;;1602 BYTE cnt;
;;;1603 WORD offset;
;;;1604 //unsigned int i=0;
;;;1605 //unsigned char j;//long name buffer offset;
;;;1606 // unsigned char *p;//long name buffer pointer
;;;1607 struct direntryBytes *item = 0;
;;;1608 //struct winentry *we =0;
;;;1609
;;;1610 if(cluster==0 && FAT32_Enable==0)// root directory
0007ac e59f972c LDR r9,|L1.3808|
0007b0 e1a04001 MOV r4,r1 ;1596
0007b4 e5d91002 LDRB r1,[r9,#2] ; FAT32_Enable
0007b8 e1911000 ORRS r1,r1,r0
;;;1611 {
;;;1612 buffer=malloc(512);//apply memory
;;;1613 if(buffer==0)return 1;//if failed
;;;1614 for(cnt=0;cnt<RootDirSectors;cnt++)
;;;1615 {
;;;1616 if(FAT_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
;;;1617 for(offset=0;offset<512;offset+=32)
;;;1618 {
;;;1619 item=(struct direntryBytes *)(&buffer[offset]);//pointer convert
;;;1620 //find a valid item and display it
;;;1621 if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5))
;;;1622 {
;;;1623 if(item->deAttributes & ATTR_DIRECTORY )
;;;1624 {
;;;1625 #if FAT_DEBUG
;;;1626 FAT_DBG_Printf(("\r\nFound a folder!"));
;;;1627 #endif
;;;1628 if(*addr==RECORD_ADDR_END)return 0;
;;;1629 else
;;;1630 {
;;;1631 WriteFolderCluster(*addr,get16_little(item->deStartCluster)+(((DWORD)get16_little(item->deHighClust))<<16));
;;;1632 *addr+=4;
;;;1633 }
;;;1634 }
;;;1635 }
;;;1636 }
;;;1637 }
;;;1638 free(buffer);//release
;;;1639 }
;;;1640 else//other folders
;;;1641 {
;;;1642 tempclust=cluster;
0007bc 11a08000 MOVNE r8,r0
;;;1643 while(1)
0007c0 1a000032 BNE |L1.2192|
0007c4 e3a00c02 MOV r0,#0x200 ;1612
0007c8 ebfffffe BL malloc
0007cc e1b08000 MOVS r8,r0 ;1612
0007d0 0a000039 BEQ |L1.2236|
0007d4 e3a07000 MOV r7,#0 ;1614
0007d8 ea000026 B |L1.2168|
|L1.2012|
0007dc e599001c LDR r0,[r9,#0x1c] ;1616 ; FirstDirSector
0007e0 e5992028 LDR r2,[r9,#0x28] ;1616 ; FAT_ReadSector
0007e4 e0800007 ADD r0,r0,r7 ;1616
0007e8 e1a01008 MOV r1,r8 ;1616
0007ec e1a0e00f MOV lr,pc ;1616
0007f0 e12fff12 BX r2 ;1616
0007f4 e3500000 CMP r0,#0 ;1616
0007f8 03a06000 MOVEQ r6,#0 ;1617
0007fc 0a000001 BEQ |L1.2056|
000800 e1a00008 MOV r0,r8 ;1616
000804 ea000039 B |L1.2288|
|L1.2056|
000808 e0885006 ADD r5,r8,r6 ;1619
00080c e5d51000 LDRB r1,[r5,#0] ;1621
000810 e351002e CMP r1,#0x2e ;1621
000814 13510000 CMPNE r1,#0 ;1621
000818 135100e5 CMPNE r1,#0xe5 ;1621
00081c 15d5000b LDRBNE r0,[r5,#0xb] ;1623
000820 13100010 TSTNE r0,#0x10 ;1623
000824 0a00000d BEQ |L1.2144|
000828 e1d4a0b0 LDRH r10,[r4,#0] ;1628
00082c e35a0b01 CMP r10,#0x400 ;1628
000830 0a00005e BEQ |L1.2480|
000834 e285001a ADD r0,r5,#0x1a ;1631
000838 ebfffffe BL get16_little
00083c e1a0b000 MOV r11,r0 ;1631
000840 e2850014 ADD r0,r5,#0x14 ;1631
000844 ebfffffe BL get16_little
000848 e59f169c LDR r1,|L1.3820|
00084c e08b0800 ADD r0,r11,r0,LSL #16 ;1631
000850 e781000a STR r0,[r1,r10] ;1631
000854 e1d400b0 LDRH r0,[r4,#0] ;1632
000858 e2800004 ADD r0,r0,#4 ;1632
00085c e1c400b0 STRH r0,[r4,#0] ;1632
|L1.2144|
000860 e2860020 ADD r0,r6,#0x20 ;1617
000864 e3c06801 BIC r6,r0,#0x10000 ;1617
000868 e3560c02 CMP r6,#0x200 ;1617
00086c 3affffe5 BCC |L1.2056|
000870 e2870001 ADD r0,r7,#1 ;1614
000874 e20070ff AND r7,r0,#0xff ;1614
|L1.2168|
000878 e5990020 LDR r0,[r9,#0x20] ;1614 ; RootDirSectors
00087c e1570000 CMP r7,r0 ;1614
000880 3affffd5 BCC |L1.2012|
000884 e1a00008 MOV r0,r8 ;1638
000888 ebfffffe BL free
00088c ea000047 B |L1.2480|
|L1.2192|
;;;1644 {
;;;1645 sector=FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
000890 e59f5648 LDR r5,|L1.3808|
000894 e2481002 SUB r1,r8,#2
000898 e1d520b6 LDRH r2,[r5,#6] ; SectorsPerClust
00089c e5950010 LDR r0,[r5,#0x10] ; FirstDataSector
0008a0 e0200291 MLA r0,r1,r2,r0
0008a4 e58d0000 STR r0,[sp,#0]
;;;1646 buffer=malloc(512);//apply memory
0008a8 e3a00c02 MOV r0,#0x200
0008ac ebfffffe BL malloc
0008b0 e1b09000 MOVS r9,r0
;;;1647 if(buffer==0)return 1;//if failed
;;;1648 for(cnt=0;cnt<SectorsPerClust;cnt++)
0008b4 13a07000 MOVNE r7,#0
0008b8 1a00002a BNE |L1.2408|
|L1.2236|
0008bc e3a00001 MOV r0,#1 ;1647
|L1.2240|
0008c0 e8bd4ff8 POP {r3-r11,lr} ;1647
;;;1649 {
;;;1650 if(FAT_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
;;;1651 for(offset=0;offset<512;offset+=32)
;;;1652 {
;;;1653 item=(struct direntryBytes *)(&buffer[offset]);
;;;1654 if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5))
;;;1655 {
;;;1656 if(item->deAttributes & ATTR_DIRECTORY )
;;;1657 {
;;;1658 #if FAT_DEBUG
;;;1659 FAT_DBG_Printf(("\r\nFound a folder!"));
;;;1660 #endif
;;;1661 if(*addr==RECORD_ADDR_END)return 0;
;;;1662 else
;;;1663 {
;;;1664 WriteFolderCluster(*addr,get16_little(item->deStartCluster)+(((DWORD)get16_little(item->deHighClust))<<16));
;;;1665 *addr+=4;
;;;1666 }
;;;1667 }
;;;1668 }
;;;1669 }
;;;1670 }
;;;1671 free(buffer);//release
;;;1672 tempclust=FAT_NextCluster(tempclust);//next cluster
;;;1673 if(tempclust == 0x0fffffff || tempclust == 0x0ffffff8 || (FAT32_Enable == 0 && tempclust == 0xffff))break;
;;;1674 }
;;;1675 }
;;;1676 return 0;
;;;1677 }
0008c4 e12fff1e BX lr
|L1.2248|
0008c8 e59d0000 LDR r0,[sp,#0] ;1650
0008cc e5922028 LDR r2,[r2,#0x28] ;1650 ; FAT_ReadSector
0008d0 e0800007 ADD r0,r0,r7 ;1650
0008d4 e1a01009 MOV r1,r9 ;1650
0008d8 e1a0e00f MOV lr,pc ;1650
0008dc e12fff12 BX r2 ;1650
0008e0 e3500000 CMP r0,#0 ;1650
0008e4 03a06000 MOVEQ r6,#0 ;1651
0008e8 0a000002 BEQ |L1.2296|
0008ec e1a00009 MOV r0,r9 ;1650
|L1.2288|
0008f0 ebfffffe BL free
0008f4 eafffff0 B |L1.2236|
|L1.2296|
0008f8 e0895006 ADD r5,r9,r6 ;1653
0008fc e5d51000 LDRB r1,[r5,#0] ;1654
000900 e351002e CMP r1,#0x2e ;1654
000904 13510000 CMPNE r1,#0 ;1654
000908 135100e5 CMPNE r1,#0xe5 ;1654
00090c 15d5000b LDRBNE r0,[r5,#0xb] ;1656
000910 13100010 TSTNE r0,#0x10 ;1656
000914 0a00000d BEQ |L1.2384|
000918 e1d4a0b0 LDRH r10,[r4,#0] ;1661
00091c e35a0b01 CMP r10,#0x400 ;1661
000920 0a000022 BEQ |L1.2480|
000924 e285001a ADD r0,r5,#0x1a ;1664
000928 ebfffffe BL get16_little
00092c e1a0b000 MOV r11,r0 ;1664
000930 e2850014 ADD r0,r5,#0x14 ;1664
000934 ebfffffe BL get16_little
000938 e59f15ac LDR r1,|L1.3820|
00093c e08b0800 ADD r0,r11,r0,LSL #16 ;1664
000940 e781000a STR r0,[r1,r10] ;1664
000944 e1d400b0 LDRH r0,[r4,#0] ;1665
000948 e2800004 ADD r0,r0,#4 ;1665
00094c e1c400b0 STRH r0,[r4,#0] ;1665
|L1.2384|
000950 e2860020 ADD r0,r6,#0x20 ;1651
000954 e3c06801 BIC r6,r0,#0x10000 ;1651
000958 e3560c02 CMP r6,#0x200 ;1651
00095c 3affffe5 BCC |L1.2296|
000960 e2870001 ADD r0,r7,#1 ;1648
000964 e20070ff AND r7,r0,#0xff ;1648
|L1.2408|
000968 e59f2570 LDR r2,|L1.3808|
00096c e1d200b6 LDRH r0,[r2,#6] ;1648 ; SectorsPerClust
000970 e1570000 CMP r7,r0 ;1648
000974 3affffd3 BCC |L1.2248|
000978 e1a00009 MOV r0,r9 ;1671
00097c ebfffffe BL free
000980 e1a00008 MOV r0,r8 ;1672
000984 ebfffffe BL FAT_NextCluster
000988 e370021f CMN r0,#0xf0000001 ;1673
00098c e1a08000 MOV r8,r0 ;1672
000990 1378028f CMNNE r8,#0xf0000008 ;1673
000994 0a000005 BEQ |L1.2480|
000998 e59f0540 LDR r0,|L1.3808|
00099c e5d00002 LDRB r0,[r0,#2] ;1673 ; FAT32_Enable
0009a0 e3500000 CMP r0,#0 ;1673
0009a4 02480cff SUBEQ r0,r8,#0xff00 ;1673
0009a8 025000ff SUBSEQ r0,r0,#0xff ;1673
0009ac 1affffb7 BNE |L1.2192|
|L1.2480|
0009b0 e3a00000 MOV r0,#0 ;1676
0009b4 eaffffc1 B |L1.2240|
;;;1678
ENDP
SearchInit PROC
;;;1681 BYTE SearchInit()
;;;1682 {
0009b8 e92d40f8 PUSH {r3-r7,lr}
;;;1683 WORD addr = RECORD_ADDR_START;
;;;1684 WORD temp_addr;
;;;1685 DWORD cluster;
;;;1686
;;;1687 #if FAT_DEBUG
;;;1688 FAT_DBG_Printf(("\r\nSearchInit"));
;;;1689 #endif
;;;1690
;;;1691 if(FAT32_Enable)
0009bc e59f051c LDR r0,|L1.3808|
0009c0 e59f5524 LDR r5,|L1.3820|
0009c4 e5d01002 LDRB r1,[r0,#2] ; FAT32_Enable
0009c8 e3e06000 MVN r6,#0
;;;1692 WriteFolderCluster(addr,FirstDirClust);
;;;1693 else
;;;1694 WriteFolderCluster(RECORD_ADDR_START,0);
;;;1695
;;;1696 addr += 4;
;;;1697
;;;1698 WriteFolderCluster(addr, 0xffffffff);
;;;1699
;;;1700 #if FAT_DEBUG
;;;1701 FAT_DBG_Printf(("\r\n"));
;;;1702 #endif
;;;1703 temp_addr = addr;
;;;1704 addr = RECORD_ADDR_START;
0009cc e3a04000 MOV r4,#0
0009d0 e3510000 CMP r1,#0 ;1691
0009d4 1590000c LDRNE r0,[r0,#0xc] ;1692 ; FirstDirClust
0009d8 03a00000 MOVEQ r0,#0 ;1692
0009dc e5850000 STR r0,[r5,#0] ;1692
0009e0 e3a00004 MOV r0,#4 ;1696
0009e4 e5856004 STR r6,[r5,#4] ;1703
0009e8 e58d0000 STR r0,[sp,#0]
|L1.2540|
0009ec e7950004 LDR r0,[r5,r4]
;;;1705 while(1)
;;;1706 {
;;;1707 cluster = GetFolderCluster(addr);
;;;1708 if(cluster == 0xffffffff)break;
0009f0 e3700001 CMN r0,#1
0009f4 0a00000a BEQ |L1.2596|
;;;1709 else
;;;1710 {
;;;1711 #if FAT_DEBUG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -