📄 hpi16.c
字号:
#include "DSP28_Device.h"
#include "string.h"
extern FLAGS bFlags;
extern unsigned char DBUF[BUFFER_LENGTH];
//////////////////////////////////////////
extern SYS_INFO_BLOCK DeviceInfo;
extern FILE_INFO ThisFile;
//////////////////////////////////////////
unsigned int DirStartCluster,NowCluster;
extern unsigned long NowSector;
extern ShowFileName_Def ShowFileName[MaxLFNum]; //long file struct
/////////////////////////////////////////////
unsigned char List16(void)
{
unsigned int i;
unsigned char k,bstop,sector;
unsigned char Lcount,Ncount,base;
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
bstop=0;
////////////////////////////////////
Lcount=0;
for(i=0;i<MaxLFNum;i++)
{
ShowFileName[i].LongName[0]=0x00;
ShowFileName[i].LongName[1]=0x00;
}
/////////////////////////////////////
if(DirStartCluster==0) //Root Dir
{
for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
{
if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,DBUF))
return FALSE;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
{
bstop=1;
break;
}
else if(DBUF[i]==0xE5)
continue;
else
{
/////////////////////////////////
if(DBUF[i+11]==0x0F)
{
base=((DBUF[i]&0x1F)-1)*26;
if(base<=224)
{
Ncount=0;
for(k=1;k<11;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
for(k=14;k<26;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
for(k=28;k<32;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
}
}
else
{
for(k=0;k<32;k++)
ShowFileName[Lcount].item[k]=DBUF[i+k];
Lcount++;//File & Dir count
}
/////////////////////////////////
}
}
if(bstop==1)break;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////
else //Son Dir
{
NowCluster=DirStartCluster;
do
{
NowSector=FirstSectorofCluster16(NowCluster);
for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
{
if(!RBC_Read(NowSector+sector,1,DBUF))
return FALSE;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
{
bstop=1;
break;
}
else if(DBUF[i]==0xE5)
continue;
else
{
/////////////////////////////////
if(DBUF[i+11]==0x0F)
{
base=((DBUF[i]&0x1F)-1)*26;
if(base<=224)
{
Ncount=0;
for(k=1;k<11;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
for(k=14;k<26;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
for(k=28;k<32;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
}
}
else
{
for(k=0;k<32;k++)
ShowFileName[Lcount].item[k]=DBUF[i+k];
Lcount++;
}
/////////////////////////////////
}
}
if(bstop==1)break;
}
if(bstop==1)break;
NowCluster=GetNextClusterNum16(NowCluster);
}while(NowCluster<=0xffef);
return TRUE;
}
}
unsigned char OpenFile16(char *pBuffer)
{
unsigned int i;
unsigned char j,bstop,sector;
unsigned char p[11];
unsigned char ch,len;
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
ThisFile.bFileOpen=0;
//-------------------------------
if (*pBuffer == '.')
return FALSE;
i=0;
while (pBuffer[i] !=0)
{
ch = pBuffer[i];
if(ch == '\\' || ch == '/' || ch == ':' || ch == '*' || ch == '?'
|| ch == '"' || ch == '<' || ch == '>' || ch == '|') return FALSE;
i++;
}
for (i=0;i<11;i++)
p[i] = 0x20;
len = 0;
i=0;
while(pBuffer[i]!='.')
{
len++;
i++;
}
if (len<8)
{
i = 0;
while(pBuffer[i]!='.')
{
p[i] = pBuffer[i];
i++;
}
p[8] = pBuffer[i+1];
p[9] = pBuffer[i+2];
p[10] = pBuffer[i+3];
}
else
{
for (i=0;i<6;i++)
p[i] = pBuffer[i];
p[6] = '~';
p[7] = '1';
i=0;
while(pBuffer[i]!='.')
i++;
p[8] = pBuffer[i+1];
p[9] = pBuffer[i+2];
p[10] = pBuffer[i+3];
}
//---------------------------------
if(DirStartCluster==0) //Root Dir
{
for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
{
if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,DBUF))
return FALSE;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
return FALSE;
j=0;
while(DBUF[i+j]==*(p+j))
{
j=j+1;
if(j>10)
break;
}
if(j>10 && (DBUF[i+11]&0x10)!=0x10)
{
bstop=1;
break;
}
}
if(bstop==1)break;
}
if(sector>=DeviceInfo.BPB_RootEntCnt)
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////////////
else
{
NowCluster=DirStartCluster;
do
{
NowSector=FirstSectorofCluster16(NowCluster);
for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
{
if(!RBC_Read(NowSector+sector,1,DBUF))
return FALSE;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
return FALSE;
j=0;
while(DBUF[i+j]==*(p+j))
{
j=j+1;
if(j>10)
break;
}
if(j>10 && (DBUF[i+11]&0x10)!=0x10)
{
bstop=1;
break;
}
}
if(bstop==1)break;
}
if(bstop==1)break;
NowCluster=GetNextClusterNum16(NowCluster);
}while(NowCluster<=0xffef);
if(NowCluster>0xffef)
return FALSE;
}
ThisFile.bFileOpen=1;
ThisFile.StartCluster=LSwapINT16(DBUF[26],DBUF[27]);
ThisFile.LengthInByte=LSwapINT32(DBUF[28],DBUF[29],DBUF[30],DBUF[31]);
ThisFile.ClusterPointer=ThisFile.StartCluster;
ThisFile.SectorPointer=FirstSectorofCluster16(ThisFile.StartCluster);
ThisFile.OffsetofSector=0;
ThisFile.SectorofCluster=0;
ThisFile.FatSectorPointer=0;
ThisFile.pointer=0;
return TRUE;
}
unsigned char ReadFile16(unsigned long readLength,unsigned char *pBuffer)
{
unsigned int len,i;
unsigned int tlen;
tlen=0;
if(readLength>MAX_READ_LENGTH)
return FALSE;
if(readLength+ThisFile.pointer>ThisFile.LengthInByte)
return FALSE;
////////////////////////////////////////////
while(readLength>0)
{
if(readLength+ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec)
len=DeviceInfo.BPB_BytesPerSec;
else
len=readLength+ThisFile.OffsetofSector;
//////////////////////////////////////////////////////
if(ThisFile.OffsetofSector>0)
{
if(RBC_Read(ThisFile.SectorPointer,1,DBUF))
{
len=len-ThisFile.OffsetofSector;
for(i=0;i<len;i++)
*(pBuffer+i)=DBUF[ThisFile.OffsetofSector+i];
ThisFile.OffsetofSector=ThisFile.OffsetofSector+len;
}
else
return FALSE;
}
else
{
if(!RBC_Read(ThisFile.SectorPointer,1,pBuffer+tlen))
return FALSE;
ThisFile.OffsetofSector=len;
}
////////////////////////////////////////////////////////////
readLength-=len;
tlen+=len;
/////////////////////////////////////////////////////////
if(ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec-1)
{
ThisFile.OffsetofSector-=DeviceInfo.BPB_BytesPerSec;
ThisFile.SectorofCluster+=1;
if(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
{
ThisFile.SectorofCluster=0;
ThisFile.ClusterPointer=GetNextClusterNum16(ThisFile.ClusterPointer);
if(ThisFile.ClusterPointer>0xffef)
return FALSE;
ThisFile.SectorPointer=FirstSectorofCluster16(ThisFile.ClusterPointer);
}
else
ThisFile.SectorPointer=ThisFile.SectorPointer+1;
}
//////////////////////////////////////////////////////////////////
}//end while
ThisFile.bFileOpen=1;
ThisFile.pointer+=tlen;
//////////////////////////////////////////////
return TRUE;
}
unsigned char SetFilePointer16(unsigned long pointer)
{
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
if(!ThisFile.bFileOpen)
return FALSE;
///////////////////////////////////////////////////////////
ThisFile.pointer=pointer;
if(ThisFile.pointer>ThisFile.LengthInByte)
return FALSE;
if(!GoToPointer16(ThisFile.pointer))
{
ThisFile.bFileOpen=0;
return FALSE;
}
//////////////////////////////////////////////
return TRUE;
}
unsigned char CreateFile16(char *str,unsigned char attr)
{
unsigned int sector,i,j;
unsigned int cnum,ClusterPointer;
unsigned char bstop,bwrite,DirCount,InByte;
unsigned char pBuffer[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char ch;
unsigned char len=0;
unsigned char *pName;
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
if (*str == '.')
return FALSE;
i=0;
while (str[i] !=0)
{
ch = str[i];
if(ch == '\\' || ch == '/' || ch == ':' || ch == '*' || ch == '?'
|| ch == '"' || ch == '<' || ch == '>' || ch == '|') return FALSE;
if (islower(ch)) str[i] = toupper(ch);
i++;
}
for (i=0;i<11;i++)
pBuffer[i] = 0x20;
len = 0;
i=0;
while(str[i]!='.')
{
len++;
i++;
}
if (len<8)
{
i = 0;
while(str[i]!='.')
{
pBuffer[i] = str[i];
i++;
}
pBuffer[8] = str[i+1];
pBuffer[9] = str[i+2];
pBuffer[10] = str[i+3];
len = 0;
}
else
{
for (i=0;i<6;i++)
pBuffer[i] = str[i];
pBuffer[6] = '~';
pBuffer[7] = '1';
i=0;
while(str[i]!='.')
i++;
pBuffer[8] = str[i+1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -