📄 fat.txt
字号:
;;;1712 FAT_DBG_Printf(("\r\nSearch one folder start, cluster = %ld"),cluster);
;;;1713 #endif
;;;1714
;;;1715 if(SearchFolder(cluster,&temp_addr))
0009f8 e28d1000 ADD r1,sp,#0
0009fc ebfffffe BL SearchFolder
;;;1716 {
;;;1717 #if FAT_DEBUG
;;;1718 FAT_DBG_Printf(("\r\nERROR: search folder error"));
;;;1719 #endif
;;;1720 }
;;;1721 if(GetFolderCluster(temp_addr) != 0xffffffff)
000a00 e1dd00b0 LDRH r0,[sp,#0]
000a04 e7951000 LDR r1,[r5,r0]
000a08 e3710001 CMN r1,#1
000a0c 17856000 STRNE r6,[r5,r0]
;;;1722 WriteFolderCluster(temp_addr,0XFFFFFFFF);
;;;1723 if(temp_addr == RECORD_ADDR_END)
000a10 e3500b01 CMP r0,#0x400
;;;1724 {
;;;1725 #if FAT_DEBUG
;;;1726 FAT_DBG_Printf(("\r\nWARNING: EEPROM is full, no more space!"));
;;;1727 #endif
;;;1728 WriteFolderCluster(temp_addr - 4,0XFFFFFFFF);
;;;1729 break;
;;;1730 }
;;;1731 #if FAT_DEBUG
;;;1732 FAT_DBG_Printf(("\r\nSearch one folder complete!\r\n"));
;;;1733 #endif
;;;1734 }
;;;1735 addr+=4;
000a14 12840004 ADDNE r0,r4,#4
000a18 13c04801 BICNE r4,r0,#0x10000
000a1c 1afffff2 BNE |L1.2540|
000a20 e58563fc STR r6,[r5,#0x3fc] ;1705
|L1.2596|
;;;1736 }
;;;1737 #if FAT_DEBUG
;;;1738 FAT_DBG_Printf(("\r\nSearch Completed!\r\n"));
;;;1739 #endif
;;;1740 return 0;
000a24 e8bd40f8 POP {r3-r7,lr}
000a28 e3a00000 MOV r0,#0
;;;1741 }
000a2c e12fff1e BX lr
;;;1742
ENDP
Search PROC
;;;1745 BYTE Search(/*BYTE *dir*/WORD *music_record_addr,struct direntryBytes *MusicInfo,WORD *Count,BYTE *type)//当COUNT为零时,有它带回这个目录下总共有多少首音乐
;;;1746 { //不为零时有MusicInfo带回第Count首歌的详细文件信息
000a30 e92d4fff PUSH {r0-r11,lr}
;;;1747 BYTE *buffer;
;;;1748 DWORD sector;
;;;1749 DWORD cluster;
;;;1750 DWORD tempclust;
;;;1751 BYTE cnt;
;;;1752 WORD offset;
;;;1753 WORD i=0;
000a34 e3a04000 MOV r4,#0
;;;1754 BYTE j;//long name buffer offset;
;;;1755 BYTE *p;//long name buffer pointer
;;;1756 struct direntryBytes *item = 0;
;;;1757 struct winentryBytes *we =0;
;;;1758 //cluster = FAT_OpenDir(dir);
;;;1759 //if(cluster == 1)return 1;
;;;1760
;;;1761 WORD addr = RECORD_ADDR_START;
000a38 e59fa4a0 LDR r10,|L1.3808|
000a3c e24dd00c SUB sp,sp,#0xc ;1746
000a40 e1a05002 MOV r5,r2 ;1746
000a44 e1a06003 MOV r6,r3 ;1746
000a48 e1a07004 MOV r7,r4
000a4c e58d4000 STR r4,[sp,#0]
|L1.2640|
000a50 e59f0494 LDR r0,|L1.3820|
000a54 e59d1000 LDR r1,[sp,#0]
000a58 e790b001 LDR r11,[r0,r1]
;;;1762
;;;1763 while(1)
;;;1764 {
;;;1765 #if FAT_DEBUG
;;;1766 FAT_DBG_Printf(("\r\n"));
;;;1767 #endif
;;;1768 cluster = GetFolderCluster(addr);
;;;1769 #if FAT_DEBUG
;;;1770 FAT_DBG_Printf(("Search the folder: cluster: %ld\r\n"),cluster);
;;;1771 #endif
;;;1772 addr += 4;
000a5c e2810004 ADD r0,r1,#4
000a60 e3c00801 BIC r0,r0,#0x10000
;;;1773 if(cluster == 0xffffffff)break;
000a64 e37b0001 CMN r11,#1
000a68 e58d0000 STR r0,[sp,#0]
000a6c 0a000143 BEQ |L1.3968|
;;;1774 else
;;;1775 {
;;;1776 if(music_record_addr != 0) *music_record_addr = addr - 4; /* record in which record found the right file */
000a70 e59d000c LDR r0,[sp,#0xc]
000a74 e3500000 CMP r0,#0
000a78 159d0000 LDRNE r0,[sp,#0]
000a7c 159d100c LDRNE r1,[sp,#0xc]
000a80 12400004 SUBNE r0,r0,#4
000a84 11c100b0 STRHNE r0,[r1,#0]
;;;1777 if(cluster==0 && FAT32_Enable==0)// root directory
000a88 e5da0002 LDRB r0,[r10,#2] ; FAT32_Enable
000a8c e190000b ORRS r0,r0,r11
000a90 1a00008e BNE |L1.3280|
;;;1778 {
;;;1779 buffer=malloc(512);//apply memory
000a94 e3a00c02 MOV r0,#0x200
000a98 ebfffffe BL malloc
000a9c e1b0b000 MOVS r11,r0
;;;1780 if(buffer==0)return 1;//if failed
000aa0 0a000095 BEQ |L1.3324|
;;;1781 for(cnt=0;cnt<RootDirSectors;cnt++)
000aa4 e3a09000 MOV r9,#0
000aa8 ea000082 B |L1.3256|
|L1.2732|
;;;1782 {
;;;1783 if(FAT_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
000aac e59a001c LDR r0,[r10,#0x1c] ; FirstDirSector
000ab0 e59a2028 LDR r2,[r10,#0x28] ; FAT_ReadSector
000ab4 e0800009 ADD r0,r0,r9
000ab8 e1a0100b MOV r1,r11
000abc e1a0e00f MOV lr,pc
000ac0 e12fff12 BX r2
000ac4 e3500000 CMP r0,#0
;;;1784 for(offset=0;offset<512;offset+=32)
000ac8 03a08000 MOVEQ r8,#0
000acc 0a000001 BEQ |L1.2776|
000ad0 e1a0000b MOV r0,r11 ;1783
000ad4 ea000096 B |L1.3380|
|L1.2776|
;;;1785 {
;;;1786 item=(struct direntryBytes *)(&buffer[offset]);//pointer convert
000ad8 e08b1008 ADD r1,r11,r8
;;;1787 //find a valid item and display it
;;;1788 if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5))
000adc e5d10000 LDRB r0,[r1,#0]
000ae0 e350002e CMP r0,#0x2e
000ae4 13500000 CMPNE r0,#0
000ae8 135000e5 CMPNE r0,#0xe5
000aec 0a00006b BEQ |L1.3232|
;;;1789 {
;;;1790 if(item->deAttributes == 0x0f)
000af0 e5d1200b LDRB r2,[r1,#0xb]
000af4 e352000f CMP r2,#0xf
000af8 1a000031 BNE |L1.3012|
;;;1791 {
;;;1792 we = (struct winentryBytes *)(&buffer[offset]);
;;;1793 j = 26 *( (we->weCnt-1) & WIN_CNT);
000afc e2400001 SUB r0,r0,#1
000b00 e200003f AND r0,r0,#0x3f
000b04 e3a0201a MOV r2,#0x1a
000b08 e0000092 MUL r0,r2,r0
000b0c e20000ff AND r0,r0,#0xff
;;;1794 if(j<MAX_LONG_NAME_SIZE-25)
000b10 e3500037 CMP r0,#0x37
000b14 2a000026 BCS |L1.2996|
;;;1795 {
;;;1796 p = &LongNameBuffer[j];
000b18 e59f23d0 LDR r2,|L1.3824|
000b1c e0800002 ADD r0,r0,r2
;;;1797 for (j=0;j<10;j++) *p++ = we->wePart1[j];
000b20 e3a02000 MOV r2,#0
|L1.2852|
000b24 e0813002 ADD r3,r1,r2
000b28 e5d3c001 LDRB r12,[r3,#1]
000b2c e1a03000 MOV r3,r0
000b30 e2822001 ADD r2,r2,#1
000b34 e20220ff AND r2,r2,#0xff
000b38 e352000a CMP r2,#0xa
000b3c e2800001 ADD r0,r0,#1
000b40 e5c3c000 STRB r12,[r3,#0]
000b44 3afffff6 BCC |L1.2852|
;;;1798 for (j=0;j<12;j++) *p++ = we->wePart2[j];
000b48 e3a02000 MOV r2,#0
|L1.2892|
000b4c e0813002 ADD r3,r1,r2
000b50 e5d3c00e LDRB r12,[r3,#0xe]
000b54 e1a03000 MOV r3,r0
000b58 e2822001 ADD r2,r2,#1
000b5c e20220ff AND r2,r2,#0xff
000b60 e352000c CMP r2,#0xc
000b64 e2800001 ADD r0,r0,#1
000b68 e5c3c000 STRB r12,[r3,#0]
000b6c 3afffff6 BCC |L1.2892|
;;;1799 for (j=0;j<4;j++) *p++ = we->wePart3[j];
000b70 e3a02000 MOV r2,#0
|L1.2932|
000b74 e0813002 ADD r3,r1,r2
000b78 e5d3c01c LDRB r12,[r3,#0x1c]
000b7c e1a03000 MOV r3,r0
000b80 e2822001 ADD r2,r2,#1
000b84 e20220ff AND r2,r2,#0xff
000b88 e3520004 CMP r2,#4
000b8c e2800001 ADD r0,r0,#1
000b90 e5c3c000 STRB r12,[r3,#0]
000b94 3afffff6 BCC |L1.2932|
;;;1800 if (we->weCnt & 0x40) (*(WORD *)p) = 0;
000b98 e5d12000 LDRB r2,[r1,#0]
000b9c e3120040 TST r2,#0x40
000ba0 11c070b0 STRHNE r7,[r0,#0]
;;;1801 if ((we->weCnt & WIN_CNT) == 1) LongNameFlag = 1;
000ba4 e5d10000 LDRB r0,[r1,#0]
000ba8 e200003f AND r0,r0,#0x3f
000bac e3500001 CMP r0,#1
000bb0 05ca0001 STRBEQ r0,[r10,#1] ; LongNameFlag
|L1.2996|
;;;1802 }
;;;1803 LongNameBuffer[MAX_LONG_NAME_SIZE-1] = 0;
000bb4 e59f0334 LDR r0,|L1.3824|
000bb8 e5c0704f STRB r7,[r0,#0x4f] ; LongNameBuffer
;;;1804 LongNameBuffer[MAX_LONG_NAME_SIZE-2] = 0;
000bbc e5c0704e STRB r7,[r0,#0x4e] ; LongNameBuffer
000bc0 ea000036 B |L1.3232|
|L1.3012|
;;;1805 /*p = &LongNameBuffer[j];
;;;1806 for (j=0;j<10;j++) *p++ = we->wePart1[j];
;;;1807 for (j=0;j<12;j++) *p++ = we->wePart2[j];
;;;1808 for (j=0;j<4;j++) *p++ = we->wePart3[j];
;;;1809 if (we->weCnt & 0x40) (*(unsigned int *)p) = 0;
;;;1810 if ((we->weCnt & WIN_CNT) == 1) LongNameFlag = 1; */
;;;1811 }
;;;1812 else if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'P')&&(item->deExtension[2] == '3'))
000bc4 e5d10008 LDRB r0,[r1,#8]
000bc8 e350004d CMP r0,#0x4d
000bcc 1a00000b BNE |L1.3072|
000bd0 e5d10009 LDRB r0,[r1,#9]
000bd4 e3500050 CMP r0,#0x50
000bd8 1a000016 BNE |L1.3128|
000bdc e5d1000a LDRB r0,[r1,#0xa]
000be0 e3500033 CMP r0,#0x33
000be4 1a00002c BNE |L1.3228|
;;;1813 {
;;;1814 #if FAT_DEBUG
;;;1815 FAT_DBG_Printf(("\r\nFound mp3 file! index = %d name: "),i+1);
;;;1816 for(j=0;j<8;j++)FAT_DBG_Putc(item->deName[j]);
;;;1817 FAT_DBG_Putc('.');
;;;1818 for(j=0;j<3;j++)FAT_DBG_Putc(item->deExtension[j]);
;;;1819 FAT_DBG_Printf("\r\n");
;;;1820 #endif
;;;1821 CopyDirentruyItem(MusicInfo,item);
000be8 e59d0010 LDR r0,[sp,#0x10]
000bec ebfffffe BL CopyDirentruyItem
;;;1822 *type=1;
000bf0 e3a00001 MOV r0,#1
;;;1823 i++;
;;;1824 if(i==*Count){free(buffer);return 0;}
000bf4 ea000022 B |L1.3204|
|L1.3064|
000bf8 e1a0000b MOV r0,r11
000bfc ea000097 B |L1.3680|
|L1.3072|
;;;1825 else LongNameFlag = 0;
;;;1826 }
;;;1827 else if((item->deExtension[0] == 'W')&&(item->deExtension[1] == 'M')&&(item->deExtension[2] == 'A'))
000c00 e3500057 CMP r0,#0x57
000c04 1a000009 BNE |L1.3120|
000c08 e5d10009 LDRB r0,[r1,#9]
000c0c e350004d CMP r0,#0x4d
000c10 1a000013 BNE |L1.3172|
000c14 e5d1000a LDRB r0,[r1,#0xa]
000c18 e3500041 CMP r0,#0x41
000c1c 1a00001e BNE |L1.3228|
;;;1828 {
;;;1829 #if FAT_DEBUG
;;;1830 FAT_DBG_Printf(("\r\nFound wma file! index = %d name: "),i+1);
;;;1831 for(j=0;j<8;j++)FAT_DBG_Putc(item->deName[j]);
;;;1832 FAT_DBG_Putc('.');
;;;1833 for(j=0;j<3;j++)FAT_DBG_Putc(item->deExtension[j]);
;;;1834 FAT_DBG_Printf("\r\n");
;;;1835 #endif
;;;1836 CopyDirentruyItem(MusicInfo,item);
000c20 e59d0010 LDR r0,[sp,#0x10]
000c24 ebfffffe BL CopyDirentruyItem
;;;1837 *type=2;
000c28 e3a00002 MOV r0,#2
;;;1838 i++;
;;;1839 if(i==*Count){free(buffer);return 0;}
000c2c ea000014 B |L1.3204|
|L1.3120|
;;;1840 else LongNameFlag = 0;
;;;1841 }
;;;1842 else if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'I')&&(item->deExtension[
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -