📄 fat16.lst
字号:
C51 COMPILER V6.23a FAT16 12/02/2003 11:07:23 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[];//外部变量申明,Page/扇区缓存
16 extern unsigned char SONG[]; //外部变量申明,歌曲列表数组
17
18 //读取MP3时的辅助变量
19 long int Current_Cluster,DataRead=0,DataRemain=0;
20
21 //文件系统有关变量申明
22 unsigned int TotalCluster,BootSector,RsdSector,SectorofFatSize,TotalCapacity,RootEntry,SecPerClus,TotalSec
-tor,BytesPerSec,FirstDataSec;
23 unsigned char FAT_TYPE;
24
25 //文件系统初始化,由存储体得到分区信息
26 void Init_FAT_Info(void)
27 {
28 1
29 1 ///////////////////////////////////////////////////
30 1 //得到引导扇区所在扇区号,如果介质是不带分区的,则0扇区就是BootSector了。
31 1 ReadPage(Begin_Cluster,0,Page_Buf);
32 1
33 1 if(!(Page_Buf[0]==0xeb&&Page_Buf[2]==0x90)){ //通过判断EB ?? 90来看是否已经是BPB了
34 2 //带分区的介质
35 2 BootSector=Page_Buf[454]+Page_Buf[455]*256+Page_Buf[456]*(256*256)+Page_Buf[457]*(256*256*256);
36 2 }
37 1 else BootSector=0;
38 1 ///////////////////////////////////////////////////
39 1
40 1 ////////////////////////////////////////////////
41 1 //得到保留扇区数,总扇区数,总扇区数/每簇扇区数得到簇数,是FAT类型的依据
42 1 ReadPage(Begin_Cluster,BootSector,Page_Buf);
43 1 RsdSector=Page_Buf[14]+Page_Buf[15]*256;//得到保留扇区数
44 1 SecPerClus=Page_Buf[13];//得到每簇扇区数
45 1
46 1 BytesPerSec=Page_Buf[12]*256+Page_Buf[11];//得到每扇区字节数
47 1
48 1 TotalSector=(Page_Buf[20]*256+Page_Buf[19]);//得到总扇区数
49 1 TotalCapacity=TotalSector*BytesPerSec;//得到总容量
50 1 TotalCluster=TotalSector/SecPerClus;//FAT16的簇总数=扇区总数/每簇扇区数
51 1
52 1 SectorofFatSize=((Page_Buf[22]+Page_Buf[23]*256));//得到每个分区表的扇区数
53 1 RootEntry=(Page_Buf[18]*256+Page_Buf[17]);//得根目录项数
54 1 //得第一个存放数据的扇区的位置
C51 COMPILER V6.23a FAT16 12/02/2003 11:07:23 PAGE 2
55 1 FirstDataSec=BootSector+RsdSector+(SectorofFatSize*2)+((RootEntry*32+(BytesPerSec-1))/BytesPerSec);
56 1
57 1 if(TotalCluster>65525){ //如果此分区为FAT32,则以下代码决定FAT32的扇区总数和FAT表项长度
58 2 FAT_TYPE=FAT32;
59 2
60 2 if(TotalSector==0) TotalSector=(Page_Buf[32]+Page_Buf[33]*256+Page_Buf[34]*256*256+Page_Buf[35]*256*256*
-256);
61 2 TotalCapacity=TotalSector*BytesPerSec;
62 2 TotalCluster=TotalSector/SecPerClus;
63 2
64 2 SectorofFatSize=(Page_Buf[36]+Page_Buf[37]*256+Page_Buf[38]*256*256+Page_Buf[39]*256*256*256);
65 2 if(SectorofFatSize>(TotalCluster*16/512)) SectorofFatSize=((Page_Buf[22]+Page_Buf[23]*256));
66 2 RootEntry=(Page_Buf[44]*256+Page_Buf[43]);
67 2 FirstDataSec=BootSector+RsdSector+(SectorofFatSize*2)+((RootEntry*32+(BytesPerSec-1))/BytesPerSec);
68 2
69 2 }
70 1 else if((TotalCluster>0)&&(TotalCluster<4085)) {//根据簇的数量决定FAT分区表的类型,FAT12
71 2 FAT_TYPE=FAT12;
72 2 }
73 1 else { //FAT16
74 2 FAT_TYPE=FAT16;
75 2 }
76 1
77 1 }
78
79 //生成MP3歌曲列表
80 unsigned char GetMP3List(void)
81 {
82 1 unsigned char i=0,j=0,l=0;
83 1 int k=0;
84 1 unsigned char MP3[3]={'M','P','3'};
85 1 Init_FAT_Info();//初始化文件系统
86 1
87 1 k=BootSector+RsdSector+2*SectorofFatSize;
88 1 // printuf("BootSector:%x",BootSector);
89 1 // printuf("RsdSector:%x",RsdSector);
90 1 // printuf("SectorofFatSize:%x",SectorofFatSize);
91 1 // printuf("RootDIR:%x",(k&0xff00)>>8);
92 1 // printuf("%x\n",k);
93 1
94 1 ReadPage(0+k/32,k%32,Page_Buf);//读根目录区的首页
95 1
96 1 while(Page_Buf[0]!=0){//遍历整个目录
97 2 for(j=0;j<16;j++){//每个扇区为512字节,可容纳16个根目录项,每个根目录项32字节
98 3 if(!Page_Buf[j*32]) break;//如果到达根目录的最后,则结束搜索
99 3 if(Page_Buf[j*32]==0xE5) continue;//如果某个文件项是已经被删除了的,则转向下一文件项
100 3
101 3 if(!memcmp(MP3,&Page_Buf[j*32+8],3)){ //找到一个扩展名为MP3的文件,file find
102 4 for(i=0;i<11;i++) SONG[l*11+i]=Page_Buf[j*32+i];//将其文件名复制到MP3歌曲列表中
103 4 l++;//歌曲总数计数加1
104 4 }
105 3 }
106 2 k++;//指向根目录表的下一个扇区
107 2 ReadPage(0+k/32,k%32,Page_Buf);//读取下一个扇区的根目录表项数据
108 2 }
109 1 return(l);//返回找到的MP3歌曲的总数
110 1 }
111
112 //从当前MP3歌曲中读取512个字节
113 int ReadSector(unsigned char *Name,unsigned char *databuff)
114 {
115 1 int i,k,Page;
C51 COMPILER V6.23a FAT16 12/02/2003 11:07:23 PAGE 3
116 1 if(DataRead==0) //第一次读取,先查找文件,然后进行读取
117 1 {
118 2 Page=BootSector+RsdSector+2*SectorofFatSize;
119 2 ReadPage(0+Page/32,Page%32,databuff);//读取根目录项
120 2 while(databuff[0]!=0){//遍历整个目录
121 3 for(i=0;i<16;i++){
122 4 if(!memcmp(Name,&databuff[i*32],11)){//找到要播放的那个文件
123 5 Current_Cluster=databuff[32*i+27]*256+databuff[32*i+26];//得当前文件的首簇
124 5 printuf("Current_Cluster:%x",(Current_Cluster&0xff00)>>8);
125 5 printuf("%x\n",Current_Cluster);
126 5 for(k=31;k>27;k--) DataRemain=(DataRemain<<8)|databuff[i*32+k];//得文件长度
127 5 ReadPage((Current_Cluster+0x11d)/32,(Current_Cluster+0x11d)%32,databuff);//读取512个字节
128 5
129 5 DataRead+=512;//已读字节数加512
130 5 DataRemain-=512;//剩余字节数减512
131 5 if(DataRemain<0) {DataRead=0;return(DataRemain+512);}//如果数据已全部读完,则返回实际本次读取的有效
-字节数
132 5 else return(512);//若未读完此歌曲,则返回512
133 5 }
134 4 }
135 3 Page++;//指向根目录区的下一个扇区
136 3 ReadPage(0+Page/32,Page%32,databuff);//读取根目录区的此扇区内容
137 3 }
138 2 printu("\nfile is not found!");return(0);
139 2 }
140 1 else
141 1 {
142 2 // if((Current_Cluster+0x11d+DataRead/BytesPerSec)%32) Current_Cluster=NextCluster(Current_Cluster);
143 2 ReadPage((Current_Cluster+0x11d)/32,(Current_Cluster+0x11d+DataRead/BytesPerSec)%32,databuff);//继续读
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -