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

📄 fat32mountpartition.lst

📁 FAT32文件系统在51单片机上实现
💻 LST
📖 第 1 页 / 共 2 页
字号:
  44      =2  //计算指定簇的开始扇区号
  45      =2  #define ClusterToSector(X)                      FAT32.ClusSec + (X - 2) * FAT32.SecPerClus
  46      =2  
  47      =2  struct BootSecFAT16Str                                  //引导扇区   FAT16  扩展结构
  48      =2  {
  49      =2          BYTE    BS_DrvNum;
  50      =2          BYTE    BS_Reserved1;
  51      =2          BYTE    BS_BootSig;
  52      =2          DWORD   BS_VolID;
  53      =2          char    BS_VolLab[11];
  54      =2          char    BS_FilSysType[8];
  55      =2  };
  56      =2  
  57      =2  struct BootSecFAT32Str                                  //引导扇区   FAT32  扩展结构
  58      =2  {
  59      =2          DWORD   BPB_FATSz32;                    //FAT32扇区总数
  60      =2          WORD    BPB_ExtFlags;
  61      =2          WORD    BPB_FSVer;
  62      =2          DWORD   BPB_RootClus;                   //根目录开始的簇
  63      =2          WORD    BPB_FSInfo;
  64      =2          WORD    BPB_BkBootSec;
  65      =2          char    BPB_Reserved[12];
  66      =2          BYTE    BS_DrvNum;
  67      =2          BYTE    BS_Reserved1;
  68      =2          BYTE    BS_BootSig;
  69      =2          DWORD   BS_VolID;
  70      =2          char    BS_VolLab[11];
  71      =2          char    BS_FilSysType[8];
  72      =2  };
  73      =2  
  74      =2  struct BootSecStr                                               //引导扇区结构
  75      =2  {
  76      =2          BYTE    BS_jmpBoot[3];
  77      =2          BYTE    BS_OEMName[8];
  78      =2          WORD    BPB_BytesPerSec;                //每扇区字节数  512
  79      =2          BYTE    BPB_SecPerClus;                 //每簇扇区数    1 2 4 8 16 32 64 128
  80      =2          WORD    BPB_RsvdSecCnt;                 //保留扇区数    0x20
  81      =2          BYTE    BPB_NumFATs;                    //FAT表个数             2
  82      =2          WORD    BPB_RootEntCnt;         
  83      =2          WORD    BPB_TotSec16;
  84      =2          BYTE    BPB_Media;
  85      =2          WORD    BPB_FATSz16;
  86      =2          WORD    BPB_SecPerTrk;
  87      =2          WORD    BPB_NumHeads;
  88      =2          DWORD   BPB_HiddSec;
  89      =2          DWORD   BPB_TotSec32;
  90      =2          union   FATUni
  91      =2          {
  92      =2                  struct BootSecFAT32Str  F32;
  93      =2                  struct BootSecFAT16Str  F16;
  94      =2          }FAT;
  95      =2  
  96      =2  };
  97      =2  
  98      =2  struct DPTStr                           //分区表结构
  99      =2  {
 100      =2          BYTE    BootFlag;
 101      =2          BYTE    CHSBegin[3];
C51 COMPILER V7.50   FAT32MOUNTPARTITION                                                   11/20/2006 15:50:39 PAGE 6   

 102      =2          BYTE    TypeCode;
 103      =2          BYTE    CHSEnd[3];
 104      =2          DWORD   LBABegin;
 105      =2          DWORD   CntSec;
 106      =2  };
 107      =2  
 108      =2  struct sDPTStr                          //简化的分区表
 109      =2  {
 110      =2          BYTE    TypeCode;
 111      =2          DWORD   LBABegin;
 112      =2          DWORD   CntSec;
 113      =2  };
 114      =2  
 115      =2  struct FAT32FSInfoStr           //FAT32扩展信息结构
 116      =2  {
 117      =2          DWORD   LeadSig;
 118      =2          BYTE    Reserved1[480];
 119      =2          DWORD   StrucSig;
 120      =2          DWORD   FreeCount;
 121      =2          DWORD   NxtFree;
 122      =2          BYTE    Reserved2[12];
 123      =2          DWORD   TrailSig;
 124      =2  };
 125      =2  
 126      =2  struct FAT32SDirStr                     //FAT目录结构 短文件名
 127      =2  {
 128      =2          CHAR    Name[11];
 129      =2          BYTE    Attr;
 130      =2          BYTE    NTRes;
 131      =2          BYTE    CrtTimeTenth;
 132      =2          WORD    CrtTime;
 133      =2          WORD    CrtDate;
 134      =2          WORD    LstAccDate;
 135      =2          WORD    FstClusHI;
 136      =2          WORD    WrtTime;
 137      =2          WORD    WrtDate;
 138      =2          WORD    FstClusLO;
 139      =2          DWORD   FileSize;
 140      =2  };
 141      =2  
 142      =2  struct FAT32LDirStr                     //FAT目录结构 长文件名
 143      =2  {
 144      =2          BYTE    Ord;
 145      =2          BYTE    Name1[10];
 146      =2          BYTE    Attr;
 147      =2          BYTE    Type;
 148      =2          BYTE    Chksum;
 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表大小(扇区)
C51 COMPILER V7.50   FAT32MOUNTPARTITION                                                   11/20/2006 15:50:39 PAGE 7   

 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
           =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);
C51 COMPILER V7.50   FAT32MOUNTPARTITION                                                   11/20/2006 15:50:39 PAGE 8   

 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扇区
*** WARNING C206 IN LINE 12 OF FAT32MOUNTPARTITION.C: 'IDEReadSector': missing function-prototype
*** ERROR C267 IN LINE 12 OF FAT32MOUNTPARTITION.C: 'IDEReadSector': requires ANSI-style prototype
  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;
  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;
*** ERROR C202 IN LINE 51 OF FAT32MOUNTPARTITION.C: 'HDD': undefined identifier
  52   1              #ifdef DEBUG
                              printf("Partition Table\n");
                              printf("PNo.\tType\tLBAStart\tCount\tSize\n");
                              for(i=0;i<HDD.TotalPartitions;i++)
C51 COMPILER V7.50   FAT32MOUNTPARTITION                                                   11/20/2006 15:50:39 PAGE 9   

                              {
                                      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 COMPILATION COMPLETE.  4 WARNING(S),  2 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -