📄 file.s
字号:
.module file.c
.area text(rom, con, rel)
; i -> R20
.even
_FileInit::
xcall push_gset1
; /****************************************Copyright (c)**************************************************
; ** 广州周立功单片机发展有限公司
; ** 研 究 所
; ** 产品一部
; **
; ** http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文 件 名: file.c
; **创 建 人: 陈明计
; **最后修改日期: 2004年4月1日
; **描 述: 文件系统的文件基本操作程序
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; #define IN_FILE
;
; #include "SYS_Config.h"
; #include "SD_Drive.h"
; #include "fat.h"
; #include "time.h"
;
;
; extern INT32U _GetFDTInfo(char *FDTName,char *DirFileName);
; extern void strupr(INT8U *Path);
;
; static MY_FILE FileInfo[MAX_OPEN_FILES];/* 打开文件信息表 */
;
;
; /*********************************************************************************************************
; ** 函数名称: FileInit
; ** 功能描述: 初始化文件指针系统
; ** 输 入: 无
; ** 输 出: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FileInit(void)
; {
; HANDLE i ;
;
; for(i=0;i<MAX_OPEN_FILES;i++)
clr R20
xjmp L5
L2:
ldi R16,33
mov R17,R20
muls R16,R17
movw R30,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R30,R24
adc R31,R25
clr R2
std z+0,R2
L3:
inc R20
L5:
cpi R20,3
brlt L2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
; Rt -> R10
; fp -> R12,R13
; FileName -> R18,R19
; DirClus -> y+8
; Drive -> R16
.even
_FindOpenFile::
st -y,r19
st -y,r18
xcall push_gset4
ldd R18,y+12
ldd R19,y+13
; {
; FileInfo[i].Flags=0 ;
; }
; }
;
; /*********************************************************************************************************
; ** 函数名称: FindOpenFile
; ** 功能描述: 查找已打开的指定文件的文件句柄,内部使用
; ** 输 入: Drive:文件所在的逻辑盘号
; ** DirClus:文件所在目录的开始簇号
; ** FileName:内部文件名
; ** 输 出: 文件句柄,Not_Open_FILE为没有打开
; ** 全局变量: FileInfo
; ** 调用模块: _GetFDTInfo,GetDrive,FindFDTInfo,
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE FindOpenFile(INT8U Drive,INT32U DirClus,char FileName[11])
; {
; HANDLE Rt ;
; MY_FILE *fp ;
;
; fp=FileInfo ;
ldi R24,<_FileInfo
ldi R25,>_FileInfo
movw R12,R24
; for(Rt=0;Rt<MAX_OPEN_FILES;Rt++)
clr R10
xjmp L10
L7:
; {
; if(fp->Flags!=0)
movw R30,R12
ldd R2,z+0
tst R2
brne X0
xjmp L11
X0:
; if(fp->Drive==Drive)
ldd R2,z+12
cp R2,R16
breq X1
xjmp L13
X1:
; if(fp->DirClus==DirClus)
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
movw R30,R12
ldd R6,z+13
ldd R7,z+14
ldd R8,z+15
ldd R9,z+16
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
breq X2
xjmp L15
X2:
; if(fp->Name[0]==FileName[0])
movw R30,R18
ldd R2,z+0
movw R30,R12
ldd R3,z+1
cp R3,R2
breq X3
xjmp L17
X3:
; if(fp->Name[1]==FileName[1])
movw R30,R18
ldd R2,z+1
movw R30,R12
ldd R3,z+2
cp R3,R2
breq X4
xjmp L19
X4:
; if(fp->Name[2]==FileName[2])
movw R30,R18
ldd R2,z+2
movw R30,R12
ldd R3,z+3
cp R3,R2
breq X5
xjmp L21
X5:
; if(fp->Name[3]==FileName[3])
movw R30,R18
ldd R2,z+3
movw R30,R12
ldd R3,z+4
cp R3,R2
breq X6
xjmp L23
X6:
; if(fp->Name[4]==FileName[4])
movw R30,R18
ldd R2,z+4
movw R30,R12
ldd R3,z+5
cp R3,R2
breq X7
xjmp L25
X7:
; if(fp->Name[5]==FileName[5])
movw R30,R18
ldd R2,z+5
movw R30,R12
ldd R3,z+6
cp R3,R2
breq X8
xjmp L27
X8:
; if(fp->Name[6]==FileName[6])
movw R30,R18
ldd R2,z+6
movw R30,R12
ldd R3,z+7
cp R3,R2
breq X9
xjmp L29
X9:
; if(fp->Name[7]==FileName[7])
movw R30,R18
ldd R2,z+7
movw R30,R12
ldd R3,z+8
cp R3,R2
brne L31
; if(fp->Name[8]==FileName[8])
movw R30,R18
ldd R2,z+8
movw R30,R12
ldd R3,z+9
cp R3,R2
brne L33
; if(fp->Name[9]==FileName[9])
movw R30,R18
ldd R2,z+9
movw R30,R12
ldd R3,z+10
cp R3,R2
brne L35
; if(fp->Name[10]==FileName[10])
movw R30,R18
ldd R2,z+10
movw R30,R12
ldd R3,z+11
cp R3,R2
brne L37
; {
; break ;
xjmp L9
L37:
L35:
L33:
L31:
L29:
L27:
L25:
L23:
L21:
L19:
L17:
L15:
L13:
L11:
movw R24,R12
adiw R24,33
movw R12,R24
L8:
inc R10
L10:
mov R24,R10
cpi R24,3
brge X10
xjmp L7
X10:
L9:
; }
; fp++;
; }
; if(Rt>=MAX_OPEN_FILES)
mov R24,R10
cpi R24,3
brlt L39
; {
; Rt=Not_Open_FILE ;
ldi R24,255
mov R10,R24
; }
L39:
; return Rt ;
mov R16,R10
L6:
xcall pop_gset4
adiw R28,2
.dbline 0 ; func end
ret
; ClusIndex1 -> y+54
; temp -> y+22
; Drive -> R12
; DirName -> y+10
; ClusIndex -> y+6
; Rt -> R10
; DirFileName -> R12,R13
.even
_RemoveFile::
xcall push_gset4
movw R12,R16
sbiw R28,58
; }
;
; /*********************************************************************************************************
; ** 函数名称: RemoveFile
; ** 功能描述: 删除文件
; ** 输 入: DirFileName:用户使用的文件名
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: strupr,_GetFDTInfo,GetDrive,FindFDTInfo,FATDelClusChain,DelFDT
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U RemoveFile(char *DirFileName)
; {
; INT32U ClusIndex,ClusIndex1 ;
; INT8U Drive,Rt ;
; char DirName[12];
; FDT temp ;
;
; strupr(DirFileName);
movw R16,R12
xcall _strupr
; /* 变为大写 */
; ClusIndex=_GetFDTInfo(DirName,DirFileName);
movw R18,R12
movw R16,R28
subi R16,246 ; offset = 10
sbci R17,255
xcall __GetFDTInfo
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
; Rt=PATH_NOT_FIND ;
ldi R24,14
mov R10,R24
; if(ClusIndex!=BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne X11
xjmp L42
X11:
; {
; Drive=GetDrive(DirFileName);
movw R16,R12
xcall _GetDrive
mov R12,R16
; /* 获取文件所在逻辑盘号 */
; Rt=FindFDTInfo(&temp,Drive,ClusIndex,DirName);
movw R24,R28
adiw R24,10
std y+5,R25
std y+4,R24
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
mov R18,R12
movw R16,R28
subi R16,234 ; offset = 22
sbci R17,255
xcall _FindFDTInfo
mov R10,R16
; if(Rt==RETURN_OK)
tst R16
breq X12
xjmp L44
X12:
; {
; Rt=NOT_FIND_FILE ;
ldi R24,19
mov R10,R24
; /* 是文件才删除 */
; if((temp.Attr&ATTR_DIRECTORY)==0)
ldd R2,y+33
sbrc R2,4
rjmp L46
; {
; Rt=FILE_LOCK ;
ldi R24,18
mov R10,R24
; if(FindOpenFile(Drive,ClusIndex,DirName)<MAX_OPEN_FILES)
movw R24,R28
adiw R24,10
std y+3,R25
std y+2,R24
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R12
xcall _FindOpenFile
cpi R16,3
brlt X13
xjmp L49
X13:
; {
; /* 文件没有打开才删除 */
; ClusIndex1=temp.FstClusLO+((INT32U)(temp.FstClusHI)<<16);
ldd R2,y+42
ldd R3,y+43
clr R4
clr R5
movw R4,R2
clr R2
clr R3
ldd R6,y+48
ldd R7,y+49
clr R8
clr R9
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+54,R6
std z+55,R7
std z+56,R8
std z+57,R9
; FATDelClusChain(Drive,ClusIndex1);
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R12
xcall _FATDelClusChain
; Rt=DelFDT(Drive,ClusIndex,DirName);
movw R24,R28
adiw R24,10
std y+3,R25
std y+2,R24
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R12
xcall _DelFDT
mov R10,R16
; }
L49:
; }
L46:
; }
L44:
; }
L42:
; return Rt ;
mov R16,R10
L41:
adiw R28,58
xcall pop_gset4
.dbline 0 ; func end
ret
; Rt -> R10
; fp -> R12,R13
; FileName -> R18,R19
; DirClus -> y+8
; Drive -> R16
.even
_FindOpenFileW::
st -y,r19
st -y,r18
xcall push_gset4
ldd R18,y+12
ldd R19,y+13
; }
;
; /*********************************************************************************************************
; ** 函数名称: FindOpenFileW
; ** 功能描述: 查找以读写方式打开的指定文件的文件句柄,内部使用
; ** 输 入: Drive:文件所在的逻辑盘号
; ** DirClus:文件所在目录的开始簇号
; ** FileName:内部文件名
; ** 输 出: 文件句柄,Not_Open_FILE为没有打开
; ** 全局变量: FileInfo
; ** 调用模块: _GetFDTInfo,GetDrive,FindFDTInfo,
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE FindOpenFileW(INT8U Drive,INT32U DirClus,char FileName[11])
; {
; HANDLE Rt ;
; MY_FILE *fp ;
;
; fp=FileInfo ;
ldi R24,<_FileInfo
ldi R25,>_FileInfo
movw R12,R24
; for(Rt=0;Rt<MAX_OPEN_FILES;Rt++)
clr R10
xjmp L57
L54:
; {
; if((fp->Flags&FILE_FLAGS_WRITE)!=0)
movw R30,R12
ldd R2,z+0
sbrs R2,1
rjmp L58
; if(fp->Drive==Drive)
ldd R2,z+12
cp R2,R16
breq X14
xjmp L60
X14:
; if(fp->DirClus==DirClus)
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
movw R30,R12
ldd R6,z+13
ldd R7,z+14
ldd R8,z+15
ldd R9,z+16
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
breq X15
xjmp L62
X15:
; if(fp->Name[0]==FileName[0])
movw R30,R18
ldd R2,z+0
movw R30,R12
ldd R3,z+1
cp R3,R2
breq X16
xjmp L64
X16:
; if(fp->Name[1]==FileName[1])
movw R30,R18
ldd R2,z+1
movw R30,R12
ldd R3,z+2
cp R3,R2
breq X17
xjmp L66
X17:
; if(fp->Name[2]==FileName[2])
movw R30,R18
ldd R2,z+2
movw R30,R12
ldd R3,z+3
cp R3,R2
breq X18
xjmp L68
X18:
; if(fp->Name[3]==FileName[3])
movw R30,R18
ldd R2,z+3
movw R30,R12
ldd R3,z+4
cp R3,R2
breq X19
xjmp L70
X19:
; if(fp->Name[4]==FileName[4])
movw R30,R18
ldd R2,z+4
movw R30,R12
ldd R3,z+5
cp R3,R2
breq X20
xjmp L72
X20:
; if(fp->Name[5]==FileName[5])
movw R30,R18
ldd R2,z+5
movw R30,R12
ldd R3,z+6
cp R3,R2
breq X21
xjmp L74
X21:
; if(fp->Name[6]==FileName[6])
movw R30,R18
ldd R2,z+6
movw R30,R12
ldd R3,z+7
cp R3,R2
breq X22
xjmp L76
X22:
; if(fp->Name[7]==FileName[7])
movw R30,R18
ldd R2,z+7
movw R30,R12
ldd R3,z+8
cp R3,R2
brne L78
; if(fp->Name[8]==FileName[8])
movw R30,R18
ldd R2,z+8
movw R30,R12
ldd R3,z+9
cp R3,R2
brne L80
; if(fp->Name[9]==FileName[9])
movw R30,R18
ldd R2,z+9
movw R30,R12
ldd R3,z+10
cp R3,R2
brne L82
; if(fp->Name[10]==FileName[10])
movw R30,R18
ldd R2,z+10
movw R30,R12
ldd R3,z+11
cp R3,R2
brne L84
; {
; break ;
xjmp L56
L84:
L82:
L80:
L78:
L76:
L74:
L72:
L70:
L68:
L66:
L64:
L62:
L60:
L58:
movw R24,R12
adiw R24,33
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -