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 + -
显示快捷键?