📄 api.lst
字号:
C51 COMPILER V7.06 API 07/30/2008 08:56:14 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE API
OBJECT MODULE PLACED IN api.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE api.c LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //************************************************************************
2 //author:dragon
3 //web:8dragon.com
4 //2004.2.5完成于桃龙源
5 //*************************************************************************
6 #include "AT89X52.h"
7 #include "api.h"
8 #include "file.h"
9 #include "host_811.h"
10 #include "ufi.h"
11 #include "string.h"
12 #include "math.h"
13 struct _FILE ApiFileControl;
14 extern struct _BPB SimpleBpb;
15 extern FAT_PARAMETER FatParameter;
16 BYTE BuffFile[8*512];
17 extern WORD FatCache[2][256];
18 BYTE CreateFile(char* filename, BYTE attribute)
19 {
20 1 struct _DIR dir,*pdir;
21 1 BYTE name[11];
22 1 struct _FILE file;
23 1 // WORD NewCluster;
24 1 BYTE Cache[512];
25 1 static char NewFileName[12];
26 1 char * p=NewFileName;
27 1 ////////////////////////////////////////////////////////////////////////
28 1 //*Get valid filen name
29 1 if(!CheckFileName(filename,p))
30 1 return FALSE;
31 1 //*核对该文件是否已经存在
32 1 if(LocateFile(filename, NULL)!=0xffffffff)
33 1 return FALSE;
34 1 strncpy(name, p, 11);
35 1 memset(&dir, 0, sizeof(dir));
36 1 memcpy(dir.Name, name, 11);
37 1 dir.Attr = attribute;
38 1 dir.CrtDate =0;
39 1 dir.CrtTime =0;
40 1 dir.CrtTimeTenth =0;
41 1 dir.FileSize =0;
42 1 DelayMs(5);
43 1 if(!LocateDir(&dir, &file))
44 1 return FALSE;
45 1 // NewCluster=SeekEmptyCluseter();
46 1 // if(NewCluster==0xffff)
47 1 // return FALSE;
48 1 DelayMs(15);
49 1 if(!Read(file.DirSectorNum,1,(BYTE *)Cache))
50 1 return FALSE;
51 1 pdir = (struct _DIR *)Cache;
52 1 pdir += file.DirIndex;
53 1 pdir->FstClusLO =0x00;//WordSwap(NewCluster);
54 1 pdir->FileSize=0;
55 1 if(!Write(file.DirSectorNum,1,Cache,TRUE))
C51 COMPILER V7.06 API 07/30/2008 08:56:14 PAGE 2
56 1 if(!Write(file.DirSectorNum,1,Cache,TRUE))
57 1 return FALSE;
58 1 return OpenFile(filename);
59 1 }
60 BYTE WriteFile(const char* buffer, UINT bytes)
61 {
62 1 BYTE *pCache;
63 1 WORD Cache[512];
64 1 UINT write_bytes =0,flag=0;
65 1 UINT max_write_bytes_in_sector;
66 1 WORD Cluster;
67 1 ////////////////////////////////////////////////////////////////////////
68 1 //如果打开的文件是一个空文件,则进入下面
69 1 //为其寻找一个开始的数据蔟,标记为0xffff
70 1 //数据直接填在该簇对应的扇区内
71 1 if(ApiFileControl.StartSectorNum<FatParameter.FirstDataSector)
72 1 {
73 2 Cluster=SeekEmptyCluster();
74 2 if(!Read(FatParameter.FirstFatSecNum+(2*Cluster/SimpleBpb.BytsPerSec),1,(BYTE *)Cache))
75 2 return FALSE;
76 2 Cache[Cluster%(SimpleBpb.BytsPerSec/2)]=0xffff;
77 2 if(!Write(FatParameter.FirstFatSecNum+(2*Cluster/SimpleBpb.BytsPerSec),1,(BYTE *)Cache,0))
78 2 return FALSE;
79 2 ApiFileControl.dir.FstClusLO=WordSwap(Cluster);
80 2 ApiFileControl.StartSectorNum=ApiFileControl.CurrentSectorNum=ClusterToSec(Cluster);
81 2 flag=1;
82 2 }
83 1 ///////////////////////////////////////////////////////////////////////////////
84 1 //
85 1 //如过前一个WriteFile函数的字节或者打开一个已经有为内容的文件的字节偏移刚好为
86 1 //SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus的整数倍,为了保持总的算法一致
87 1 //(都是先写好某簇为0xffff然后再写该簇的内容)则开始的时候必须先为其准备好
88 1 //一个未有内容的簇,标记好为0xffff,然后数据直接填在该簇对应的扇区内。
89 1 //
90 1 //////////////////////////////////////////////////////////////////////////////
91 1 if((ApiFileControl.SectorOffset==0)&&flag==0)
92 1 {
93 2 Cluster =LinkClusterList(SecToCluster(ApiFileControl.CurrentSectorNum));
94 2 if(Cluster == 0xffff)
95 2 return FALSE;
96 2 ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
97 2 }
98 1 for(;;)
99 1 {
100 2 pCache=BuffFile;//Cache;
101 2 pCache += ApiFileControl.SectorOffset;
102 2 if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - write_bytes))
103 2 max_write_bytes_in_sector = (bytes - write_bytes);
104 2 else
105 2 max_write_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);
106 2 memcpy(pCache, buffer, max_write_bytes_in_sector);
107 2 ApiFileControl.SectorOffset += max_write_bytes_in_sector;
108 2 if(ApiFileControl.SectorOffset>=SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus)
109 2 {
110 3 if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE*)BuffFile,FALSE))
111 3 if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE*)BuffFile,FALSE))
112 3 return FALSE;
113 3 if((write_bytes+max_write_bytes_in_sector)<bytes)
114 3 {
115 4 Cluster =LinkClusterList(SecToCluster(ApiFileControl.CurrentSectorNum));
116 4 if(Cluster == 0xffff)
117 4 return FALSE;
C51 COMPILER V7.06 API 07/30/2008 08:56:14 PAGE 3
118 4 ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
119 4 }
120 3
121 3 ApiFileControl.SectorOffset = 0;
122 3 }
123 2 write_bytes += max_write_bytes_in_sector;
124 2 buffer = (char*)buffer + max_write_bytes_in_sector;
125 2 ApiFileControl.dir.FileSize += max_write_bytes_in_sector;
126 2 if(write_bytes >= bytes)
127 2 return TRUE;
128 2 }//end for cycle
129 1 return FALSE;
130 1 }
131 BYTE AddWriteFile(const char* buffer, UINT bytes)
132 {
133 1 UINT write_bytes =0;
134 1 UINT max_write_bytes_in_sector;
135 1 ////////////////////////////////////////////////////////////////////////
136 1 // WORD Cluster;
137 1 // DWORD Sector;
138 1 BYTE *pCache;
139 1 // BYTE BuffFile[4*512];
140 1 /////////////////////////////////////////////////////////////////////////////
141 1 //
142 1 //****如果文件的大小不是SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus
143 1 //的整数倍,则进入下面的语句可以保证加写的东西精确到到字节
144 1 //
145 1 //////////////////////////////////////////////////////////////////////////////
146 1 if(0<ApiFileControl.SectorOffset<SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus)
147 1 {
148 2 pCache=BuffFile;
149 2 if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - write_bytes))
150 2 max_write_bytes_in_sector = (bytes - write_bytes);
151 2 else
152 2 max_write_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);
153 2 // Cluster=SecToCluster(ApiFileControl.CurrentSectorNum);
154 2 // Sector=ClusterToSec(Cluster);
155 2 if(!Read(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile))
156 2 return FALSE;
157 2 pCache += ApiFileControl.SectorOffset;
158 2 memcpy(pCache, buffer, max_write_bytes_in_sector);
159 2 if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile,TRUE))
160 2 if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile,TRUE))
161 2 return FALSE;
162 2 write_bytes += max_write_bytes_in_sector;
163 2 buffer = (char*)buffer + max_write_bytes_in_sector;
164 2 ApiFileControl.dir.FileSize += max_write_bytes_in_sector;
165 2 if((bytes-max_write_bytes_in_sector)>0)
166 2 ApiFileControl.SectorOffset=0;
167 2 }
168 1 if(!WriteFile(buffer,(bytes -write_bytes)))
169 1 return FALSE;
170 1 return TRUE;
171 1 }
172 BYTE OpenFile(const char* filename)
173 {
174 1 DWORD FileFirstSector;
175 1 WORD Cluster;
176 1 ////////////////////////////////////////////////////////////////////////
177 1 FileFirstSector=LocateFile(filename, &ApiFileControl);
178 1 if(FileFirstSector==0xffffffff)
179 1 return FALSE;
C51 COMPILER V7.06 API 07/30/2008 08:56:14 PAGE 4
180 1 ApiFileControl.StartSectorNum = FileFirstSector;
181 1 Cluster=WordSwap(ApiFileControl.dir.FstClusLO);
182 1 for(;;)
183 1 {
184 2 if((GetListCluster(Cluster)==0xffff)||(Cluster==0))
185 2 break;
186 2 Cluster=GetListCluster(Cluster);
187 2 }
188 1 //ApiFileControl.CurrentSectorNum为该簇对应的第一个扇区
189 1 ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
190 1 ApiFileControl.SectorOffset=(DWordSwap(ApiFileControl.dir.FileSize)%(SimpleBpb.BytsPerSec*SimpleBpb.SecPe
-rClus));
191 1 ApiFileControl.dir.FileSize=DWordSwap(ApiFileControl.dir.FileSize);
192 1 return TRUE;
193 1 }
194 BYTE ReadFile(void* buffer, UINT bytes)
195 {
196 1 BYTE*pCache;
197 1 UINT read_bytes =0;
198 1 UINT max_copy_bytes_in_sector;
199 1 WORD Cluster,i;
200 1 DWORD FileSize;
201 1 // BYTE buf[600];
202 1 // for(i=0;i<600;i++)
203 1 // buf[i]='a';
204 1 // memcpy(buffer,buf,400);
205 1 // return TRUE;
206 1 ////////////////////////////////////////////////////////////////////////
207 1 FileSize = ApiFileControl.dir.FileSize;
208 1 if(bytes>=FileSize)
209 1 bytes=FileSize;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -