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

📄 fdt.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
	movw R10,R30
;             *Buf++=FDTData->Name[5];
	movw R30,R12
	ldd R2,z+5
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[6];
	movw R30,R12
	ldd R2,z+6
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[7];
	movw R30,R12
	ldd R2,z+7
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[8];
	movw R30,R12
	ldd R2,z+8
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[9];
	movw R30,R12
	ldd R2,z+9
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Name[10];
	movw R30,R12
	ldd R2,z+10
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->Attr ;
	movw R30,R12
	ldd R2,z+11
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->NTRes ;
	movw R30,R12
	ldd R2,z+12
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->CrtTimeTenth ;
	movw R30,R12
	ldd R2,z+13
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->CrtTime ;
	movw R30,R12
	ldd R2,z+14
	ldd R3,z+15
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->CrtTime)>>8 ;
	movw R30,R12
	ldd R2,z+14
	ldd R3,z+15
	mov R2,R3
	clr R3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->CrtDate ;
	movw R30,R12
	ldd R2,z+16
	ldd R3,z+17
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->CrtDate)>>8 ;
	movw R30,R12
	ldd R2,z+16
	ldd R3,z+17
	mov R2,R3
	clr R3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->LstAccDate ;
	movw R30,R12
	ldd R2,z+18
	ldd R3,z+19
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->LstAccDate)>>8 ;
	movw R30,R12
	ldd R2,z+18
	ldd R3,z+19
	mov R2,R3
	clr R3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->FstClusHI ;
	movw R30,R12
	ldd R2,z+20
	ldd R3,z+21
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->FstClusHI)>>8 ;
	movw R30,R12
	ldd R2,z+20
	ldd R3,z+21
	mov R2,R3
	clr R3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->WrtTime ;
	movw R30,R12
	ldd R2,z+22
	ldd R3,z+23
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->WrtTime)>>8 ;
	movw R30,R12
	ldd R2,z+22
	ldd R3,z+23
	mov R2,R3
	clr R3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->WrtDate ;
	movw R30,R12
	ldd R2,z+24
	ldd R3,z+25
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->WrtDate)>>8 ;
	movw R30,R12
	ldd R2,z+24
	ldd R3,z+25
	mov R2,R3
	clr R3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=FDTData->FstClusLO ;
	movw R30,R12
	ldd R2,z+26
	ldd R3,z+27
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->FstClusLO)>>8 ;
	movw R30,R12
	ldd R2,z+26
	ldd R3,z+27
	mov R2,R3
	clr R3
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->FileSize);
	movw R30,R12
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf++=(FDTData->FileSize)>>8 ;
	ldi R24,8
	ldi R25,0
	movw R30,R12
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R30,R10
	st Z+,R16
	movw R10,R30
;             *Buf++=(FDTData->FileSize)>>16 ;
	movw R30,R12
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	movw R2,R4
	clr R4
	clr R5
	movw R30,R10
	st Z+,R2
	movw R10,R30
;             *Buf=(FDTData->FileSize)>>24 ;
	ldi R24,24
	ldi R25,0
	movw R30,R12
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R30,R10
	std z+0,R16
;             WriteSec(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 _WriteSec
;         }
L18:
;         CloseSec(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 _CloseSec
;     }
L16:
;     return temp ;
	mov R16,R20
L15:
	adiw R28,2
	xcall pop_gset4
	adiw R28,2
	.dbline 0 ; func end
	ret
;       SecIndex -> y+6
;      ByteIndex -> R12,R13
;           temp -> R10
;           Disk -> R14,R15
;          Index -> y+24
;          Drive -> y+22
;             Rt -> y+20
	.even
_GetRootFDTInfo::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,10
; }
; 
; /*********************************************************************************************************
; ** 函数名称: GetRootFDTInfo
; ** 功能描述: 获取根目录指定文件(目录)信息
; ** 输   入: Rt:存储返回信息的指针
; **           Drive:驱动器号
; **           Index:文件(目录)在FDT中的位置
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,GetFDTInfo,ReadFDTInfo
; ** 作   者: 陈明计
; ** 日   期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U GetRootFDTInfo(FDT *Rt,INT8U Drive,INT32U Index)
; {
;     Disk_Info *Disk ;
;     INT16U ByteIndex ;
;     INT32U SecIndex ;
;     INT8U  temp ;
;     
;     temp=NOT_FIND_DISK ;
	clr R10
	inc R10
;     Disk=GetDiskInfo(Drive);
	ldd R16,y+22
	xcall _GetDiskInfo
	movw R14,R16
;     if(Disk!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X11
	xjmp L21
X11:
X10:
;     {
;         temp=NOT_FAT_DISK ;
	ldi R24,8
	mov R10,R24
;         Index=Index*32 ;/* 32:sizeof(FDT ) */
	movw R30,R28
	ldd R2,z+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	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+24,R16
	std z+25,R17
	std z+26,R18
	std z+27,R19
;         
;         if(Disk->FATType==FAT12||Disk->FATType==FAT16)
	movw R30,R14
	ldd R2,z+1
	clr R3
	tst R2
	breq L25
	mov R24,R2
	cpi R24,1
	breq X12
	xjmp L23
X12:
L25:
;         {
;             temp=FDT_OVER ;
	ldi R24,9
	mov R10,R24
;             if(Index<(Disk->RootSecCnt*Disk->BytsPerSec))
	movw R30,R14
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R14
	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+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	cp R2,R16
	cpc R3,R17
	cpc R4,R18
	cpc R5,R19
	brlo X13
	xjmp L26
X13:
;             {
;                 ByteIndex=Index%Disk->BytsPerSec ;
	movw R30,R14
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	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 mod32u
	movw R12,R16
;                 SecIndex=Index/Disk->BytsPerSec+Disk->RootDirTable ;
	movw R30,R14
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	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 div32u
	movw R2,R16
	movw R4,R18
	movw R30,R14
	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
;                 temp=ReadFDTInfo(Rt,Drive,SecIndex,ByteIndex);
	std y+5,R13
	std y+4,R12
	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
	ldd R18,y+22
	ldd R16,y+20
	ldd R17,y+21
	xcall _ReadFDTInfo
	mov R10,R16
;             }
L26:
;         }
L23:
;     }
L21:
;     return temp ;
	mov R16,R10
L20:
	adiw R28,10
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
;      ByteIndex -> R10,R11
;           Disk -> R12,R13
;              i -> y+10
;       SecIndex -> y+6
;          Index -> y+32
;      ClusIndex -> y+28
;          Drive -> R14
;             Rt -> y+24
	.even
_GetFDTInfo::
	xcall push_arg4
	xcall push_gset5
	mov R14,R18
	sbiw R28,14
; }
; 
; /*********************************************************************************************************
; ** 函数名称: GetFDTInfo
; ** 功能描述: 获取指定目录指定文件(目录)信息
; ** 输   入: Rt:存储返回信息的指针
; **           Drive:驱动器号
; **           ClusIndex:目录首簇号
; **           Index:文件(目录)在FDT中的位置
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,ReadFDTInfo
; ** 作   者: 陈明计
; ** 日   期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U GetFDTInfo(FDT *Rt,INT8U Drive,INT32U ClusIndex,INT32U Index)
; {
;     Disk_Info *Disk ;
;     INT16U ByteIndex ;
;     INT32U SecIndex,i ;
;     
;     Disk=GetDiskInfo(Drive);
	mov R16,R14
	xcall _GetDiskInfo
	movw R12,R16
;     if(Disk==NULL)
	cpi R16,0
	cpc R16,R17
	brne L29
X14:
;     {
;         return NOT_FIND_DISK ;
	ldi R16,1
	xjmp L28
L29:
;     }
;     
;     if(ClusIndex==EMPTY_CLUS)
	ldi R20,0
	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
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L31
;     {
;         if(Disk->FATType==FAT32)
	movw R30,R12
	ldd R24,z+1
	cpi R24,2
	brne L33
;         {
;             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+28,R2
	std z+29,R3
	std z+30,R4
	std z+31,R5
;         }
	xjmp L34
L33:
;         else 
;         {
;             return GetRootFDTInfo(Rt,Drive,Index);
	movw R30,R28
	ldd R2,z+32
	ldd R3,z+33
	ldd R4,z+34
	ldd R5,z+35
	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 _GetRootFDTInfo
	xjmp L28
L34:
;         }
;     }
L31:
;     
;     if((Disk->FATType==FAT12)||(Disk->FATType==FAT16)||(Disk->FATType==FAT32))
	movw R30,R12
	ldd R2,z+1
	clr R3
	tst R2
	breq L38
	mov R24,R2
	cpi R24,1
	breq L38
	cpi R24,2
	breq X15
	xjmp L35
X15:
L38:
;     {
;         Index=Index*32 ;
	movw R30,R28
	ldd R2,z+32
	ldd R3,z+33
	ldd R4,z+34
	ldd R5,z+35
	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+32,R16
	std z+33,R17
	std z+34,R18
	std z+35,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+32
	ldd R7,z+33
	ldd R8,z+34
	ldd R9,z+35
	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+32
	ldd R7,z+33
	ldd R8,z+34
	ldd R9,z+35
	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 R2,z+2
	clr R3
	clr R4
	clr R5
	movw R30,R28
	std z+10,R2
	std z+11,R3
	std z+12,R4
	std z+13,R5
	xjmp L40
L39:
;         while(SecIndex>=i)
;         {
;             ClusIndex=FATGetNextClus(Drive,ClusIndex);
	movw R30,R28
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R14
	xcall _FATGetNextClus
	movw R30,R28
	std z+28,R16
	std z+29,R17
	std z+30,R18
	std z+31,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+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brsh L44
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L42
L44:
;             {
;                 return FDT_OVER ;
	ldi R16,9

⌨️ 快捷键说明

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