📄 file_sys.c
字号:
/* Copyright (C) 1996-2005 Brilliant Ideal Electronics. All rights reserved.
MP3_Player+USB_Disk V3.0 Edit by JMBIE STUDIO 2005.03
*/
#include <string.h>
#include "AT89C51SND1_REG.H"
#include "FILE_SYS.H"
#include "MP3_PLAYER.H"
#include "UDISK_DEF.H"
unsigned char Page_Buf[512];
long int Current_Cluster, DataRead = 0, DataRemain = 0, Sector_Offset = 0x21d;
unsigned int TotalCluster, BootSector, RsdSector, SectorofFatSize, TotalCapacity, RootEntry, SecPerClus;
unsigned int TotalSector, BytesPerSec, FirstDataSec;
unsigned char FAT_TYPE;
void Init_FAT_Info(void)
{
ReadPage(Begin_Cluster, 0, Page_Buf);
if (!(Page_Buf[0] == 0xeb && Page_Buf[2] == 0x90))
{
BootSector = Page_Buf[454] + Page_Buf[455] * 256 + Page_Buf[456] * (256 * 256) + Page_Buf[457] * (256 * 256 * 256);
}
else
{
BootSector = 0;
}
ReadPage(Begin_Cluster, BootSector, Page_Buf);
RsdSector = Page_Buf[14] + Page_Buf[15] * 256;
SecPerClus = Page_Buf[13];
BytesPerSec = Page_Buf[12] * 256 + Page_Buf[11];
TotalSector = (Page_Buf[20] * 256 + Page_Buf[19]);
TotalCapacity = TotalSector * BytesPerSec;
TotalCluster = TotalSector / SecPerClus;
SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
RootEntry = (Page_Buf[18] * 256 + Page_Buf[17]);
FirstDataSec = BootSector + RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / BytesPerSec);
if (TotalCluster > 65525)
{
FAT_TYPE = FAT32;
if (TotalSector == 0)
{
TotalSector = (Page_Buf[32] + Page_Buf[33] * 256 + Page_Buf[34] * 256 * 256 + Page_Buf[35] * 256 * 256 * 256);
}
TotalCapacity = TotalSector * BytesPerSec;
TotalCluster = TotalSector / SecPerClus;
SectorofFatSize = (Page_Buf[36] + Page_Buf[37] * 256 + Page_Buf[38] * 256 * 256 + Page_Buf[39] * 256 * 256 * 256);
if (SectorofFatSize > (TotalCluster * 16 / 512))
{
SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
}
RootEntry = (Page_Buf[44] * 256 + Page_Buf[43]);
FirstDataSec = BootSector+RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / BytesPerSec);
}
else if ((TotalCluster > 0) && (TotalCluster < 4085))
{
FAT_TYPE = FAT12;
}
else
{
FAT_TYPE = FAT16;
}
}
unsigned char GetMP3List(void)
{
unsigned char i = 0, j = 0, l = 0;
int k = 0;
unsigned char MP3[3] = {'M', 'P', '3'};
Init_FAT_Info();
k = BootSector + RsdSector + 2 * SectorofFatSize;
ReadPage(0 + k / 32, k % 32, Page_Buf);
while (Page_Buf[0] != 0)
{
for (j=0; j<16; j++)
{
if (!Page_Buf[j * 32]) break;
if (Page_Buf[j * 32] == 0xE5) continue;
if (!memcmp(MP3, &Page_Buf[j * 32 + 8], 3)) //file find
{
for (i=0; i<11; i++)
{
SONG[l * 11 + i] = Page_Buf[j * 32 + i];
}
l++;
}
}
k++;
ReadPage(0 + k / 32, k % 32, Page_Buf);
}
return (l);
}
int ReadSector(unsigned char *Name, unsigned char *databuff)
{
int i, k, Page;
unsigned long CurrentSector;
if (DataRead == 0)
{
Page = BootSector + RsdSector + 2 * SectorofFatSize;
ReadPage(0 + Page / 32, Page % 32, databuff);
while (databuff[0] != 0)
{
for (i=0; i<16; i++)
{
if (!memcmp(Name, &databuff[i * 32], 11))
{
Current_Cluster = databuff[32 * i + 27] * 256 + databuff[32 * i + 26];
for (k=31; k>27; k--)
{
DataRemain = (DataRemain << 8) | databuff[i * 32 + k];
}
CurrentSector = (Current_Cluster - 2) * SecPerClus + FirstDataSec;
ReadPage(CurrentSector / 32, CurrentSector % 32, databuff);
DataRead += 512;
DataRemain -= 512;
if (DataRemain < 0)
{
DataRead = 0;
return (DataRemain + 512);
}
else
{
return (512);
}
}
}
Page++;
ReadPage(0 + Page / 32, Page % 32, databuff);
}
return (0);
}
else
{
Current_Cluster++;
CurrentSector = (Current_Cluster - 2) * SecPerClus + FirstDataSec;
ReadPage(CurrentSector / 32, CurrentSector % 32, databuff);
DataRead += 512;
DataRemain -= 512;
if (DataRemain < 0)
{
DataRead = 0;
return (DataRemain + 512);
}
else return (512);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -