fdt.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,635 行 · 第 1/5 页
LIS
1,635 行
.module FDT.c
.area text(rom, con, rel)
; Disk -> R14,R15
; temp -> R12
; i -> R14
; SecIndex -> y+2
; Index -> y+16
; Drive -> R10
.even
0000 _ClearClus::
0000 3A93 st -y,r19
0002 2A93 st -y,r18
0004 0E940000 xcall push_gset5
0008 A02E mov R10,R16
000A 2697 sbiw R28,6
000C ; /****************************************Copyright (c)**************************************************
000C ; ** 广州周立功单片机发展有限公司
000C ; ** 研 究 所
000C ; ** ARM开发组
000C ; **
000C ; ** http://www.zlgmcu.com
000C ; **
000C ; **--------------文件信息--------------------------------------------------------------------------------
000C ; **文 件 名: FDT.c
000C ; **创 建 人: 陈明计
000C ; **最后修改日期: 2003年9月9日
000C ; **描 述: FAT文件系统文件目录表基本操作程序
000C ; **
000C ; **--------------历史版本信息----------------------------------------------------------------------------
000C ; ** 创建人: 陈明计
000C ; ** 版 本: V1.0
000C ; ** 日 期: 2003年9月8日
000C ; ** 描 述: 原始版本
000C ; **
000C ; **--------------当前版本修订------------------------------------------------------------------------------
000C ; ** 修改人: 陈明计
000C ; ** 日 期: 2004年4月10日
000C ; ** 描 述: 修改注释
000C ; **
000C ; **------------------------------------------------------------------------------------------------------
000C ; ********************************************************************************************************/
000C ; #define IN_FDT
000C ;
000C ; #include "SYS_Config.h"
000C ; #include "fat.h"
000C ;
000C ; /*********************************************************************************************************
000C ; ** 函数名称: ClearClus
000C ; ** 功能描述: 将指定簇所有数据清零
000C ; ** 输 入: Disk:逻辑盘信息
000C ; ** Index:簇号
000C ; ** 输 出: RETURN_OK:成功
000C ; ** 其它参考fat.h中关于返回值的说明
000C ; ** 全局变量: 无
000C ; ** 调用模块: GetDiskInfo,OpenSec,WriteSec,CloseSec
000C ; ** 作 者: 陈明计
000C ; ** 日 期: 2003年9月3日
000C ; **-------------------------------------------------------------------------------------------------------
000C ; ** 修 改 人:
000C ; ** 日 期:
000C ; **------------------------------------------------------------------------------------------------------
000C ; ********************************************************************************************************/
000C ; INT8U ClearClus(INT8U Drive,INT32U Index)
000C ; {
000C ; INT8U i,temp ;
000C ; INT32U SecIndex ;
000C ; Disk_Info *Disk ;
000C ;
000C ; Disk=GetDiskInfo(Drive);
000C 0A2D mov R16,R10
000E 0E940000 xcall _GetDiskInfo
0012 7801 movw R14,R16
0014 ; if(Disk!=NULL)
0014 0030 cpi R16,0
0016 0107 cpc R16,R17
0018 09F4 brne X1
001A 80C0 xjmp L2
001C X1:
001C X0:
001C ; {
001C ; if(Index<Disk->ClusPerData)
001C F701 movw R30,R14
001E 20A0 ldd R2,z+32
0020 31A0 ldd R3,z+33
0022 42A0 ldd R4,z+34
0024 53A0 ldd R5,z+35
0026 FE01 movw R30,R28
0028 6088 ldd R6,z+16
002A 7188 ldd R7,z+17
002C 8288 ldd R8,z+18
002E 9388 ldd R9,z+19
0030 6214 cp R6,R2
0032 7304 cpc R7,R3
0034 8404 cpc R8,R4
0036 9504 cpc R9,R5
0038 08F0 brlo X2
003A 6EC0 xjmp L4
003C X2:
003C ; {
003C ; temp=Disk->SecPerClus ;
003C F701 movw R30,R14
003E C280 ldd R12,z+2
0040 ; Index-=2 ;
0040 42E0 ldi R20,2
0042 50E0 ldi R21,0
0044 60E0 ldi R22,0
0046 70E0 ldi R23,0
0048 FE01 movw R30,R28
004A 2088 ldd R2,z+16
004C 3188 ldd R3,z+17
004E 4288 ldd R4,z+18
0050 5388 ldd R5,z+19
0052 241A sub R2,R20
0054 350A sbc R3,R21
0056 460A sbc R4,R22
0058 570A sbc R5,R23
005A FE01 movw R30,R28
005C 208A std z+16,R2
005E 318A std z+17,R3
0060 428A std z+18,R4
0062 538A std z+19,R5
0064 ; SecIndex=Disk->DataStartSec+Index*temp ;/* 2:保留簇数 */
0064 2C2C mov R2,R12
0066 3324 clr R3
0068 4424 clr R4
006A 5524 clr R5
006C FE01 movw R30,R28
006E 6088 ldd R6,z+16
0070 7188 ldd R7,z+17
0072 8288 ldd R8,z+18
0074 9388 ldd R9,z+19
0076 5A92 st -y,R5
0078 4A92 st -y,R4
007A 3A92 st -y,R3
007C 2A92 st -y,R2
007E 8301 movw R16,R6
0080 9401 movw R18,R8
0082 0E940000 xcall empy32u
0086 F701 movw R30,R14
0088 248C ldd R2,z+28
008A 358C ldd R3,z+29
008C 468C ldd R4,z+30
008E 578C ldd R5,z+31
0090 200E add R2,R16
0092 311E adc R3,R17
0094 421E adc R4,R18
0096 531E adc R5,R19
0098 FE01 movw R30,R28
009A 2282 std z+2,R2
009C 3382 std z+3,R3
009E 4482 std z+4,R4
00A0 5582 std z+5,R5
00A2 ; for(i=0;i<temp;i++)
00A2 EE24 clr R14
00A4 34C0 xjmp L9
00A6 L6:
00A6 FE01 movw R30,R28
00A8 2280 ldd R2,z+2
00AA 3380 ldd R3,z+3
00AC 4480 ldd R4,z+4
00AE 5580 ldd R5,z+5
00B0 4882 std y+0,R4
00B2 5982 std y+1,R5
00B4 9101 movw R18,R2
00B6 0A2D mov R16,R10
00B8 0E940000 xcall _OpenSec
00BC FE01 movw R30,R28
00BE 2280 ldd R2,z+2
00C0 3380 ldd R3,z+3
00C2 4480 ldd R4,z+4
00C4 5580 ldd R5,z+5
00C6 4882 std y+0,R4
00C8 5982 std y+1,R5
00CA 9101 movw R18,R2
00CC 0A2D mov R16,R10
00CE 0E940000 xcall _WriteSec
00D2 FE01 movw R30,R28
00D4 2280 ldd R2,z+2
00D6 3380 ldd R3,z+3
00D8 4480 ldd R4,z+4
00DA 5580 ldd R5,z+5
00DC 4882 std y+0,R4
00DE 5982 std y+1,R5
00E0 9101 movw R18,R2
00E2 0A2D mov R16,R10
00E4 0E940000 xcall _CloseSec
00E8 41E0 ldi R20,1
00EA 50E0 ldi R21,0
00EC 60E0 ldi R22,0
00EE 70E0 ldi R23,0
00F0 FE01 movw R30,R28
00F2 2280 ldd R2,z+2
00F4 3380 ldd R3,z+3
00F6 4480 ldd R4,z+4
00F8 5580 ldd R5,z+5
00FA 240E add R2,R20
00FC 351E adc R3,R21
00FE 461E adc R4,R22
0100 571E adc R5,R23
0102 FE01 movw R30,R28
0104 2282 std z+2,R2
0106 3382 std z+3,R3
0108 4482 std z+4,R4
010A 5582 std z+5,R5
010C L7:
010C E394 inc R14
010E L9:
010E EC14 cp R14,R12
0110 08F4 brsh X3
0112 C9CF xjmp L6
0114 X3:
0114 ; {
0114 ; OpenSec(Drive,SecIndex);
0114 ; WriteSec(Drive,SecIndex);
0114 ; CloseSec(Drive,SecIndex);
0114 ; SecIndex++;
0114 ; }
0114 ; return RETURN_OK ;
0114 0027 clr R16
0116 03C0 xjmp L1
0118 L4:
0118 ; }
0118 ; else
0118 ; {
0118 ; return CLUSTER_NOT_IN_DISK ;
0118 06E0 ldi R16,6
011A 01C0 xjmp L1
011C L2:
011C ; }
011C ; }
011C ; else
011C ; {
011C ; return NOT_FIND_DISK ;
011C 01E0 ldi R16,1
011E L1:
011E 2696 adiw R28,6
0120 0E940000 xcall pop_gset5
0124 2296 adiw R28,2
0126 .dbline 0 ; func end
0126 0895 ret
0128 ; temp -> R10
0128 ; Buf -> R14,R15
0128 ; ByteIndex -> y+16
0128 ; SecIndex -> y+12
0128 ; Drive -> R12
0128 ; Rt -> R8,R9
.even
0128 _ReadFDTInfo::
0128 0E940000 xcall push_gset5
012C C22E mov R12,R18
012E 4801 movw R8,R16
0130 2297 sbiw R28,2
0132 ; }
0132 ; }
0132 ;
0132 ; /*********************************************************************************************************
0132 ; ** 函数名称: ReadFDTInfo
0132 ; ** 功能描述: 读取FDT信息
0132 ; ** 输 入: Rt:存储返回信息的指针
0132 ; ** Drive:驱动器号
0132 ; ** SecIndex:扇区号
0132 ; ** ByteIndex:偏移量
0132 ; ** 输 出: RETURN_OK:成功
0132 ; ** 其它参考fat.h中关于返回值的说明
0132 ; ** 全局变量: 无
0132 ; ** 调用模块: OpenSec,ReadSec,CloseSec
0132 ; ** 作 者: 陈明计
0132 ; ** 日 期: 2003年9月8日
0132 ; **-------------------------------------------------------------------------------------------------------
0132 ; ** 修 改 人:
0132 ; ** 日 期:
0132 ; **------------------------------------------------------------------------------------------------------
0132 ; ********************************************************************************************************/
0132 ; INT8U ReadFDTInfo(FDT *Rt,INT8U Drive,INT32U SecIndex,INT16U ByteIndex)
0132 ; {
0132 ; INT8U *Buf ;
0132 ; INT8U temp ;
0132 ;
0132 ; Buf=OpenSec(Drive,SecIndex);
0132 FE01 movw R30,R28
0134 2484 ldd R2,z+12
0136 3584 ldd R3,z+13
0138 4684 ldd R4,z+14
013A 5784 ldd R5,z+15
013C 4882 std y+0,R4
013E 5982 std y+1,R5
0140 9101 movw R18,R2
0142 0C2D mov R16,R12
0144 8F92 push R8
0146 9F92 push R9
0148 0E940000 xcall _OpenSec
014C 9F90 pop R9
014E 8F90 pop R8
0150 7801 movw R14,R16
0152 ; temp=NOT_EMPTY_CACHE ;
0152 84E0 ldi R24,4
0154 A82E mov R10,R24
0156 ; if(Buf!=NULL)
0156 0030 cpi R16,0
0158 0107 cpc R16,R17
015A 09F4 brne X5
015C 06C1 xjmp L11
015E X5:
015E X4:
015E ; {
015E ; temp=ReadSec(Drive,SecIndex);
015E FE01 movw R30,R28
0160 2484 ldd R2,z+12
0162 3584 ldd R3,z+13
0164 4684 ldd R4,z+14
0166 5784 ldd R5,z+15
0168 4882 std y+0,R4
016A 5982 std y+1,R5
016C 9101 movw R18,R2
016E 0C2D mov R16,R12
0170 8F92 push R8
0172 9F92 push R9
0174 0E940000 xcall _ReadSec
0178 9F90 pop R9
017A 8F90 pop R8
017C A02E mov R10,R16
017E ; if(temp==RETURN_OK)
017E 0023 tst R16
0180 09F0 breq X6
0182 E8C0 xjmp L13
0184 X6:
0184 ; {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?