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

📄 fdt.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
	.module FDT.c
	.area text(rom, con, rel)
;           Disk -> R14,R15
;           temp -> R12
;              i -> R14
;       SecIndex -> y+2
;          Index -> y+16
;          Drive -> R10
	.even
_ClearClus::
	st -y,r19
	st -y,r18
	xcall push_gset5
	mov R10,R16
	sbiw R28,6
; /****************************************Copyright (c)**************************************************
; **                               广州周立功单片机发展有限公司
; **                                     研    究    所
; **                                        ARM开发组
; **
; **                                 http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文   件   名: FDT.c
; **创   建   人: 陈明计
; **最后修改日期: 2003年9月9日
; **描        述: FAT文件系统文件目录表基本操作程序
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版  本: V1.0
; ** 日 期: 2003年9月8日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人: 陈明计
; ** 日 期: 2004年4月10日
; ** 描 述: 修改注释
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; #define   IN_FDT 
; 
; #include "SYS_Config.h" 
; #include "fat.h" 
; 
; /*********************************************************************************************************
; ** 函数名称: ClearClus
; ** 功能描述: 将指定簇所有数据清零
; ** 输   入: Disk:逻辑盘信息
; **           Index:簇号
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,OpenSec,WriteSec,CloseSec
; ** 作   者: 陈明计
; ** 日   期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 
; ** 日   期: 
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U ClearClus(INT8U Drive,INT32U Index)
; {
;     INT8U i,temp ;
;     INT32U SecIndex ;
;     Disk_Info *Disk ;
;     
;     Disk=GetDiskInfo(Drive);
	mov R16,R10
	xcall _GetDiskInfo
	movw R14,R16
;     if(Disk!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X1
	xjmp L2
X1:
X0:
;     {
;         if(Index<Disk->ClusPerData)
	movw R30,R14
	ldd R2,z+32
	ldd R3,z+33
	ldd R4,z+34
	ldd R5,z+35
	movw R30,R28
	ldd R6,z+16
	ldd R7,z+17
	ldd R8,z+18
	ldd R9,z+19
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo X2
	xjmp L4
X2:
;         {
;             temp=Disk->SecPerClus ;
	movw R30,R14
	ldd R12,z+2
;             Index-=2 ;
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	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
	std z+16,R2
	std z+17,R3
	std z+18,R4
	std z+19,R5
;             SecIndex=Disk->DataStartSec+Index*temp ;/* 2:保留簇数 */
	mov R2,R12
	clr R3
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+16
	ldd R7,z+17
	ldd R8,z+18
	ldd R9,z+19
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32u
	movw R30,R14
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
;             for(i=0;i<temp;i++)
	clr R14
	xjmp L9
L6:
	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
	mov R16,R10
	xcall _OpenSec
	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
	mov R16,R10
	xcall _WriteSec
	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
	mov R16,R10
	xcall _CloseSec
	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
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
L7:
	inc R14
L9:
	cp R14,R12
	brsh X3
	xjmp L6
X3:
;             {
;                 OpenSec(Drive,SecIndex);
;                 WriteSec(Drive,SecIndex);
;                 CloseSec(Drive,SecIndex);
;                 SecIndex++;
;             }
;             return RETURN_OK ;
	clr R16
	xjmp L1
L4:
;         }
;         else 
;         {
;             return CLUSTER_NOT_IN_DISK ;
	ldi R16,6
	xjmp L1
L2:
;         }
;     }
;     else 
;     {
;         return NOT_FIND_DISK ;
	ldi R16,1
L1:
	adiw R28,6
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
;           temp -> R10
;            Buf -> R14,R15
;      ByteIndex -> y+16
;       SecIndex -> y+12
;          Drive -> R12
;             Rt -> R8,R9
	.even
_ReadFDTInfo::
	xcall push_gset5
	mov R12,R18
	movw R8,R16
	sbiw R28,2
;     }
; }
; 
; /*********************************************************************************************************
; ** 函数名称: ReadFDTInfo
; ** 功能描述: 读取FDT信息
; ** 输   入: Rt:存储返回信息的指针
; **           Drive:驱动器号
; **           SecIndex:扇区号
; **           ByteIndex:偏移量
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: OpenSec,ReadSec,CloseSec
; ** 作   者: 陈明计
; ** 日   期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U ReadFDTInfo(FDT *Rt,INT8U Drive,INT32U SecIndex,INT16U ByteIndex)
; {
;     INT8U *Buf ;
;     INT8U temp ;
;     
;     Buf=OpenSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R12
	push R8
	push R9
	xcall _OpenSec
	pop R9
	pop R8
	movw R14,R16
;     temp=NOT_EMPTY_CACHE ;
	ldi R24,4
	mov R10,R24
;     if(Buf!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X5
	xjmp L11
X5:
X4:
;     {
;         temp=ReadSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R12
	push R8
	push R9
	xcall _ReadSec
	pop R9
	pop R8
	mov R10,R16
;         if(temp==RETURN_OK)
	tst R16
	breq X6
	xjmp L13
X6:
;         {
;             Buf=Buf+ByteIndex ;
	ldd R0,y+16
	ldd R1,y+17
	add R14,R0
	adc R15,R1
;             Rt->Name[0]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+0,R2
;             Rt->Name[1]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+1,R2
;             Rt->Name[2]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+2,R2
;             Rt->Name[3]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+3,R2
;             Rt->Name[4]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+4,R2
;             Rt->Name[5]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+5,R2
;             Rt->Name[6]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+6,R2
;             Rt->Name[7]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+7,R2
;             Rt->Name[8]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+8,R2
;             Rt->Name[9]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+9,R2
;             Rt->Name[10]=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+10,R2
;             Rt->Attr=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+11,R2
;             Rt->NTRes=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+12,R2
;             Rt->CrtTimeTenth=*Buf++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	movw R30,R8
	std z+13,R2
;             Rt->CrtTime=Buf[0]|( (INT16U)Buf[1]<<8 );
	movw R30,R14
	ldd R2,z+1
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	ldd R4,z+0
	clr R5
	or R4,R2
	or R5,R3
	movw R30,R8
	std z+15,R5
	std z+14,R4
;             Rt->CrtDate=Buf[2]|( (INT16U)Buf[3]<<8 );
	movw R30,R14
	ldd R2,z+3
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	ldd R4,z+2
	clr R5
	or R4,R2
	or R5,R3
	movw R30,R8
	std z+17,R5
	std z+16,R4
;             Rt->LstAccDate=Buf[4]|( (INT16U)Buf[5]<<8 );
	movw R30,R14
	ldd R2,z+5
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	ldd R4,z+4
	clr R5
	or R4,R2
	or R5,R3
	movw R30,R8
	std z+19,R5
	std z+18,R4
;             Rt->FstClusHI=Buf[6]|( (INT16U)Buf[7]<<8 );
	movw R30,R14
	ldd R2,z+7
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	ldd R4,z+6
	clr R5
	or R4,R2
	or R5,R3
	movw R30,R8
	std z+21,R5
	std z+20,R4
;             Rt->WrtTime=Buf[8]|( (INT16U)Buf[9]<<8 );
	movw R30,R14
	ldd R2,z+9
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	ldd R4,z+8
	clr R5
	or R4,R2
	or R5,R3
	movw R30,R8
	std z+23,R5
	std z+22,R4
;             Rt->WrtDate=Buf[10]|( (INT16U)Buf[11]<<8 );
	movw R30,R14
	ldd R2,z+11
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	ldd R4,z+10
	clr R5
	or R4,R2
	or R5,R3
	movw R30,R8
	std z+25,R5
	std z+24,R4
;             Rt->FstClusLO=Buf[12]|( (INT16U)Buf[13]<<8 );
	movw R30,R14
	ldd R2,z+13
	clr R3
	mov R3,R2
	clr R2
	movw R30,R14
	ldd R4,z+12
	clr R5
	or R4,R2
	or R5,R3
	movw R30,R8
	std z+27,R5
	std z+26,R4
; 	    
;             Rt->FileSize=Buf[14]|( (INT32U)Buf[15]<<8 );
	ldi R24,8
	ldi R25,0
	movw R30,R14
	ldd R2,z+15
	clr R3
	clr R4
	clr R5
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R14
	ldd R2,z+14
	clr R3
	clr R4
	clr R5
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	movw R30,R8
	std z+28,R2
	std z+29,R3
	std z+30,R4
	std z+31,R5
;             Rt->FileSize|=(( (INT32U)Buf[16]<<16 )|( (INT32U)Buf[17]<<24) );
	movw R24,R8
	adiw R24,28
	movw R2,R24
	ldi R24,24
	ldi R25,0
	movw R30,R14
	ldd R4,z+17
	clr R5
	clr R6
	clr R7
	st -y,R24
	movw R16,R4
	movw R18,R6
	xcall lsl32
	movw R30,R14
	ldd R4,z+16
	clr R5
	clr R6
	clr R7
	movw R6,R4
	clr R4
	clr R5
	or R4,R16
	or R5,R17
	or R6,R18
	or R7,R19
	movw R30,R2
	ldd R20,z+0
	ldd R21,z+1
	ldd R22,z+2
	ldd R23,z+3
	or R20,R4
	or R21,R5
	or R22,R6
	or R23,R7
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
;             temp=RETURN_OK ;
	clr R10
;         }
L13:
;         CloseSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R12
	xcall _CloseSec
;     }
L11:
;     return temp ;
	mov R16,R10
L10:
	adiw R28,2
	xcall pop_gset5
	.dbline 0 ; func end
	ret
;           temp -> R20
;            Buf -> R10,R11
;        FDTData -> R12,R13
;      ByteIndex -> y+14
;       SecIndex -> y+10
;          Drive -> R22
	.even
_WriteFDTInfo::
	st -y,r19
	st -y,r18
	xcall push_gset4
	mov R22,R16
	sbiw R28,2
	ldd R12,y+16
	ldd R13,y+17
; }
; 
; /*********************************************************************************************************
; ** 函数名称: WriteFDTInfo
; ** 功能描述: 写FDT信息
; ** 输   入: Drive:驱动器号
; **           SecIndex:扇区号
; **           ByteIndex:偏移量
; **           FDT *FDTData:数据
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: OpenSec,ReadSec,CloseSec
; ** 作   者: 
; ** 日   期: 
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U WriteFDTInfo(INT8U Drive,INT32U SecIndex,INT16U ByteIndex,FDT *FDTData)
; {
;     INT8U *Buf ;
;     INT8U temp ;
;     
;     temp=NOT_EMPTY_CACHE ;
	ldi R20,4
;     Buf=OpenSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R22
	xcall _OpenSec
	movw R10,R16
;     if(Buf!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X8
	xjmp L16
X8:
X7:
;     {
;         temp=ReadSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R22
	xcall _ReadSec
	mov R20,R16
;         if(temp==RETURN_OK)
	tst R16
	breq X9
	xjmp L18
X9:
;         {
;              Buf=Buf+ByteIndex ;
	ldd R0,y+14
	ldd R1,y+15
	add R10,R0
	adc R11,R1
;             *Buf++=FDTData->Name[0];
	movw R30,R12
	ldd R2,z+0
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[1];
	movw R30,R12
	ldd R2,z+1
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[2];
	movw R30,R12
	ldd R2,z+2
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[3];
	movw R30,R12
	ldd R2,z+3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[4];
	movw R30,R12
	ldd R2,z+4
	movw R30,R10
	st Z+,R2

⌨️ 快捷键说明

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