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

📄 file.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
	ldd R8,z+4
	ldd R9,z+5
	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+10,R16
	std z+11,R17
	std z+12,R18
	std z+13,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+2
	ldd R7,z+3
	ldd R8,z+4
	ldd R9,z+5
	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+2,R16
	std z+3,R17
	std z+4,R18
	std z+5,R19
;                 SecIndex=(fp->Clus-2)*DiskInfo->SecPerClus+DiskInfo->DataStartSec+i ;
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R12
	ldd R2,z+25
	ldd R3,z+26
	ldd R4,z+27
	ldd R5,z+28
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R30,R14
	ldd R6,z+2
	clr R7
	clr R8
	clr R9
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R2
	movw R18,R4
	xcall empy32u
	movw R2,R16
	movw R4,R18
	movw R30,R14
	ldd R6,z+28
	ldd R7,z+29
	ldd R8,z+30
	ldd R9,z+31
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	ldd R6,z+10
	ldd R7,z+11
	ldd R8,z+12
	ldd R9,z+13
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;                 Rt=SECTOR_READ_ERR ;
	ldi R24,5
	mov R10,R24
;                 
;                 /* 调整打开文件信息表 */
;                 fp->Offset++;
	movw R24,R12
	adiw R24,29
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R24
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	add R4,R20
	adc R5,R21
	adc R6,R22
	adc R7,R23
	std z+0,R4
	std z+1,R5
	std z+2,R6
	std z+3,R7
;                 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 R2,R6
	cpc R3,R7
	cpc R4,R8
	cpc R5,R9
	brsh L230
;                 {
;                     fp->FileSize=fp->Offset ;
	movw R30,R12
	ldd R2,z+29
	ldd R3,z+30
	ldd R4,z+31
	ldd R5,z+32
	movw R30,R12
	std z+17,R2
	std z+18,R3
	std z+19,R4
	std z+20,R5
;                 }
L230:
;                 
;                 /* 打开扇区 */
;                 Buf=OpenSec(fp->Drive,SecIndex);
	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
	movw R30,R12
	ldd R16,z+12
	xcall _OpenSec
	movw R14,R16
;                 if(Buf!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X58
	xjmp L232
X58:
X52:
;                 {
;                     /* 写扇区数据 */
;                     if(ReadSec(fp->Drive,SecIndex)==RETURN_OK)
	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
	movw R30,R12
	ldd R16,z+12
	xcall _ReadSec
	tst R16
	brne L234
;                     {
;                         /* 存储数据 */
;                         Buf[j]=Ch ;
	movw R30,R28
	push R26
	push R27
	ldd R26,z+2
	ldd R27,z+3
	movw R30,R26
	pop R27
	pop R26
	add R30,R14
	adc R31,R15
	ldd R0,y+24
	std z+0,R0
;                         WriteSec(fp->Drive,SecIndex);
	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
	movw R30,R12
	ldd R16,z+12
	xcall _WriteSec
;                         Rt=RETURN_OK ;
	clr R10
;                     }
L234:
;                     CloseSec(fp->Drive,SecIndex);
	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
	movw R30,R12
	ldd R16,z+12
	xcall _CloseSec
;                 }
L232:
;             }
L220:
;         }
L218:
;     }
L216:
L214:
;     return Rt ;
	mov R16,R10
L213:
	adiw R28,14
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
;           temp -> R10,R11
;              i -> y+0
;         Handle -> R12
;           Size -> y+14
;            Buf -> R14,R15
	.even
_FileWrite::
	st -y,r19
	st -y,r18
	xcall push_gset5
	movw R14,R16
	sbiw R28,4
	ldd R12,y+18
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FileWrite
; ** 功能描述: 写文件
; ** 输   入: Buf:要写的数据
; **           Size:要写的字节数
; **           Handle:文件句柄
; ** 输   出: 实际写的字节数
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U FileWrite(void *Buf,INT32U Size,HANDLE Handle)
; {
;     INT8U  *temp ;
;     INT32U i ;
;     
;     temp=(INT8U *)Buf ;
	movw R10,R14
;     for(i=0;i<Size;i++)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	xjmp L240
L237:
;     {
;         if(FilePutCh(*temp,Handle)!=RETURN_OK)
	mov R18,R12
	movw R30,R10
	ldd R16,z+0
	xcall _FilePutCh
	tst R16
	breq L241
;         {
;             break ;
	xjmp L239
L241:
	movw R24,R10
	adiw R24,1
	movw R10,R24
L238:
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
L240:
	movw R30,R28
	ldd R2,z+14
	ldd R3,z+15
	ldd R4,z+16
	ldd R5,z+17
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X59
	xjmp L237
X59:
L239:
;         }
;         temp++;
;     }
;     return i ;
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
L236:
	adiw R28,4
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
;              i -> y+0
	.even
_FileCloseAll::
	xcall push_gset2
	sbiw R28,4
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FileCloseAll
; ** 功能描述: 关闭所有打开的文件
; ** 输   入: 无
; ** 输   出: 无
; ** 全局变量: FileInfo
; ** 调用模块: AllCacheWriteBack
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FileCloseAll(void)
; {
;     INT32U i ;
;     
;     for(i=0;i<MAX_OPEN_FILES;i++)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	xjmp L247
L244:
	movw R30,R28
	ldd R16,z+0
	xcall _FileClose
L245:
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
L247:
	ldi R20,3
	ldi R21,0
	ldi R22,0
	ldi R23,0
	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
	brlo L244
;     {
;         FileClose(i);
;     }
;     AllCacheWriteBack();
	xcall _AllCacheWriteBack
L243:
	adiw R28,4
	xcall pop_gset2
	.dbline 0 ; func end
	ret
;         Handle -> R10
	.even
_FileEof::
	xcall push_gset3
	mov R10,R16
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FileEof
; ** 功能描述: 判断文件是否到读\写到文件尾
; ** 输   入: Handle:文件句柄
; ** 输   出: 0:否
; **           1:是
; ** 全局变量: FileInfo
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileEof(HANDLE Handle)
; {
;     if(Handle<MAX_OPEN_FILES)
	mov R24,R10
	cpi R24,3
	brge L249
;     {
;         if(FileInfo[Handle].Offset<FileInfo[Handle].FileSize)
	ldi R16,33
	mov R17,R24
	muls R16,R17
	ldi R24,<_FileInfo+17
	ldi R25,>_FileInfo+17
	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
	ldi R24,<_FileInfo+29
	ldi R25,>_FileInfo+29
	movw R30,R0
	add R30,R24
	adc R31,R25
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh L251
;         {
;             return FALSE ;
	clr R16
	xjmp L248
L251:
;         }
;     }
L249:
;     return TRUE ;
	ldi R16,1
L248:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
;       DiskInfo -> R14,R15
;              i -> y+6
;           Clus -> y+2
;             fp -> R12,R13
;             Rt -> R10
;         Whence -> y+24
;         offset -> y+20
;         Handle -> R14
	.even
_FileSeek::
	st -y,r19
	st -y,r18
	xcall push_gset5
	mov R14,R16
	sbiw R28,10
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FileSeek
; ** 功能描述: 移动文件读\写位置
; ** 输   入: Handle:文件句柄
; **           offset:移动偏移量
; **           Whence:移动模式SEEK_SET:从文件头计算SEEK_CUR:从当前位置计算SEEK_END:从文件尾计算
; ** 输   出: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年7月12日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileSeek(HANDLE Handle,INT32S offset,INT8U Whence)
; {
;     INT8U Rt ;
;     INT32U i,Clus ;
;     MY_FILE   *fp ;
;     Disk_Info *DiskInfo ;
;     
;     Rt=PARAMETER_ERR ;
	ldi R24,255
	mov R10,R24
;     fp=FileInfo+Handle ;
	ldi R16,33
	mov R17,R14
	muls R16,R17
	movw R12,R0
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	add R12,R24
	adc R13,R25
;     
;     if(Handle>=0&&Handle<MAX_OPEN_FILES)/* Handle是否有效 */
	cpi R17,0
	brge X63
	xjmp L256
X63:
	cpi R17,3
	brlt X64
	xjmp L256
X64:
;     if(fp->Flags!=0)/* 对应的打开文件信息表是否已使用 */
	movw R30,R12
	ldd R2,z+0
	tst R2
	brne X65
	xjmp L258
X65:
;     {
;         Rt=RETURN_OK ;
	clr R10
;         switch(Whence)
	ldd R14,y+24
	clr R15
	tst R14
	brne X60
	tst R15
	brne X66
	xjmp L264
X66:
X60:
	movw R24,R14
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X67
	xjmp L265
X67:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	breq L263
	xjmp L260
X61:
;         {
L263:
;             case SEEK_END :/* 从文件尾计算 */
;                  fp->Offset=fp->FileSize-offset ;
	movw R30,R28
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	movw R30,R12
	ldd R6,z+17
	ldd R7,z+18
	ldd R8,z+19
	ldd R9,z+20
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R12
	std z+29,R6
	std z+30,R7
	std z+31,R8
	std z+32,R9
;                  offset=-offset ;
	movw R30,R28
	ldd R16,z+20
	ldd R17,z+21
	ldd R18,z+22
	ldd R19,z+23
	xcall neg32
	movw R30,R28
	std z+20,R16
	std z+21,R17
	std z+22,R18
	std z+23,R19
;                  break ;
	xjmp L261
L264:
;             case SEEK_SET :
;                  fp->Offset=offset ;
	movw R30,R28
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	movw R30,R12
	std z+29,R2
	std z+30,R3
	std z+31,R4
	std z+32,R5
;                  break ;
	xjmp L261
L265:
;             case SEEK_CUR :/* 从当前位置计算 这里不用break是正确的*/
;                  i=fp->Offset+offset ;
	movw R30,R28
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	movw R30,R12
	ldd R6,z+29
	ldd R7,z+30
	ldd R8,z+

⌨️ 快捷键说明

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