📄 ide_test.c
字号:
}
return 0;
}
//write the cluster content of the new created file (the content does not occupy the whole cluster)
unsigned char WriteGroup(unsigned int dstgroup,unsigned int ClusNums)
{
unsigned int i=0,j=0,t=0,m=0,l=0,k=0,dstsector=0;
unsigned char flag=0;
t = (NEWLENGTH - ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector) / CPartition.bpb.BytePerSector;
m = (NEWLENGTH - ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector) - CPartition.bpb.BytePerSector * 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] = NewFileBuf[k + 512 * l + ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector];
atadev_put_block_quick(dstsector + l, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (j = 0; j < 256; j++)
{
temp[2*j] = uRcvBuffer[j] & 0x000000FF;
temp[2*j+1] = (uRcvBuffer[j] & 0x0000FF00) >> 8;
}
for (j = 0;j < 512; j++)
uRcvBuffer[j]=temp[j];
flag = 0;
atadev_get_block_quick(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] = NewFileBuf[k + 512*t + ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector];
for(k = m; k < 512; k++)
uRcvBuffer[k]=' ';
atadev_put_block_quick(dstsector + t, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (j = 0; j < 256; j++)
{
temp[2*j] = uRcvBuffer[j] & 0x000000FF;
temp[2*j+1] = (uRcvBuffer[j] & 0x0000FF00) >> 8;
}
for (j = 0;j < 512; j++)
uRcvBuffer[j]=temp[j];
flag = 0;
atadev_get_block_quick(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;
}
//write the cluster content of the new created file (the content occupies the whole cluster)
unsigned char WriteWholeGroup(unsigned int dstgroup,unsigned int ClusNums)
{
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] = NewFileBuf[j+512*i+ ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector];
atadev_put_block_quick(dstsector, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (j = 0; j < 256; j++)
{
temp[2*j] = uRcvBuffer[j] & 0x000000FF;
temp[2*j+1] = (uRcvBuffer[j] & 0x0000FF00) >> 8;
}
for (j = 0;j < 512; j++)
uRcvBuffer[j]=temp[j];
flag = 0;
atadev_get_block_quick(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;
}
//just can add data to the new created file
unsigned char AddToFile()
{
unsigned int i=0,j=0,k=0,m=0;
unsigned int dstgroup=0;
unsigned int ClusNums = 0;
unsigned int DstClusNumb = 0;
unsigned int ModifyIndex = 0;
//set the DFB parameters(name and BeginGroup should be same as the new created file's)
myaddfile.FileName[0] = 'T';
myaddfile.FileName[1] = 'E';
myaddfile.FileName[2] = 'S';
myaddfile.FileName[3] = 'T';
myaddfile.FileName[4] = ' ';
myaddfile.FileName[5] = ' ';
myaddfile.FileName[6] = ' ';
myaddfile.FileName[7] = ' ';
myaddfile.FileExt[0] = 'T';
myaddfile.FileExt[1] = 'X';
myaddfile.FileExt[2] = 'T';
myaddfile.Attrib = ATTRIB;
myaddfile.LastTime = (ADDHOUR << 11) | (ADDMINUTE << 5) | (ADDSECOND / 2);
myaddfile.LastDate = ((ADDYEAR-1980) << 9) | (ADDMONTH << 5) | ADDDAY;
myaddfile.BeginGroup = NEWBEGINGRP;
myaddfile.FileLength = ADDLENGTH;
//write the content of the file to be added
AddFileBuf[0] = '\n';
AddFileBuf[1] = 'A';
AddFileBuf[2] = 'D';
AddFileBuf[3] = 'D';
AddFileBuf[4] = 'i';
AddFileBuf[5] = 'n';
AddFileBuf[6] = 'g';
AddFileBuf[7] = ':';
for(i = 8; i < 512; i++) AddFileBuf[i] = '.';
AddFileBuf[512] = 'a';
AddFileBuf[513] = 'd';
AddFileBuf[514] = 'd';
for(i = 515; i < 2*512; i++) AddFileBuf[i] = '.';
AddFileBuf[2*512] ='a';
AddFileBuf[2*512+1] ='d';
AddFileBuf[2*512+2] ='d';
for(i = 2*512+3; i < 1437; i++) AddFileBuf[i] = '.';
AddFileBuf[1437] = 'a';
AddFileBuf[1438] = 'd';
AddFileBuf[1439] = 'd';
for(i = 1440; i<4096; i++) AddFileBuf[i] = '.';
AddFileBuf[4096] = 'E';
AddFileBuf[4097] = 'N';
AddFileBuf[4098] = 'D';
//(groupnum+1):count of the cluster the new file occupies
//(FileLength-1):the reason -1 is to prevent the FileLength is just the integral multiple of 1 cluster but occupies one more cluster
groupnum = (myaddfile.FileLength - 1) / CPartition.bpb.BytePerSector / CPartition.bpb.SectorPerGroup;
ClusNums = groupnum;
//add the data to the file
dstgroup = newgrp();
DstClusNumb = dstgroup;
while(1)
{
for(m = 0; m < ClusNums; m++)
{
//the new added data is smaller than 1 cluster
if(groupnum == 0)
{
AddGroup(dstgroup,ClusNums);
//modify destination cluster
i = dstgroup * 4 / 512;
j = dstgroup - i * 512 / 4;
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);
//modify the cluster number to point to the first cluster number of the added file
ModifyIndex = NEWBEGINGRP + (NEWLENGTH-1)/CPartition.bpb.BytePerSector/CPartition.bpb.SectorPerGroup;
i = ModifyIndex * 4 / 512;
j = ModifyIndex - i * 512 / 4;
atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
uRcvBuffer[4*j+0] = DstClusNumb & 0x000000FF;
uRcvBuffer[4*j+1] = (DstClusNumb & 0x0000FF00) >> 8;
uRcvBuffer[4*j+2] = (DstClusNumb & 0x00FF0000) >> 16;
uRcvBuffer[4*j+3] = (DstClusNumb & 0xFF000000) >> 24;
atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
//write file register item
if(!WriteAddDFT())
{
printf("\n\r ERROR: Write DFT failed!");
return 0;
}
return 1;
}
//the new created data is larger than 1 cluster
groupnum = groupnum - 1;
AddWholeGroup(dstgroup,m);
//write the next destination cluster number to the previous destination cluster in FAT1
i = dstgroup * 4 / 512;
j = dstgroup - i * 512 / 4;
//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] = DstClusNumb & 0x000000FF;
uRcvBuffer[4*j+1] = (DstClusNumb & 0x0000FF00) >> 8;
uRcvBuffer[4*j+2] = (DstClusNumb & 0x00FF0000) >> 16;
uRcvBuffer[4*j+3] = (DstClusNumb & 0xFF000000) >> 24;
atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
}
}
}
//add the cluster content of the new created file (the content does not occupy the whole cluster)
unsigned char AddGroup(unsigned int dstgroup,unsigned int ClusNums)
{
unsigned int i=0,j=0,t=0,m=0,l=0,k=0,dstsector=0;
unsigned char flag=0;
t = (ADDLENGTH - ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector) / CPartition.bpb.BytePerSector;
m = (ADDLENGTH - ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector) - CPartition.bpb.BytePerSector * 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] = AddFileBuf[k + 512 * l + ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector];
atadev_put_block(dstsector + l, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (j = 0; j < 256; j++)
{
temp[2*j] = uRcvBuffer[j] & 0x000000FF;
temp[2*j+1] = (uRcvBuffer[j] & 0x0000FF00) >> 8;
}
for (j = 0;j < 512; j++)
uRcvBuffer[j]=temp[j];
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] = AddFileBuf[k + 512*t + ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector];
for(k = m; k < 512; k++)
uRcvBuffer[k]=' ';
atadev_put_block(dstsector + t, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (j = 0; j < 256; j++)
{
temp[2*j] = uRcvBuffer[j] & 0x000000FF;
temp[2*j+1] = (uRcvBuffer[j] & 0x0000FF00) >> 8;
}
for (j = 0;j < 512; j++)
uRcvBuffer[j]=temp[j];
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;
}
//add the cluster content of the new created file (the content occupies the whole cluster)
unsigned char AddWholeGroup(unsigned int dstgroup,unsigned int ClusNums)
{
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] = AddFileBuf[j+512*i + ClusNums * CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector];
atadev_put_block(dstsector, 1, uRcvBuffer);
//translate uRcvBuffer[256] to uRcvBuffer[512]
for (j = 0; j < 256; j++)
{
temp[2*j] = uRcvBuffer[j] & 0x000000FF;
temp[2*j+1] = (uRcvBuffer[j] & 0x0000FF00) >> 8;
}
for (j = 0;j < 512; j++)
uRcvBuffer[j]=temp[j];
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;
}
unsigned char WriteAddDFT()
{
unsigned int i=0, j=0, k=0, AddLength;
//(NEWLENGTH-1):the reason -1 is to prevent the NEWLENGTH is just the integral multiple of 1 cluster but occupies one more cluster
AddLength = ((NEWLENGTH - 1) / CPartition.bpb.BytePerSector / CPartition.bpb.SectorPerGroup + 1)
* CPartition.bpb.SectorPerGroup * CPartition.bpb.BytePerSector
+ ADDLENGTH;
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 == NEWBEGINGRP)
{
for(k=0; k<8; k++)
uRcvBuffer[32*j+k] = myaddfile.FileName[k];
for(k=0; k<3; k++)
uRcvBuffer[32*j+k+8] = myaddfile.FileExt[k];
uRcvBuffer[32*j+0x0b] = ATTRIB;
uRcvBuffer[32*j+0x16] = myaddfile.LastTime & 0X000000FF;
uRcvBuffer[32*j+0x17] = (myaddfile.LastTime & 0X0000FF00) >> 8;
uRcvBuffer[32*j+0x18] = myaddfile.LastDate & 0X000000FF;
uRcvBuffer[32*j+0x19] = (myaddfile.LastDate & 0X0000FF00) >>8;
uRcvBuffer[32*j+0x1a] = NEWBEGINGRP & 0X000000FF;
uRcvBuffer[32*j+0x1b] = (NEWBEGINGRP & 0X0000FF00) >>8;
uRcvBuffer[32*j+0x1c] = AddLength & 0X000000FF;
uRcvBuffer[32*j+0x1d] = (AddLength & 0X0000FF00) >>8;
uRcvBuffer[32*j+0x1e] = (AddLength & 0X00FF0000) >>16;
uRcvBuffer[32*j+0x1f] = (AddLength & 0XFF000000) >>24;
atadev_put_block(CPartition.DATABeginSector + i, 1, uRcvBuffer);
return 1;
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -