⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fatmountvolumeid.lst

📁 C51实现的FAT32文件系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 + -