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

📄 fdt.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
	xjmp L28
L42:
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	std z+6,R6
	std z+7,R7
	std z+8,R8
	std z+9,R9
L40:
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo X16
	xjmp L39
X16:
;             }
;             SecIndex-=i ;
;         }
;         SecIndex=(ClusIndex-2)*i+SecIndex+Disk->DataStartSec ;
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R30,R28
	ldd R6,z+10
	ldd R7,z+11
	ldd R8,z+12
	ldd R9,z+13
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R2
	movw R18,R4
	xcall empy32u
	movw R2,R16
	movw R4,R18
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R12
	ldd R6,z+28
	ldd R7,z+29
	ldd R8,z+30
	ldd R9,z+31
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;         return ReadFDTInfo(Rt,Drive,SecIndex,ByteIndex);
	std y+5,R11
	std y+4,R10
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	mov R18,R14
	ldd R16,y+24
	ldd R17,y+25
	xcall _ReadFDTInfo
	xjmp L28
L35:
;     }
;     return NOT_FAT_DISK ;
	ldi R16,8
L28:
	adiw R28,14
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
;       SecIndex -> y+6
;      ByteIndex -> R14,R15
;             Rt -> R10
;           Disk -> R12,R13
;        FDTData -> y+26
;          Index -> y+22
;          Drive -> y+20
	.even
_SetRootFDTInfo::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,10
; }
; 
; /*********************************************************************************************************
; ** 函数名称: SetRootFDTInfo
; ** 功能描述: 设置根目录指定文件(目录)信息
; ** 输   入: FDTData:要写入的信息
; **           Drive:驱动器号
; **           Index:文件(目录)在FDT中的位置
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,SetFDTInfo,WriteFDTInfo
; ** 作   者: 陈明计
; ** 日   期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U SetRootFDTInfo(INT8U Drive,INT32U Index,FDT *FDTData)
; {
;     Disk_Info *Disk ;
;     INT16U ByteIndex ;
;     INT32U SecIndex ;
;     INT8U Rt ;
;     
;     Rt=NOT_FIND_DISK ;
	clr R10
	inc R10
;     Disk=GetDiskInfo(Drive);
	ldd R16,y+20
	xcall _GetDiskInfo
	movw R12,R16
;     if(Disk!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X18
	xjmp L46
X18:
X17:
;     {
;         Index=Index*32 ;
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	ldi R20,32
	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 R30,R28
	std z+22,R16
	std z+23,R17
	std z+24,R18
	std z+25,R19
;         /* 32:sizeof(FDT ) */
;         if(Disk->FATType==FAT12||Disk->FATType==FAT16)
	movw R30,R12
	ldd R2,z+1
	clr R3
	tst R2
	breq L50
	mov R24,R2
	cpi R24,1
	breq X19
	xjmp L48
X19:
L50:
;         {
;             Rt=FDT_OVER ;
	ldi R24,9
	mov R10,R24
;             if(Index<(Disk->RootSecCnt*Disk->BytsPerSec))
	movw R30,R12
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R12
	ldd R6,z+24
	ldd R7,z+25
	ldd R8,z+26
	ldd R9,z+27
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32u
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	cp R2,R16
	cpc R3,R17
	cpc R4,R18
	cpc R5,R19
	brlo X20
	xjmp L51
X20:
;             {
;                 ByteIndex=Index%Disk->BytsPerSec ;
	movw R30,R12
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	ldd R6,z+22
	ldd R7,z+23
	ldd R8,z+24
	ldd R9,z+25
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall mod32u
	movw R14,R16
;                 SecIndex=Index/Disk->BytsPerSec+Disk->RootDirTable ;
	movw R30,R12
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	ldd R6,z+22
	ldd R7,z+23
	ldd R8,z+24
	ldd R9,z+25
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall div32u
	movw R2,R16
	movw R4,R18
	movw R30,R12
	ldd R6,z+20
	ldd R7,z+21
	ldd R8,z+22
	ldd R9,z+23
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;                 Rt=WriteFDTInfo(Drive,SecIndex,ByteIndex,FDTData);
	ldd R0,y+26
	ldd R1,y+27
	std y+5,R1
	std y+4,R0
	std y+3,R15
	std y+2,R14
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+20
	xcall _WriteFDTInfo
	mov R10,R16
;             }
L51:
;         }
L48:
;     }
L46:
;     return Rt ;
	mov R16,R10
L45:
	adiw R28,10
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
;      ByteIndex -> R10,R11
;           Disk -> R12,R13
;              i -> R14
;       SecIndex -> y+6
;        FDTData -> y+30
;          Index -> y+26
;      ClusIndex -> y+22
;          Drive -> y+20
	.even
_SetFDTInfo::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,10
; }
; 
; /*********************************************************************************************************
; ** 函数名称: SetFDTInfo
; ** 功能描述: 设置指定目录指定文件(目录)信息
; ** 输   入: FDTData:要写入的信息
; **           Drive:驱动器号
; **           ClusIndex:目录首簇号
; **           Index:文件(目录)在FDT中的位置
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,WriteFDTInfo
; ** 作   者: 陈明计
; ** 日   期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U SetFDTInfo(INT8U Drive,INT32U ClusIndex,INT32U Index,FDT *FDTData)
; {
;     Disk_Info *Disk ;
;     INT16U ByteIndex ;
;     INT32U SecIndex ;
;     INT8U i ;
;     
;     Disk=GetDiskInfo(Drive);
	ldd R16,y+20
	xcall _GetDiskInfo
	movw R12,R16
;     if(Disk==NULL)
	cpi R16,0
	cpc R16,R17
	brne L54
X21:
;     {
;         return NOT_FIND_DISK ;
	ldi R16,1
	xjmp L53
L54:
;     }
;     
;     if(ClusIndex==EMPTY_CLUS)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L56
;     {
;         if(Disk->FATType==FAT32)
	movw R30,R12
	ldd R24,z+1
	cpi R24,2
	brne L58
;         {
;             ClusIndex=Disk->RootDirTable ;
	movw R30,R12
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	movw R30,R28
	std z+22,R2
	std z+23,R3
	std z+24,R4
	std z+25,R5
;         }
	xjmp L59
L58:
;         else 
;         {
;             return SetRootFDTInfo(Drive,Index,FDTData);
	ldd R0,y+30
	ldd R1,y+31
	std y+3,R1
	std y+2,R0
	movw R30,R28
	ldd R2,z+26
	ldd R3,z+27
	ldd R4,z+28
	ldd R5,z+29
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+20
	xcall _SetRootFDTInfo
	xjmp L53
L59:
;         }
;     }
L56:
;     
;     if(Disk->FATType==FAT12||Disk->FATType==FAT16||Disk->FATType==FAT32)
	movw R30,R12
	ldd R2,z+1
	clr R3
	tst R2
	breq L63
	mov R24,R2
	cpi R24,1
	breq L63
	cpi R24,2
	breq X22
	xjmp L60
X22:
L63:
;     {
;         Index=Index*32 ;
	movw R30,R28
	ldd R2,z+26
	ldd R3,z+27
	ldd R4,z+28
	ldd R5,z+29
	ldi R20,32
	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 R30,R28
	std z+26,R16
	std z+27,R17
	std z+28,R18
	std z+29,R19
;         ByteIndex=Index%Disk->BytsPerSec ;
	movw R30,R12
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	ldd R6,z+26
	ldd R7,z+27
	ldd R8,z+28
	ldd R9,z+29
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall mod32u
	movw R10,R16
;         SecIndex=Index/Disk->BytsPerSec ;
	movw R30,R12
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	ldd R6,z+26
	ldd R7,z+27
	ldd R8,z+28
	ldd R9,z+29
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall div32u
	movw R30,R28
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
;         /* 计算目录项所在扇区 */
;         i=Disk->SecPerClus ;
	movw R30,R12
	ldd R14,z+2
	xjmp L65
L64:
;         while(SecIndex>=i)
;         {
;             ClusIndex=FATGetNextClus(Drive,ClusIndex);
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+20
	xcall _FATGetNextClus
	movw R30,R28
	std z+22,R16
	std z+23,R17
	std z+24,R18
	std z+25,R19
;             if(ClusIndex<=EMPTY_CLUS_1||ClusIndex>=BAD_CLUS)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brsh L69
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L67
L69:
;             {
;                 return FDT_OVER ;
	ldi R16,9
	xjmp L53
L67:
	mov R2,R14
	clr R3
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	std z+6,R6
	std z+7,R7
	std z+8,R8
	std z+9,R9
L65:
	mov R2,R14
	clr R3
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo X23
	xjmp L64
X23:
;             }
;             SecIndex-=i ;
;         }
;         SecIndex=(ClusIndex-2)*i+SecIndex+Disk->DataStartSec ;
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	mov R6,R14
	clr R7
	clr R8
	clr R9
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R2
	movw R18,R4
	xcall empy32u
	movw R2,R16
	movw R4,R18
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R12
	ldd R6,z+28
	ldd R7,z+29
	ldd R8,z+30
	ldd R9,z+31
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;         
;         return WriteFDTInfo(Drive,SecIndex,ByteIndex,FDTData);
	ldd R0,y+30
	ldd R1,y+31
	std y+5,R1
	std y+4,R0
	std y+3,R11
	std y+2,R10
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+20
	xcall _WriteFDTInfo
	xjmp L53
L60:
;     }
;     return NOT_FAT_DISK ;
	ldi R16,8
L53:
	adiw R28,10
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
;              i -> y+8
;           temp -> R10
;       FileName -> R12,R13
;      ClusIndex -> y+22
;          Drive -> R14
;             Rt -> R6,R7
	.even
_FindFDTInfo::
	xcall push_gset5
	mov R14,R18
	movw R6,R16
	sbiw R28,12
	ldd R12,y+26
	ldd R13,y+27
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FindFDTInfo
; ** 功能描述: 在指定目录查找指定文件(目录)
; ** 输   入: Rt:存储返回信息的指针
; **           Drive:驱动器号

⌨️ 快捷键说明

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