📄 fdt.s
字号:
.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 + -