dir.lis

来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,634 行 · 第 1/5 页

LIS
1,634
字号
 010A 5FEF              ldi R21,255
 010C 6FEF              ldi R22,255
 010E 7FE0              ldi R23,15
 0110 FE01              movw R30,R28
 0112 4083              std z+0,R20
 0114 5183              std z+1,R21
 0116 6283              std z+2,R22
 0118 7383              std z+3,R23
 011A 28C0              xjmp L44
 011C           L43:
 011C           ;     while(1)
 011C           ;     {
 011C           ;         if(*temp=='\\'||*temp==':')
 011C F601              movw R30,R12
 011E 2080              ldd R2,z+0
 0120 3324              clr R3
 0122 822D              mov R24,R2
 0124 8C35              cpi R24,92
 0126 11F0              breq L48
 0128 8A33              cpi R24,58
 012A 89F4              brne L46
 012C           L48:
 012C           ;         {
 012C           ;             /* 找到目录分割符号'\' 或 */
 012C           ;             /* 找到逻辑盘分割符号':',表明是指定逻辑盘当前目录 */
 012C           ;             temp++;
 012C C601              movw R24,R12
 012E 0196              adiw R24,1
 0130 6C01              movw R12,R24
 0132           ;             i=*temp ;
 0132 FC01              movw R30,R24
 0134 A080              ldd R10,z+0
 0136           ;             *temp=0 ;
 0136 2224              clr R2
 0138 2082              std z+0,R2
 013A           ;             Rt=GetDirClusIndex(DirFileName);
 013A 8701              movw R16,R14
 013C 64D0              xcall _GetDirClusIndex
 013E FE01              movw R30,R28
 0140 0083              std z+0,R16
 0142 1183              std z+1,R17
 0144 2283              std z+2,R18
 0146 3383              std z+3,R19
 0148           ;             *temp=i ;
 0148 F601              movw R30,R12
 014A A082              std z+0,R10
 014C           ;             break ;
 014C 10C0              xjmp L45
 014E           L46:
 014E           ;         }
 014E           ;         if(temp==DirFileName)
 014E CE14              cp R12,R14
 0150 DF04              cpc R13,R15
 0152 49F4              brne L49
 0154           ;         {
 0154           ;             /* 只有文件\目录名,表明是当前逻辑盘当前目录 */
 0154           ;             Rt=GetDirClusIndex(".");
 0154 00E0              ldi R16,<L51
 0156 10E0              ldi R17,>L51
 0158 56D0              xcall _GetDirClusIndex
 015A FE01              movw R30,R28
 015C 0083              std z+0,R16
 015E 1183              std z+1,R17
 0160 2283              std z+2,R18
 0162 3383              std z+3,R19
 0164           ;             break ;
 0164 04C0              xjmp L45
 0166           L49:
 0166 C601              movw R24,R12
 0168 0197              sbiw R24,1
 016A 6C01              movw R12,R24
 016C           L44:
 016C D7CF              xjmp L43
 016E           L45:
 016E           ;         }
 016E           ;         temp--;
 016E           ;     }
 016E           ;     /* 获取系统内文件\目录名 */
 016E           ;     if(StrToFDTName(FDTName,temp)!=RETURN_OK)
 016E 9601              movw R18,R12
 0170 0E85              ldd R16,y+14
 0172 1F85              ldd R17,y+15
 0174 45DF              xcall _StrToFDTName
 0176 0023              tst R16
 0178 49F0              breq L52
 017A           ;     {
 017A           ;         Rt=BAD_CLUS ;
 017A 47EF              ldi R20,247
 017C 5FEF              ldi R21,255
 017E 6FEF              ldi R22,255
 0180 7FE0              ldi R23,15
 0182 FE01              movw R30,R28
 0184 4083              std z+0,R20
 0186 5183              std z+1,R21
 0188 6283              std z+2,R22
 018A 7383              std z+3,R23
 018C           ;     }
 018C           L52:
 018C           ;     return Rt ;
 018C FE01              movw R30,R28
 018E 0081              ldd R16,z+0
 0190 1181              ldd R17,z+1
 0192 2281              ldd R18,z+2
 0194 3381              ldd R19,z+3
 0196           L37:
 0196 2496              adiw R28,4
 0198 0E940000          xcall pop_gset5
 019C 2496              adiw R28,4
 019E                   .dbline 0 ; func end
 019E 0895              ret
 01A0           ;          Drive -> R20
 01A0           ;           Path -> R22,R23
                        .even
 01A0           _GetDrive::
 01A0 0E940000          xcall push_gset2
 01A4 B801              movw R22,R16
 01A6           ; }
 01A6           ; 
 01A6           ; /*********************************************************************************************************
 01A6           ; ** 函数名称: GetDrive
 01A6           ; ** 功能描述: 获取指定目录的驱动器
 01A6           ; ** 输   入: Path:路径名
 01A6           ; ** 输   出: 驱动器号
 01A6           ; ** 全局变量: 无
 01A6           ; ** 调用模块: 无
 01A6           ; ** 作   者: 陈明计
 01A6           ; ** 日   期: 2003年9月8日
 01A6           ; **-------------------------------------------------------------------------------------------------------
 01A6           ; ** 修 改 人:
 01A6           ; ** 日   期:
 01A6           ; **------------------------------------------------------------------------------------------------------
 01A6           ; ********************************************************************************************************/
 01A6           ; INT8U GetDrive(char *Path)
 01A6           ; {
 01A6           ;     INT8U Drive ;
 01A6           ;     
 01A6           ;     Drive=CurrentDrive ;
 01A6 40910000          lds R20,_CurrentDrive
 01AA           ;     if(Path!=NULL)
 01AA 6030              cpi R22,0
 01AC 6707              cpc R22,R23
 01AE 49F0              breq L55
 01B0           X0:
 01B0           ;     {
 01B0           ;         strupr(Path);/* 变为大写 */
 01B0 8B01              movw R16,R22
 01B2 FFD2              xcall _strupr
 01B4           ;         
 01B4           ;         if(Path[1]==':')
 01B4 FB01              movw R30,R22
 01B6 8181              ldd R24,z+1
 01B8 8A33              cpi R24,58
 01BA 19F4              brne L57
 01BC           ;         {
 01BC           ;             Drive=Path[0]-'A' ;
 01BC FB01              movw R30,R22
 01BE 4081              ldd R20,z+0
 01C0 4154              subi R20,65
 01C2           ;         }
 01C2           L57:
 01C2           ;     }
 01C2           L55:
 01C2           ;     return Drive ;
 01C2 042F              mov R16,R20
 01C4           L54:
 01C4 0E940000          xcall pop_gset2
 01C8                   .dbline 0 ; func end
 01C8 0895              ret
 01CA           ;           Disk -> R10,R11
 01CA           ;             Rt -> R20
 01CA           ;          Drive -> R22,R23
                        .even
 01CA           _ChangeDrive::
 01CA 0E940000          xcall push_gset3
 01CE B801              movw R22,R16
 01D0           ; }
 01D0           ; 
 01D0           ; /*********************************************************************************************************
 01D0           ; ** 函数名称: ChangeDrive
 01D0           ; ** 功能描述: 改变当前逻辑盘
 01D0           ; ** 输   入: Drive:逻辑盘符字符串
 01D0           ; ** 输   出: RETURN_OK:成功
 01D0           ; **           NOT_FIND_DISK:逻辑盘不存在
 01D0           ; **           PARAMETER_ERR:非法参数
 01D0           ; ** 全局变量: 无
 01D0           ; ** 调用模块: strupr,GetDiskInfo
 01D0           ; ** 作   者: 陈明计
 01D0           ; ** 日   期: 2003年9月8日
 01D0           ; **-------------------------------------------------------------------------------------------------------
 01D0           ; ** 修 改 人:
 01D0           ; ** 日   期:
 01D0           ; **------------------------------------------------------------------------------------------------------
 01D0           ; ********************************************************************************************************/
 01D0           ; INT8U ChangeDrive(char *Drive)
 01D0           ; {
 01D0           ;     INT8U Rt ;
 01D0           ;     Disk_Info *Disk ;
 01D0           ;     
 01D0           ;     Rt=PARAMETER_ERR ;
 01D0 4FEF              ldi R20,255
 01D2           ;     strupr(Drive);/* 变为大写 */
 01D2 8B01              movw R16,R22
 01D4 EED2              xcall _strupr
 01D6           ;     
 01D6           ;     if(Drive[1]==':')
 01D6 FB01              movw R30,R22
 01D8 8181              ldd R24,z+1
 01DA 8A33              cpi R24,58
 01DC 81F4              brne L60
 01DE           ;     {
 01DE           ;         Rt=NOT_FIND_DISK ;
 01DE 41E0              ldi R20,1
 01E0           ;         Disk=GetDiskInfo(Drive[0]-'A');
 01E0 FB01              movw R30,R22
 01E2 0081              ldd R16,z+0
 01E4 0154              subi R16,65
 01E6 0E940000          xcall _GetDiskInfo
 01EA 5801              movw R10,R16
 01EC           ;         if(Disk!=NULL)
 01EC 0030              cpi R16,0
 01EE 0107              cpc R16,R17
 01F0 31F0              breq L62
 01F2           X1:
 01F2           ;         {
 01F2           ;             CurrentDrive=Drive[0]-'A' ;
 01F2 FB01              movw R30,R22
 01F4 8081              ldd R24,z+0
 01F6 8154              subi R24,65
 01F8 80930000          sts _CurrentDrive,R24
 01FC           ;             Rt=RETURN_OK ;
 01FC 4427              clr R20
 01FE           ;         }
 01FE           L62:
 01FE           ;     }
 01FE           L60:
 01FE           ;     return Rt ;
 01FE 042F              mov R16,R20
 0200           L59:
 0200 0E940000          xcall pop_gset3
 0204                   .dbline 0 ; func end
 0204 0895              ret
 0206           ;           Disk -> R10,R11
 0206           ;          Drive -> R12
 0206           ;        DirName -> y+42
 0206           ;           temp -> y+10
 0206           ;             Rt -> y+6
 0206           ;           Path -> R14,R15
                        .even
 0206           _GetDirClusIndex::
 0206 0E940000          xcall push_gset5
 020A 7801              movw R14,R16
 020C E697              sbiw R28,54
 020E           ; }
 020E           ; 
 020E           ; /*********************************************************************************************************
 020E           ; ** 函数名称: GetDirClusIndex
 020E           ; ** 功能描述: 获取指定目录开始簇号
 020E           ; ** 输   入: Path:路径名
 020E           ; ** 输   出: 开始簇号,EMPTY_CLUS:为根目录
 020E           ; ** 全局变量: 无
 020E           ; ** 调用模块: strupr,GetDiskInfo,FindFDTInfo
 020E           ; ** 作   者: 陈明计
 020E           ; ** 日   期: 2003年9月8日
 020E           ; **-------------------------------------------------------------------------------------------------------
 020E           ; ** 修 改 人: 陈明计
 020E           ; ** 日   期: 2004年4月10日
 020E           ; **------------------------------------------------------------------------------------------------------
 020E           ; ********************************************************************************************************/
 020E           ; INT32U GetDirClusIndex(char *Path)
 020E           ; {
 020E           ;     char DirName[12];
 020E           ;     INT8U Drive ;
 020E           ;     INT32U Rt ;
 020E           ;     FDT temp ;
 020E           ;     Disk_Info *Disk ;
 020E           ;     
 020E           ;     Rt=BAD_CLUS ;
 020E 47EF              ldi R20,247
 0210 5FEF              ldi R21,255
 0212 6FEF              ldi R22,255
 0214 7FE0              ldi R23,15
 0216 FE01              movw R30,R28
 0218 4683              std z+6,R20
 021A 5783              std z+7,R21
 021C 6087              std z+8,R22
 021E 7187              std z+9,R23
 0220           ;     if(Path!=NULL)
 0220 EE20              tst R14
 0222 19F4              brne X2
 0224 FF20              tst R15
 0226 09F4              brne X4
 0228 F3C0              xjmp L65
 022A           X4:
 022A           X2:
 022A           ;     {
 022A           ;         strupr(Path);/* 变为大写 */
 022A 8701              movw R16,R14
 022C C2D2              xcall _strupr
 022E           ;         Drive=GetDrive(Path);/* 获取路基盘符 */
 022E 8701              movw R16,R14
 0230 B7DF              xcall _GetDrive
 0232 C02E              mov R12,R16
 0234           ;         if(Path[1]==':')
 0234 F701              movw R30,R14
 0236 8181              ldd R24,z+1
 0238 8A33              cpi R24,58
 023A 19F4              brne L67
 023C           ;         {
 023C           ;             Path+=2 ;
 023C C701              movw R24,R14
 023E 0296              adiw R24,2
 0240 7C01              movw R14,R24
 0242           ;         }
 0242           L67:
 0242           ;         Disk=GetDiskInfo(Drive);/* 获取逻辑盘信息 */
 0242 0C2D              mov R16,R12
 0244 0E940000          xcall _GetDiskInfo
 0248 5801              movw R10,R16
 024A           ;         if(Disk!=NULL)
 024A 0030              cpi R16,0
 024C 0107              cpc R16,R17
 024E 09F4              brne X5
 0250 B5C0              xjmp L69
 0252           X5:
 0252           X3:
 0252           ;         {
 0252           ;             Rt=0 ;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?