📄 fat32mountpartition.lst
字号:
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表开始扇区
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
C51 COMPILER V6.23a FAT32MOUNTPARTITION 12/24/2004 00:11:02 PAGE 10
=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);
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 FAT32MountPartition(void);
6
7 BYTE FAT32MountPartition(void)
8 {
9 1 register BYTE i,j,k;
10 1 xdata DWORD temp[4]={0,0,0,0};
11 1
12 1 IDEReadSector(0); //读MBR扇区
13 1
14 1 //检查MBR扇区标记
15 1 if (DiskBuffer[510] != 0x55||DiskBuffer[511] != 0xaa)
16 1 return(FAT32_ERR_MBR_FLAG); //不正常的引导扇区标志
17 1
18 1 //加载分区表
19 1 j=0;k=0;
C51 COMPILER V6.23a FAT32MOUNTPARTITION 12/24/2004 00:11:02 PAGE 11
20 1 for(i=0;i<4;i++)
21 1 {
22 2 DPT[i].LBABegin=MEMSwap32(DPT[i].LBABegin);
23 2 DPT[i].CntSec=MEMSwap32(DPT[i].CntSec);
24 2 if (DPT[i].TypeCode==0x0b) //FAT32 分区
25 2 {
26 3 sDPT[j].TypeCode = DPT[i].TypeCode;
27 3 sDPT[j].LBABegin = DPT[i].LBABegin;
28 3 sDPT[j].CntSec = DPT[i].CntSec;
29 3 j++;
30 3 }
31 2 else if (DPT[i].TypeCode==0x05||DPT[i].TypeCode==0x0f) //扩展分区
32 2 {
33 3 temp[k]=DPT[i].LBABegin;
34 3 k++;
35 3 }
36 2 }
37 1
38 1 for(i=0;i<k&&j<16;i++)
39 1 {
40 2 IDEReadSector(temp[i]);
41 2 DPT[i].LBABegin=MEMSwap32(DPT[i].LBABegin);
42 2 DPT[i].CntSec=MEMSwap32(DPT[i].CntSec);
43 2 if (DPT[i].TypeCode==0x0b) //FAT32 分区
44 2 {
45 3 sDPT[j].TypeCode = DPT[i].TypeCode;
46 3 sDPT[j].LBABegin = temp[i] + DPT[i].LBABegin;
47 3 sDPT[j].CntSec = DPT[i].CntSec;
48 3 j++;
49 3 }
50 2 }
51 1 HDD.TotalPartitions=j;
52 1 #ifdef DEBUG
printf("Partition Table\n");
printf("PNo.\tType\tLBAStart\tCount\tSize\n");
for(i=0;i<HDD.TotalPartitions;i++)
{
printf("P%bd\t%bx\t%ld\t\t%ld\t%ldMB\n",i,sDPT[i].TypeCode,sDPT[i].LBABegin,sDPT[i].CntSec,sDPT[i].CntS
-ec*512/1024/1024);
}
#endif
60 1 return(0);
61 1 }
C51 COMPILER V6.23a FAT32MOUNTPARTITION 12/24/2004 00:11:02 PAGE 12
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION FAT32MountPartition (BEGIN)
; SOURCE LINE # 7
; SOURCE LINE # 8
; SOURCE LINE # 10
0000 7800 R MOV R0,#LOW temp
0002 7C00 R MOV R4,#HIGH temp
0004 7D01 MOV R5,#01H
0006 7BFF MOV R3,#0FFH
0008 7A00 R MOV R2,#HIGH _?ix1000
000A 7900 R MOV R1,#LOW _?ix1000
000C 7E00 MOV R6,#00H
000E 7F10 MOV R7,#010H
0010 120000 E LCALL ?C?COPY
; SOURCE LINE # 12
0013 900000 E MOV DPTR,#IDE+02H
0016 120000 E LCALL ?C?LSTKXDATA
0019 00 DB 00H
001A 00 DB 00H
001B 00 DB 00H
001C 00 DB 00H
001D 120000 E LCALL _IDEReadSector
; SOURCE LINE # 15
0020 900000 E MOV DPTR,#DiskBuffer+01FEH
0023 E0 MOVX A,@DPTR
0024 B45506 CJNE A,#055H,?C0002
0027 A3 INC DPTR
0028 E0 MOVX A,@DPTR
0029 64AA XRL A,#0AAH
002B 6003 JZ ?C0001
002D ?C0002:
; SOURCE LINE # 16
002D 7F01 MOV R7,#01H
002F 22 RET
0030 ?C0001:
; SOURCE LINE # 19
0030 E4 CLR A
0031 900000 R MOV DPTR,#j
0034 F0 MOVX @DPTR,A
0035 A3 INC DPTR
0036 F0 MOVX @DPTR,A
; SOURCE LINE # 20
0037 900000 R MOV DPTR,#i
003A F0 MOVX @DPTR,A
003B ?C0004:
; SOURCE LINE # 21
; SOURCE LINE # 22
003B 900000 R MOV DPTR,#i
003E E0 MOVX A,@DPTR
003F 75F010 MOV B,#010H
0042 A4 MUL AB
0043 FF MOV R7,A
0044 900000 E MOV DPTR,#DPT
0047 E0 MOVX A,@DPTR
0048 FB MOV R3,A
0049 A3 INC DPTR
004A E0 MOVX A,@DPTR
004B FA MOV R2,A
004C A3 INC DPTR
004D E0 MOVX A,@DPTR
C51 COMPILER V6.23a FAT32MOUNTPARTITION 12/24/2004 00:11:02 PAGE 13
004E 2F ADD A,R7
004F F9 MOV R1,A
0050 EA MOV A,R2
0051 35F0 ADDC A,B
0053 FA MOV R2,A
0054 900008 MOV DPTR,#08H
0057 120000 E LCALL ?C?LLDOPTR
005A 120000 E LCALL _MEMSwap32
005D C006 PUSH AR6
005F C007 PUSH AR7
0061 900000 R MOV DPTR,#i
0064 E0 MOVX A,@DPTR
0065 75F010 MOV B,#010H
0068 A4 MUL AB
0069 FF MOV R7,A
006A 900000 E MOV DPTR,#DPT
006D E0 MOVX A,@DPTR
006E FB MOV R3,A
006F A3 INC DPTR
0070 E0 MOVX A,@DPTR
0071 FA MOV R2,A
0072 A3 INC DPTR
0073 E0 MOVX A,@DPTR
0074 2F ADD A,R7
0075 F9 MOV R1,A
0076 EA MOV A,R2
0077 35F0 ADDC A,B
0079 FA MOV R2,A
007A 900008 MOV DPTR,#08H
007D D007 POP AR7
007F D006 POP AR6
0081 120000 E LCALL ?C?LSTOPTR
; SOURCE LINE # 23
0084 90000C MOV DPTR,#0CH
0087 120000 E LCALL ?C?LLDOPTR
008A 120000 E LCALL _MEMSwap32
008D C006 PUSH AR6
008F C007 PUSH AR7
0091 900000 R MOV DPTR,#i
0094 E0 MOVX A,@DPTR
0095 75F010 MOV B,#010H
0098 A4 MUL AB
0099 FF MOV R7,A
009A 900000 E MOV DPTR,#DPT
009D E0 MOVX A,@DPTR
009E FB MOV R3,A
009F A3 INC DPTR
00A0 E0 MOVX A,@DPTR
00A1 FA MOV R2,A
00A2 A3 INC DPTR
00A3 E0 MOVX A,@DPTR
00A4 2F ADD A,R7
00A5 F9 MOV R1,A
00A6 EA MOV A,R2
00A7 35F0 ADDC A,B
00A9 FA MOV R2,A
00AA 90000C MOV DPTR,#0CH
00AD D007 POP AR7
00AF D006 POP AR6
00B1 120000 E LCALL ?C?LSTOPTR
; SOURCE LINE # 24
00B4 900004 MOV DPTR,#04H
C51 COMPILER V6.23a FAT32MOUNTPARTITION 12/24/2004 00:11:02 PAGE 14
00B7 120000 E LCALL ?C?CLDOPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -