📄 fatmountvolumeid.lst
字号:
175 =2 struct FATLDirStr //FAT目录结构 长文件名
176 =2 {
177 =2 BYTE Ord;
178 =2 BYTE Name1[10];
179 =2 BYTE Attr;
180 =2 BYTE Type;
181 =2 BYTE Chksum;
182 =2 BYTE Name2[12];
183 =2 WORD FstClusLO;
184 =2 BYTE Name3[4];
185 =2 };
186 =2
C51 COMPILER V6.23a FATMOUNTVOLUMEID 12/24/2004 00:11:38 PAGE 10
187 =2 struct FATStr //FAT参数表
188 =2 {
189 =2 // BYTE ClusSecCnt; //当前簇扇区计数
190 =2 DWORD CurrentDirectory; //当前目录入口(簇号)
191 =2 BYTE SecPerClus; //每簇扇区数 1 2 4 8 16 32 64 128
192 =2 DWORD RootClus; //根目录开始的簇
193 =2 BYTE RootSectors; //根目录占用的扇区数
194 =2 DWORD ClusSec; //簇开始的扇区
195 =2 DWORD FATSz; //FAT表大小(扇区)
196 =2 DWORD FATSec; //FAT表开始扇区
197 =2 DWORD FSISec; //FSI所在扇区
198 =2 DWORD FSIFreeCount; //空闲簇数
199 =2 DWORD FSINxtFree; //空闲簇搜索指针
200 =2 };
201 =2
202 =2 struct FCBStr
203 =2 {
204 =2 CHAR FileName[12]; //文件名
205 =2 DWORD Size; //文件大小
206 =2 DWORD FirstCluster; //第一个簇
207 =2 DWORD LastCluster; //最近一次读到的簇号
208 =2 DWORD ClusSecCnt; //当前簇扇区计数
209 =2 DWORD ByteCnt; //当前字节计数
210 =2 };
211 =2
212 =2 struct FATTableStr
213 =2 {
214 =2 DWORD Sector;
215 =2 union FATUin
216 =2 {
217 =2 DWORD F32[128];
218 =2 WORD F16[256];
219 =2 BYTE F12[512];
220 =2 }FAT;
221 =2 };
222 =2
223 =2 struct FATClusterStr
224 =2 {
225 =2 BYTE SecOffset; //扇区偏移量
226 =2 DWORD Sector; //扇区号
227 =2 DWORD Cluster; //簇号
228 =2 };
229 =2
230 =2 #ifndef _LIBRARY_DEFINE
=2 xdata BYTE DiskBuffer[512];
=2
=2 xdata struct StorageMediaStr StorageMedia;
=2 xdata struct sDPTStr sDPT[FAT_MAX_PARTITIONS];
=2 xdata struct FATStr FAT;
=2 xdata struct FCBStr FCB[FAT_MAX_FCB];
=2 xdata CHAR LongFileName[256];
=2 xdata struct FATTableStr FATTable;
=2 xdata struct DPTStr *DPT; //分区表结构指针
=2 xdata struct BootSecStr *BOOTSEC; //引导扇区结构指针
=2 xdata struct FAT32FSInfoStr *FSI; //FAT32扩展信息
=2 xdata struct FATSDirStr *sDIR; //FAT目录结构指针
=2 xdata struct FATLDirStr *lDIR; //FAT目录结构指针
=2 #endif
245 =2 #endif
246 =2
247 =2 extern xdata BYTE DiskBuffer[512];
248 =2
C51 COMPILER V6.23a FATMOUNTVOLUMEID 12/24/2004 00:11:38 PAGE 11
249 =2 extern xdata struct StorageMediaStr StorageMedia;
250 =2 extern xdata struct sDPTStr sDPT[FAT_MAX_PARTITIONS];
251 =2 extern xdata struct FATStr FAT;
252 =2 extern xdata struct FCBStr FCB[FAT_MAX_FCB];
253 =2 extern xdata CHAR LongFileName[256];
254 =2 extern xdata struct FATTableStr FATTable;
255 =2 extern xdata struct DPTStr *DPT; //分区表结构指针
256 =2 extern xdata struct BootSecStr *BOOTSEC; //引导扇区结构指针
257 =2 extern xdata struct FAT32FSInfoStr *FSI; //FAT32扩展信息
258 =2 extern xdata struct FATSDirStr *sDIR; //FAT目录结构指针
259 =2 extern xdata struct FATLDirStr *lDIR; //FAT目录结构指针
260 =2
261 =2 extern void FATInit(void);
262 =2 extern BYTE FATSelectMedia(BYTE Media);
263 =2 extern BYTE FATFindPartitions(void);
264 =2 extern BYTE FATMountPartition(void);
265 =2 extern BYTE FATMountVolumeID(BYTE Partition);
266 =2 extern void FATGetPartLongName(struct FATLDirStr *ldp,CHAR *name);
267 =2 extern DWORD FATDiskSize(void);
268 =2 extern DWORD FATDiskFreeSize(void);
269 =2 extern BYTE FATFindDIREntry(CHAR *DirName);
270 =2 extern BYTE FAT32FindDIREntry(CHAR *DirName);
271 =2 extern BYTE FAT16FindDIREntry(CHAR *DirName);
272 =2 void FATReadCluster(struct FATClusterStr *Cluster,BYTE *Buffer);
273 =2 extern BYTE FATChangeDirectory(CHAR *DirName);
274 =2 extern BYTE FATListDirectory(void);
275 =2 extern BYTE FAT32ListDirectory(void);
276 =2 extern BYTE FAT16ListDirectory(void);
277 =2 extern void FATNextCluster(DWORD *CurrentCluster);
278 =2 extern BYTE FATGetDirName(WORD SecNum);
279 =2 extern BYTE FATOpenFile(CHAR *filename);
280 =2 extern void FATCloseFile(BYTE fp);
281 =2 extern WORD FATReadFile(BYTE fp);
282 =2
11 =1
3 #endif
4
5 BYTE FATMountVolumeID(BYTE Partition);
6
7 BYTE FATMountVolumeID(BYTE Partition)
8 {
9 1 pdata DWORD TotSec,DataSec,CountofCluster;
10 1
11 1 if (Partition>=StorageMedia.TotalPartitions) return(FAT_ERR_PARTITION_NOT_FOUND); //没找到指定扇区
12 1
13 1 StorageMedia.ReadSector(sDPT[Partition].LBABegin,DiskBuffer); //读FAT VolumeID扇区
14 1
15 1 //检查VolumeID扇区标记
16 1 if (DiskBuffer[510] != 0x55||DiskBuffer[511] != 0xaa)
17 1 return(FAT_ERR_MBR_FLAG); //不正常的引导扇区标志
18 1
19 1 //检查分区类型
20 1 StorageMedia.CurrentPartition = Partition; //当前分区号
21 1 BOOTSEC->BPB_RsvdSecCnt=MEMSwap16(BOOTSEC->BPB_RsvdSecCnt);
22 1 BOOTSEC->BPB_RootEntCnt=MEMSwap16(BOOTSEC->BPB_RootEntCnt);
23 1 BOOTSEC->FAT.F32.BPB_RootClus=MEMSwap32(BOOTSEC->FAT.F32.BPB_RootClus);
24 1 BOOTSEC->FAT.F32.BPB_FSInfo=MEMSwap16(BOOTSEC->FAT.F32.BPB_FSInfo);
25 1 BOOTSEC->BPB_TotSec16=MEMSwap16(BOOTSEC->BPB_TotSec16);
26 1 BOOTSEC->BPB_FATSz16=MEMSwap16(BOOTSEC->BPB_FATSz16);
27 1 BOOTSEC->BPB_TotSec32=MEMSwap32(BOOTSEC->BPB_TotSec32);
28 1 BOOTSEC->FAT.F32.BPB_FATSz32=MEMSwap32(BOOTSEC->FAT.F32.BPB_FATSz32);
29 1
C51 COMPILER V6.23a FATMOUNTVOLUMEID 12/24/2004 00:11:38 PAGE 12
30 1 FAT.RootSectors = (BOOTSEC->BPB_RootEntCnt * 32) / 512;
31 1 if (BOOTSEC->BPB_FATSz16!=0)
32 1 FAT.FATSz = BOOTSEC->BPB_FATSz16;
33 1 else
34 1 FAT.FATSz = BOOTSEC->FAT.F32.BPB_FATSz32;
35 1
36 1 if (BOOTSEC->BPB_TotSec16!=0)
37 1 TotSec = BOOTSEC->BPB_TotSec16;
38 1 else
39 1 TotSec = BOOTSEC->BPB_TotSec32;
40 1
41 1 DataSec = TotSec - (BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * FAT.FATSz) + FAT.RootSectors);
42 1
43 1 CountofCluster = DataSec / (DWORD)(BOOTSEC->BPB_SecPerClus);
44 1 if (CountofCluster<4085)
45 1 {
46 2 sDPT[Partition].FATType=FAT_TYPE_FAT12;
47 2 FAT.RootClus = BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * BOOTSEC->BPB_FATSz16);
48 2 }
49 1 else if (CountofCluster<65525)
50 1 {
51 2 sDPT[Partition].FATType=FAT_TYPE_FAT16;
52 2 FAT.RootClus = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_Nu
-mFATs * BOOTSEC->BPB_FATSz16);
53 2 }
54 1 else
55 1 {
56 2 sDPT[Partition].FATType=FAT_TYPE_FAT32;
57 2 FAT.RootClus = BOOTSEC->FAT.F32.BPB_RootClus; //根目录簇号
58 2 }
59 1 FAT.SecPerClus = BOOTSEC->BPB_SecPerClus; //每簇扇区数
60 1 FAT.CurrentDirectory = FAT.RootClus; //当前目录入口(簇号)
61 1 FAT.FATSec = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt; //FAT表开始的扇区号
62 1 FAT.ClusSec = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumF
-ATs * FAT.FATSz) + FAT.RootSectors; //簇开始的扇区
63 1 FAT.FSISec = BOOTSEC->FAT.F32.BPB_FSInfo + sDPT[Partition].LBABegin; //FAT32扩展信息扇区号
64 1 //加载第一个FAT表
65 1 StorageMedia.ReadSector(FAT.FATSec,FATTable.FAT.F12);
66 1 FATTable.Sector=0;
67 1 return(0);
68 1 }
C51 COMPILER V6.23a FATMOUNTVOLUMEID 12/24/2004 00:11:38 PAGE 13
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _FATMountVolumeID (BEGIN)
; SOURCE LINE # 7
0000 900000 R MOV DPTR,#Partition
0003 EF MOV A,R7
0004 F0 MOVX @DPTR,A
; SOURCE LINE # 8
; SOURCE LINE # 11
0005 900000 E MOV DPTR,#StorageMedia+06H
0008 E0 MOVX A,@DPTR
0009 FE MOV R6,A
000A EF MOV A,R7
000B C3 CLR C
000C 9E SUBB A,R6
000D 4003 JC ?C0001
000F 7F02 MOV R7,#02H
0011 22 RET
0012 ?C0001:
; SOURCE LINE # 13
0012 900000 R MOV DPTR,#Partition
0015 E0 MOVX A,@DPTR
0016 75F009 MOV B,#09H
0019 A4 MUL AB
001A 2400 E ADD A,#LOW sDPT+01H
001C F582 MOV DPL,A
001E E4 CLR A
001F 3400 E ADDC A,#HIGH sDPT+01H
0021 F583 MOV DPH,A
0023 E0 MOVX A,@DPTR
0024 FC MOV R4,A
0025 A3 INC DPTR
0026 E0 MOVX A,@DPTR
0027 FD MOV R5,A
0028 A3 INC DPTR
0029 E0 MOVX A,@DPTR
002A FE MOV R6,A
002B A3 INC DPTR
002C E0 MOVX A,@DPTR
002D FF MOV R7,A
002E 7B01 MOV R3,#01H
0030 7A00 E MOV R2,#HIGH DiskBuffer
0032 7900 E MOV R1,#LOW DiskBuffer
0034 C002 PUSH AR2
0036 900000 E MOV DPTR,#StorageMedia+08H
0039 A3 INC DPTR
003A E0 MOVX A,@DPTR
003B FA MOV R2,A
003C A3 INC DPTR
003D E0 MOVX A,@DPTR
003E F582 MOV DPL,A
0040 8A83 MOV DPH,R2
0042 D002 POP AR2
0044 120000 R LCALL ?C0013
0047 8002 SJMP ?C0014
0049 ?C0013:
0049 E4 CLR A
004A 73 JMP @A+DPTR
004B ?C0014:
; SOURCE LINE # 16
004B 900000 E MOV DPTR,#DiskBuffer+01FEH
C51 COMPILER V6.23a FATMOUNTVOLUMEID 12/24/2004 00:11:38 PAGE 14
004E E0 MOVX A,@DPTR
004F B45506 CJNE A,#055H,?C0004
0052 A3 INC DPTR
0053 E0 MOVX A,@DPTR
0054 64AA XRL A,#0AAH
0056 6003 JZ ?C0003
0058 ?C0004:
; SOURCE LINE # 17
0058 7F01 MOV R7,#01H
005A 22 RET
005B ?C0003:
; SOURCE LINE # 20
005B 900000 R MOV DPTR,#Partition
005E E0 MOVX A,@DPTR
005F 900000 E MOV DPTR,#StorageMedia+07H
0062 F0 MOVX @DPTR,A
; SOURCE LINE # 21
0063 900000 E MOV DPTR,#BOOTSEC
0066 E0 MOVX A,@DPTR
0067 FB MOV R3,A
0068 A3 INC DPTR
0069 E0 MOVX A,@DPTR
006A FA MOV R2,A
006B A3 INC DPTR
006C E0 MOVX A,@DPTR
006D F9 MOV R1,A
006E 90000E MOV DPTR,#0EH
0071 120000 E LCALL ?C?ILDOPTR
0074 FF MOV R7,A
0075 AEF0 MOV R6,B
0077 120000 E LCALL _MEMSwap16
007A 900000 E MOV DPTR,#BOOTSEC
007D E0 MOVX A,@DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -