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