⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dir.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
	.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 + -