📄 dosfdb.c
字号:
#include "..\define.h"
#include "..\all.h"
data bit gb_FindFile=0;
idata U8 gc_DOS_Status;
idata U32 gdw_StartCluster2;
idata U32 gdw_CurrFlag;
xdata U16 gw_DOS_CreateDate;
xdata U16 gw_DOS_CreateTime;
xdata U16 gw_FdbOffset;
xdata U8 tc_File_Type[100];
xdata U16 tc_FDB_Offset[100];
xdata U32 tc_FDB_Cluster[100];
xdata U32 tc_FDB_LogAdd[100];
xdata U32 tc_LFDB_LogAdd0[100];
xdata U32 tc_LFDB_LogAdd1[100];
extern data bit gb_TriggerFileSkip;
extern data U8 gc_FileSkipNumber;
extern xdata U8 EXT_NameA[];
extern xdata U8 EXT_NameB[];
extern xdata U8 EXT_NameC[];
extern xdata U8* EXT_Name[];
extern void MoveUSBtoUserDataBuf(U16 tw_StartAddr);
void DOS_FillFdb(U8 * tpc_Fdb, U8 * tpc_Name, U32 tdw_StartCluster, U32 tdw_FileSize);
U8 Find_Fdb(SearchFdb *p_mp);
U8 Dos_GetFileLongName(U8 tc_FileHandle, U8 *tpc_LongName);
void DOS_FillFdb(U8 * tpc_Fdb, U8 * tpc_Name, U32 tdw_StartCluster, U32 tdw_FileSize)
{
// update new name
memcpy(tpc_Fdb,tpc_Name,0x0C);
tpc_Fdb[0x0C] = 0; // reserved
tpc_Fdb[0x0D] = 0; // creation time in millisecond
//creation time
tpc_Fdb[0x0E] = gw_DOS_CreateTime;
tpc_Fdb[0x0F] = gw_DOS_CreateTime >> 8;
//creation date
tpc_Fdb[0x10] = gw_DOS_CreateDate;
tpc_Fdb[0x11] = gw_DOS_CreateDate >> 8;
//last access date
tpc_Fdb[0x12] = gw_DOS_CreateDate;
tpc_Fdb[0x13] = gw_DOS_CreateDate >> 8;
//last modify time
tpc_Fdb[0x16] = gw_DOS_CreateTime;
tpc_Fdb[0x17] = gw_DOS_CreateTime >> 8;
//last modify date
tpc_Fdb[0x18] = gw_DOS_CreateDate;
tpc_Fdb[0x19] = gw_DOS_CreateDate >> 8;
tpc_Fdb[0x1A] = tdw_StartCluster;
tpc_Fdb[0x1B] = tdw_StartCluster >> 8;
//high word of start cluster number
tpc_Fdb[0x14] = tdw_StartCluster >> 16;
tpc_Fdb[0x15] = tdw_StartCluster >> 24;
tpc_Fdb[0x1C] = tdw_FileSize;
tpc_Fdb[0x1D] = tdw_FileSize >> 8;
tpc_Fdb[0x1E] = tdw_FileSize >> 16;
tpc_Fdb[0x1F] = tdw_FileSize >> 24;
return;
}
U8 Find_Fdb(SearchFdb *p_mp)
{
bit tbt_flag=0,tbt_SortFlag=0,tbt_FileSort_Flag=0,tbt_SameFlag=0;
U8 tc_sts,tc_Read_fail,tc_SectorOffset,tc_Temp_SectorOffset;
U8 tc_PlayMode,tc_ExtNameCon=3;
U8 tc_DOS_FDBSize1;
U16 tw_FdbOffset1;
U16 tw_XBYTEstart;
U16 tw_FdbOffset,tw_Temp_FdbOffset,tw_FileLongName,tw_ByteOffset;
U32 tdw_SectorAdd,tdw_StartCluster,tdw_S_ClusterNum,tdw_FDBClusterNum;
U32 tdw_Find_ClusterSize,tdw_TheEndCluster,tdw_StartCluster1,tdw_StartCluster3;
U32 tdw_FDB_LogAdd0,tdw_FDB_LogAdd1;
U32 tdw_Temp_flag=0;
U16 tw_DirIndex=0,tw_DirIndex1=0;
U8 tc_ExtNum,tc_RecFlag;
U32 tdw_Tag0,tdw_Tag1;
U8 code REC[]={'R','E','C','_'};
U8 tc_FileSkipNumber;
U8 Pointer=0;
tc_FileSkipNumber=gc_FileSkipNumber;
if (gc_DOS_Status > 0x80)
{//dos error is occur, not to do search
return 1;
}
tdw_Tag1= p_mp->Compare.dw_BubbleFlag;
if(p_mp->c_Search_Direction) //find pre
{
tdw_Tag0=0x0000;
}
else
{//find next
tdw_Tag0=0xffffffff;
}
tdw_FDBClusterNum=p_mp->dw_FDB_StartCluster;
p_mp->dw_LongFDB_LogAdd1=0;
p_mp->dw_LongFDB_LogAdd0=0;
tw_Temp_FdbOffset=0x00;
tc_Temp_SectorOffset=0x00;
tdw_FDB_LogAdd0=0;
tdw_FDB_LogAdd1=0;
tdw_S_ClusterNum=p_mp->dw_FDB_StartCluster;
tc_sts=GO_ON;
if(gc_DOS_FileSystemType==0)
{
tdw_TheEndCluster=0x0fff;
}
else if(gc_DOS_FileSystemType==1)
{
tdw_TheEndCluster=0xffff;
}
else
{
tdw_TheEndCluster=0x0fffffff;
}
while(tdw_S_ClusterNum<tdw_TheEndCluster)//要考虑FAT32的情况
{ //find in one dir
if (!tdw_S_ClusterNum) //Is rootdir
{
tdw_Find_ClusterSize=(gdw_DOS_DataAddr - gdw_DOS_RootDirAddr);
tdw_SectorAdd=gdw_DOS_RootDirAddr;
}
else
{
tdw_Find_ClusterSize=gc_DOS_SectorPerCluster;
tdw_SectorAdd=DOS_ClusterLogicAddr(tdw_S_ClusterNum);
}
for(tc_SectorOffset=tc_Temp_SectorOffset;tc_SectorOffset<tdw_Find_ClusterSize;tc_SectorOffset++)
{//find in one cluster
gc_ReadWriteDataArea=1;
tc_Read_fail = DOS_Read_LogicSector((tdw_SectorAdd+tc_SectorOffset),1);
if(tc_Read_fail)
{//read sector error(1 is fail)
break;
}
if(tc_SectorOffset!=tc_Temp_SectorOffset)//when one Sector is(tw_FdbOffset)finished,fdboffset should be 0
{
tw_Temp_FdbOffset=0;
}
for(tw_FdbOffset1=tw_Temp_FdbOffset;tw_FdbOffset1<gw_DOS_SectorSize;tw_FdbOffset1+=32)
{//Find in one sector
tc_DOS_FDBSize1=tw_FdbOffset1>>9;
tw_FdbOffset=tw_FdbOffset1;
if(tc_DOS_FDBSize1)
{
tw_XBYTEstart=HOST_BUF_SA+((U16)tc_DOS_FDBSize1<<9);
MoveUSBtoUserDataBuf(tw_XBYTEstart);
}
tc_PlayMode=0;
tc_RecFlag=1;
tw_DirIndex++;
if(gc_UserDataBuf[tw_FdbOffset]==0xE5)
{
if(p_mp->c_Search_Mode==K_FIND_FREE_FDB)
{
tc_sts=0;
}
}
else if(gc_UserDataBuf[tw_FdbOffset]==0x00)
{
if((p_mp->c_Search_Mode==K_FIND_FREE_FDB) || (p_mp->c_Search_Mode==K_FIND_LAST_FDB))
{
tc_sts=0;
}
else
{
tc_sts=1; //The dir is end flag
}
}
else if(gc_UserDataBuf[tw_FdbOffset+0x0b]==0x0f) //is longfdb
{
if(p_mp->c_Search_Mode==K_SPECIFIC_LONG_FILENAME)//find by long filename
{
if(gc_UserDataBuf[tw_FdbOffset]&0x40) //IS it the last longfdb?
{
if(gc_UserDataBuf[tw_FdbOffset]==p_mp->pc_LongFileName[0])
{
if (*(p_mp->pc_LongFileName+1) != 0)
{
if((gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[*(p_mp->pc_LongFileName+1)-1]]==0x00) && (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[*(p_mp->pc_LongFileName+1)-2]]==0x00))
{
goto MatchEXTName;
}
}
else
{//character NUM is equal
MatchEXTName:
tc_ExtNameCon = 6;
((U8 *)(&tw_FileLongName))[0] = *(p_mp->pc_LongFileName+3);
((U8 *)(&tw_FileLongName))[1] = *(p_mp->pc_LongFileName+4);
tw_FileLongName+=5;
for(tw_ByteOffset=0;tw_ByteOffset<(26-(*(p_mp->pc_LongFileName+1)));tw_ByteOffset++)
{//compare the last longfdb
if(gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]]!=p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset]) //last longfdb is not equal
{
if ((gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]] >= 'a') && (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]] <= 'z'))
{//if current char is lower letter,try to compare after converting to upper letter
if (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[(*(p_mp->pc_LongFileName+1))+tw_ByteOffset]]!=(p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset] + 0x20))
{
break;
}
}
else
{
break;
}
}
}
if(tw_ByteOffset==26-*(p_mp->pc_LongFileName+1)) //the last longfdb is equal
{
if((gc_UserDataBuf[tw_FdbOffset]&0x3f)==1) //current longfdb is the first
{
tc_sts=0;
}
else
{
tw_FileLongName-=tw_ByteOffset;
}
}
}
}
}
else
{//not the "last" longfdb
for(tw_ByteOffset=0;tw_ByteOffset<26;tw_ByteOffset++)
{//compare the longfdb which is not the last
if(gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]]!=p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset])
{
if ((gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]] >= 'a') && (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]] <= 'z'))
{//if current char is lower letter,try to compare after converting to upper letter
if (gc_UserDataBuf[tw_FdbOffset+Unicode_Offset[tw_ByteOffset]]!=(p_mp->pc_LongFileName[tw_FileLongName-tw_ByteOffset] + 0x20))
{
break;
}
}
else
{
break;
}
}
}
if(tw_ByteOffset==26) //equal
{
tw_FileLongName-=tw_ByteOffset;
if((gc_UserDataBuf[tw_FdbOffset]&0x3f)==1)
{//current longfdb is the first
tc_sts=0;
}
}
}
}
}
else
{//short_fdb
tw_FileLongName = *(p_mp->pc_LongFileName+4);
if(gc_UserDataBuf[tw_FdbOffset+0x0b] & 0x10)
{//is dir
if(p_mp->c_Search_Attribute)
{//find dir
p_mp->c_type = 4;
if(gc_UserDataBuf[tw_FdbOffset]!=0x2e)
{
if (((p_mp->c_Search_Mode == K_FIND_DIR_EXTNAME) || (p_mp->c_Search_Mode == K_SPECIFIC_SHORT_FILENAME)))
{
goto EXTNAMECOMPARE;
}
else
{
tbt_flag=1; //the flag which determine if implement the flowing program
}
}
}
}
else if(!(p_mp->c_Search_Attribute))
{//not dir and not find dir
if((gc_UserDataBuf[tw_FdbOffset+0x0b]&0x08)!=0x08)
{
EXTNAMECOMPARE:
if(p_mp->c_EXTSelect==1)
{//need compare EXTName
for(tc_ExtNum=0;tc_ExtNum<EXT_Name[p_mp->c_type][0];tc_ExtNum++)
{//compare the ext_name
for(tw_ByteOffset=0;tw_ByteOffset<3;tw_ByteOffset++)
{//the max length of ext_name is 3 now
if(gc_UserDataBuf[tw_FdbOffset+0x08+tw_ByteOffset]!=EXT_Name[p_mp->c_type][tw_ByteOffset+tc_PlayMode*3+1])
{
tc_PlayMode++;
break;
}
}
if(tw_ByteOffset>=3)
{//EXTName is equal
tbt_flag=1;
tw_FileLongName-=3;
if(p_mp->c_type==1)
{
tc_PlayMode+=EXT_Name[0][0];
}
break;
}
}
}
else if(p_mp->c_EXTSelect==0)
{//no need compare EXTName
tbt_flag=1; //the flag determines if implement the flowing programe
tw_FileLongName-=3;
}
if((tbt_flag==1)&&(p_mp->c_type==1))
{//voice file
for(tw_ByteOffset=0;tw_ByteOffset<4;tw_ByteOffset++)
{//the max length of ext_name is 3 now
if(gc_UserDataBuf[tw_FdbOffset+tw_ByteOffset]!=REC[tw_ByteOffset])
{
tbt_flag=0;
break;
}
}
}
}
}//not and not find dir
if(tbt_flag)
{
tbt_flag=0;
if(p_mp->c_type==1)
{
for(tw_ByteOffset=0;tw_ByteOffset<0x04;tw_ByteOffset++)
{
if((gc_UserDataBuf[tw_FdbOffset+0x04+tw_ByteOffset]<0x30)||(gc_UserDataBuf[tw_FdbOffset+0x04+tw_ByteOffset]>0x39))
{
tc_RecFlag = 0;
}
tdw_Temp_flag =tdw_Temp_flag<<8;
tdw_Temp_flag |= gc_UserDataBuf [tw_FdbOffset+0x04+tw_ByteOffset]; //sorts the name of current fdb
}
}
if(p_mp->c_Search_Mode==K_COUNTER_FILENUM)
{
if(p_mp->c_Search_Attribute)
{
p_mp->w_DirTotalNum++;
}
else
{
if(tc_RecFlag)
{
p_mp->w_FileTotalNum++;
}
}
}
else if((p_mp->c_Search_Mode==K_TIME_FINDFDB)||p_mp->c_Search_Mode==K_NAME_FINDFDB) //find by create time
{
((U8 *)(&tdw_StartCluster1))[0]=gc_UserDataBuf[tw_FdbOffset+0x15];
((U8 *)(&tdw_StartCluster1))[1]=gc_UserDataBuf[tw_FdbOffset+0x14];
((U8 *)(&tdw_StartCluster1))[2]=gc_UserDataBuf[tw_FdbOffset+0x1b];
((U8 *)(&tdw_StartCluster1))[3]=gc_UserDataBuf[tw_FdbOffset+0x1a];
if(tc_RecFlag)
{
if(p_mp->c_Search_Direction)
{//find pre
if((tdw_Tag0<=tdw_Temp_flag)&&(tdw_Temp_flag<tdw_Tag1))
{
tdw_Tag0= tdw_Temp_flag;
p_mp->dw_FDB_Cluster=tdw_S_ClusterNum;
p_mp->dw_FDB_LogAdd=tc_SectorOffset+tdw_SectorAdd;
p_mp->w_FDB_Offset=tw_FdbOffset;
tdw_StartCluster3=tdw_StartCluster1;
p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;
p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;
tbt_SortFlag=1;
gs_File_FCB[p_mp->c_type].c_FileType = tc_PlayMode;
}
else if(tdw_Temp_flag==tdw_Tag1)
{
if(tdw_StartCluster1!=p_mp->dw_File_StartCluster)
{//startcluster is not equal
if(!tbt_SameFlag)
{//current fdb is before pre fdb which we stored
tdw_Tag0= tdw_Temp_flag;
p_mp->dw_FDB_Cluster=tdw_S_ClusterNum;
p_mp->dw_FDB_LogAdd=tc_SectorOffset+tdw_SectorAdd;
p_mp->w_FDB_Offset=tw_FdbOffset;
tdw_StartCluster3=tdw_StartCluster1;
p_mp->dw_LongFDB_LogAdd1=tdw_FDB_LogAdd1;
p_mp->dw_LongFDB_LogAdd0=tdw_FDB_LogAdd0;
tbt_SortFlag=1;
gs_File_FCB[p_mp->c_type].c_FileType = tc_PlayMode;
}
}
else
{
tbt_SameFlag=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -