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