📄 fat.lst
字号:
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 + -