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

📄 file.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
	ldi R16,33
	mov R17,R20
	muls R16,R17
	movw R2,R0
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	add R2,R24
	adc R3,R25
	movw R30,R2
	ldd R24,z+0
	ori R24,3
	std z+0,R24
;         }
	xjmp L148
L147:
;         else 
;         {
;             FileInfo[Rt].Flags=0 ;
	ldi R16,33
	mov R17,R20
	muls R16,R17
	movw R30,R0
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
;             Rt=Not_Open_FILE ;
	ldi R20,255
;         }
L148:
;     }
L146:
;     return Rt ;
	mov R16,R20
L144:
	adiw R28,4
	xcall pop_gset2
	.dbline 0 ; func end
	ret
;             Rt -> R20
;           Type -> R10,R11
;    DirFileName -> R22,R23
	.even
_FileOpen::
	xcall push_gset3
	movw R10,R18
	movw R22,R16
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FileOpen
; ** 功能描述: 以指定方式打开文件
; ** 输   入: DirFileName:用户使用的文件名
; **           Type:打开方式
; ** 输   出: 文件句柄,Not_Open_FILE为不能打开
; ** 全局变量: 无
; ** 调用模块: _FileOpenR,_FileOpenW,_FileOpenRW
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE FileOpen(char *DirFileName,char *Type)
; {
;     HANDLE Rt ;
;     
;     Rt=Not_Open_FILE ;
	ldi R20,255
;     strupr(Type);
	movw R16,R10
	xcall _strupr
;     strupr(DirFileName);
	movw R16,R22
	xcall _strupr
;     if(Type[0]=='R')
	movw R30,R10
	ldd R24,z+0
	cpi R24,82
	brne L153
;     {
;         if(Type[1]=='W')
	ldd R24,z+1
	cpi R24,87
	brne L155
;         {
;             Rt=_FileOpenRW(DirFileName);
	movw R16,R22
	xcall __FileOpenRW
	mov R20,R16
;         }
	xjmp L156
L155:
;         else 
;         {
;             Rt=_FileOpenR(DirFileName);
	movw R16,R22
	xcall __FileOpenR
	mov R20,R16
;         }
L156:
;         return Rt ;
	mov R16,R20
	xjmp L152
L153:
;     }
;     if(Type[0]=='W')
	movw R30,R10
	ldd R24,z+0
	cpi R24,87
	brne L157
;     {
;         if(Type[1]=='R')
	ldd R24,z+1
	cpi R24,82
	brne L159
;         {
;             Rt=_FileOpenRW(DirFileName);
	movw R16,R22
	xcall __FileOpenRW
	mov R20,R16
;         }
	xjmp L160
L159:
;         else 
;         {
;             Rt=_FileOpenW(DirFileName);
	movw R16,R22
	xcall __FileOpenW
	mov R20,R16
;         }
L160:
;     }
L157:
;     return Rt ;
	mov R16,R20
L152:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
;        FileFDT -> y+6
;             fp -> R12,R13
;             Rt -> R10
;         Handle -> R12
	.even
_FileClose::
	xcall push_gset4
	mov R12,R16
	sbiw R28,38
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FileClose
; ** 功能描述: 关闭指定文件
; ** 输   入: Handle:文件句柄
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileClose(HANDLE Handle)
; {
;     INT8U Rt ;
;     FDT FileFDT ;
;     MY_FILE *fp ;
;     
;     Rt=PARAMETER_ERR ;
	ldi R24,255
	mov R10,R24
;     if(Handle>=0&&Handle<MAX_OPEN_FILES)
	mov R24,R12
	cpi R24,0
	brge X33
	xjmp L162
X33:
	cpi R24,3
	brlt X34
	xjmp L162
X34:
;     {
;         Rt=RETURN_OK ;
	clr R10
;         fp=FileInfo+Handle ;
	ldi R16,33
	mov R17,R24
	muls R16,R17
	movw R12,R0
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	add R12,R24
	adc R13,R25
;         if((fp->Flags&FILE_FLAGS_WRITE)==FILE_FLAGS_WRITE)
	movw R30,R12
	ldd R24,z+0
	andi R24,2
	cpi R24,2
	breq X35
	xjmp L164
X35:
;         {
;             Rt=FindFDTInfo(&FileFDT,fp->Drive,fp->DirClus,fp->Name);
	movw R24,R30
	adiw R24,1
	std y+5,R25
	std y+4,R24
	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
	mov R10,R16
;             if(Rt==RETURN_OK)
	tst R16
	breq X36
	xjmp L166
X36:
;             if(FileFDT.FileSize<fp->FileSize)
	movw R30,R12
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R28
	ldd R6,z+34
	ldd R7,z+35
	ldd R8,z+36
	ldd R9,z+37
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo X37
	xjmp L168
X37:
;             {
;                 FileFDT.FileSize=fp->FileSize ;
	movw R30,R12
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R28
	std z+34,R2
	std z+35,R3
	std z+36,R4
	std z+37,R5
;                 if(FileFDT.FstClusLO==0)
	ldd R2,y+32
	ldd R3,y+33
	tst R2
	brne L172
	tst R3
	brne L172
X31:
;                 if(FileFDT.FstClusHI==0)
	ldd R2,y+26
	ldd R3,y+27
	tst R2
	brne L175
	tst R3
	brne L175
X32:
;                 {
;                     FileFDT.FstClusLO=fp->FstClus&0xffff ;
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R12
	ldd R2,z+21
	ldd R3,z+22
	ldd R4,z+23
	ldd R5,z+24
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	std y+33,R3
	std y+32,R2
;                     FileFDT.FstClusHI=(fp->FstClus>>16)&0xffff ;
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R12
	ldd R2,z+21
	ldd R3,z+22
	ldd R4,z+23
	ldd R5,z+24
	movw R2,R4
	clr R4
	clr R5
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	std y+27,R3
	std y+26,R2
;                 }
L175:
L172:
;                 ChangeFDT(fp->Drive,fp->DirClus,&FileFDT);
	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 _ChangeFDT
;             }
L168:
L166:
;         }
L164:
;         fp->Flags=0 ;
	clr R2
	movw R30,R12
	std z+0,R2
;     }
L162:
;     return Rt ;
	mov R16,R10
L161:
	adiw R28,38
	xcall pop_gset4
	.dbline 0 ; func end
	ret
;            Buf -> R10,R11
;              i -> y+12
;       SecIndex -> y+8
;              j -> y+4
;       DiskInfo -> R14,R15
;             Rt -> y+16
;             fp -> R12,R13
;         Handle -> R10
;             Ch -> y+27
	.even
_FileGetCh::
	xcall push_arg4
	xcall push_gset5
	mov R10,R18
	sbiw R28,17
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FileGetCh
; ** 功能描述: 从文件读一个字节
; ** 输   入: Ch:返回读到的数据
; **           Handle:文件句柄
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileGetCh(INT8U *Ch,HANDLE Handle)
; {
;     INT32U i,j,SecIndex ;
;     MY_FILE *fp ;
;     Disk_Info *DiskInfo ;
;     INT8U Rt ;
;     INT8U *Buf ;
;     
;     Rt=PARAMETER_ERR ;
	ldi R24,255
	std y+16,R24
;     fp=FileInfo+Handle ;
	ldi R16,33
	mov R17,R10
	muls R16,R17
	movw R12,R0
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	add R12,R24
	adc R13,R25
;     /* Handle是否有效 */
;     /* 对应的打开文件信息表是否已使用 */
;     if(Handle>=0&&Handle<MAX_OPEN_FILES)
	cpi R17,0
	brge X40
	xjmp L181
X40:
	cpi R17,3
	brlt X41
	xjmp L181
X41:
;     if(fp->Flags!=0)
	movw R30,R12
	ldd R2,z+0
	tst R2
	brne X42
	xjmp L183
X42:
;     {
;         Rt=FILE_EOF ;
	ldi R24,17
	std y+16,R24
;         if(fp->Offset>=fp->FileSize)
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R12
	ldd R6,z+29
	ldd R7,z+30
	ldd R8,z+31
	ldd R9,z+32
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X43
	xjmp L185
X43:
;         {
;             /* 如果读数据超出文件的长度,看一看谁否有别的程序正在写这个文件 */
;             /* 如果有,则可能文件的长度有变化,更正之*/
;             Handle=FindOpenFileW(fp->Drive,fp->DirClus,fp->Name);
	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
	mov R10,R16
;             if(Handle<MAX_OPEN_FILES)
	mov R24,R10
	cpi R16,3
	brlt X44
	xjmp L187
X44:
;             {
;                 fp->FileSize=FileInfo[Handle].FileSize ;
	ldi R16,33
	mov R17,R24
	muls R16,R17
	movw R30,R0
	ldi R24,<_FileInfo+17
	ldi R25,>_FileInfo+17
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R12
	std z+17,R2
	std z+18,R3
	std z+19,R4
	std z+20,R5
;                 if(fp->Offset==0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R12
	ldd R2,z+29
	ldd R3,z+30
	ldd R4,z+31
	ldd R5,z+32
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L190
;                 {
;                     fp->FstClus=FileInfo[Handle].FstClus ;
	muls R16,R17
	movw R30,R0
	ldi R24,<_FileInfo+21
	ldi R25,>_FileInfo+21
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R12
	std z+21,R2
	std z+22,R3
	std z+23,R4
	std z+24,R5
;                     fp->Clus=FileInfo[Handle].Clus ;
	muls R16,R17
	movw R30,R0
	ldi R24,<_FileInfo+25
	ldi R25,>_FileInfo+25
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R12
	std z+25,R2
	std z+26,R3
	std z+27,R4
	std z+28,R5
;                 }
L190:
;             }
L187:
;         }
L185:
;         Rt=FILE_EOF ;
	ldi R24,17
	std y+16,R24
;         /* 是否到文件结束 */
;         if(fp->Offset<fp->FileSize)
	movw R30,R12
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R12
	ldd R6,z+29
	ldd R7,z+30
	ldd R8,z+31
	ldd R9,z+32
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo X45
	xjmp L194
X45:
;         {
;             Rt=NOT_FIND_DISK ;
	clr R0
	inc R0
	std y+16,R0
;             /* 获取文件所在逻辑盘信息 */
;             DiskInfo=GetDiskInfo(fp->Drive);
	movw R30,R12
	ldd R16,z+12
	xcall _GetDiskInfo
	movw R14,R16
;             if(DiskInfo!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X46
	xjmp L196
X46:
X38:
;             {
;                 /* 计算数据所在扇区 */
;                 j=fp->Offset%(DiskInfo->SecPerClus*DiskInfo->BytsPerSec);
	movw R30,R14
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R14
	ldd R6,z+2
	clr R7
	clr R8
	clr R9
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32u
	movw R30,R12
	ldd R2,z+29
	ldd R3,z+30
	ldd R4,z+31
	ldd R5,z+32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	movw R16,R2
	movw R18,R4
	xcall mod32u
	movw R30,R28
	std z+4,R16
	std z+5,R17
	std z+6,R18
	std z+7,R19
;                 i=j/DiskInfo->BytsPerSec ;
	movw R30,R14
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall div32u
	movw R30,R28
	std z+12,R16
	std z+13,R17
	std z+14,R18
	std z+15,R19
;                 j=j%DiskInfo->BytsPerSec ;
	movw R30,R14
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R30,R28
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall mod32u
	movw R30,R28
	std z+4,R16
	std z+5,R17
	std z+6,R18
	std z+7,R19
;                 SecIndex=(fp->Clus-2)*DiskInfo->SecPerClus+
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R12
	ldd R2,z+25
	ldd R3,z+26

⌨️ 快捷键说明

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