📄 dir.s
字号:
ldd R5,z+39
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R12
xcall _ClearClus
; /* 清空簇 */
;
; /* 设置FDT属性 */
; temp.Attr=ATTR_DIRECTORY ;
ldi R24,16
std y+15,R24
; temp.FileSize=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+32,R20
std z+33,R21
std z+34,R22
std z+35,R23
;
; temp.NTRes=0 ;
clr R2
std y+16,R2
; temp.CrtTimeTenth=time_getTime();
xcall _fs_getTime
std y+17,R16
; temp.CrtTime=time_getTime();
xcall _fs_getTime
std y+19,R17
std y+18,R16
; temp.CrtDate=time_getDate();
xcall _fs_getDate
std y+21,R17
std y+20,R16
; temp.LstAccDate=time_getDate();
xcall _fs_getDate
std y+23,R17
std y+22,R16
; temp.WrtTime=time_getTime();
xcall _fs_getTime
std y+27,R17
std y+26,R16
; temp.WrtDate=time_getDate();
xcall _fs_getDate
std y+29,R17
std y+28,R16
;
; temp.FstClusLO=(INT16U)(Temp1&0xffff);
ldi R20,255
ldi R21,255
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
and R2,R20
and R3,R21
and R4,R22
and R5,R23
std y+31,R3
std y+30,R2
; //temp.FstClusHI=Temp1/0x10000 ;
; temp.FstClusHI=(INT16U)(Temp1>>16);
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
movw R2,R4
std y+25,R3
std y+24,R2
;
; Rt=AddFDT(Drive,ClusIndex,&temp);
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
mov R16,R12
xcall _AddFDT
mov R10,R16
; /* 增加目录项 */
; if(Rt==RETURN_OK)
tst R16
breq X7
xjmp L127
X7:
; {
; /* 建立'.'目录 */
; temp.Name[0]='.' ;
ldi R24,46
std y+4,R24
; temp.Name[1]=0x20 ;
ldi R24,32
std y+5,R24
; temp.Name[2]=0x20 ;
std y+6,R24
; temp.Name[3]=0x20 ;
std y+7,R24
; temp.Name[4]=0x20 ;
std y+8,R24
; temp.Name[5]=0x20 ;
std y+9,R24
; temp.Name[6]=0x20 ;
std y+10,R24
; temp.Name[7]=0x20 ;
std y+11,R24
; temp.Name[8]=0x20 ;
std y+12,R24
; temp.Name[9]=0x20 ;
std y+13,R24
; temp.Name[10]=0x20 ;
std y+14,R24
;
; AddFDT(Drive,Temp1,&temp);
movw R24,R28
adiw R24,4
std y+3,R25
std y+2,R24
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R12
xcall _AddFDT
;
; /* 建立'..'目录 */
; temp.Name[1]='.' ;
ldi R24,46
std y+5,R24
;
; temp.FstClusLO=(INT16U)(ClusIndex&0xffff);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+40
ldd R3,z+41
ldd R4,z+42
ldd R5,z+43
and R2,R20
and R3,R21
and R4,R22
and R5,R23
std y+31,R3
std y+30,R2
; //temp.FstClusHI=ClusIndex/0x10000 ;
; temp.FstClusHI=(INT16U)(Temp1>>16);
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
movw R2,R4
std y+25,R3
std y+24,R2
;
; Rt=AddFDT(Drive,Temp1,&temp);
movw R24,R28
adiw R24,4
std y+3,R25
std y+2,R24
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R12
xcall _AddFDT
mov R10,R16
; }
xjmp L128
L127:
; else
; {
; FATDelClusChain(Drive,Temp1);
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R12
xcall _FATDelClusChain
; }
L128:
; return Rt ;
mov R16,R10
L108:
adiw R28,44
xcall pop_gset4
.dbline 0 ; func end
ret
; ClusIndex1 -> y+54
; temp -> y+22
; DirName -> y+10
; Drive -> R12
; ClusIndex -> y+6
; Rt -> R10
; Path -> R10,R11
.even
_RemoveDir::
xcall push_gset4
movw R10,R16
sbiw R28,58
; }
;
; /*********************************************************************************************************
; ** 函数名称: RemoveDir
; ** 功能描述: 删除目录
; ** 输 入: Path:路径名
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: strupr,DelFDT
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U RemoveDir(char *Path)
; {
; INT32U ClusIndex,ClusIndex1 ;
; INT8U Drive,Rt ;
; char DirName[12];
; FDT temp ;
;
; strupr(Path);
movw R16,R10
xcall _strupr
; /* 变为大写 */
; ClusIndex=_GetFDTInfo(DirName,Path);
movw R18,R10
movw R16,R28
subi R16,246 ; offset = 10
sbci R17,255
xcall __GetFDTInfo
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
; if(ClusIndex==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
brne L143
; {
; return PATH_NOT_FIND ;
ldi R16,14
xjmp L142
L143:
; }
;
; Drive=GetDrive(Path);
movw R16,R10
xcall _GetDrive
mov R12,R16
;
; /* 获取FDT其信息 */
; Rt=FindFDTInfo(&temp,Drive,ClusIndex,DirName);
movw R24,R28
adiw R24,10
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,234 ; offset = 22
sbci R17,255
xcall _FindFDTInfo
mov R10,R16
; if(Rt==RETURN_OK)
tst R16
breq X8
xjmp L145
X8:
; {
; /* 是否是目录 */
; if((temp.Attr&ATTR_DIRECTORY)!=0)
ldd R2,y+33
sbrs R2,4
rjmp L147
; {
; /* 是 */
; ClusIndex1=temp.FstClusLO+((INT32U)(temp.FstClusHI)<<16);
ldd R2,y+42
ldd R3,y+43
clr R4
clr R5
movw R4,R2
clr R2
clr R3
ldd R6,y+48
ldd R7,y+49
clr R8
clr R9
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+54,R6
std z+55,R7
std z+56,R8
std z+57,R9
; /* 是否是空目录 */
; Rt=DirIsEmpty(Drive,ClusIndex1);
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,R12
xcall _DirIsEmpty
mov R10,R16
; if(Rt==DIR_EMPTY)
cpi R16,12
brne L148
; {
; /* 是,删除 */
; FATDelClusChain(Drive,ClusIndex1);
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,R12
xcall _FATDelClusChain
; Rt=DelFDT(Drive,ClusIndex,DirName);
movw R24,R28
adiw R24,10
std y+3,R25
std y+2,R24
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
mov R16,R12
xcall _DelFDT
mov R10,R16
; }
; }
xjmp L148
L147:
; else
; {
; return PATH_NOT_FIND ;
ldi R16,14
xjmp L142
L148:
; }
; }
L145:
; return Rt ;
mov R16,R10
L142:
adiw R28,58
xcall pop_gset4
.dbline 0 ; func end
ret
; Drive -> R12
; Disk -> R12,R13
; ClusIndex -> y+0
; Rt -> R10
; Path -> R12,R13
.even
_ChangeDir::
xcall push_gset4
movw R12,R16
sbiw R28,4
; }
;
; /*********************************************************************************************************
; ** 函数名称: ChangeDir
; ** 功能描述: 改变当前目录
; ** 输 入: Path:路径名
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDirClusIndex,GetDiskInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U ChangeDir(char *Path)
; {
; INT32U ClusIndex ;
; INT8U Rt,Drive ;
; Disk_Info *Disk ;
;
; Rt=PATH_NOT_FIND ;
ldi R24,14
mov R10,R24
; ClusIndex=GetDirClusIndex(Path);
movw R16,R12
xcall _GetDirClusIndex
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
; if(ClusIndex!=BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L155
; {
; Drive=GetDrive(Path);
movw R16,R12
xcall _GetDrive
; Disk=GetDiskInfo(Drive);
xcall _GetDiskInfo
movw R12,R16
; Rt=NOT_FIND_DISK ;
clr R10
inc R10
; if(Disk!=NULL)
cpi R16,0
cpc R16,R17
breq L157
X9:
; {
; Rt=RETURN_OK ;
clr R10
; Disk->PathClusIndex=ClusIndex ;
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R12
std z+36,R2
std z+37,R3
std z+38,R4
std z+39,R5
; }
L157:
; }
L155:
; return Rt ;
mov R16,R10
L154:
adiw R28,4
xcall pop_gset4
.dbline 0 ; func end
ret
; cp -> R20,R21
; Str -> R16,R17
.even
_strupr::
xcall push_gset1
; }
;
;
; char *strupr(char *Str)
; {
; char *cp;
; cp = Str;
movw R20,R16
xjmp L161
L160:
;
; while (*cp != 0)
; {
; if (*cp >= 'a' && *cp <= 'z' )
movw R30,R20
ldd R2,z+0
clr R3
mov R24,R2
cpi R24,97
brlo L163
ldi R24,122
cp R24,R2
brlo L163
; {
; *cp -= 'a' - 'A';
ldd R24,z+0
subi R24,32
std z+0,R24
; }
L163:
subi R20,255 ; offset = 1
sbci R21,255
L161:
movw R30,R20
ldd R2,z+0
tst R2
brne L160
; cp++;
; }
; return Str;
L159:
xcall pop_gset1
.dbline 0 ; func end
ret
.area bss(ram, con, rel)
_CurrentDrive:
.blkb 1
.area data(ram, con, rel)
L51:
.blkb 2
.area idata
.byte 46,0
.area data(ram, con, rel)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -