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

📄 file.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
	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 + -