📄 fat16.lst
字号:
C51 COMPILER V6.23a FAT16 12/02/2003 11:07:55 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE FAT16
OBJECT MODULE PLACED IN fat16.OBJ
COMPILER INVOKED BY: d:\SoftDev\Keil\C51\BIN\C51.EXE fat16.c LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /****************************************************************/
2 /* UP-MP3DIY100 */
3 /* Beijing Universal Pioneering Technology Co., LTD */
4 /* CopyRighted,All right Reserved www.up-tech.com */
5 /* July,2003 */
6 /* 010-62387873 62381842 */
7 /****************************************************************/
8
9 #include "Fat16.h"
10 #include "Flash.h"
11 #include "uart.h"
12 #include "string.h"
13
14 //数据结构与全局变量定义
15 extern unsigned char Page_Buf[];
16 extern unsigned char SONG[];
17
18 long int Current_Cluster,DataRead=0,DataRemain=0,Sector_Offset=0x21d;
19
20
21 unsigned int TotalCluster,BootSector,RsdSector,SectorofFatSize,TotalCapacity,RootEntry,SecPerClus,TotalSec
-tor,BytesPerSec,FirstDataSec;
22 unsigned char FAT_TYPE;
23
24 void Init_FAT_Info(void)
25 {
26 1 int i;
27 1
28 1 ///////////////////////////////////////////////////
29 1 //得到引导扇区所在扇区号,如果介质是不带分区的,则0扇区就是BootSector了。
30 1 ReadPage(Begin_Cluster,0,Page_Buf);
31 1
32 1 if(!(Page_Buf[0]==0xeb&&Page_Buf[2]==0x90)){ //通过判断EB ?? 90来看是否已经是BPB了
33 2 //带分区的介质
34 2 BootSector=Page_Buf[454]+Page_Buf[455]*256+Page_Buf[456]*(256*256)+Page_Buf[457]*(256*256*256);
35 2 }
36 1 else BootSector=0;
37 1 ///////////////////////////////////////////////////
38 1
39 1 ////////////////////////////////////////////////
40 1 //得到保留扇区数,总扇区数,总扇区数/每簇扇区数得到簇数,是FAT类型的依据
41 1 ReadPage(Begin_Cluster,BootSector,Page_Buf);
42 1 RsdSector=Page_Buf[14]+Page_Buf[15]*256;
43 1 SecPerClus=Page_Buf[13];
44 1
45 1 BytesPerSec=Page_Buf[12]*256+Page_Buf[11];
46 1
47 1 TotalSector=(Page_Buf[20]*256+Page_Buf[19]);
48 1 TotalCapacity=TotalSector*BytesPerSec;
49 1 TotalCluster=TotalSector/SecPerClus;//FAT16的簇总数=扇区总数/每簇扇区数
50 1
51 1 SectorofFatSize=((Page_Buf[22]+Page_Buf[23]*256));
52 1 RootEntry=(Page_Buf[18]*256+Page_Buf[17]);
53 1
54 1 FirstDataSec=BootSector+RsdSector+(SectorofFatSize*2)+((RootEntry*32+(BytesPerSec-1))/BytesPerSec);
C51 COMPILER V6.23a FAT16 12/02/2003 11:07:55 PAGE 2
55 1
56 1 if(TotalCluster>65525){ //FAT32的扇区总数和FAT表项长度
57 2 FAT_TYPE=FAT32;
58 2
59 2 if(TotalSector==0) TotalSector=(Page_Buf[32]+Page_Buf[33]*256+Page_Buf[34]*256*256+Page_Buf[35]*256*256*
-256);
60 2 TotalCapacity=TotalSector*BytesPerSec;
61 2 TotalCluster=TotalSector/SecPerClus;
62 2
63 2 SectorofFatSize=(Page_Buf[36]+Page_Buf[37]*256+Page_Buf[38]*256*256+Page_Buf[39]*256*256*256);
64 2 if(SectorofFatSize>(TotalCluster*16/512)) SectorofFatSize=((Page_Buf[22]+Page_Buf[23]*256));
65 2 RootEntry=(Page_Buf[44]*256+Page_Buf[43]);
66 2 FirstDataSec=BootSector+RsdSector+(SectorofFatSize*2)+((RootEntry*32+(BytesPerSec-1))/BytesPerSec);
67 2
68 2 }
69 1 else if((TotalCluster>0)&&(TotalCluster<4085)) {//FAT12
70 2 FAT_TYPE=FAT12;
71 2 }
72 1 else { //FAT16
73 2 FAT_TYPE=FAT16;
74 2 }
75 1
76 1 }
*** WARNING C280 IN LINE 26 OF FAT16.C: 'i': unreferenced local variable
77
78 unsigned char GetMP3List(void)
79 {
80 1 unsigned char i=0,j=0,l=0;
81 1 int k=0;
82 1 unsigned char MP3[3]={'M','P','3'};
83 1 Init_FAT_Info();
84 1
85 1 k=BootSector+RsdSector+2*SectorofFatSize;
86 1 printuf("BootSector:%x",BootSector);
87 1 printuf("RsdSector:%x",RsdSector);
88 1 printuf("SectorofFatSize:%x",SectorofFatSize);
89 1
90 1 printuf("RootDIR:%x",(k&0xff00)>>8);
91 1 printuf("%x\n",k);
92 1
93 1 ReadPage(0+k/32,k%32,Page_Buf);
94 1
95 1 while(Page_Buf[0]!=0){//遍历整个目录
96 2 for(j=0;j<16;j++){
97 3 if(!Page_Buf[j*32]) break;
98 3 if(Page_Buf[j*32]==0xE5) continue;
99 3
100 3 if(!memcmp(MP3,&Page_Buf[j*32+8],3)){ //file find
101 4 for(i=0;i<11;i++) SONG[l*11+i]=Page_Buf[j*32+i];
102 4 l++;
103 4 }
104 3 }
105 2 k++;
106 2 ReadPage(0+k/32,k%32,Page_Buf);
107 2 }
108 1 return(l);
109 1 }
110 int ReadSector(unsigned char *Name,unsigned char *databuff)
111 {
112 1 int i,j,k,Page;
113 1 if(DataRead==0) //第一次读取,先查找文件,然后进行读取
114 1 {
C51 COMPILER V6.23a FAT16 12/02/2003 11:07:55 PAGE 3
115 2 Page=BootSector+RsdSector+2*SectorofFatSize;
116 2 ReadPage(0+Page/32,Page%32,databuff);
117 2 while(databuff[0]!=0){//遍历整个目录
118 3 for(i=0;i<16;i++){
119 4 if(!memcmp(Name,&databuff[i*32],11)){
120 5 Current_Cluster=databuff[32*i+27]*256+databuff[32*i+26];
121 5 printuf("Current_Cluster:%x",(Current_Cluster&0xff00)>>8);
122 5 printuf("%x\n",Current_Cluster);
123 5 for(k=31;k>27;k--) DataRemain=(DataRemain<<8)|databuff[i*32+k];
124 5 ReadPage((Current_Cluster+Sector_Offset)/32,(Current_Cluster+Sector_Offset)%32,databuff);
125 5
126 5 DataRead+=512;
127 5 DataRemain-=512;
128 5 if(DataRemain<0) {DataRead=0;return(DataRemain+512);}
129 5 else return(512);
130 5 }
131 4 }
132 3 Page++;
133 3 ReadPage(0+Page/32,Page%32,databuff);
134 3 }
135 2 printu("\nfile is not found!");return(0);
136 2 }
137 1 else
138 1 {
139 2 // if((Current_Cluster+Sector_Offset+DataRead/BytesPerSec)%32) Current_Cluster=NextCluster(Current_Clust
-er);
140 2 ReadPage((Current_Cluster+Sector_Offset)/32,(Current_Cluster+Sector_Offset+DataRead/BytesPerSec)%32,dat
-abuff);
141 2 DataRead+=512;
142 2 // if(!((Current_Cluster+Sector_Offset+DataRead/BytesPerSec)%32)) Current_Cluster=NextCluster(Current_Cl
-uster+32);
143 2 if(!((Current_Cluster+Sector_Offset+DataRead/BytesPerSec)%32)) Current_Cluster+=32;//默认歌曲文件是顺序
-存放的。
144 2 DataRemain-=512;
145 2 if(DataRemain<0) {DataRead=0;return(DataRemain+512);}
146 2 else return(512);
147 2 }
148 1
149 1 }
*** WARNING C280 IN LINE 112 OF FAT16.C: 'j': unreferenced local variable
150
151 unsigned int NextCluster(unsigned int CurrentCluster)
152 {
153 1 unsigned int i,j;
154 1 if(FAT_TYPE==FAT12){
155 2 ReadPage(Begin_Cluster+(BootSector+RsdSector+(CurrentCluster*3/2)/BytesPerSec)/SecPerClus,(BootSector+Rs
-dSector+(CurrentCluster*3/2)/BytesPerSec)%SecPerClus,Page_Buf);
156 2 if(CurrentCluster%2==0) {
157 3 j=Page_Buf[(CurrentCluster*3/2)%BytesPerSec+1];
158 3 i=Page_Buf[(CurrentCluster*3/2)%BytesPerSec]|(j<<8);
159 3 i&=0x0fff;
160 3 }
161 2 else {
162 3 j=Page_Buf[(CurrentCluster*3/2)%BytesPerSec+1];
163 3 i=Page_Buf[(CurrentCluster*3/2)%BytesPerSec]|(j<<8);
164 3 i=(i>>4);
165 3 }
166 2 return (i);
167 2 }
168 1 else if(FAT_TYPE==FAT16){
169 2 ReadPage(Begin_Cluster+(BootSector+RsdSector+(CurrentCluster*2)/BytesPerSec)/32,(BootSector+RsdSector+(C
-urrentCluster*2)/BytesPerSec)%32,Page_Buf);
C51 COMPILER V6.23a FAT16 12/02/2003 11:07:55 PAGE 4
170 2 i=Page_Buf[(CurrentCluster*2)%BytesPerSec+1]*256+Page_Buf[(CurrentCluster*2)%BytesPerSec];
171 2 return (i);
172 2 }
173 1 else if(FAT_TYPE==FAT32){
174 2 ReadPage(Begin_Cluster+(BootSector+RsdSector+(CurrentCluster*4)/BytesPerSec)/SecPerClus,(BootSector+RsdS
-ector+(CurrentCluster*4)/BytesPerSec)%SecPerClus,Page_Buf);
175 2 i=Page_Buf[(CurrentCluster*4)%BytesPerSec+3]*256*256*256+Page_Buf[(CurrentCluster*4)%BytesPerSec+2]*256*
-256+Page_Buf[(CurrentCluster*4)%BytesPerSec+1]*256+Page_Buf[(CurrentCluster*4)%BytesPerSec];
176 2 return (i);
177 2 }
178 1 }
179
180
181
182
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2922 ----
CONSTANT SIZE = 103 ----
XDATA SIZE = 37 30
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -