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

📄 fdt.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
; **           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 + -