📄 file.c
字号:
/*******************************Copyright (c)***************************************
文件管理.
************************************************************************************/
#include "common.h"
#include "file.h"
#include "hpi.h"
#include "usb.H"
/*---------------------------------------------------------------------------------*/
UHWORD idata MemMiscPt = 0; //曲目库位置
UHWORD idata MemMiscCnt = 0; //曲目库数量
UBYTE xdata UsbItemBuf[32]; //U盘文件项
FILE_MANAGE xdata FileList[16]; //内存文件项
/*-----------------------------------------------------------------------------------
名称: void FileListInital(void);
功能: 文件管理初始设定.
-----------------------------------------------------------------------------------*/
void FileListInital(void)
{
UBYTE i = 0;
UBYTE j = 0;
for(i=0;i<16;i++)
{
for(j=0;j<8;j++)
FileList[i].Name[j] = 0x20;
FileList[i].Lenth = 0;
FileList[i].Address = 0;
}
}
/*-----------------------------------------------------------------------------------
名称: UWORD FileListEmptySearch(UWORD Lenth);
功能: 文件目录表空余位置搜索.
-----------------------------------------------------------------------------------*/
UWORD FileListEmptySearch(UWORD Lenth)
{
UBYTE point = 0;
UWORD index = 0;
for(point=0;point<16;point++)
{
if(FileList[point].Name[0]==' ')
break;
}
if(point==0)
{
return(MEM_STA_ADDRESS);
}
else if((point>0)&&(point<16))
{
index = FileList[point-1].Lenth+FileList[point-1].Address;
if(index+Lenth>MEM_END_ADDRESS)
{
FileListInital();
return(MEM_STA_ADDRESS);
}
else
{
((UBYTE*)&index)[0]=point;
return(index);
}
}
else
{
FileListInital();
return(MEM_STA_ADDRESS);
}
}
/*-----------------------------------------------------------------------------------
名称: void FileSaveMemory(UBYTE *FileName);
功能: 存储文件到内存.
-----------------------------------------------------------------------------------*/
void FileSaveMemory(UBYTE *FileName)
{
UBYTE value = 0;
UBYTE pages = 0;
UHWORD count = 0;
UHWORD index = 0;
UWORD lenth = 0;
UWORD point = 0;
((UBYTE*)&lenth)[0] = InOutBuf[18];
((UBYTE*)&lenth)[1] = InOutBuf[19];
((UBYTE*)&lenth)[2] = InOutBuf[20];
((UBYTE*)&lenth)[3] = InOutBuf[21];
lenth += 22;
point = FileListEmptySearch(lenth);
value = ((UBYTE*)&point)[0];
((UBYTE*)&point)[0] = 0;
for(pages=0;pages<8;pages++)
FileList[value].Name[pages] = FileName[pages];
FileList[value].Lenth = lenth;
FileList[value].Address = point;
pages = point/0x8000;
index = point%0x8000;
for(count=0;count<lenth;count++)
{
RamAreaSelect(0);
value = InOutBuf[count];
RamAreaSelect(pages);
XBYTE[index++] = value;
if(index==0x8000)
{
index = 0;
pages ++;
}
}
RamAreaSelect(0);
}
/*-----------------------------------------------------------------------------------
名称: UBYTE FileSearchMemory(void);
功能: 搜索内存文件数.
-----------------------------------------------------------------------------------*/
UBYTE FileSearchMemory(void)
{
UBYTE i = 0;
for(i=0;i<16;i++)
{
if(FileList[i].Name[0]==' ')
break;
}
return(i);
}
/*-----------------------------------------------------------------------------------
名称: UBYTE FileNameCheckMemory(UBYTE *String);
功能: 检测内存文件名称.
-----------------------------------------------------------------------------------*/
UBYTE FileNameCheckMemory(UBYTE *String)
{
UBYTE i = 0;
UBYTE j = 0;
UBYTE k = 0;
for(i=0;i<16;i++)
{
k = 0;
for(j=0;j<8;j++)
{
if(String[j]==FileList[i].Name[j])
k ++;
}
if(k==8)
return false;
}
return true;
}
/*-----------------------------------------------------------------------------------
名称: void FileOpenMemory(UBYTE Point);
功能: 打开内存文件.
-----------------------------------------------------------------------------------*/
void FileOpenMemory(UBYTE Point)
{
UBYTE value = 0;
UBYTE pages = 0;
UHWORD lenth = 0;
UHWORD index = 0;
pages = FileList[Point].Address/0x8000;
index = FileList[Point].Address%0x8000;
for(lenth=0;lenth<FileList[Point].Lenth;lenth++)
{
RamAreaSelect(pages);
value = XBYTE[index++];
if(index==0x8000)
{
index = 0;
pages ++;
}
RamAreaSelect(0);
InOutBuf[lenth] = value;
}
RamAreaSelect(0);
FlagRecEnd = false;
}
/*-----------------------------------------------------------------------------------
名称: UBYTE FileInfoUpdate(UBYTE step);
功能: 更新U盘文件信息.
-----------------------------------------------------------------------------------*/
UBYTE FileInfoUpdate(UBYTE step)
{
ThisFile.OffsetofSector-=step*DeviceInfo.BPB_BytesPerSec;
ThisFile.SectorofCluster+=step;
if(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
{
while(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
{
ThisFile.SectorofCluster-=DeviceInfo.BPB_SecPerClus;
if(ThisFile.pointer<ThisFile.LengthInByte)
ThisFile.ClusterPointer=GetNextClusterNum(ThisFile.ClusterPointer);
else
ThisFile.ClusterPointer=CreateClusterLink(ThisFile.ClusterPointer);
if(ThisFile.ClusterPointer==0x00)
return false;
}
ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.ClusterPointer)+ThisFile.SectorofCluster;
}
else
ThisFile.SectorPointer=ThisFile.SectorPointer+step;
return true;
}
/*-----------------------------------------------------------------------------------
名称: UBYTE WriteFileEnd(void);
功能: U盘写入完毕.
-----------------------------------------------------------------------------------*/
UBYTE WriteFileEnd(void)
{
PDIR_STRUC pDir;
UHWORD idata i,sector;
UBYTE idata j,bStop;
UWORD idata sectorToRead,dirClusterPointer;
if(DiskFlags.bFatChanged==1)
{
if(!RBC_Write(FreeSecNum,1,CurFatSector))
return 0;
if(!RBC_Write(FreeSecNum+DeviceInfo.FATSz,1,CurFatSector))
return 0;
DiskFlags.bFatChanged=0;
}
sector=0;
dirClusterPointer=ThisDir.StartCluster;
for(;;)
{
if(!SeekSectorToRead(&dirClusterPointer,§or,§orToRead))
return false;
if(!RBC_Read(sectorToRead,1,DBUF))
return false;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
pDir=(PDIR_STRUC)(DBUF+i);
if(DBUF[i]==0x00)
return false;
j=0;
while(DBUF[i+j]==ThisFile.FileName[j])
{
j=j+1;
if(j>10)
break;
}
if(DBUF[i+11]&0x10==0x10) //not directory?
continue;
if(j>10)
{
if(DiskFlags.bIsFat32==0)
{
pDir->DIR_FstClusLO=SwapINT16(ThisFile.StartCluster);
}
else
{
DBUF[i+20]=ThisFile.StartCluster>>16;
DBUF[i+21]=ThisFile.StartCluster>>24;
DBUF[i+26]=ThisFile.StartCluster;
DBUF[i+27]=ThisFile.StartCluster>>8;
}
if(ThisFile.pointer>ThisFile.LengthInByte)
ThisFile.LengthInByte=ThisFile.pointer;
pDir->DIR_FileSize=SwapINT32(ThisFile.LengthInByte);
if(!RBC_Write(sectorToRead,1,DBUF))
return false;
bStop=1;
break;
}
}
if(bStop==1)
break;
}
return true;
}
/*-----------------------------------------------------------------------------------
名称: UBYTE RemoveUsbFile(UBYTE *FileName);
功能: 删除U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE RemoveUsbFile(UBYTE *FileName)
{
PDIR_STRUC pDir;
UHWORD idata i,sector;
UBYTE idata j,bStop,bFlag;
UWORD idata sectorToRead,dirClusterPointer;
ThisFile.bFileOpen = 0;
if(!DiskFlags.UDiskOK)
return false;
sector=0;
dirClusterPointer=ThisDir.StartCluster;
for(;;)
{
if(!SeekSectorToRead(&dirClusterPointer,§or,§orToRead))
return false;
if(!RBC_Read(sectorToRead,1,DBUF))
return false;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
return false;
bFlag=DBUF[i+11]&0x18;
if(bFlag!=0)
continue;
j=0;
while(DBUF[i+j]==*(FileName+j))
{
j=j+1;
if(j>11)
break;
}
if(j>11)
{
DBUF[i]=0xE5;
pDir=(PDIR_STRUC)(DBUF+i);
ThisFile.StartCluster=MakeWord(DBUF[i+21],DBUF[i+20],DBUF[i+27],DBUF[i+26]);
if(!RBC_Write(sectorToRead,1,DBUF))
return false;
if(!DeleteClusterLink(ThisFile.StartCluster))
return false;
bStop=1;
break;
}
}
if(bStop==1)
break;
}
return true;
}
/*-----------------------------------------------------------------------------------
名称: UBYTE CreateUsbFile(UBYTE *pBuffer);
功能: 创建U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE CreateUsbFile(UBYTE *pBuffer)
{
PDIR_STRUC pDir;
UHWORD idata i,j,sector;
UBYTE idata bstop;
UWORD idata sectorToRead,dirClusterPointer;
if(!DiskFlags.UDiskOK)
return false;
pDir=(PDIR_STRUC)pBuffer;
pDir->DIR_FstClusHI=0x0000;
pDir->DIR_FstClusLO=0x0000;
pDir->DIR_FileSize=0;
ThisFile.bFileOpen=0;
bstop=0;
sector=0;
dirClusterPointer=ThisDir.StartCluster;
for(;;)
{
if(!SeekSectorToRead(&dirClusterPointer,§or,§orToRead))
return false;
if(!RBC_Read(sectorToRead,1,DBUF))
return false;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if((DBUF[i]==0x00)||(DBUF[i]==0xE5))
{
for(j=0;j<32;j++)
DBUF[i+j]=*(pBuffer+j);
if(!RBC_Write(sectorToRead,1,DBUF))
return false;
bstop=1;
break;
}
}
if(bstop==1)
break;
}
ThisFile.StartCluster=0x00000000;
ThisFile.LengthInByte=0;
ThisFile.ClusterPointer=0x00;
ThisFile.SectorPointer=0x00;
ThisFile.OffsetofSector=0;
ThisFile.SectorofCluster=0;
ThisFile.bFileOpen=1;
ThisFile.pointer=0;
for(j=0;j<11;j++)
ThisFile.FileName[j]=*(pBuffer+j);
FreeClusterNum=DeviceInfo.FSI_Nxt_Free;
FreeSecNum=ThisFatSecNum(DeviceInfo.FSI_Nxt_Free);
if(!RBC_Read(FreeSecNum,1,CurFatSector))
return false;
return true;
}
/*-----------------------------------------------------------------------------------
名称: UBYTE WriterUsbFile(UHWORD writeLength,UBYTE *pBuffer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -