📄 dir.s
字号:
.module dir.c
.area text(rom, con, rel)
; i -> R20
; temp -> R22
; Str -> R18,R19
; FDTName -> R16,R17
.even
_StrToFDTName::
xcall push_gset2
; /****************************************Copyright (c)**************************************************
; ** 广州周立功单片机发展有限公司
; ** 研 究 所
; ** ARM开发组
; **
; ** http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文 件 名: dir.c
; **创 建 人: 陈明计
; **最后修改日期: 2003年9月9日
; **描 述: FAT文件系统的目录基本操作程序
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创 建 人: 陈明计
; ** 版 本: V1.0
; ** 日 期: 2003年9月8日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修 改人: 陈明计
; ** 日 期: 2004年4月10日
; ** 描 述: 增加注释
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; #define IN_DIR
;
; #include "SYS_Config.h"
; #include "SD_Drive.h"
; #include "fat.h"
; #include "time.h"
;
; static INT8U CurrentDrive ;
;
; char *strupr(char *Str);
;
; INT32U GetDirClusIndex(char *Path);
;
; /*********************************************************************************************************
; ** 函数名称: StrToFDTName
; ** 功能描述: 用户文件\目录名转换为系统名
; ** 输 入: Str:用户名称
; ** 输 出: 驱动器号
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U StrToFDTName(char *FDTName,char *Str)
; {
; INT8U i,temp ;
;
; /* 文件\目录名是否有效 */
; if(Str[0]==0x20||Str[0]==0)
movw R30,R18
ldd R2,z+0
clr R3
mov R24,R2
cpi R24,32
breq L4
tst R24
brne L2
L4:
; {
; return FILE_NAME_ERR ;
ldi R16,16
xjmp L1
L2:
; }
;
; for(i=11;i!=0;i--)
ldi R20,11
xjmp L8
L5:
ldi R24,32
movw R30,R16
st Z+,R24
movw R16,R30
L6:
dec R20
L8:
tst R20
brne L5
; {
; *FDTName++=0x20 ;//0x20表示为空
; }
; FDTName-=11 ;
subi R16,11
sbci R17,0
;
; /* 是否为"." */
; if(Str[0]=='.')
movw R30,R18
ldd R24,z+0
cpi R24,46
brne L9
; if(Str[1]==0||Str[1]=='\\')
ldd R2,z+1
clr R3
tst R2
breq L13
mov R24,R2
cpi R24,92
brne L11
L13:
; {
; FDTName[0]='.' ;
ldi R24,46
movw R30,R16
std z+0,R24
; return RETURN_OK ;
clr R16
xjmp L1
L11:
L9:
; }
;
; /* 是否为".." */
; if(Str[0]=='.')
movw R30,R18
ldd R24,z+0
cpi R24,46
brne L14
; if(Str[1]=='.')
ldd R24,z+1
cpi R24,46
brne L16
; if(Str[2]==0||Str[2]=='\\')
movw R30,R18
ldd R2,z+2
clr R3
tst R2
breq L20
mov R24,R2
cpi R24,92
brne L18
L20:
; {
; FDTName[0]='.' ;
ldi R24,46
movw R30,R16
std z+0,R24
; FDTName[1]='.' ;
std z+1,R24
; return RETURN_OK ;
clr R16
xjmp L1
L18:
L16:
L14:
; }
;
; /* 获取主文件/目录名 */
; for(i=8;i!=0;i--)
ldi R20,8
xjmp L24
L21:
; {
; temp=*Str ;
movw R30,R18
ldd R22,z+0
; if(temp==0||temp=='\\')
tst R22
breq L27
cpi R22,92
brne L25
L27:
; {
; break ;
xjmp L23
L25:
; }
; Str++;
subi R18,255 ; offset = 1
sbci R19,255
; if(temp=='.')
cpi R22,46
brne L28
; {
; break ;
xjmp L23
L28:
movw R30,R16
st Z+,R22
movw R16,R30
L22:
dec R20
L24:
tst R20
brne L21
L23:
; }
; *FDTName++=temp ;
; }
; FDTName+=i ;
mov R2,R20
clr R3
add R16,R2
adc R17,R3
;
; /* 获取文件\目录扩展名 */
; for(i=3;i!=0;i--)
ldi R20,3
xjmp L33
L30:
; {
; temp=*Str ;
movw R30,R18
ldd R22,z+0
; if(temp==0||temp=='\\')
tst R22
breq L36
cpi R22,92
brne L34
L36:
; {
; break ;
xjmp L32
L34:
subi R18,255 ; offset = 1
sbci R19,255
movw R30,R16
st Z+,R22
movw R16,R30
L31:
dec R20
L33:
tst R20
brne L30
L32:
; }
; Str++;
; *FDTName++=temp ;
; }
; return RETURN_OK ;
clr R16
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
; i -> R10
; Rt -> y+0
; temp -> R12,R13
; DirFileName -> R14,R15
; FDTName -> y+14
.even
__GetFDTInfo::
xcall push_arg4
xcall push_gset5
movw R14,R18
sbiw R28,4
; }
;
; /*********************************************************************************************************
; ** 函数名称: _GetFDTInfo
; ** 功能描述: 获取FDT所在的目录的开始簇号及系统内名称,内部使用
; ** 输 入: DirFileName:用户使用的FDT名(包括路径)
; ** FDTName:用于返回系统使用的FDT名(不包括路径)
; ** 输 出: FDT所在的目录的开始簇号,BAD_CLUS表示找不到路径
; ** 全局变量: 无
; ** 调用模块: GetDirClusIndex,StrToFDTName
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U _GetFDTInfo(char *FDTName,char *DirFileName)
; {
; INT32U Rt ;
; char *temp ;
; INT8U i ;
;
; temp=DirFileName ;/* 获取字符串结束位置 */
movw R12,R14
xjmp L39
L38:
movw R24,R12
adiw R24,1
movw R12,R24
L39:
; while(*temp!=0)
movw R30,R12
ldd R2,z+0
tst R2
brne L38
; {
; temp++;
; }
; temp--;
movw R24,R30
sbiw R24,1
movw R12,R24
;
; if(*temp=='\\')/* 最后字符为\不是有效文件/目录名 */
movw R30,R24
ldd R24,z+0
cpi R24,92
brne L41
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L37
L41:
; }
;
; /* 获取目录开始簇号 */
; Rt=BAD_CLUS ;
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
xjmp L44
L43:
; while(1)
; {
; if(*temp=='\\'||*temp==':')
movw R30,R12
ldd R2,z+0
clr R3
mov R24,R2
cpi R24,92
breq L48
cpi R24,58
brne L46
L48:
; {
; /* 找到目录分割符号'\' 或 */
; /* 找到逻辑盘分割符号':',表明是指定逻辑盘当前目录 */
; temp++;
movw R24,R12
adiw R24,1
movw R12,R24
; i=*temp ;
movw R30,R24
ldd R10,z+0
; *temp=0 ;
clr R2
std z+0,R2
; Rt=GetDirClusIndex(DirFileName);
movw R16,R14
xcall _GetDirClusIndex
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
; *temp=i ;
movw R30,R12
std z+0,R10
; break ;
xjmp L45
L46:
; }
; if(temp==DirFileName)
cp R12,R14
cpc R13,R15
brne L49
; {
; /* 只有文件\目录名,表明是当前逻辑盘当前目录 */
; Rt=GetDirClusIndex(".");
ldi R16,<L51
ldi R17,>L51
xcall _GetDirClusIndex
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
; break ;
xjmp L45
L49:
movw R24,R12
sbiw R24,1
movw R12,R24
L44:
xjmp L43
L45:
; }
; temp--;
; }
; /* 获取系统内文件\目录名 */
; if(StrToFDTName(FDTName,temp)!=RETURN_OK)
movw R18,R12
ldd R16,y+14
ldd R17,y+15
xcall _StrToFDTName
tst R16
breq L52
; {
; Rt=BAD_CLUS ;
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; }
L52:
; return Rt ;
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
L37:
adiw R28,4
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; Drive -> R20
; Path -> R22,R23
.even
_GetDrive::
xcall push_gset2
movw R22,R16
; }
;
; /*********************************************************************************************************
; ** 函数名称: GetDrive
; ** 功能描述: 获取指定目录的驱动器
; ** 输 入: Path:路径名
; ** 输 出: 驱动器号
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U GetDrive(char *Path)
; {
; INT8U Drive ;
;
; Drive=CurrentDrive ;
lds R20,_CurrentDrive
; if(Path!=NULL)
cpi R22,0
cpc R22,R23
breq L55
X0:
; {
; strupr(Path);/* 变为大写 */
movw R16,R22
xcall _strupr
;
; if(Path[1]==':')
movw R30,R22
ldd R24,z+1
cpi R24,58
brne L57
; {
; Drive=Path[0]-'A' ;
movw R30,R22
ldd R20,z+0
subi R20,65
; }
L57:
; }
L55:
; return Drive ;
mov R16,R20
L54:
xcall pop_gset2
.dbline 0 ; func end
ret
; Disk -> R10,R11
; Rt -> R20
; Drive -> R22,R23
.even
_ChangeDrive::
xcall push_gset3
movw R22,R16
; }
;
; /*********************************************************************************************************
; ** 函数名称: ChangeDrive
; ** 功能描述: 改变当前逻辑盘
; ** 输 入: Drive:逻辑盘符字符串
; ** 输 出: RETURN_OK:成功
; ** NOT_FIND_DISK:逻辑盘不存在
; ** PARAMETER_ERR:非法参数
; ** 全局变量: 无
; ** 调用模块: strupr,GetDiskInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U ChangeDrive(char *Drive)
; {
; INT8U Rt ;
; Disk_Info *Disk ;
;
; Rt=PARAMETER_ERR ;
ldi R20,255
; strupr(Drive);/* 变为大写 */
movw R16,R22
xcall _strupr
;
; if(Drive[1]==':')
movw R30,R22
ldd R24,z+1
cpi R24,58
brne L60
; {
; Rt=NOT_FIND_DISK ;
ldi R20,1
; Disk=GetDiskInfo(Drive[0]-'A');
movw R30,R22
ldd R16,z+0
subi R16,65
xcall _GetDiskInfo
movw R10,R16
; if(Disk!=NULL)
cpi R16,0
cpc R16,R17
breq L62
X1:
; {
; CurrentDrive=Drive[0]-'A' ;
movw R30,R22
ldd R24,z+0
subi R24,65
sts _CurrentDrive,R24
; Rt=RETURN_OK ;
clr R20
; }
L62:
; }
L60:
; return Rt ;
mov R16,R20
L59:
xcall pop_gset3
.dbline 0 ; func end
ret
; Disk -> R10,R11
; Drive -> R12
; DirName -> y+42
; temp -> y+10
; Rt -> y+6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -