📄 fat32getdirname.lst
字号:
149 =2 BYTE Name2[12];
150 =2 WORD FstClusLO;
151 =2 BYTE Name3[4];
152 =2 };
153 =2
154 =2 struct FAT32Str //FAT32参数表
155 =2 {
156 =2 BYTE ClusSecCnt; //当前簇扇区计数
157 =2 DWORD CurrentDirectory; //当前目录入口(簇号)
158 =2 BYTE SecPerClus; //每簇扇区数 1 2 4 8 16 32 64 128
159 =2 WORD RsvdSecCnt; //保留扇区数 0x20
160 =2 BYTE NumFATs; //FAT表个数 2
161 =2 DWORD RootClus; //根目录开始的簇
162 =2 DWORD ClusSec; //簇开始的扇区
163 =2 DWORD FATSz; //FAT表大小(扇区)
164 =2 DWORD FATSec; //FAT表开始扇区
C51 COMPILER V8.08 FAT32GETDIRNAME 06/01/2008 16:21:03 PAGE 10
165 =2 DWORD FSISec; //FSI所在扇区
166 =2 DWORD FSIFreeCount; //空闲簇数
167 =2 DWORD FSINxtFree; //空闲簇搜索指针
168 =2 };
169 =2
170 =2 struct FCBStr
171 =2 {
172 =2 CHAR FileName[12]; //文件名
173 =2 DWORD Size; //文件大小
174 =2 DWORD FirstCluster; //第一个簇
175 =2 DWORD LastCluster; //最近一次读到的簇号
176 =2 DWORD ClusSecCnt; //当前簇扇区计数
177 =2 DWORD ByteCnt; //当前字节计数
178 =2 };
179 =2
180 =2 struct FATStr
181 =2 {
182 =2 DWORD Sector;
183 =2 DWORD FAT[128];
184 =2 };
185 =2
186 =2 #ifndef _LIBRARY_DEFINE
=2 xdata BYTE DiskBuffer[512];
=2
=2 xdata struct sDPTStr sDPT[4];
=2 xdata struct FAT32Str FAT32;
=2 xdata struct FCBStr FCB[FAT32_MAX_FCB];
=2 xdata CHAR LongFileName[256];
=2 xdata struct FATStr FAT;
=2 xdata struct DPTStr *DPT; //分区表结构指针
=2 xdata struct BootSecStr *BOOTSEC; //引导扇区结构指针
=2 xdata struct FAT32FSInfoStr *FSI; //FAT32扩展信息
=2 xdata struct FAT32SDirStr *sDIR; //FAT目录结构指针
=2 xdata struct FAT32LDirStr *lDIR; //FAT目录结构指针
=2 #endif
200 =2 #endif
201 =2
202 =2 extern xdata BYTE DiskBuffer[512];
203 =2
204 =2 extern xdata struct sDPTStr sDPT[4];
205 =2 extern xdata struct FAT32Str FAT32;
206 =2 extern xdata struct FCBStr FCB[FAT32_MAX_FCB];
207 =2 extern xdata CHAR LongFileName[256];
208 =2 extern xdata struct FATStr FAT;
209 =2 extern xdata struct DPTStr *DPT; //分区表结构指针
210 =2 extern xdata struct BootSecStr *BOOTSEC; //引导扇区结构指针
211 =2 extern xdata struct FAT32FSInfoStr *FSI; //FAT32扩展信息
212 =2 extern xdata struct FAT32SDirStr *sDIR; //FAT目录结构指针
213 =2 extern xdata struct FAT32LDirStr *lDIR; //FAT目录结构指针
214 =2
215 =2 extern void FAT32Init(void);
216 =2 extern BYTE FAT32MountPartition(void);
217 =2 extern BYTE FAT32MountVolumeID(BYTE Partition);
218 =2 extern BYTE FAT32GetDirName(WORD SecNum);
219 =2 extern void FAT32GetPartLongName(struct FAT32LDirStr *ldp,CHAR *name);
220 =2 extern DWORD FAT32DiskSize(void);
221 =2 extern DWORD FAT32DiskFreeSize(void);
222 =2 extern BYTE FAT32FindDIREntry(CHAR *DirName);
223 =2 extern void FAT32ReadCluster(DWORD *Cluster);
224 =2 extern BYTE FAT32ChangeDirectory(CHAR *DirName);
225 =2 extern BYTE FAT32ListDirectory(void);
226 =2 extern DWORD FAT32NextCluster(DWORD CurrentCluster);
C51 COMPILER V8.08 FAT32GETDIRNAME 06/01/2008 16:21:03 PAGE 11
227 =2 extern BYTE FAT32OpenFile(CHAR *filename);
228 =2 extern void FAT32CloseFile(BYTE fp);
229 =2 extern WORD FAT32ReadFile(BYTE fp);
11 =1
12 =1
3 #endif
4
5 BYTE FAT32GetDirName(WORD SecNum);
6
7 BYTE FAT32GetDirName(WORD SecNum)
8 {
9 1 BYTE i,j,k,m,n;
10 1 DWORD chain;
11 1 CHAR temp[27];
12 1
13 1 chain=FAT32.CurrentDirectory;
14 1 FAT32.ClusSecCnt=0;
15 1 while(chain!=0x0fffffff)
16 1 {
17 2 FAT32ReadCluster(&chain);
18 2 for (i=0;i<16;i++)
19 2 {
20 3 if (SecNum==1)
21 3 {
22 4 if ((sDIR[i].Attr&FAT32_ATTR_LONG_NAME_MASK)==FAT32_ATTR_LONG_NAME)
23 4 //长文件名
24 4 {
25 5 j=lDIR[i].Ord - FAT32_LAST_LONG_ENTRY;
26 5 LongFileName[0]=0;n=0;
27 5 for(;j>0;j--)
28 5 {
29 6 FAT32GetPartLongName(lDIR+i,temp);
30 6 m=strlen((char *)temp);
31 6 k=m+n;
32 6 for(;n>0;n--)
33 6 LongFileName[m+n]=LongFileName[n];
34 6 LongFileName[m+n]=LongFileName[n];
35 6 m--;
36 6 for(;m>0;m--)
37 6 LongFileName[m]=temp[m];
38 6 LongFileName[m]=temp[m];
39 6 n=k;
40 6 i++;
41 6 if (i==16)
42 6 {
43 7 FAT32ReadCluster(&chain);
44 7 i=0;
45 7 }
46 6 }
47 5 if (sDIR[i].Name[0]==0x00||sDIR[i].Name[0]==0xe5) return(3); //空目录项
48 5 if (sDIR[i].Attr&FAT32_ATTR_DIRECTORY) return(2); //找到一个目录入口
49 5 }
50 4 else
51 4 {
52 5 //短文件名
53 5 if (sDIR[i].Name[0]==0x00||sDIR[i].Name[0]==0xe5) return(3); //空目录项
54 5 if (sDIR[i].Attr&FAT32_ATTR_VOLUME_ID) continue; //如果是目录入口或卷标则跳过
55 5 for(j=0;j<11;j++)
56 5 LongFileName[j]=sDIR[i].Name[j];
57 5 LongFileName[j]=0;
58 5 for(j=0;j<3;j++)
59 5 temp[j]=toupper(sDIR[i].Name[8+j]);
C51 COMPILER V8.08 FAT32GETDIRNAME 06/01/2008 16:21:03 PAGE 12
60 5 temp[j]=0;
61 5 if (sDIR[i].Attr&FAT32_ATTR_DIRECTORY) return(2); //找到一个目录入口
62 5 }
63 4 return(1);
64 4 }
65 3 else if (sDIR[i].Attr!=FAT32_ATTR_LONG_NAME) SecNum--;
66 3 }
67 2 }
68 1 return(0);
69 1 }
70
C51 COMPILER V8.08 FAT32GETDIRNAME 06/01/2008 16:21:03 PAGE 13
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _FAT32GetDirName (BEGIN)
; SOURCE LINE # 7
0000 900000 R MOV DPTR,#SecNum
0003 EE MOV A,R6
0004 F0 MOVX @DPTR,A
0005 A3 INC DPTR
0006 EF MOV A,R7
0007 F0 MOVX @DPTR,A
; SOURCE LINE # 8
; SOURCE LINE # 13
0008 900000 E MOV DPTR,#FAT32+01H
000B E0 MOVX A,@DPTR
000C FC MOV R4,A
000D A3 INC DPTR
000E E0 MOVX A,@DPTR
000F FD MOV R5,A
0010 A3 INC DPTR
0011 E0 MOVX A,@DPTR
0012 FE MOV R6,A
0013 A3 INC DPTR
0014 E0 MOVX A,@DPTR
0015 FF MOV R7,A
0016 900000 R MOV DPTR,#chain
0019 120000 E LCALL ?C?LSTXDATA
; SOURCE LINE # 14
001C E4 CLR A
001D 900000 E MOV DPTR,#FAT32
0020 F0 MOVX @DPTR,A
0021 ?C0001:
; SOURCE LINE # 15
0021 74FF MOV A,#0FFH
0023 FF MOV R7,A
0024 FE MOV R6,A
0025 FD MOV R5,A
0026 7C0F MOV R4,#0FH
0028 900000 R MOV DPTR,#chain
002B E0 MOVX A,@DPTR
002C F8 MOV R0,A
002D A3 INC DPTR
002E E0 MOVX A,@DPTR
002F F9 MOV R1,A
0030 A3 INC DPTR
0031 E0 MOVX A,@DPTR
0032 FA MOV R2,A
0033 A3 INC DPTR
0034 E0 MOVX A,@DPTR
0035 FB MOV R3,A
0036 C3 CLR C
0037 120000 E LCALL ?C?ULCMP
003A 7003 JNZ $ + 5H
003C 020000 R LJMP ?C0002
; SOURCE LINE # 16
; SOURCE LINE # 17
003F 7B01 MOV R3,#01H
0041 7A00 R MOV R2,#HIGH chain
0043 7900 R MOV R1,#LOW chain
0045 120000 E LCALL _FAT32ReadCluster
; SOURCE LINE # 18
0048 E4 CLR A
C51 COMPILER V8.08 FAT32GETDIRNAME 06/01/2008 16:21:03 PAGE 14
0049 900000 R MOV DPTR,#i
004C F0 MOVX @DPTR,A
004D ?C0003:
004D 900000 R MOV DPTR,#i
0050 E0 MOVX A,@DPTR
0051 FF MOV R7,A
0052 C3 CLR C
0053 9410 SUBB A,#010H
0055 50CA JNC ?C0001
; SOURCE LINE # 19
; SOURCE LINE # 20
0057 900000 R MOV DPTR,#SecNum
005A E0 MOVX A,@DPTR
005B 7004 JNZ ?C0035
005D A3 INC DPTR
005E E0 MOVX A,@DPTR
005F 6401 XRL A,#01H
0061 ?C0035:
0061 6003 JZ $ + 5H
0063 020000 R LJMP ?C0006
; SOURCE LINE # 21
; SOURCE LINE # 22
0066 EF MOV A,R7
0067 75F020 MOV B,#020H
006A A4 MUL AB
006B FF MOV R7,A
006C 900000 E MOV DPTR,#sDIR
006F E0 MOVX A,@DPTR
0070 FB MOV R3,A
0071 A3 INC DPTR
0072 E0 MOVX A,@DPTR
0073 FA MOV R2,A
0074 A3 INC DPTR
0075 E0 MOVX A,@DPTR
0076 2F ADD A,R7
0077 F9 MOV R1,A
0078 EA MOV A,R2
0079 35F0 ADDC A,B
007B FA MOV R2,A
007C 90000B MOV DPTR,#0BH
007F 120000 E LCALL ?C?CLDOPTR
0082 543F ANL A,#03FH
0084 640F XRL A,#0FH
0086 6003 JZ $ + 5H
0088 020000 R LJMP ?C0007
; SOURCE LINE # 24
; SOURCE LINE # 25
008B 900000 E MOV DPTR,#lDIR
008E E0 MOVX A,@DPTR
008F FB MOV R3,A
0090 A3 INC DPTR
0091 E0 MOVX A,@DPTR
0092 FA MOV R2,A
0093 A3 INC DPTR
0094 E0 MOVX A,@DPTR
0095 F9 MOV R1,A
0096 900000 R MOV DPTR,#i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -