⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
	.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
_FATGetNextClus::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,12
; /****************************************Copyright (c)**************************************************
; **                               广州周立功单片机发展有限公司
; **                                     研    究    所
; **                                        ARM开发组
; **
; **                                 http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文   件   名: floppy.c
; **创   建   人: 陈明计
; **最后修改日期:  2003年9月5日
; **描        述: FAT文件系统的文件分配表基本操作函数
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版  本: V1.0
; ** 日 期: 2003年9月5日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人: 陈明计
; ** 日 期: 2004年4月10日
; ** 描 述: 修改注释
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; 
; #define   IN_FAT 
; 
; #include "SYS_Config.h" 
; #include "SD_Config.h" 
; #include "SD_Drive.h" 
; #include "Fat.h" 
; 
; 
; /*********************************************************************************************************
; ** 函数名称: FATGetNextClus
; ** 功能描述: 返回FAT表指定簇的下一个簇号
; ** 输   入: Drive:驱动器号
; **           Index:簇号
; ** 输   出: 下一个簇号
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U FATGetNextClus(INT8U Drive,INT32U Index)
; {
;     INT16U temp,ByteIndex ;
;     INT32U SecIndex ;
;     INT8U  *Buf ;
;     Disk_Info *Disk ;
;     INT32U Rt ;
;     
;     Disk=GetDiskInfo(Drive);
	ldd R16,y+22
	xcall _GetDiskInfo
	std y+11,R17
	std y+10,R16
;     if(Disk==NULL)
	movw R0,R16
	cpi R16,0
	cpc R16,R17
	brne L2
X0:
;     {
;         return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L1
L2:
;     }
;     
;     if(Index>=(Disk->ClusPerData))
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+32
	ldd R3,z+33
	ldd R4,z+34
	ldd R5,z+35
	movw R30,R28
	ldd R6,z+24
	ldd R7,z+25
	ldd R8,z+26
	ldd R9,z+27
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L4
;     {
;         return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L1
L4:
;     }
;     
;     /* 计算扇区号和字节索引 */
;     switch(Disk->FATType)
	ldd R30,y+10
	ldd R31,y+11
	ldd R10,z+1
	clr R11
	tst R10
	brne X1
	tst R11
	breq L9
X1:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X7
	xjmp L10
X7:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X8
	xjmp L11
X8:
	xjmp L6
X2:
;     {
L9:
;         case FAT12 :
;              SecIndex=Index*3/(2*Disk->BytsPerSec);
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R2,R16
	movw R4,R18
	movw R30,R28
	ldd R6,z+24
	ldd R7,z+25
	ldd R8,z+26
	ldd R9,z+27
	ldi R20,3
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall div32u
	movw R30,R28
	std z+2,R16
	std z+3,R17
	std z+4,R18
	std z+5,R19
;              ByteIndex=((Index*3)/2)-(SecIndex*Disk->BytsPerSec);
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	ldd R6,z+2
	ldd R7,z+3
	ldd R8,z+4
	ldd R9,z+5
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32u
	movw R2,R16
	movw R4,R18
	movw R30,R28
	ldd R6,z+24
	ldd R7,z+25
	ldd R8,z+26
	ldd R9,z+27
	ldi R20,3
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R6,R16
	movw R8,R18
	lsr R9
	ror R8
	ror R7
	ror R6
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R14,R6
;              SecIndex+=Disk->FATStartSec ;
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	movw R30,R28
	ldd R6,z+2
	ldd R7,z+3
	ldd R8,z+4
	ldd R9,z+5
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+2,R6
	std z+3,R7
	std z+4,R8
	std z+5,R9
;              break ;
	xjmp L7
L10:
;         case FAT16 :
;              SecIndex=Index*2/Disk->BytsPerSec+Disk->FATStartSec ;
	movw R30,R28
	ldd R2,z+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	ldd R30,y+10
	ldd R31,y+11
	ldd R6,z+16
	ldd R7,z+17
	ldd R8,z+18
	ldd R9,z+19
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	xcall div32u
	movw R2,R16
	movw R4,R18
	ldd R30,y+10
	ldd R31,y+11
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
;              ByteIndex=(Index*2)&(Disk->BytsPerSec-1);
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R30,R28
	ldd R6,z+24
	ldd R7,z+25
	ldd R8,z+26
	ldd R9,z+27
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R6,R16
	movw R8,R18
	and R6,R2
	and R7,R3
	and R8,R4
	and R9,R5
	movw R14,R6
;              break ;
	xjmp L7
L11:
;         case FAT32 :
;              SecIndex=Index*4/Disk->BytsPerSec+Disk->FATStartSec ;
	movw R30,R28
	ldd R2,z+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	ldi R20,4
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	ldd R30,y+10
	ldd R31,y+11
	ldd R6,z+16
	ldd R7,z+17
	ldd R8,z+18
	ldd R9,z+19
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	xcall div32u
	movw R2,R16
	movw R4,R18
	ldd R30,y+10
	ldd R31,y+11
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
;              ByteIndex=(Index*4)&(Disk->BytsPerSec-1);
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R30,R28
	ldd R6,z+24
	ldd R7,z+25
	ldd R8,z+26
	ldd R9,z+27
	ldi R20,4
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R6,R16
	movw R8,R18
	and R6,R2
	and R7,R3
	and R8,R4
	and R9,R5
	movw R14,R6
;              break ;
	xjmp L7
L6:
;         default :
;              return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L1
L7:
;     }
;     
;     Buf=OpenSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+22
	xcall _OpenSec
	movw R12,R16
;     if(Buf==NULL)
	cpi R16,0
	cpc R16,R17
	brne L12
X3:
;     {
;         return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L1
L12:
;     }
;     ReadSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+22
	xcall _ReadSec
;     
;     /* 读取FAT表数据 */
;     switch(Disk->FATType)
	ldd R30,y+10
	ldd R31,y+11
	ldd R10,z+1
	clr R11
	tst R10
	brne X4
	tst R11
	breq L17
X4:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X9
	xjmp L26
X9:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X10
	xjmp L29
X10:
	xjmp L14
X5:
;     {
L17:
;         case FAT12 :
;              temp=Buf[ByteIndex];
	movw R30,R14
	add R30,R12
	adc R31,R13
	ldd R10,z+0
	clr R11
;              ByteIndex++;
	movw R24,R14
	adiw R24,1
	movw R14,R24
;              /* 下一个字节是否在下一个扇区 */
;              if(ByteIndex>=Disk->BytsPerSec)
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R6,R24
	clr R8
	clr R9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X11
	xjmp L18
X11:
;              {
;                  Buf=OpenSec(Drive,SecIndex+1);
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+22
	xcall _OpenSec
	movw R12,R16
;             	 if(Buf==NULL)
	cpi R16,0
	cpc R16,R17
	brne L20
X6:
;             	 {
;                      return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L1
L20:
;             	 }
;             	 ReadSec(Drive,SecIndex+1);
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+22
	xcall _ReadSec
;            	 temp=temp|((INT16U)Buf[0]<<8);
	movw R30,R12
	ldd R2,z+0
	clr R3
	mov R3,R2
	clr R2
	or R10,R2
	or R11,R3
;            	 CloseSec(Drive,SecIndex+1);
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+22
	xcall _CloseSec
;              }
	xjmp L19
L18:
;        	     else 
;              {
;                  temp=temp|((INT16U)Buf[ByteIndex]<<8);
	movw R30,R14
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	mov R3,R2
	clr R2
	or R10,R2
	or R11,R3
;              }
L19:
;              /* 判断哪12位有效 */
;              if((Index&0x01)!=0)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L22
;              {
;                  temp=temp/16 ;
	movw R2,R10
	lsr R3
	ror R2
	lsr R3
	ror R2
	lsr R3
	ror R2
	lsr R3
	ror R2
	movw R10,R2
;              }
	xjmp L23
L22:
;              else 
;              {
;                  temp=temp&0x0fff ;
	movw R24,R10
	andi R25,15
	movw R10,R24
;              }
L23:
;              Rt=temp ;
	movw R2,R10
	clr R4
	clr R5
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;              /* 是否有特殊意义 */
;              if(temp>=(BAD_CLUS&0x0fff))
	ldi R20,247
	ldi R21,15
	ldi R22,0
	ldi R23,0
	clr R4
	clr R5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge X12
	xjmp L15
X12:
;              {
;                  Rt=((INT32U)0x0fffL<<16)|(temp|0xf000);
	ldi R20,0
	ldi R21,0
	ldi R22,255
	ldi R23,15
	movw R24,R2
	ori R25,240
	movw R2,R24
	clr R4
	clr R5
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;              }
;              break ;
	xjmp L15
L26:
;         case FAT16 :
;              temp=Buf[ByteIndex]|((INT16U)Buf[ByteIndex+1]<<8);
	movw R30,R14
	adiw R30,1
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	add R30,R12
	adc R31,R13
	ldd R10,z+0
	clr R11
	or R10,R2
	or R11,R3
;              Rt=temp ;
	movw R2,R10
	clr R4
	clr R5
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;              /* 是否有特殊意义 */
;              if(temp>=(BAD_CLUS&0xffff))
	ldi R20,247
	ldi R21,255
	ldi R22,0
	ldi R23,0
	clr R4
	clr R5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge X13
	xjmp L15
X13:
;              {
;                  Rt=((INT32U)0x0fffL<<16)|temp ;
	ldi R20,0
	ldi R21,0
	ldi R22,255
	ldi R23,15
	clr R4
	clr R5
	or R2,R20
	or R3,R21
	or R4,R22
	or R5,R23
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;              }
;              break ;
	xjmp L15
L29:
;         case FAT32 :
;              Rt=Buf[ByteIndex]|((INT32U)Buf[ByteIndex+1]<<8);
	movw R30,R14
	adiw R30,1
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	ldi R24,8
	ldi R25,0
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R14
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;              Rt|=((INT32U)Buf[ByteIndex+2]<<16)|((INT32U)Buf[ByteIndex+3]<<24);
	movw R30,R14
	adiw R30,3
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	ldi R24,24
	ldi R25,0
	st -y,R24

⌨️ 快捷键说明

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