📄 file.s
字号:
movw R12,R24
L55:
inc R10
L57:
mov R24,R10
cpi R24,3
brge X23
xjmp L54
X23:
L56:
; }
; fp++;
; }
; if(Rt>=MAX_OPEN_FILES)
mov R24,R10
cpi R24,3
brlt L86
; {
; Rt=Not_Open_FILE ;
ldi R24,255
mov R10,R24
; }
L86:
; return Rt ;
mov R16,R10
L53:
xcall pop_gset4
adiw R28,2
.dbline 0 ; func end
ret
; FileFDT -> y+6
; fp -> R12,R13
; Rt -> R10
; DirFileName -> R14,R15
.even
__FileOpenR::
xcall push_gset5
movw R14,R16
sbiw R28,38
; }
;
; /*********************************************************************************************************
; ** 函数名称: _FileOpenR
; ** 功能描述: 只读方式打开文件,内部使用
; ** 输 入: DirFileName:用户使用的文件名
; ** 输 出: 文件句柄,Not_Open_FILE为不能打开
; ** 全局变量: FileInfo
; ** 调用模块: _GetFDTInfo,GetDrive,FindFDTInfo,
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE _FileOpenR(char *DirFileName)
; {
; MY_FILE *fp ;
; HANDLE Rt ;
; FDT FileFDT ;
;
; /* 查找空闲文件登记项 */
; for(Rt=0;Rt<MAX_OPEN_FILES;Rt++)
clr R10
xjmp L92
L89:
; {
; if(FileInfo[Rt].Flags==0)
ldi R16,33
mov R17,R10
muls R16,R17
movw R30,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
brne L93
; {
; break ;
xjmp L91
L93:
L90:
inc R10
L92:
mov R24,R10
cpi R24,3
brlt L89
L91:
; }
; }
;
; if(Rt<MAX_OPEN_FILES)
mov R24,R10
cpi R24,3
brlt X24
xjmp L95
X24:
; {
; fp=FileInfo+Rt ;
ldi R16,33
mov R17,R24
muls R16,R17
movw R12,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R12,R24
adc R13,R25
;
; /* 获取目录开始簇号和文件名 */
; fp->DirClus=_GetFDTInfo(fp->Name,DirFileName);
movw R18,R14
movw R16,R12
subi R16,255 ; offset = 1
sbci R17,255
xcall __GetFDTInfo
movw R30,R12
std z+13,R16
std z+14,R17
std z+15,R18
std z+16,R19
; if(fp->DirClus<BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo X25
xjmp L97
X25:
; {
; fp->Drive=GetDrive(DirFileName);/* 获取文件所在逻辑盘号 */
movw R16,R14
xcall _GetDrive
movw R30,R12
std z+12,R16
;
; /* 获取文件信息 */
; if(FindFDTInfo(&FileFDT,fp->Drive,fp->DirClus,fp->Name)==RETURN_OK)
movw R24,R12
adiw R24,1
std y+5,R25
std y+4,R24
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
movw R30,R12
ldd R18,z+12
movw R16,R28
subi R16,250 ; offset = 6
sbci R17,255
xcall _FindFDTInfo
tst R16
breq X26
xjmp L99
X26:
; {
; if((FileFDT.Attr&ATTR_DIRECTORY)==0)
ldd R2,y+17
sbrc R2,4
rjmp L101
; {
; fp->Flags=FILE_FLAGS_READ ;
ldi R24,1
movw R30,R12
std z+0,R24
; fp->FileSize=FileFDT.FileSize ;
movw R30,R28
ldd R2,z+34
ldd R3,z+35
ldd R4,z+36
ldd R5,z+37
movw R30,R12
std z+17,R2
std z+18,R3
std z+19,R4
std z+20,R5
; fp->FstClus=((INT32U)FileFDT.FstClusHI<<16)+FileFDT.FstClusLO ;
ldd R2,y+32
ldd R3,y+33
clr R4
clr R5
ldd R6,y+26
ldd R7,y+27
clr R8
clr R9
movw R8,R6
clr R6
clr R7
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R12
std z+21,R6
std z+22,R7
std z+23,R8
std z+24,R9
; fp->Clus=fp->FstClus ;
movw R30,R12
ldd R2,z+21
ldd R3,z+22
ldd R4,z+23
ldd R5,z+24
movw R30,R12
std z+25,R2
std z+26,R3
std z+27,R4
std z+28,R5
; fp->Offset=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R12
std z+29,R20
std z+30,R21
std z+31,R22
std z+32,R23
; return Rt ;
mov R16,R10
xjmp L88
L101:
; }
; }
L99:
; }
L97:
; }
L95:
; return Not_Open_FILE ;
ldi R16,255
L88:
adiw R28,38
xcall pop_gset5
.dbline 0 ; func end
ret
; temp -> y+6
; i -> R10
; fp -> R12,R13
; Rt -> R14
; DirFileName -> R10,R11
.even
__FileOpenW::
xcall push_gset5
movw R10,R16
sbiw R28,38
; }
;
; /*********************************************************************************************************
; ** 函数名称: _FileOpenW
; ** 功能描述: 只写方式打开文件,内部使用
; ** 输 入: DirFileName:用户使用的文件名
; ** 输 出: 文件句柄,Not_Open_FILE为不能打开
; ** 全局变量: FileInfo
; ** 调用模块: _GetFDTInfo,GetDrive,FindFDTInfo,
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE _FileOpenW(char *DirFileName)
; {
; MY_FILE *fp ;
; FDT temp ;
; HANDLE Rt ;
; INT8U i ;
;
; for(Rt=0;Rt<MAX_OPEN_FILES;Rt++)
clr R14
xjmp L111
L108:
; {
; if(FileInfo[Rt].Flags==0)
ldi R16,33
mov R17,R14
muls R16,R17
movw R30,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
brne L112
; {
; break ;
xjmp L110
L112:
L109:
inc R14
L111:
mov R24,R14
cpi R24,3
brlt L108
L110:
; }
; }
;
; if(Rt<MAX_OPEN_FILES)
mov R24,R14
cpi R24,3
brlt X27
xjmp L114
X27:
; {
; fp=FileInfo+Rt ;
ldi R16,33
mov R17,R24
muls R16,R17
movw R12,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R12,R24
adc R13,R25
;
; fp->DirClus=_GetFDTInfo(fp->Name,DirFileName);/* 获取目录开始簇号和文件名 */
movw R18,R10
movw R16,R12
subi R16,255 ; offset = 1
sbci R17,255
xcall __GetFDTInfo
movw R30,R12
std z+13,R16
std z+14,R17
std z+15,R18
std z+16,R19
; if(fp->DirClus<BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo X28
xjmp L116
X28:
; {
; fp->Drive=GetDrive(DirFileName);/* 获取文件所在逻辑盘号 */
movw R16,R10
xcall _GetDrive
movw R30,R12
std z+12,R16
;
; /* 文件已经以读写方式打开,不能再次以读写方式打开 */
; if(FindOpenFileW(fp->Drive,fp->DirClus,fp->Name)==Not_Open_FILE)
movw R24,R12
adiw R24,1
std y+3,R25
std y+2,R24
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _FindOpenFileW
cpi R16,255
breq X29
xjmp L118
X29:
; {
; if(FindFDTInfo(&temp,fp->Drive,fp->DirClus,fp->Name)==RETURN_OK)
movw R24,R12
adiw R24,1
std y+5,R25
std y+4,R24
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
movw R30,R12
ldd R18,z+12
movw R16,R28
subi R16,250 ; offset = 6
sbci R17,255
xcall _FindFDTInfo
tst R16
brne L120
; {
; if((temp.Attr&ATTR_DIRECTORY)!=0)
ldd R2,y+17
sbrs R2,4
rjmp L122
; {
; return Not_Open_FILE ;
ldi R16,255
xjmp L107
L122:
; }
; /* 删除文件 */
; if(RemoveFile(DirFileName)!=RETURN_OK)
movw R16,R10
xcall _RemoveFile
tst R16
breq L125
; {
; return Not_Open_FILE ;
ldi R16,255
xjmp L107
L125:
; }
; }
L120:
; /* 创建文件 */
; for(i=0;i<11;i++)
clr R10
xjmp L130
L127:
movw R24,R12
adiw R24,1
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
adiw R24,6
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L128:
inc R10
L130:
mov R24,R10
cpi R24,11
brlo L127
; {
; temp.Name[i]=fp->Name[i];
; }
; temp.Attr=0 ;
clr R2
std y+17,R2
; temp.FileSize=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+34,R20
std z+35,R21
std z+36,R22
std z+37,R23
;
; temp.NTRes=0 ;
std y+18,R2
; temp.CrtTimeTenth=time_getTime();
xcall _fs_getTime
std y+19,R16
; temp.CrtTime=time_getTime();
xcall _fs_getTime
std y+21,R17
std y+20,R16
; temp.CrtDate=time_getDate();
xcall _fs_getDate
std y+23,R17
std y+22,R16
; temp.LstAccDate=time_getDate();
xcall _fs_getDate
std y+25,R17
std y+24,R16
; temp.WrtTime=time_getTime();
xcall _fs_getTime
std y+29,R17
std y+28,R16
; temp.WrtDate=time_getDate();
xcall _fs_getDate
std y+31,R17
std y+30,R16
;
; temp.FstClusLO=0 ;
clr R2
clr R3
std y+33,R3
std y+32,R2
; temp.FstClusHI=0 ;
std y+27,R3
std y+26,R2
; /* 增加文件 */
; if(AddFDT(fp->Drive,fp->DirClus,&temp)==RETURN_OK)
movw R24,R28
adiw R24,6
std y+3,R25
std y+2,R24
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _AddFDT
tst R16
breq X30
xjmp L142
X30:
; {
; /* 设置文件信息 */
; fp->Flags=FILE_FLAGS_READ|FILE_FLAGS_WRITE ;
ldi R24,3
movw R30,R12
std z+0,R24
; fp->FileSize=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+17,R20
std z+18,R21
std z+19,R22
std z+20,R23
; fp->FstClus=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R12
std z+21,R20
std z+22,R21
std z+23,R22
std z+24,R23
; fp->Clus=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R12
std z+25,R20
std z+26,R21
std z+27,R22
std z+28,R23
; fp->Offset=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R12
std z+29,R20
std z+30,R21
std z+31,R22
std z+32,R23
; return Rt ;
mov R16,R14
xjmp L107
L142:
; }
; }
L118:
; }
L116:
; }
L114:
; return Not_Open_FILE ;
ldi R16,255
L107:
adiw R28,38
xcall pop_gset5
.dbline 0 ; func end
ret
; Rt -> R20
; DirFileName -> R22,R23
.even
__FileOpenRW::
xcall push_gset2
movw R22,R16
sbiw R28,4
; }
;
; /*********************************************************************************************************
; ** 函数名称: _FileOpenRW
; ** 功能描述: 只读写方式打开文件,内部使用
; ** 输 入: DirFileName:用户使用的文件名
; ** 输 出: 文件句柄,Not_Open_FILE为不能打开
; ** 全局变量: 无
; ** 调用模块: _FileOpenR,_FileOpenW
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE _FileOpenRW(char *DirFileName)
; {
; HANDLE Rt ;
;
; Rt=_FileOpenR(DirFileName);
movw R16,R22
xcall __FileOpenR
mov R20,R16
; if(Rt==Not_Open_FILE)
cpi R16,255
brne L145
; {
; Rt=_FileOpenW(DirFileName);
movw R16,R22
xcall __FileOpenW
mov R20,R16
; }
xjmp L146
L145:
; else
; {
; if(FindOpenFileW(FileInfo[Rt].Drive,FileInfo[Rt].DirClus,FileInfo[Rt].Name)==Not_Open_FILE)
ldi R16,33
mov R17,R20
muls R16,R17
ldi R24,<_FileInfo+1
ldi R25,>_FileInfo+1
movw R2,R0
add R2,R24
adc R3,R25
std y+3,R3
std y+2,R2
ldi R24,<_FileInfo+13
ldi R25,>_FileInfo+13
movw R30,R0
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+0,R4
std y+1,R5
movw R18,R2
ldi R24,<_FileInfo+12
ldi R25,>_FileInfo+12
movw R30,R0
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _FindOpenFileW
cpi R16,255
brne L147
; {
; FileInfo[Rt].Flags|=(FILE_FLAGS_WRITE|FILE_FLAGS_READ);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -