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