📄 dosfile.c
字号:
#include "..\define.h"
#include "..\all.h"
data bit gb_TriggerFileSkip=0;
data U8 gc_FileSkipNumber=0;
xdata U8 gc_FileHandle;
xdata File_FCB gs_File_FCB[6];
xdata DIR_FCB gs_DIR_FCB[3];
extern data U8 gc_SectorUnit;
extern data U8 gc_maxtimes;
U8 DOS_Close_File(U8 tc_FileHandle, U8 tc_CloseMode, U8 * tpc_FileName);
U8 DOS_Open_File(U8 tc_FileHandle, U8 tc_OpenMode, U8 * tpc_FileName);
U8 DOS_Read_File(U8 tc_FileHandle);
U8 DOS_Search_File(U8 tc_Mode, U8 tc_Type, U8 tc_PrevOrNext);
U32 DOS_Seek_File(U8 tc_FileHandle, U32 tdw_SectorNumber);
U8 DOS_Close_File(U8 tc_FileHandle, U8 tc_CloseMode, U8 * tpc_FileName)
{
U8 tc_Status;
U8 tac_FileFdb[32];
if(gs_File_FCB[tc_FileHandle].dw_File_StartCluster==0xffffffff)
{
return 1;
}
if (tc_CloseMode == 1)
{//Create new file mode
if (gs_File_FCB[tc_FileHandle].dw_File_TotalSize != 0)
{//file size is not 0
U32 tdw_TempLogicAddr;
//fill fdb content
DOS_FillFdb(tac_FileFdb , tpc_FileName, gs_File_FCB[tc_FileHandle].dw_File_StartCluster, gs_File_FCB[tc_FileHandle].dw_File_TotalSize);
tac_FileFdb[0x0B] = 0x20;//attribute is archive
tdw_TempLogicAddr = DOS_ClusterLogicAddr(gs_File_FCB[tc_FileHandle].dw_FDB_Cluster);
if ((tdw_TempLogicAddr == gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd) \
&& (gs_File_FCB[tc_FileHandle].w_FDB_Offset == 0) \
&& (gs_File_FCB[tc_FileHandle].dw_FDB_Cluster != gdw_DOS_RootDirClus))
{//directory area is full,must add fdb in a new free cluster
U32 tdw_TempCluster;
U32 tdw_PreviousCluster;
memcpy(gc_PlayRecordDataBuf,tac_FileFdb,32);
memset(&gc_PlayRecordDataBuf[32],0,480);
gc_ReadWriteDataArea = 0;//select gc_PlayRecordDataBuf[]
DOS_AppendWrite_LogicSector(tdw_TempLogicAddr,1);
//clear other area of the cluster to 0
memset(gc_PlayRecordDataBuf,0,32);
DOS_AppendWrite_LogicSector(tdw_TempLogicAddr + 1,((gc_DOS_SectorPerCluster) - 1));
//find the last cluster of the directory
tdw_TempCluster = gs_File_FCB[tc_FileHandle].dw_FDB_StartCluster;
while (tdw_TempCluster < gdw_DOS_FatMaxCluster)
{
tdw_PreviousCluster = tdw_TempCluster;
tdw_TempCluster = DOS_GetNextCluster(tdw_TempCluster, 1);
}
//connect the free cluster after the last cluster of the directory
DOS_ConnectFATChain(tdw_PreviousCluster,gs_File_FCB[tc_FileHandle].dw_FDB_Cluster);
}
else
{//add fdb in directory area
gc_ReadWriteDataArea = 0;//select gc_PlayRecordDataBuf[]
DOS_Read_LogicSector(gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd, 1);
memcpy(&gc_PlayRecordDataBuf[gs_File_FCB[tc_FileHandle].w_FDB_Offset],tac_FileFdb,32);
DOS_Write_LogicSector(gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd,1);
}
//connect file FAT chain from first cluster to final cluster
DOS_ConnectFATChain(gs_File_FCB[tc_FileHandle].dw_File_StartCluster, gs_File_FCB[tc_FileHandle].dw_File_CurrentCluster);
}
gc_ClusBufValidPoint = 0; //must Search Free Cluster from start
gc_ClusBufValidSize = 0;
gdw_FreeClusterNum[0]=0;
if (gdw_FreeClusterNum[1] < (gdw_DOS_FatMaxCluster - 1))
{//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -