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

📄 dir.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
;           Path -> R14,R15
	.even
_GetDirClusIndex::
	xcall push_gset5
	movw R14,R16
	sbiw R28,54
; }
; 
; /*********************************************************************************************************
; ** 函数名称: GetDirClusIndex
; ** 功能描述: 获取指定目录开始簇号
; ** 输   入: Path:路径名
; ** 输   出: 开始簇号,EMPTY_CLUS:为根目录
; ** 全局变量: 无
; ** 调用模块: strupr,GetDiskInfo,FindFDTInfo
; ** 作   者: 陈明计
; ** 日   期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U GetDirClusIndex(char *Path)
; {
;     char DirName[12];
;     INT8U Drive ;
;     INT32U Rt ;
;     FDT temp ;
;     Disk_Info *Disk ;
;     
;     Rt=BAD_CLUS ;
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
;     if(Path!=NULL)
	tst R14
	brne X2
	tst R15
	brne X4
	xjmp L65
X4:
X2:
;     {
;         strupr(Path);/* 变为大写 */
	movw R16,R14
	xcall _strupr
;         Drive=GetDrive(Path);/* 获取路基盘符 */
	movw R16,R14
	xcall _GetDrive
	mov R12,R16
;         if(Path[1]==':')
	movw R30,R14
	ldd R24,z+1
	cpi R24,58
	brne L67
;         {
;             Path+=2 ;
	movw R24,R14
	adiw R24,2
	movw R14,R24
;         }
L67:
;         Disk=GetDiskInfo(Drive);/* 获取逻辑盘信息 */
	mov R16,R12
	xcall _GetDiskInfo
	movw R10,R16
;         if(Disk!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X5
	xjmp L69
X5:
X3:
;         {
;             Rt=0 ;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
;             if(Disk->FATType==FAT32)/* FAT32 根目录 */
	movw R30,R10
	ldd R24,z+1
	cpi R24,2
	brne L71
;             {
;                 Rt=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+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;             }
L71:
;             if(Path[0]!='\\')/* 不是目录分隔符号,表明起点是当前路径 */
	movw R30,R14
	ldd R24,z+0
	cpi R24,92
	breq L73
;             {
;                 Rt=Disk->PathClusIndex ;
	movw R30,R10
	ldd R2,z+36
	ldd R3,z+37
	ldd R4,z+38
	ldd R5,z+39
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;             }
	xjmp L74
L73:
;             else 
;             {
;                 Path++;
	movw R24,R14
	adiw R24,1
	movw R14,R24
;             }
L74:
;             /* '\.'表明起点是当前路径 */
;             if(Path[0]=='.')
	movw R30,R14
	ldd R24,z+0
	cpi R24,46
	brne L75
;             {
;                 Rt=Disk->PathClusIndex ;
	movw R30,R10
	ldd R2,z+36
	ldd R3,z+37
	ldd R4,z+38
	ldd R5,z+39
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;                 if(Path[1]==0||Path[1]=='\\')
	movw R30,R14
	ldd R2,z+1
	clr R3
	tst R2
	breq L79
	mov R24,R2
	cpi R24,92
	brne L77
L79:
;                 {
;                     Path++;
	movw R24,R14
	adiw R24,1
	movw R14,R24
;                 }
L77:
;             }
L75:
;             if(Path[0]=='\\')
	movw R30,R14
	ldd R24,z+0
	cpi R24,92
	brne L80
;             {
;                 Path++;
	movw R24,R30
	adiw R24,1
	movw R14,R24
;             }
L80:
;             
;             DirName[11]=0 ;
	clr R2
	std y+53,R2
	xjmp L84
L83:
;             while(Path[0]!=0)
;             {
;                 /* 获取子目录名 */
;                 StrToFDTName(DirName,Path);
	movw R18,R14
	movw R16,R28
	subi R16,214  ; offset = 42
	sbci R17,255
	xcall _StrToFDTName
;                 
;                 /* 子目录名开始簇号 */
;                 if(DirName[0]==0x20)
	ldd R24,y+42
	cpi R24,32
	brne L86
;                 {
;                     Rt=BAD_CLUS ;
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
;                     break ;
	xjmp L85
L86:
;                 }
;                 /* 获取FDT信息 */
;                 if(FindFDTInfo(&temp,Drive,Rt,DirName)!=RETURN_OK)
	movw R24,R28
	adiw R24,42
	std y+5,R25
	std y+4,R24
	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,R12
	movw R16,R28
	subi R16,246  ; offset = 10
	sbci R17,255
	xcall _FindFDTInfo
	tst R16
	breq L88
;                 {
;                     Rt=BAD_CLUS ;
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
;                     break ;
	xjmp L85
L88:
;                 }
;                 /* FDT是否是目录 */
;                 if((temp.Attr&ATTR_DIRECTORY)==0)
	ldd R2,y+21
	sbrc R2,4
	rjmp L90
;                 {
;                     Rt=BAD_CLUS ;
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
;                     break ;
	xjmp L85
L90:
;                 }
;                 Rt=temp.FstClusLO+((INT32U)(temp.FstClusHI)<<16);
	ldd R2,y+30
	ldd R3,y+31
	clr R4
	clr R5
	movw R4,R2
	clr R2
	clr R3
	ldd R6,y+36
	ldd R7,y+37
	clr R8
	clr R9
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+6,R6
	std z+7,R7
	std z+8,R8
	std z+9,R9
	xjmp L96
L95:
;                 /* 字符串到下一个目录 */
;                 while(1)
;                 {
;                     if(*Path=='\\')
	movw R30,R14
	ldd R24,z+0
	cpi R24,92
	brne L98
;                     {
;                         Path++;
	movw R24,R30
	adiw R24,1
	movw R14,R24
;                         break ;
	xjmp L97
L98:
;                     }
;                     if(*Path==0)
	movw R30,R14
	ldd R2,z+0
	tst R2
	brne L100
;                     {
;                         break ;
	xjmp L97
L100:
	movw R24,R14
	adiw R24,1
	movw R14,R24
L96:
	xjmp L95
L97:
L84:
	movw R30,R14
	ldd R2,z+0
	tst R2
	breq X6
	xjmp L83
X6:
L85:
;                     }
;                     Path++;
;                 }
;             }
;         }
L69:
;         if(Disk->FATType==FAT32)
	movw R30,R10
	ldd R24,z+1
	cpi R24,2
	brne L102
;         if(Rt!=BAD_CLUS)
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L104
;         if(Rt==Disk->RootDirTable)
	movw R30,R10
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	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
	brne L106
;         {
;             Rt=0 ;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
;         }
L106:
L104:
L102:
;     }
L65:
;     return Rt ;
	movw R30,R28
	ldd R16,z+6
	ldd R17,z+7
	ldd R18,z+8
	ldd R19,z+9
L64:
	adiw R28,54
	xcall pop_gset5
	.dbline 0 ; func end
	ret
;      ClusIndex -> y+40
;             Rt -> R10
;          Drive -> R12
;          Temp1 -> y+36
;           temp -> y+4
;           Path -> R10,R11
	.even
_MakeDir::
	xcall push_gset4
	movw R10,R16
	sbiw R28,44
; }
; 
; /*********************************************************************************************************
; ** 函数名称: MakeDir
; ** 功能描述: 建立目录
; ** 输   入: Path:路径名
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: strupr,ClearClus,AddFDT
; ** 作   者: 陈明计
; ** 日   期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U MakeDir(char *Path)
; {
;     INT32U ClusIndex,Temp1 ;
;     INT8U  Drive,Rt ;
;     FDT    temp ;
;     
;     strupr(Path);/* 变为大写 */
	movw R16,R10
	xcall _strupr
;     
;     ClusIndex=_GetFDTInfo(temp.Name,Path);
	movw R18,R10
	movw R16,R28
	subi R16,252  ; offset = 4
	sbci R17,255
	xcall __GetFDTInfo
	movw R30,R28
	std z+40,R16
	std z+41,R17
	std z+42,R18
	std z+43,R19
;     if(ClusIndex==BAD_CLUS)
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+40
	ldd R3,z+41
	ldd R4,z+42
	ldd R5,z+43
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L109
;     {
;         return PATH_NOT_FIND ;
	ldi R16,14
	xjmp L108
L109:
;     }
;     
;     Drive=GetDrive(Path);
	movw R16,R10
	xcall _GetDrive
	mov R12,R16
;     
;     /* FDT是否存在 */
;     Rt=FDTIsLie(Drive,ClusIndex,temp.Name);
	movw R24,R28
	adiw R24,4
	std y+3,R25
	std y+2,R24
	movw R30,R28
	ldd R2,z+40
	ldd R3,z+41
	ldd R4,z+42
	ldd R5,z+43
	std y+0,R4
	std y+1,R5
	movw R18,R2
	xcall _FDTIsLie
	mov R10,R16
;     if(Rt!=NOT_FIND_FDT)
	cpi R16,7
	breq L111
;     {
;         return Rt ;
	xjmp L108
L111:
;     }
;     
;     /* 不存在 */
;     Temp1=FATAddClus(Drive,0);
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std y+0,R22
	std y+1,R23
	movw R18,R20
	mov R16,R12
	xcall _FATAddClus
	movw R30,R28
	std z+36,R16
	std z+37,R17
	std z+38,R18
	std z+39,R19
;     
;     if((Temp1<=EMPTY_CLUS_1)||(Temp1>=BAD_CLUS))/* 获取目录所需磁盘空间 */
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+36
	ldd R3,z+37
	ldd R4,z+38
	ldd R5,z+39
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brsh L115
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+36
	ldd R3,z+37
	ldd R4,z+38
	ldd R5,z+39
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L113
L115:
;     {
;         /* 没有空闲空间 */
;         return DISK_FULL ;
	ldi R16,2
	xjmp L108
L113:
;     }
;     
;     ClearClus(Drive,Temp1);
	movw R30,R28
	ldd R2,z+36
	ldd R3,z+37
	ldd R4,z+38

⌨️ 快捷键说明

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