fat.lis

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

LIS
1,740
字号
                        .module fat.c
                        .area text(rom, con, rel)
                ;           temp -> R10,R11
                ;      ByteIndex -> R14,R15
                ;             Rt -> y+6
                ;            Buf -> R12,R13
                ;       SecIndex -> y+2
                ;           Disk -> y+10
                ;          Index -> y+24
                ;          Drive -> y+22
                        .even
 0000           _FATGetNextClus::
 0000 0E940000          xcall push_arg4
 0004 0E940000          xcall push_gset5
 0008 2C97              sbiw R28,12
 000A           ; /****************************************Copyright (c)**************************************************
 000A           ; **                               广州周立功单片机发展有限公司
 000A           ; **                                     研    究    所
 000A           ; **                                        ARM开发组
 000A           ; **
 000A           ; **                                 http://www.zlgmcu.com
 000A           ; **
 000A           ; **--------------文件信息--------------------------------------------------------------------------------
 000A           ; **文   件   名: floppy.c
 000A           ; **创   建   人: 陈明计
 000A           ; **最后修改日期:  2003年9月5日
 000A           ; **描        述: FAT文件系统的文件分配表基本操作函数
 000A           ; **
 000A           ; **--------------历史版本信息----------------------------------------------------------------------------
 000A           ; ** 创建人: 陈明计
 000A           ; ** 版  本: V1.0
 000A           ; ** 日 期: 2003年9月5日
 000A           ; ** 描 述: 原始版本
 000A           ; **
 000A           ; **--------------当前版本修订------------------------------------------------------------------------------
 000A           ; ** 修改人: 陈明计
 000A           ; ** 日 期: 2004年4月10日
 000A           ; ** 描 述: 修改注释
 000A           ; **
 000A           ; **------------------------------------------------------------------------------------------------------
 000A           ; ********************************************************************************************************/
 000A           ; 
 000A           ; #define   IN_FAT 
 000A           ; 
 000A           ; #include "SYS_Config.h" 
 000A           ; #include "SD_Config.h" 
 000A           ; #include "SD_Drive.h" 
 000A           ; #include "Fat.h" 
 000A           ; 
 000A           ; 
 000A           ; /*********************************************************************************************************
 000A           ; ** 函数名称: FATGetNextClus
 000A           ; ** 功能描述: 返回FAT表指定簇的下一个簇号
 000A           ; ** 输   入: Drive:驱动器号
 000A           ; **           Index:簇号
 000A           ; ** 输   出: 下一个簇号
 000A           ; ** 全局变量: 无
 000A           ; ** 调用模块: 无
 000A           ; ** 作   者: 陈明计
 000A           ; ** 日   期: 2003年9月5日
 000A           ; **-------------------------------------------------------------------------------------------------------
 000A           ; ** 修 改 人: 陈明计
 000A           ; ** 日   期: 2004年4月10日
 000A           ; **------------------------------------------------------------------------------------------------------
 000A           ; ********************************************************************************************************/
 000A           ; INT32U FATGetNextClus(INT8U Drive,INT32U Index)
 000A           ; {
 000A           ;     INT16U temp,ByteIndex ;
 000A           ;     INT32U SecIndex ;
 000A           ;     INT8U  *Buf ;
 000A           ;     Disk_Info *Disk ;
 000A           ;     INT32U Rt ;
 000A           ;     
 000A           ;     Disk=GetDiskInfo(Drive);
 000A 0E89              ldd R16,y+22
 000C 0E940000          xcall _GetDiskInfo
 0010 1B87              std y+11,R17
 0012 0A87              std y+10,R16
 0014           ;     if(Disk==NULL)
 0014 0801              movw R0,R16
 0016 0030              cpi R16,0
 0018 0107              cpc R16,R17
 001A 29F4              brne L2
 001C           X0:
 001C           ;     {
 001C           ;         return BAD_CLUS ;
 001C 07EF              ldi R16,247
 001E 1FEF              ldi R17,255
 0020 2FEF              ldi R18,255
 0022 3FE0              ldi R19,15
 0024 E0C2              xjmp L1
 0026           L2:
 0026           ;     }
 0026           ;     
 0026           ;     if(Index>=(Disk->ClusPerData))
 0026 EA85              ldd R30,y+10
 0028 FB85              ldd R31,y+11
 002A 20A0              ldd R2,z+32
 002C 31A0              ldd R3,z+33
 002E 42A0              ldd R4,z+34
 0030 53A0              ldd R5,z+35
 0032 FE01              movw R30,R28
 0034 608C              ldd R6,z+24
 0036 718C              ldd R7,z+25
 0038 828C              ldd R8,z+26
 003A 938C              ldd R9,z+27
 003C 6214              cp R6,R2
 003E 7304              cpc R7,R3
 0040 8404              cpc R8,R4
 0042 9504              cpc R9,R5
 0044 28F0              brlo L4
 0046           ;     {
 0046           ;         return BAD_CLUS ;
 0046 07EF              ldi R16,247
 0048 1FEF              ldi R17,255
 004A 2FEF              ldi R18,255
 004C 3FE0              ldi R19,15
 004E CBC2              xjmp L1
 0050           L4:
 0050           ;     }
 0050           ;     
 0050           ;     /* 计算扇区号和字节索引 */
 0050           ;     switch(Disk->FATType)
 0050 EA85              ldd R30,y+10
 0052 FB85              ldd R31,y+11
 0054 A180              ldd R10,z+1
 0056 BB24              clr R11
 0058 AA20              tst R10
 005A 11F4              brne X1
 005C BB20              tst R11
 005E 61F0              breq L9
 0060           X1:
 0060 C501              movw R24,R10
 0062 8130              cpi R24,1
 0064 E0E0              ldi R30,0
 0066 9E07              cpc R25,R30
 0068 09F4              brne X7
 006A 7CC0              xjmp L10
 006C           X7:
 006C 8230              cpi R24,2
 006E E0E0              ldi R30,0
 0070 9E07              cpc R25,R30
 0072 09F4              brne X8
 0074 CCC0              xjmp L11
 0076           X8:
 0076 20C1              xjmp L6
 0078           X2:
 0078           ;     {
 0078           L9:
 0078           ;         case FAT12 :
 0078           ;              SecIndex=Index*3/(2*Disk->BytsPerSec);
 0078 EA85              ldd R30,y+10
 007A FB85              ldd R31,y+11
 007C 2088              ldd R2,z+16
 007E 3188              ldd R3,z+17
 0080 4288              ldd R4,z+18
 0082 5388              ldd R5,z+19
 0084 42E0              ldi R20,2
 0086 50E0              ldi R21,0
 0088 60E0              ldi R22,0
 008A 70E0              ldi R23,0
 008C 5A92              st -y,R5
 008E 4A92              st -y,R4
 0090 3A92              st -y,R3
 0092 2A92              st -y,R2
 0094 8A01              movw R16,R20
 0096 9B01              movw R18,R22
 0098 0E940000          xcall empy32u
 009C 1801              movw R2,R16
 009E 2901              movw R4,R18
 00A0 FE01              movw R30,R28
 00A2 608C              ldd R6,z+24
 00A4 718C              ldd R7,z+25
 00A6 828C              ldd R8,z+26
 00A8 938C              ldd R9,z+27
 00AA 43E0              ldi R20,3
 00AC 50E0              ldi R21,0
 00AE 60E0              ldi R22,0
 00B0 70E0              ldi R23,0
 00B2 9A92              st -y,R9
 00B4 8A92              st -y,R8
 00B6 7A92              st -y,R7
 00B8 6A92              st -y,R6
 00BA 8A01              movw R16,R20
 00BC 9B01              movw R18,R22
 00BE 0E940000          xcall empy32u
 00C2 5A92              st -y,R5
 00C4 4A92              st -y,R4
 00C6 3A92              st -y,R3
 00C8 2A92              st -y,R2
 00CA 0E940000          xcall div32u
 00CE FE01              movw R30,R28
 00D0 0283              std z+2,R16
 00D2 1383              std z+3,R17
 00D4 2483              std z+4,R18
 00D6 3583              std z+5,R19
 00D8           ;              ByteIndex=((Index*3)/2)-(SecIndex*Disk->BytsPerSec);
 00D8 EA85              ldd R30,y+10
 00DA FB85              ldd R31,y+11
 00DC 2088              ldd R2,z+16
 00DE 3188              ldd R3,z+17
 00E0 4288              ldd R4,z+18
 00E2 5388              ldd R5,z+19
 00E4 FE01              movw R30,R28
 00E6 6280              ldd R6,z+2
 00E8 7380              ldd R7,z+3
 00EA 8480              ldd R8,z+4
 00EC 9580              ldd R9,z+5
 00EE 5A92              st -y,R5
 00F0 4A92              st -y,R4
 00F2 3A92              st -y,R3
 00F4 2A92              st -y,R2
 00F6 8301              movw R16,R6
 00F8 9401              movw R18,R8
 00FA 0E940000          xcall empy32u
 00FE 1801              movw R2,R16
 0100 2901              movw R4,R18
 0102 FE01              movw R30,R28
 0104 608C              ldd R6,z+24
 0106 718C              ldd R7,z+25
 0108 828C              ldd R8,z+26
 010A 938C              ldd R9,z+27
 010C 43E0              ldi R20,3
 010E 50E0              ldi R21,0
 0110 60E0              ldi R22,0
 0112 70E0              ldi R23,0
 0114 9A92              st -y,R9
 0116 8A92              st -y,R8
 0118 7A92              st -y,R7
 011A 6A92              st -y,R6
 011C 8A01              movw R16,R20
 011E 9B01              movw R18,R22
 0120 0E940000          xcall empy32u
 0124 3801              movw R6,R16
 0126 4901              movw R8,R18
 0128 9694              lsr R9
 012A 8794              ror R8
 012C 7794              ror R7
 012E 6794              ror R6
 0130 6218              sub R6,R2
 0132 7308              sbc R7,R3
 0134 8408              sbc R8,R4
 0136 9508              sbc R9,R5
 0138 7301              movw R14,R6
 013A           ;              SecIndex+=Disk->FATStartSec ;
 013A EA85              ldd R30,y+10
 013C FB85              ldd R31,y+11
 013E 2480              ldd R2,z+4
 0140 3580              ldd R3,z+5
 0142 4680              ldd R4,z+6
 0144 5780              ldd R5,z+7
 0146 FE01              movw R30,R28
 0148 6280              ldd R6,z+2
 014A 7380              ldd R7,z+3
 014C 8480              ldd R8,z+4
 014E 9580              ldd R9,z+5
 0150 620C              add R6,R2
 0152 731C              adc R7,R3
 0154 841C              adc R8,R4
 0156 951C              adc R9,R5
 0158 FE01              movw R30,R28
 015A 6282              std z+2,R6
 015C 7382              std z+3,R7
 015E 8482              std z+4,R8
 0160 9582              std z+5,R9
 0162           ;              break ;
 0162 AFC0              xjmp L7
 0164           L10:
 0164           ;         case FAT16 :
 0164           ;              SecIndex=Index*2/Disk->BytsPerSec+Disk->FATStartSec ;
 0164 FE01              movw R30,R28
 0166 208C              ldd R2,z+24
 0168 318C              ldd R3,z+25
 016A 428C              ldd R4,z+26
 016C 538C              ldd R5,z+27
 016E 42E0              ldi R20,2
 0170 50E0              ldi R21,0
 0172 60E0              ldi R22,0
 0174 70E0              ldi R23,0
 0176 5A92              st -y,R5
 0178 4A92              st -y,R4
 017A 3A92              st -y,R3
 017C 2A92              st -y,R2
 017E 8A01              movw R16,R20
 0180 9B01              movw R18,R22
 0182 0E940000          xcall empy32u
 0186 EA85              ldd R30,y+10
 0188 FB85              ldd R31,y+11
 018A 6088              ldd R6,z+16
 018C 7188              ldd R7,z+17
 018E 8288              ldd R8,z+18
 0190 9388              ldd R9,z+19
 0192 9A92              st -y,R9
 0194 8A92              st -y,R8
 0196 7A92              st -y,R7
 0198 6A92              st -y,R6
 019A 0E940000          xcall div32u
 019E 1801              movw R2,R16
 01A0 2901              movw R4,R18
 01A2 EA85              ldd R30,y+10
 01A4 FB85              ldd R31,y+11
 01A6 6480              ldd R6,z+4
 01A8 7580              ldd R7,z+5
 01AA 8680              ldd R8,z+6
 01AC 9780              ldd R9,z+7
 01AE 260C              add R2,R6
 01B0 371C              adc R3,R7
 01B2 481C              adc R4,R8
 01B4 591C              adc R5,R9
 01B6 FE01              movw R30,R28
 01B8 2282              std z+2,R2
 01BA 3382              std z+3,R3
 01BC 4482              std z+4,R4
 01BE 5582              std z+5,R5
 01C0           ;              ByteIndex=(Index*2)&(Disk->BytsPerSec-1);
 01C0 41E0              ldi R20,1
 01C2 50E0              ldi R21,0
 01C4 60E0              ldi R22,0
 01C6 70E0              ldi R23,0
 01C8 EA85              ldd R30,y+10
 01CA FB85              ldd R31,y+11
 01CC 2088              ldd R2,z+16
 01CE 3188              ldd R3,z+17
 01D0 4288              ldd R4,z+18
 01D2 5388              ldd R5,z+19
 01D4 241A              sub R2,R20
 01D6 350A              sbc R3,R21
 01D8 460A              sbc R4,R22
 01DA 570A              sbc R5,R23
 01DC FE01              movw R30,R28
 01DE 608C              ldd R6,z+24
 01E0 718C              ldd R7,z+25
 01E2 828C              ldd R8,z+26
 01E4 938C              ldd R9,z+27
 01E6 42E0              ldi R20,2
 01E8 50E0              ldi R21,0
 01EA 60E0              ldi R22,0
 01EC 70E0              ldi R23,0
 01EE 9A92              st -y,R9
 01F0 8A92              st -y,R8
 01F2 7A92              st -y,R7
 01F4 6A92              st -y,R6
 01F6 8A01              movw R16,R20
 01F8 9B01              movw R18,R22
 01FA 0E940000          xcall empy32u
 01FE 3801              movw R6,R16
 0200 4901              movw R8,R18
 0202 6220              and R6,R2

⌨️ 快捷键说明

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