dir.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,634 行 · 第 1/5 页
LIS
1,634 行
.module dir.c
.area text(rom, con, rel)
; i -> R20
; temp -> R22
; Str -> R18,R19
; FDTName -> R16,R17
.even
0000 _StrToFDTName::
0000 0E940000 xcall push_gset2
0004 ; /****************************************Copyright (c)**************************************************
0004 ; ** 广州周立功单片机发展有限公司
0004 ; ** 研 究 所
0004 ; ** ARM开发组
0004 ; **
0004 ; ** http://www.zlgmcu.com
0004 ; **
0004 ; **--------------文件信息--------------------------------------------------------------------------------
0004 ; **文 件 名: dir.c
0004 ; **创 建 人: 陈明计
0004 ; **最后修改日期: 2003年9月9日
0004 ; **描 述: FAT文件系统的目录基本操作程序
0004 ; **
0004 ; **--------------历史版本信息----------------------------------------------------------------------------
0004 ; ** 创 建 人: 陈明计
0004 ; ** 版 本: V1.0
0004 ; ** 日 期: 2003年9月8日
0004 ; ** 描 述: 原始版本
0004 ; **
0004 ; **--------------当前版本修订------------------------------------------------------------------------------
0004 ; ** 修 改人: 陈明计
0004 ; ** 日 期: 2004年4月10日
0004 ; ** 描 述: 增加注释
0004 ; **
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; ********************************************************************************************************/
0004 ; #define IN_DIR
0004 ;
0004 ; #include "SYS_Config.h"
0004 ; #include "SD_Drive.h"
0004 ; #include "fat.h"
0004 ; #include "time.h"
0004 ;
0004 ; static INT8U CurrentDrive ;
0004 ;
0004 ; char *strupr(char *Str);
0004 ;
0004 ; INT32U GetDirClusIndex(char *Path);
0004 ;
0004 ; /*********************************************************************************************************
0004 ; ** 函数名称: StrToFDTName
0004 ; ** 功能描述: 用户文件\目录名转换为系统名
0004 ; ** 输 入: Str:用户名称
0004 ; ** 输 出: 驱动器号
0004 ; ** 全局变量: 无
0004 ; ** 调用模块: 无
0004 ; ** 作 者: 陈明计
0004 ; ** 日 期: 2003年9月8日
0004 ; **-------------------------------------------------------------------------------------------------------
0004 ; ** 修 改 人: 陈明计
0004 ; ** 日 期: 2004年4月10日
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; ********************************************************************************************************/
0004 ; INT8U StrToFDTName(char *FDTName,char *Str)
0004 ; {
0004 ; INT8U i,temp ;
0004 ;
0004 ; /* 文件\目录名是否有效 */
0004 ; if(Str[0]==0x20||Str[0]==0)
0004 F901 movw R30,R18
0006 2080 ldd R2,z+0
0008 3324 clr R3
000A 822D mov R24,R2
000C 8032 cpi R24,32
000E 11F0 breq L4
0010 8823 tst R24
0012 11F4 brne L2
0014 L4:
0014 ; {
0014 ; return FILE_NAME_ERR ;
0014 00E1 ldi R16,16
0016 5AC0 xjmp L1
0018 L2:
0018 ; }
0018 ;
0018 ; for(i=11;i!=0;i--)
0018 4BE0 ldi R20,11
001A 05C0 xjmp L8
001C L5:
001C 80E2 ldi R24,32
001E F801 movw R30,R16
0020 8193 st Z+,R24
0022 8F01 movw R16,R30
0024 L6:
0024 4A95 dec R20
0026 L8:
0026 4423 tst R20
0028 C9F7 brne L5
002A ; {
002A ; *FDTName++=0x20 ;//0x20表示为空
002A ; }
002A ; FDTName-=11 ;
002A 0B50 subi R16,11
002C 1040 sbci R17,0
002E ;
002E ; /* 是否为"." */
002E ; if(Str[0]=='.')
002E F901 movw R30,R18
0030 8081 ldd R24,z+0
0032 8E32 cpi R24,46
0034 61F4 brne L9
0036 ; if(Str[1]==0||Str[1]=='\\')
0036 2180 ldd R2,z+1
0038 3324 clr R3
003A 2220 tst R2
003C 19F0 breq L13
003E 822D mov R24,R2
0040 8C35 cpi R24,92
0042 29F4 brne L11
0044 L13:
0044 ; {
0044 ; FDTName[0]='.' ;
0044 8EE2 ldi R24,46
0046 F801 movw R30,R16
0048 8083 std z+0,R24
004A ; return RETURN_OK ;
004A 0027 clr R16
004C 3FC0 xjmp L1
004E L11:
004E L9:
004E ; }
004E ;
004E ; /* 是否为".." */
004E ; if(Str[0]=='.')
004E F901 movw R30,R18
0050 8081 ldd R24,z+0
0052 8E32 cpi R24,46
0054 89F4 brne L14
0056 ; if(Str[1]=='.')
0056 8181 ldd R24,z+1
0058 8E32 cpi R24,46
005A 71F4 brne L16
005C ; if(Str[2]==0||Str[2]=='\\')
005C F901 movw R30,R18
005E 2280 ldd R2,z+2
0060 3324 clr R3
0062 2220 tst R2
0064 19F0 breq L20
0066 822D mov R24,R2
0068 8C35 cpi R24,92
006A 31F4 brne L18
006C L20:
006C ; {
006C ; FDTName[0]='.' ;
006C 8EE2 ldi R24,46
006E F801 movw R30,R16
0070 8083 std z+0,R24
0072 ; FDTName[1]='.' ;
0072 8183 std z+1,R24
0074 ; return RETURN_OK ;
0074 0027 clr R16
0076 2AC0 xjmp L1
0078 L18:
0078 L16:
0078 L14:
0078 ; }
0078 ;
0078 ; /* 获取主文件/目录名 */
0078 ; for(i=8;i!=0;i--)
0078 48E0 ldi R20,8
007A 10C0 xjmp L24
007C L21:
007C ; {
007C ; temp=*Str ;
007C F901 movw R30,R18
007E 6081 ldd R22,z+0
0080 ; if(temp==0||temp=='\\')
0080 6623 tst R22
0082 11F0 breq L27
0084 6C35 cpi R22,92
0086 09F4 brne L25
0088 L27:
0088 ; {
0088 ; break ;
0088 0BC0 xjmp L23
008A L25:
008A ; }
008A ; Str++;
008A 2F5F subi R18,255 ; offset = 1
008C 3F4F sbci R19,255
008E ; if(temp=='.')
008E 6E32 cpi R22,46
0090 09F4 brne L28
0092 ; {
0092 ; break ;
0092 06C0 xjmp L23
0094 L28:
0094 F801 movw R30,R16
0096 6193 st Z+,R22
0098 8F01 movw R16,R30
009A L22:
009A 4A95 dec R20
009C L24:
009C 4423 tst R20
009E 71F7 brne L21
00A0 L23:
00A0 ; }
00A0 ; *FDTName++=temp ;
00A0 ; }
00A0 ; FDTName+=i ;
00A0 242E mov R2,R20
00A2 3324 clr R3
00A4 020D add R16,R2
00A6 131D adc R17,R3
00A8 ;
00A8 ; /* 获取文件\目录扩展名 */
00A8 ; for(i=3;i!=0;i--)
00A8 43E0 ldi R20,3
00AA 0DC0 xjmp L33
00AC L30:
00AC ; {
00AC ; temp=*Str ;
00AC F901 movw R30,R18
00AE 6081 ldd R22,z+0
00B0 ; if(temp==0||temp=='\\')
00B0 6623 tst R22
00B2 11F0 breq L36
00B4 6C35 cpi R22,92
00B6 09F4 brne L34
00B8 L36:
00B8 ; {
00B8 ; break ;
00B8 08C0 xjmp L32
00BA L34:
00BA 2F5F subi R18,255 ; offset = 1
00BC 3F4F sbci R19,255
00BE F801 movw R30,R16
00C0 6193 st Z+,R22
00C2 8F01 movw R16,R30
00C4 L31:
00C4 4A95 dec R20
00C6 L33:
00C6 4423 tst R20
00C8 89F7 brne L30
00CA L32:
00CA ; }
00CA ; Str++;
00CA ; *FDTName++=temp ;
00CA ; }
00CA ; return RETURN_OK ;
00CA 0027 clr R16
00CC L1:
00CC 0E940000 xcall pop_gset2
00D0 .dbline 0 ; func end
00D0 0895 ret
00D2 ; i -> R10
00D2 ; Rt -> y+0
00D2 ; temp -> R12,R13
00D2 ; DirFileName -> R14,R15
00D2 ; FDTName -> y+14
.even
00D2 __GetFDTInfo::
00D2 0E940000 xcall push_arg4
00D6 0E940000 xcall push_gset5
00DA 7901 movw R14,R18
00DC 2497 sbiw R28,4
00DE ; }
00DE ;
00DE ; /*********************************************************************************************************
00DE ; ** 函数名称: _GetFDTInfo
00DE ; ** 功能描述: 获取FDT所在的目录的开始簇号及系统内名称,内部使用
00DE ; ** 输 入: DirFileName:用户使用的FDT名(包括路径)
00DE ; ** FDTName:用于返回系统使用的FDT名(不包括路径)
00DE ; ** 输 出: FDT所在的目录的开始簇号,BAD_CLUS表示找不到路径
00DE ; ** 全局变量: 无
00DE ; ** 调用模块: GetDirClusIndex,StrToFDTName
00DE ; ** 作 者: 陈明计
00DE ; ** 日 期: 2003年6月5日
00DE ; **-------------------------------------------------------------------------------------------------------
00DE ; ** 修 改 人: 陈明计
00DE ; ** 日 期: 2004年4月10日
00DE ; **------------------------------------------------------------------------------------------------------
00DE ; ********************************************************************************************************/
00DE ; INT32U _GetFDTInfo(char *FDTName,char *DirFileName)
00DE ; {
00DE ; INT32U Rt ;
00DE ; char *temp ;
00DE ; INT8U i ;
00DE ;
00DE ; temp=DirFileName ;/* 获取字符串结束位置 */
00DE 6701 movw R12,R14
00E0 03C0 xjmp L39
00E2 L38:
00E2 C601 movw R24,R12
00E4 0196 adiw R24,1
00E6 6C01 movw R12,R24
00E8 L39:
00E8 ; while(*temp!=0)
00E8 F601 movw R30,R12
00EA 2080 ldd R2,z+0
00EC 2220 tst R2
00EE C9F7 brne L38
00F0 ; {
00F0 ; temp++;
00F0 ; }
00F0 ; temp--;
00F0 CF01 movw R24,R30
00F2 0197 sbiw R24,1
00F4 6C01 movw R12,R24
00F6 ;
00F6 ; if(*temp=='\\')/* 最后字符为\不是有效文件/目录名 */
00F6 FC01 movw R30,R24
00F8 8081 ldd R24,z+0
00FA 8C35 cpi R24,92
00FC 29F4 brne L41
00FE ; {
00FE ; return BAD_CLUS ;
00FE 07EF ldi R16,247
0100 1FEF ldi R17,255
0102 2FEF ldi R18,255
0104 3FE0 ldi R19,15
0106 47C0 xjmp L37
0108 L41:
0108 ; }
0108 ;
0108 ; /* 获取目录开始簇号 */
0108 ; Rt=BAD_CLUS ;
0108 47EF ldi R20,247
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?