📄 ide_test.c.bak
字号:
CPartition.DATABeginSector;
dstsector = i + (dstgroup-2)*CPartition.bpb.SectorPerGroup +
CPartition.DATABeginSector;
flag=1;
while(flag)
{
atadev_get_block(srcsector, 1, uRcvBuffer);
atadev_put_block(dstsector, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (i = 0; i < 256; i++)
{
temp[2*i] = uRcvBuffer[i] & 0x000000FF;
temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
}
for (i = 0;i < 512; i++)
uRcvBuffer[i]=temp[i];
flag = 0;
atadev_get_block(dstsector, 1, uRcvBuffer1);
for(j=0; j<512; j++)
{
if(uRcvBuffer[j]!=uRcvBuffer1[j])
{
flag = 1;
printf("\n\r Copy sector error, now repeating!");
}
}
}
}
return 1;
}
//find new unused cluster
unsigned int newgrp()
{
unsigned int i=0, j=0;
unsigned int temp;
groupnum = NxtFreeGrp;
for(i=0; i<CPartition.bpb.SectorPerFAT ; i++)
{
atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
for(j=0; j<512/4; j++)//4 bytes(32 bits) describe 1 cluster number(occupies 1 cote)
{
temp = uRcvBuffer[4*j+0] | (uRcvBuffer[4*j+1]<<8) |
(uRcvBuffer[4*j+2]<<16) | (uRcvBuffer[4*j+3]<<24);
if( (temp == 0x00000000) && ((i!=0) || (j >= 4)) )//the foremost 2 cotes(8 bytes) of the FAT1 are reserved for the identification
{ //the following 2 cotes are reserved for the DFT
groupnum = j + i * 512 / 4;
return groupnum;
}
}
}
return 0;
}
//write file register item
unsigned char WriteDFT()
{
unsigned int i=0, j=0, k=0;
for(i=0; i< 2 * CPartition.bpb.SectorPerGroup ; i++)
{
atadev_get_block(CPartition.DATABeginSector + i, 1, uRcvBuffer);
for(j=0; j<16; j++)
{
InitFile(j);
if(OperatorFile.Attrib != 32)
{
for(k=0; k<8; k++)
uRcvBuffer[32*j+k] = mycopyfile.FileName[k];
for(k=0; k<3; k++)
uRcvBuffer[32*j+k+8] = mycopyfile.FileExt[k];
uRcvBuffer[32*j+0x0b] = mycopyfile.Attrib;
uRcvBuffer[32*j+0x16] = mycopyfile.LastTime ;
uRcvBuffer[32*j+0x17] = mycopyfile.LastTime>>8;
uRcvBuffer[32*j+0x18] = mycopyfile.LastDate;
uRcvBuffer[32*j+0x19] = mycopyfile.LastDate>>8;
uRcvBuffer[32*j+0x1a] = mycopyfile.BeginGroup;
uRcvBuffer[32*j+0x1b] = mycopyfile.BeginGroup>>8;
uRcvBuffer[32*j+0x1c] = mycopyfile.FileLength;
uRcvBuffer[32*j+0x1d] = mycopyfile.FileLength>>8;
uRcvBuffer[32*j+0x1e] = mycopyfile.FileLength>>16;
uRcvBuffer[32*j+0x1f] = mycopyfile.FileLength>>24;
atadev_put_block(CPartition.DATABeginSector + i, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (i = 0; i < 256; i++)
{
temp[2*i] = uRcvBuffer[i] & 0x000000FF;
temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
}
for (i = 0;i < 512; i++)
uRcvBuffer[i]=temp[i];
return 1;
}
}
}
return 0;
}
//delete DFB of file(the data of the file are still in the DATA section)
unsigned char DelFile(unsigned int srcgroup)
{
unsigned int i=0, j=0, k=0;
for(i=0; i< 2 * CPartition.bpb.SectorPerGroup ; i++)
{
atadev_get_block(CPartition.DATABeginSector + i, 1, uRcvBuffer);
for(j=0; j<16; j++)
{
InitFile(j);
if(OperatorFile.BeginGroup == srcgroup)
{
printf("\n\r Found the file, cleaning it now!");
for(k=0; k<32; k++)
uRcvBuffer[32*j+k] = 0;
atadev_put_block(CPartition.DATABeginSector + i, 1, uRcvBuffer);
}
}
}
return 1;
}
unsigned char NewFile()
{
unsigned int i=0;
//set the DFB parameters
mynewfile.FileName[0] = 'T';
mynewfile.FileName[1] = 'E';
mynewfile.FileName[2] = 'S';
mynewfile.FileName[3] = 'T';
mynewfile.FileName[4] = ' ';
mynewfile.FileName[5] = ' ';
mynewfile.FileName[6] = ' ';
mynewfile.FileName[7] = ' ';
mynewfile.FileExt[0] = 'T';
mynewfile.FileExt[1] = 'X';
mynewfile.FileExt[2] = 'T';
mynewfile.Attrib = 32;
mynewfile.LastTime = (NEWHOUR << 11) | (NEWMINUTE << 5) | (NEWSECOND / 2);
mynewfile.LastDate = ((NEWYEAR-1980) << 9) | (NEWMONTH << 5) | NEWDAY;
mynewfile.BeginGroup = NEWBEGINGRP;
mynewfile.FileLength = LENGTH;
//write the content of the file to be created
FileBuffer[0] = 'T';
FileBuffer[1] = 'E';
FileBuffer[2] = 'S';
FileBuffer[3] = 'T';
FileBuffer[4] = 'i';
FileBuffer[5] = 'n';
FileBuffer[6] = 'g';
FileBuffer[7] = ':';
for(i = 8; i < 512; i++) FileBuffer[i]='.';
FileBuffer[512] = 'i';
FileBuffer[513] = 'n';
FileBuffer[514] = 'g';
for(i=515;i<32*512;i++) FileBuffer[i]='.';
FileBuffer[32*512+1]='E';
FileBuffer[32*512+2]='N';
FileBuffer[32*512+3]='D';
WriteFile();
return 1;
}
unsigned char WriteFile()
{
unsigned int i=0, j=0;
unsigned int dstgroup=0;
//count of the cluster the new file occupies
groupnum = mynewfile.FileLength / CPartition.bpb.BytePerSector / CPartition.bpb.SectorPerGroup;
OperatorFile = mynewfile;
ViewFile();
//copy the data of the file
dstgroup = mynewfile.BeginGroup;
while(1)
{
//the new created data is smaller than 1 cluster
if(groupnum == 0)
{
WriteGroup(dstgroup);
//modify destination cluster
i = dstgroup / 128;
j = dstgroup - 128 * i;
atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
uRcvBuffer[4*j+0] = 0xFF;
uRcvBuffer[4*j+1] = 0xFF;
uRcvBuffer[4*j+2] = 0xFF;
uRcvBuffer[4*j+3] = 0x0F;
atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
//write file register item
if(!WriteNewDFT())
{
printf("\n\r ERROR: Write DFT failed!");
return 0;
}
return 1;
}
//the new created data is larger than 1 cluster
groupnum = groupnum - 1;
WriteWholeGroup(dstgroup);
//write the next destination cluster number to the previous destination cluster in FAT1
i = dstgroup / 128;
j = dstgroup - 128 * i;
//first write something,prevent find new cluster is this cluster again
atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
uRcvBuffer[4*j+0] = 0x55;
atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
//next new cluster,content is the content of the next object cluster
dstgroup = newgrp();
if(dstgroup == 0)
{
printf("\n\r Can not find free space!");
return 0;
}
//modify destination cluster in FAT1
atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
uRcvBuffer[4*j+0] = dstgroup & 0X000000FF;
uRcvBuffer[4*j+1] = dstgroup & 0X0000FF00;
uRcvBuffer[4*j+2] = dstgroup & 0X00FF0000;
uRcvBuffer[4*j+3] = dstgroup & 0XFF000000;
atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
}
}
//write the register item of the new created file
unsigned char WriteNewDFT()
{
unsigned int i=0, j=0, k=0;
for(i=0; i< 2 * CPartition.bpb.SectorPerGroup ; i++)
{
atadev_get_block(CPartition.DATABeginSector + i, 1, uRcvBuffer);
for(j=0; j<16; j++)
{
InitFile(j);
if(OperatorFile.Attrib != 32)
{
for(k=0; k<8; k++)
uRcvBuffer[32*j+k] = mynewfile.FileName[k];
for(k=0; k<3; k++)
uRcvBuffer[32*j+k+8] = mynewfile.FileExt[k];
uRcvBuffer[32*j+0x0b] = mynewfile.Attrib;
uRcvBuffer[32*j+0x16] = mynewfile.LastTime ;
uRcvBuffer[32*j+0x17] = mynewfile.LastTime>>8;
uRcvBuffer[32*j+0x18] = mynewfile.LastDate;
uRcvBuffer[32*j+0x19] = mynewfile.LastDate>>8;
uRcvBuffer[32*j+0x1a] = mynewfile.BeginGroup;
uRcvBuffer[32*j+0x1b] = mynewfile.BeginGroup>>8;
uRcvBuffer[32*j+0x1c] = mynewfile.FileLength;
uRcvBuffer[32*j+0x1d] = mynewfile.FileLength>>8;
uRcvBuffer[32*j+0x1e] = mynewfile.FileLength>>16;
uRcvBuffer[32*j+0x1f] = mynewfile.FileLength>>24;
atadev_put_block(CPartition.DATABeginSector + i, 1, uRcvBuffer);
return 1;
}
}
}
return 0;
}
unsigned char WriteGroup(unsigned int dstgroup)
{
unsigned int i=0,j=0,t=0,m=0,l=0,k=0,dstsector=0;
unsigned char flag=0;
t = LENGTH / 512;
m = LENGTH - 512 * t;
for(i=0; i<CPartition.bpb.SectorPerGroup; i++)
{
dstsector = i + (dstgroup-2)*CPartition.bpb.SectorPerGroup +
CPartition.DATABeginSector;
flag=1;
while(flag)
{
for(l = 0; l < t; l++)
{
for(k = 0; k < 512; k++)
uRcvBuffer[k] = FileBuffer[k + 512 * l];
atadev_put_block(dstsector + l, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (i = 0; i < 256; i++)
{
temp[2*i] = uRcvBuffer[i] & 0x000000FF;
temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
}
for (i = 0;i < 512; i++)
uRcvBuffer[i]=temp[i];
flag = 0;
atadev_get_block(dstsector + l, 1, uRcvBuffer1);
for(j=0; j<512; j++)
{
if(uRcvBuffer[j]!=uRcvBuffer1[j])
{
flag = 1;
printf("\n\r Write sector error, now repeating!");
}
}
}
for(k = 0; k < m; k++)
uRcvBuffer[k] = FileBuffer[k + 512*t];
for(k = m; k < 512; k++)
uRcvBuffer[k]=' ';
atadev_put_block(dstsector + t, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (i = 0; i < 256; i++)
{
temp[2*i] = uRcvBuffer[i] & 0x000000FF;
temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
}
for (i = 0;i < 512; i++)
uRcvBuffer[i]=temp[i];
flag = 0;
atadev_get_block(dstsector + t, 1, uRcvBuffer1);
for(j=0; j<512; j++)
{
if(uRcvBuffer[j]!=uRcvBuffer1[j])
{
flag = 1;
printf("\n\r Write sector error, now repeating!");
}
}
}
}
return 1;
}
unsigned char WriteWholeGroup(unsigned int dstgroup)
{
unsigned int i=0,j=0,dstsector=0;
unsigned char flag=0;
for(i=0; i<CPartition.bpb.SectorPerGroup; i++)
{
dstsector = i + (dstgroup-2)*CPartition.bpb.SectorPerGroup +
CPartition.DATABeginSector;
flag = 1;
while(flag)
{
for(j = 0; j < 512; j++)
uRcvBuffer[j] = FileBuffer[j+512*i];
atadev_put_block(dstsector, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (i = 0; i < 256; i++)
{
temp[2*i] = uRcvBuffer[i] & 0x000000FF;
temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
}
for (i = 0;i < 512; i++)
uRcvBuffer[i]=temp[i];
flag = 0;
atadev_get_block(dstsector, 1, uRcvBuffer1);
for(j = 0; j < 512; j++)
{
if(uRcvBuffer[j] != uRcvBuffer1[j])
{
flag = 1;
printf("\n\r Write sector error, now repeating!");
}
}
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -