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

📄 fat.lst

📁 mp3播放器
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V8.08   FAT                                                                   07/28/2007 11:42:16 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE FAT
OBJECT MODULE PLACED IN fat.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE fat.c OMF2 OPTIMIZE(6,SPEED) BROWSE VARBANKING DEBUG

line level    source

   1          #ifndef __FAT_C__
   2          #define __FAT_C__
   3          //***********************************************
   4          #include "dp8051.h"
   5          #include "config.h"
   6          #include "absacc.h"
   7          #include "constant.h"
   8          #include "variable.h"
   9          #include "function.h"
  10          #include "sdhost.h"
  11          #include "sssmp3_regs.h"
  12          #include "fat.h"
  13          #include "mp3_appl.h"
  14          //***********************************************
  15          //***********************************************
  16          xdata U8 sbuf1[512] _at_(0xE000);
  17          xdata U8 sbuf2[512] _at_(0xF000);
  18          //***********************************************
  19          /************************************************
  20          函 数 名: InitFat()
  21          功    能:初始化Fat
  22          说    明:
  23          调    用:
  24          全局变量:
  25          入口参数:无
  26          出口参数:无
  27          返 回 值:无
  28          ************************************************/
  29          U8 InitFat(void)
  30          {
  31   1              //setting LBA = 0 to read MBR info. or BPB
  32   1              DMA_load_sector(0, 0x05);
  33   1      
  34   1              //Assume it is MBR, now load Boot Sector
  35   1              if((((((MBR *)sbuf1)->P1).x86Boot == 0x00)
  36   1                      ||((((MBR *)sbuf1)->P1).x86Boot == 0x80))
  37   1                      &&((((((MBR *)sbuf1)->P1).PartitionType)& 0xF0)== 0x00))
  38   1              {
  39   2                      if(((MBR *)sbuf1)->Signature != 0x55AA )
  40   2                      {       //NOTE: must be 0x55AA in MBR      
  41   3                              return FATERR_NO_DOSFORMAT;
  42   3              }
  43   2      
  44   2                      ENDIAN_ASSIGN_4( &CFatData.dwFatTabStartlba, &((MBR *)sbuf1)->P1.LogStartSector );      //not done yet! See b
             -elow.
  45   2                      //CFatData.dwFatTabStartlba = LE32(((MBR *)sbuf1)->P1.LogStartSector);
  46   2      
  47   2                      //setting BPB LBA, load Boot Sector
  48   2                      DMA_load_sector(CFatData.dwFatTabStartlba, 0x05);
  49   2      //*********************************************
  50   2      #if TX_DEBUG
  51   2              //TXSend((Uint8 xdata *)0xE000);
  52   2      #endif
  53   2      //*********************************************
  54   2              }
C51 COMPILER V8.08   FAT                                                                   07/28/2007 11:42:16 PAGE 2   

  55   1              else if((((BS16 *)sbuf1)->JmpCode[0] == 0xEB)
  56   1                              &&(((BS16 *)sbuf1)->JmpCode[2] == 0x90)
  57   1                              &&(((BS16 *)sbuf1)->Signature == 0x55AA))
  58   1              {
  59   2              CFatData.dwFatTabStartlba = 0; //not done yet! See below.
  60   2              }
  61   1              else
  62   1              {
  63   2                      return FATERR_NO_DOSFORMAT;
  64   2              }
  65   1         
  66   1              if(((BS16 *)sbuf1)->FATSz16)
  67   1                      CFatData.fFAT32 = 0;//FAT16 mode
  68   1              else
  69   1                      CFatData.fFAT32 = 1; // FAT32 mode      
  70   1                      
  71   1              // HERE: sbuf should be containing Boot sector ////
  72   1        if(CFatData.fFAT32)
  73   1        {//FAT32
  74   2              ENDIAN_ASSIGN_2(&CFatData.wBytesPerSec, &((BS32 *)sbuf1)->BytesPerSector);
  75   2              //CFatData.wBytesPerSec = LE16(((BS32 *)sbuf1)->BytesPerSector);
  76   2      
  77   2              CFatData.bSectorsPerClu = ((BS32 *)sbuf1)->SectorsPerCluster;
  78   2              CFatData.dwFatTabStartlba += ((U8 *)&((BS32 *)sbuf1)->ReservedSectors)[0]; 
  79   2              ENDIAN_ASSIGN_4( &CFatData.dwSecNumInFat, &((BS32 *)sbuf1)->FATSz32);
  80   2              //CFatData.dwSecNumInFat = LE32(((BS32 *)sbuf1)->FATSz32);
  81   2      
  82   2          CFatData.dwClu2Startlba = CFatData.dwFatTabStartlba + CFatData.dwSecNumInFat *((U32)(((BS32 *)sbuf1)->
             -NumFATs)); 
  83   2          ENDIAN_ASSIGN_4( &CFatData.dwRootStartCluNo, &((BS32 *)sbuf1)->RootClus);
  84   2              //CFatData.dwRootStartCluNo = LE32(((BS32 *)sbuf1)->RootClus);
  85   2      
  86   2          CFatData.dwRootStartlba = (CFatData.dwRootStartCluNo - 2)* CFatData.bSectorsPerClu + CFatData.dwClu2St
             -artlba;
  87   2                      
  88   2          CFatData.wSecNumInRoot = CFatData.bSectorsPerClu;
  89   2          FATTab.bShiftBits = 2;//Fat32 records each cluster by four bytes
  90   2              CFatData.dwMask = 0x0FFFFFFF;//fat32 using bit28~bit0
  91   2      
  92   2              //FAT32根目录簇链
  93   2          ReadRootCluster();
  94   2        }
  95   1        else
  96   1        {//FAT16
  97   2              ENDIAN_ASSIGN_2( &CFatData.wBytesPerSec, &((BS16 *)sbuf1)->BytesPerSector);
  98   2              //CFatData.wBytesPerSec = LE16(((BS16 *)sbuf1)->BytesPerSector);
  99   2      
 100   2          CFatData.bSectorsPerClu = ((BS16 *)sbuf1)->SectorsPerCluster;
 101   2          CFatData.dwFatTabStartlba += ((U8 *)&((BS16 *)sbuf1)->ReservedSectors)[0];
 102   2          //ENDIAN_ASSIGN_2( &varAl.TmpShort, &((BS16 *)sbuf1)->FATSz16); 
 103   2          //CFatData.dwSecNumInFat = (0x0000FFFF)&((ULONG)varAl.TmpShort);
 104   2              CFatData.dwSecNumInFat = ((U32)LE16(((BS16 *)sbuf1)->FATSz16))& 0x0000FFFF;
 105   2      
 106   2          ENDIAN_ASSIGN_2(&CFatData.wSecNumInRoot, &((BS16 *)sbuf1)->RootDirEntries);
 107   2              //CFatData.wSecNumInRoot = LE16(((BS16 *)sbuf1)->RootDirEntries);
 108   2      
 109   2          FileData.RootDirNum = (U32)CFatData.wSecNumInRoot;
 110   2          CFatData.wSecNumInRoot <<= 5;//Each FDB = 32bytes
 111   2          CFatData.wSecNumInRoot /= CFatData.wBytesPerSec;
 112   2          CFatData.dwRootStartlba = CFatData.dwFatTabStartlba + CFatData.dwSecNumInFat *((U32)(((BS16 *)sbuf1)->
             -NumFATs)); 
 113   2          CFatData.dwRootStartCluNo = 0;//Assigning "0" to the start cluster# of root for fat16 mode.
C51 COMPILER V8.08   FAT                                                                   07/28/2007 11:42:16 PAGE 3   

 114   2          CFatData.dwClu2Startlba = CFatData.dwRootStartlba +(U32)CFatData.wSecNumInRoot; 
 115   2          FATTab.bShiftBits = 1;//Fat16 records each cluster by two bytes.  
 116   2          CFatData.dwMask = 0x0000FFFF; 
 117   2        }
 118   1              
 119   1        CFatData.bFDBNumInSec = (U8)(CFatData.wBytesPerSec / DIREntrySize);//Coutning the number of FDB in one s
             -ector.
 120   1        return FATERR_NO_ERROR;
 121   1      }
 122          /************************************************
 123          函 数 名: Forward()
 124          功    能:
 125          说    明:
 126          调    用:
 127          全局变量:
 128          入口参数:无
 129          出口参数:无
 130          返 回 值:
 131          ************************************************/
 132          bit Forward(void)
 133          {
 134   1        bit flag = 0;
 135   1        U8 index;
 136   1        U32 position;
 137   1        if(CFatData.fFAT32)
 138   1        {
 139   2          //FAT32
 140   2          for(;FileData.dwCurCluNo < FileData.RootDirNum;)
 141   2              {
 142   3            position = FileData.dwCurCluNo;
 143   3                for(index = 0; index  < MAX_FILE_FRAGMENT_NUMBER; index++)
 144   3                {
 145   4                  if(position < rootclusters[index].number)
 146   4                  {
 147   5                    position = rootclusters[index].cluster + position;
 148   5                    break;
 149   5                      }
 150   4                      else
 151   4                      {
 152   5                        position -= rootclusters[index].number;
 153   5                      }
 154   4                }
 155   3                position = CFatData.dwClu2Startlba + (position - 2)* (U32)CFatData.bSectorsPerClu;
 156   3            
 157   3                for(;FileData.wCurFDBNo < (U16)CFatData.bSectorsPerClu * CFatData.wBytesPerSec / DIREntrySize;)
 158   3                {
 159   4                  //position += FileData.wCurFDBNo / DIREntrySize / CFatData.wBytesPerSec;
 160   4                      if(!flag)
 161   4                      {
 162   5                        DMA_load_sector(position + FileData.wCurFDBNo * DIREntrySize / CFatData.wBytesPerSec, 0x05);
 163   5                flag = 1;
 164   5                      }
 165   4              if((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute != 0x0F)
 166   4                &&((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute & ARCHIVE_DIR) != A
             -RCHIVE_DIR))
 167   4                  {
 168   5                        if((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] == (S8)'M')
 169   5                          &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] == (S8)'P')
 170   5                          &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] == (S8)'3')
 171   5                          &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] != (S8)DIR_Unused)
 172   5                          &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] != (S8)DIR_Deleted))
 173   5                        {
C51 COMPILER V8.08   FAT                                                                   07/28/2007 11:42:16 PAGE 4   

 174   6                          ENDIAN_ASSIGN_4(&FileData.dwFileDataSize,&((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySiz
             -e))->FileSize);
 175   6                              FileData.dwFileStartCluNo = CFatData.dwMask &((U32)LE16(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* 
             -DIREntrySize))->FSClusLO));
 176   6                  FileData.dwFileStartCluNo += CFatData.dwMask &(((U32)LE16(((_DIR *)(sbuf1 + (FileData.wCurFDBN
             -o & 0x0F)* DIREntrySize))->FSClusHI)) << 16);
 177   6                  ReadFileFAT();
 178   6                  return OK;
 179   6                        }
 180   5                        else
 181   5                        {
 182   6                          FileData.wCurFDBNo++;
 183   6                          if(!(FileData.wCurFDBNo & 0x0F))
 184   6                            flag = 0;
 185   6                        }
 186   5                  }
 187   4                      else
 188   4                      {
 189   5                        FileData.wCurFDBNo++;
 190   5                        if(!(FileData.wCurFDBNo & 0x0F))
 191   5                          flag = 0;
 192   5                      }
 193   4                }
 194   3            FileData.wCurFDBNo = 0;
 195   3            FileData.dwCurCluNo++;
 196   3              }
 197   2          return KO;

⌨️ 快捷键说明

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