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

📄 fat.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
;              break ;
	xjmp L46
L60:
;         case FAT32 :
;              Buf[ByteIndex]=Next ;
	movw R30,R10
	add R30,R14
	adc R31,R15
	movw R26,R28
	adiw R26,22
	ld R2,x+
	ld R3,x+
	ld R4,x+
	ld R5,x
	std z+0,R2
;              Buf[ByteIndex+1]=Next>>8 ;
	ldi R24,8
	ldi R25,0
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R30,R10
	adiw R30,1
	add R30,R14
	adc R31,R15
	std z+0,R16
;              Buf[ByteIndex+2]=Next>>16 ;
	movw R30,R10
	adiw R30,2
	add R30,R14
	adc R31,R15
	movw R26,R28
	adiw R26,22
	ld R2,x+
	ld R3,x+
	ld R4,x+
	ld R5,x
	movw R2,R4
	clr R4
	clr R5
	std z+0,R2
;              Buf[ByteIndex+3]=(Buf[ByteIndex+3]&0xf0)|((Next>>24)&0x0f);
	movw R24,R10
	adiw R24,3
	add R24,R14
	adc R25,R15
	movw R2,R24
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R4,z+22
	ldd R5,z+23
	ldd R6,z+24
	ldd R7,z+25
	st -y,R24
	movw R16,R4
	movw R18,R6
	xcall lsr32
	movw R4,R16
	movw R6,R18
	ldi R20,15
	ldi R21,0
	ldi R22,0
	ldi R23,0
	and R4,R20
	and R5,R21
	and R6,R22
	and R7,R23
	movw R30,R2
	ldd R24,z+0
	clr R25
	andi R24,240
	andi R25,0
	movw R20,R24
	clr R22
	sbrc R21,7
	com R22
	clr R23
	sbrc R22,7
	com R23
	or R20,R4
	or R21,R5
	or R22,R6
	or R23,R7
	mov R4,R20
	std z+0,R4
;              break ;
;         default :
;              break ;
L46:
;     }
;     WriteSec(Drive,SecIndex);
	ldd R2,y+4
	ldd R3,y+5
	clr R4
	clr R5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+16
	xcall _WriteSec
;     CloseSec(Drive,SecIndex);
	ldd R2,y+4
	ldd R3,y+5
	clr R4
	clr R5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+16
	xcall _CloseSec
;     return ;
L30:
	adiw R28,6
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
;           Disk -> R12,R13
;        MaxClus -> y+14
;       ThisClus -> y+10
;       NextClus -> y+6
;          Index -> y+26
;          Drive -> R10
	.even
_FATAddClus::
	st -y,r19
	st -y,r18
	xcall push_gset4
	mov R10,R16
	sbiw R28,18
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FATAddClus
; ** 功能描述: 为指定簇链增加一个簇
; ** 输   入: Drive:驱动器号
; **           Index:簇链中任意一个簇号,如果为0,则为一个空链增加一个簇
; ** 输   出: 增加的簇号
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U FATAddClus(INT8U Drive,INT32U Index)
; {
;     INT32U NextClus,ThisClus,MaxClus ;
;     Disk_Info *Disk ;
;     
;     Disk=GetDiskInfo(Drive);
	mov R16,R10
	xcall _GetDiskInfo
	movw R12,R16
;     if(Disk==NULL)
	cpi R16,0
	cpc R16,R17
	brne L62
X26:
;     {
;         return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L61
L62:
;     }
;     
;     if(Index>=BAD_CLUS)
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+26
	ldd R3,z+27
	ldd R4,z+28
	ldd R5,z+29
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L64
;     {
;         return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L61
L64:
;     }
;     
;     
;     MaxClus=Disk->ClusPerData ;
	movw R30,R12
	ldd R2,z+32
	ldd R3,z+33
	ldd R4,z+34
	ldd R5,z+35
	movw R30,R28
	std z+14,R2
	std z+15,R3
	std z+16,R4
	std z+17,R5
;     
;     /* 查找最后一个簇 */
;     ThisClus=Index ;
	movw R30,R28
	ldd R2,z+26
	ldd R3,z+27
	ldd R4,z+28
	ldd R5,z+29
	movw R30,R28
	std z+10,R2
	std z+11,R3
	std z+12,R4
	std z+13,R5
;     if(ThisClus!=EMPTY_CLUS&&ThisClus!=EMPTY_CLUS_1)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne X28
	xjmp L66
X28:
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne X29
	xjmp L66
X29:
;     {
	xjmp L69
L68:
;         while(1)
;         {
;             NextClus=FATGetNextClus(Drive,ThisClus);
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R10
	xcall _FATGetNextClus
	movw R30,R28
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
;             if(NextClus>=EOF_CLUS_1)
	ldi R20,248
	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
	brlo L71
;             {
;                 break ;
	xjmp L67
L71:
;             }
;             if(NextClus<=EMPTY_CLUS_1)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brlo L73
;             {
;                 break ;
	xjmp L67
L73:
;             }
;             if(NextClus==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 L75
;             {
;                 return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
	xjmp L61
L75:
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	movw R30,R28
	std z+10,R2
	std z+11,R3
	std z+12,R4
	std z+13,R5
L69:
	xjmp L68
X27:
;             }
;             ThisClus=NextClus ;
;         }
;     }
	xjmp L67
L66:
;     else 
;     {
;         ThisClus=EMPTY_CLUS_1 ;
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+10,R20
	std z+11,R21
	std z+12,R22
	std z+13,R23
;     }
L67:
;     
;     for(NextClus=ThisClus+1;NextClus<MaxClus;NextClus++)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
	xjmp L80
L77:
;     {
;         if(FATGetNextClus(Drive,NextClus)==EMPTY_CLUS)
	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,R10
	xcall _FATGetNextClus
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R16,R20
	cpc R17,R21
	cpc R18,R22
	cpc R19,R23
	brne L81
;         {
;             break ;
	xjmp L79
L81:
L78:
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
L80:
	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+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X30
	xjmp L77
X30:
L79:
;         }
;     }
;     if(NextClus>=MaxClus)
	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+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X31
	xjmp L83
X31:
;     {
;         for(NextClus=EMPTY_CLUS_1+1;NextClus<ThisClus;NextClus++)
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
	xjmp L88
L85:
;         {
;             if(FATGetNextClus(Drive,NextClus)==EMPTY_CLUS)
	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,R10
	xcall _FATGetNextClus
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R16,R20
	cpc R17,R21
	cpc R18,R22
	cpc R19,R23
	brne L89
;             {
;                 break ;
	xjmp L87
L89:
L86:
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
L88:
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X32
	xjmp L85
X32:
L87:
;             }
;         }
;     }
L83:
;     if(FATGetNextClus(Drive,NextClus)==EMPTY_CLUS)
	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,R10
	xcall _FATGetNextClus
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R16,R20
	cpc R17,R21
	cpc R18,R22
	cpc R19,R23
	breq X33
	xjmp L91
X33:
;     {
;         if(ThisClus>EMPTY_CLUS_1)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brsh L93
;         {
;             FATSetNextClus(Drive,ThisClus,NextClus);
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R10
	xcall _FATSetNextClus
;         }
L93:
;         FATSetNextClus(Drive,NextClus,EOF_CLUS_END);
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,15
	std y+2,R20
	std y+3,R21
	std y+4,R22
	std y+5,R23
	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,R10
	xcall _FATSetNextClus
;         return NextClus ;
	movw R30,R28
	ldd R16,z+6
	ldd R17,z+7
	ldd R18,z+8
	ldd R19,z+9
	xjmp L61
L91:
;     }
;     else 
;     {
;         return BAD_CLUS ;
	ldi R16,247
	ldi R17,255
	ldi R18,255
	ldi R19,15
L61:
	adiw R28,18
	xcall pop_gset4
	adiw R28,2
	.dbline 0 ; func end
	ret
;       ThisClus -> y+10
;       NextClus -> y+6
;          Index -> y+20
;          Drive -> R10
	.even
_FATDelClusChain::
	st -y,r19
	st -y,r18
	xcall push_gset3
	mov R10,R16
	sbiw R28,14
;     }
; }
; /*********************************************************************************************************
; ** 函数名称: FATDelClusChain
; ** 功能描述: 删除指定簇链
; ** 输   入: Drive:驱动器号
; **           Index:簇链中首簇号
; ** 输   出: 无
; ** 全局变量: 无
; ** 调用模块: FATGetNextClus,FATSetNextClus
; ** 作   者: 陈明计
; ** 日   期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FATDelClusChain(INT8U Drive,INT32U Index)
; {
;     INT32U NextClus,ThisClus ;
;     
;     if(Index<=EMPTY_CLUS_1)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brlo L96
;     {
;         return ;
	xjmp L95
L96:
;     }
;     if(Index>=BAD_CLUS)
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L98
;     {
;         return ;
	xjmp L95
L98:
;     }
;     ThisClus=Index ;
	movw R30,R28
	ldd R2,z+20
	ldd R3,z+21
	ldd R4,z+22
	ldd R5,z+23
	movw R30,R28
	std z+10,R2
	std z+11,R3
	std z+12,R4
	std z+13,R5
	xjmp L101
L100:
;     while(1)
;     {
;         NextClus=FATGetNextClus(Drive,ThisClus);
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R10
	xcall _FATGetNextClus
	movw R30,R28
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
;         FATSetNextClus(Drive,ThisClus,EMPTY_CLUS);
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std y+2,R20
	std y+3,R21
	std y+4,R22
	std y+5,R23
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R10
	xcall _FATSetNextClus
;         if(NextClus>=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
	brlo L103
;         {
;             break ;
	xjmp L102
L103:
;         }
;         if(NextClus<=EMPTY_CLUS_1)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brlo L105
;         {
;             break ;
	xjmp L102
L105:
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	movw R30,R28
	std z+10,R2
	std z+11,R3
	std z+12,R4
	std z+13,R5
L101:
	xjmp L100
L102:
L95:
	adiw R28,14
	xcall pop_gset3
	adiw R28,2
	.dbline 0 ; func end
	ret

⌨️ 快捷键说明

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