📄 fdt.s
字号:
; ** ClusIndex:目录首簇号
; ** FileName:文件(目录)名
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,GetFDTInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FindFDTInfo(FDT *Rt,INT8U Drive,INT32U ClusIndex,char FileName[])
; {
; INT32U i ;
; INT8U temp ;
;
; i=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+8,R20
std z+9,R21
std z+10,R22
std z+11,R23
; if(FileName[0]==DEL_FDT)
movw R30,R12
ldd R24,z+0
cpi R24,229
breq X24
xjmp L74
X24:
; {
; FileName[0]=ESC_FDT ;
ldi R24,5
std z+0,R24
; }
xjmp L74
L73:
; while(1)
; {
; temp=GetFDTInfo(Rt,Drive,ClusIndex,i);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+4,R2
std y+5,R3
std y+6,R4
std y+7,R5
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
mov R18,R14
movw R16,R6
push R16
push R17
xcall _GetFDTInfo
pop R7
pop R6
mov R10,R16
; if(temp!=RETURN_OK)
tst R16
breq L76
; {
; break ;
xjmp L75
L76:
; }
;
; if(Rt->Name[0]==EMPTY_FDT)
movw R30,R6
ldd R2,z+0
tst R2
brne L78
; {
; temp=NOT_FIND_FDT ;
ldi R24,7
mov R10,R24
; break ;
xjmp L75
L78:
; }
; if((Rt->Attr&ATTR_VOLUME_ID)==0)
movw R30,R6
ldd R2,z+11
sbrc R2,3
rjmp L80
; if(FileName[0]==Rt->Name[0])
movw R30,R6
ldd R2,z+0
movw R30,R12
ldd R3,z+0
cp R3,R2
breq X25
xjmp L82
X25:
; if(FileName[1]==Rt->Name[1])
movw R30,R6
ldd R2,z+1
movw R30,R12
ldd R3,z+1
cp R3,R2
breq X26
xjmp L84
X26:
; if(FileName[2]==Rt->Name[2])
movw R30,R6
ldd R2,z+2
movw R30,R12
ldd R3,z+2
cp R3,R2
breq X27
xjmp L86
X27:
; if(FileName[3]==Rt->Name[3])
movw R30,R6
ldd R2,z+3
movw R30,R12
ldd R3,z+3
cp R3,R2
breq X28
xjmp L88
X28:
; if(FileName[4]==Rt->Name[4])
movw R30,R6
ldd R2,z+4
movw R30,R12
ldd R3,z+4
cp R3,R2
breq X29
xjmp L90
X29:
; if(FileName[5]==Rt->Name[5])
movw R30,R6
ldd R2,z+5
movw R30,R12
ldd R3,z+5
cp R3,R2
breq X30
xjmp L92
X30:
; if(FileName[6]==Rt->Name[6])
movw R30,R6
ldd R2,z+6
movw R30,R12
ldd R3,z+6
cp R3,R2
breq X31
xjmp L94
X31:
; if(FileName[7]==Rt->Name[7])
movw R30,R6
ldd R2,z+7
movw R30,R12
ldd R3,z+7
cp R3,R2
brne L96
; if(FileName[8]==Rt->Name[8])
movw R30,R6
ldd R2,z+8
movw R30,R12
ldd R3,z+8
cp R3,R2
brne L98
; if(FileName[9]==Rt->Name[9])
movw R30,R6
ldd R2,z+9
movw R30,R12
ldd R3,z+9
cp R3,R2
brne L100
; if(FileName[10]==Rt->Name[10])
movw R30,R6
ldd R2,z+10
movw R30,R12
ldd R3,z+10
cp R3,R2
brne L102
; {
; temp=RETURN_OK ;
clr R10
; break ;
xjmp L75
L102:
L100:
L98:
L96:
L94:
L92:
L90:
L88:
L86:
L84:
L82:
L80:
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+8,R2
std z+9,R3
std z+10,R4
std z+11,R5
L74:
xjmp L73
L75:
; }
; i++;
; }
; if(FileName[0]==ESC_FDT)
movw R30,R12
ldd R24,z+0
cpi R24,5
brne L104
; {
; FileName[0]=DEL_FDT ;
ldi R24,229
std z+0,R24
; }
L104:
; return temp ;
mov R16,R10
L70:
adiw R28,12
xcall pop_gset5
.dbline 0 ; func end
ret
; Disk -> R10,R11
; TempFDT -> y+12
; i -> y+8
; temp -> R10
; FDTData -> R12,R13
; ClusIndex -> y+54
; Drive -> R14
.even
_AddFDT::
st -y,r19
st -y,r18
xcall push_gset5
mov R14,R16
sbiw R28,44
ldd R12,y+58
ldd R13,y+59
; }
;
; /*********************************************************************************************************
; ** 函数名称: AddFDT
; ** 功能描述: 在指定目录查增加指定文件(目录)
; **
; ** 输 入: Rt:存储返回信息的指针
; ** Drive:驱动器号
; ** ClusIndex:目录首簇号
; ** FileName:文件(目录)名
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: FindFDTInfo,GetFDTInfo,SetFDTInfo
; **
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修改人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U AddFDT(INT8U Drive,INT32U ClusIndex,FDT *FDTData)
; {
; Disk_Info *Disk ;
; INT32U i ;
; FDT TempFDT ;
; INT8U temp ;
;
; Disk=GetDiskInfo(Drive);
mov R16,R14
xcall _GetDiskInfo
movw R10,R16
; if(Disk==NULL)
cpi R16,0
cpc R16,R17
brne L107
X32:
; {
; return NOT_FIND_DISK ;
ldi R16,1
xjmp L106
L107:
; }
;
; if(ClusIndex==EMPTY_CLUS)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L109
; if(Disk->FATType==FAT32)
movw R30,R10
ldd R24,z+1
cpi R24,2
brne L111
; {
; ClusIndex=Disk->RootDirTable ;
movw R30,R10
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
movw R30,R28
std z+54,R2
std z+55,R3
std z+56,R4
std z+57,R5
; }
L111:
L109:
;
; temp=FindFDTInfo(&TempFDT,Drive,ClusIndex,FDTData->Name);
std y+5,R13
std y+4,R12
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
mov R18,R14
movw R16,R28
subi R16,244 ; offset = 12
sbci R17,255
xcall _FindFDTInfo
mov R10,R16
; if(temp==RETURN_OK)
tst R16
brne L113
; {
; return FDT_EXISTS ;
ldi R16,10
xjmp L106
L113:
; }
; if(temp!=NOT_FIND_FDT)
mov R24,R10
cpi R24,7
breq L115
; if(temp!=FDT_OVER)
cpi R24,9
breq L117
; {
; return temp ;
mov R16,R24
xjmp L106
L117:
L115:
; }
;
; if(FDTData->Name[0]==DEL_FDT)
movw R30,R12
ldd R24,z+0
cpi R24,229
brne L119
; {
; FDTData->Name[0]=ESC_FDT ;
ldi R24,5
std z+0,R24
; }
L119:
;
; i=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+8,R20
std z+9,R21
std z+10,R22
std z+11,R23
; temp=RETURN_OK ;
clr R10
xjmp L122
L121:
; while(temp==RETURN_OK)
; {
; temp=GetFDTInfo(&TempFDT,Drive,ClusIndex,i);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+4,R2
std y+5,R3
std y+6,R4
std y+7,R5
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
mov R18,R14
movw R16,R28
subi R16,244 ; offset = 12
sbci R17,255
xcall _GetFDTInfo
mov R10,R16
; if(temp==RETURN_OK)
tst R16
brne L124
; {
; if(TempFDT.Name[0]==DEL_FDT||TempFDT.Name[0]==EMPTY_FDT)
ldd R24,y+12
cpi R24,229
breq L128
tst R24
brne L126
L128:
; {
; temp=SetFDTInfo(Drive,ClusIndex,i,FDTData);
std y+7,R13
std y+6,R12
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R14
xcall _SetFDTInfo
mov R10,R16
; break ;
xjmp L123
L126:
; }
; }
L124:
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+8,R2
std z+9,R3
std z+10,R4
std z+11,R5
L122:
tst R10
brne X33
xjmp L121
X33:
L123:
; i++;
; }
; if(temp==FDT_OVER)
mov R24,R10
cpi R24,9
breq X34
xjmp L129
X34:
; if(ClusIndex!=EMPTY_CLUS)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne X35
xjmp L131
X35:
; {
; i=FATAddClus(Drive,ClusIndex);
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R14
xcall _FATAddClus
movw R30,R28
std z+8,R16
std z+9,R17
std z+10,R18
std z+11,R19
; temp=DISK_FULL ;
ldi R24,2
mov R10,R24
; if(i!=BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L133
; {
; ClearClus(Drive,i);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R14
xcall _ClearClus
; temp=SetFDTInfo(Drive,i,0,FDTData);
std y+7,R13
std y+6,R12
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std y+2,R20
std y+3,R21
std y+4,R22
std y+5,R23
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R14
xcall _SetFDTInfo
mov R10,R16
; }
L133:
; }
L131:
L129:
; if(FDTData->Name[0]==ESC_FDT)
movw R30,R12
ldd R24,z+0
cpi R24,5
brne L135
; {
; FDTData->Name[0]=DEL_FDT ;
ldi R24,229
std z+0,R24
; }
L135:
; return temp ;
mov R16,R10
L106:
adiw R28,44
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
; i -> y+40
; temp -> R10
; TempFDT -> y+8
; FileName -> R12,R13
; ClusIndex -> y+54
; Drive -> R14
.even
_DelFDT::
st -y,r19
st -y,r18
xcall push_gset5
mov R14,R16
sbiw R28,44
ldd R12,y+58
ldd R13,y+59
; }
;
; /*********************************************************************************************************
; ** 函数名称: DelFDT
; ** 功能描述: 在指定目录删除指定文件(目录)
; **
; ** 输 入: Rt:存储返回信息的指针
; ** Drive:驱动器号
; ** ClusIndex:目录首簇号
; ** FileName:文件(目录)名
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,GetFDTInfo,SetFDTInfo
; **
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修改人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U DelFDT(INT8U Drive,INT32U ClusIndex,char FileName[])
; {
; INT32U i ;
; FDT TempFDT ;
; INT8U temp ;
;
; i=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+40,R20
std z+41,R21
std z+42,R22
std z+43,R23
; if(FileName[0]==DEL_FDT)
movw R30,R12
ldd R24,z+0
cpi R24,229
breq X36
xjmp L141
X36:
; {
; FileName[0]=ESC_FDT ;
ldi R24,5
std z+0,R24
; }
xjmp L141
L140:
;
; while(1)
; {
; temp=GetFDTInfo(&TempFDT,Drive,ClusIndex,i);
movw R30,R28
ldd R2,z+40
ldd R3,z+41
ldd R4,z+42
ldd R5,z+43
std y+4,R2
std y+5,R3
std y+6,R4
std y+7,R5
movw R30,R28
ldd R2,z+54
ldd R3,z+55
ldd R4,z+56
ldd R5,z+57
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
mov R18,R14
movw R16,R28
subi R16,248 ; offset = 8
sbci R17,255
xcall _GetFDTInfo
mov R10,R16
; if(temp!=RETURN_OK)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -