📄 dir.s
字号:
; 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 + -