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

📄 fat.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R14
	adiw R30,2
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	movw R4,R2
	clr R2
	clr R3
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	movw R30,R28
	ldd R6,z+6
	ldd R7,z+7
	ldd R8,z+8
	ldd R9,z+9
	or R6,R2
	or R7,R3
	or R8,R4
	or R9,R5
	movw R30,R28
	std z+6,R6
	std z+7,R7
	std z+8,R8
	std z+9,R9
;              Rt=Rt&0x0fffffff ;
	ldi R20,255
	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
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
;              break ;
	xjmp L15
L14:
;         default :
;              Rt=BAD_CLUS ;
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
;              break ;
L15:
;     }
;     CloseSec(Drive,SecIndex);
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+22
	xcall _CloseSec
;     return Rt ;
	movw R30,R28
	ldd R16,z+6
	ldd R17,z+7
	ldd R18,z+8
	ldd R19,z+9
L1:
	adiw R28,12
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
;           temp -> R12,R13
;      ByteIndex -> R10,R11
;            Buf -> R14,R15
;       SecIndex -> y+4
;           Disk -> y+2
;           Next -> y+22
;          Index -> y+18
;          Drive -> y+16
	.even
_FATSetNextClus::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,6
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FATSetNextClus
; ** 功能描述: 设置下一个簇
; **
; ** 输 入: Drive:驱动器号
; **        Index:簇号
; **        Next:下一个簇号
; ** 输 出: 无
; **
; ** 全局变量: 无
; ** 调用模块: 无
; **
; ** 作 者: 陈明计
; ** 日 期: 2003年9月6日
; **-------------------------------------------------------------------------------------------------------
; ** 修改人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FATSetNextClus(INT8U Drive,INT32U Index,INT32U Next)
; {
;     INT16U temp ;
;     INT16U SecIndex,ByteIndex ;
;     INT8U *Buf ;
;     Disk_Info *Disk ;
;     
;     Disk=GetDiskInfo(Drive);
	ldd R16,y+16
	xcall _GetDiskInfo
	std y+3,R17
	std y+2,R16
;     if(Disk==NULL)
	movw R0,R16
	cpi R16,0
	cpc R16,R17
	brne L31
X14:
;     {
;         return ;
	xjmp L30
L31:
;     }
;     if(Index<=EMPTY_CLUS_1)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brlo L33
;     {
;         return ;
	xjmp L30
L33:
;     }
;     
;     if(Index>=Disk->ClusPerData)
	ldd R30,y+2
	ldd R31,y+3
	ldd R2,z+32
	ldd R3,z+33
	ldd R4,z+34
	ldd R5,z+35
	movw R30,R28
	ldd R6,z+18
	ldd R7,z+19
	ldd R8,z+20
	ldd R9,z+21
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L35
;     {
;         return ;
	xjmp L30
L35:
;     }
;     
;     /* 计算扇区号和字节索引 */
;     switch(Disk->FATType)
	ldd R30,y+2
	ldd R31,y+3
	ldd R10,z+1
	clr R11
	tst R10
	brne X15
	tst R11
	breq L40
X15:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X21
	xjmp L41
X21:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X22
	xjmp L42
X22:
	xjmp L30
X16:
;     {
L40:
;         case FAT12 :
;              SecIndex=Index*3/(2*Disk->BytsPerSec);
	ldd R30,y+2
	ldd R31,y+3
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R2,R16
	movw R4,R18
	movw R30,R28
	ldd R6,z+18
	ldd R7,z+19
	ldd R8,z+20
	ldd R9,z+21
	ldi R20,3
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall div32u
	std y+5,R17
	std y+4,R16
;              ByteIndex=((Index*3)/2)-(SecIndex*Disk->BytsPerSec);
	ldd R30,y+2
	ldd R31,y+3
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R6,R16
	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 R2,R16
	movw R4,R18
	movw R30,R28
	ldd R6,z+18
	ldd R7,z+19
	ldd R8,z+20
	ldd R9,z+21
	ldi R20,3
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R6,R16
	movw R8,R18
	lsr R9
	ror R8
	ror R7
	ror R6
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R10,R6
;              SecIndex+=Disk->FATStartSec ;
	ldd R30,y+2
	ldd R31,y+3
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	ldd R6,y+4
	ldd R7,y+5
	clr R8
	clr R9
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	std y+5,R7
	std y+4,R6
;              break ;
	xjmp L38
L41:
;         case FAT16 :
;              SecIndex=Index*2/Disk->BytsPerSec+Disk->FATStartSec ;
	movw R30,R28
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	ldd R30,y+2
	ldd R31,y+3
	ldd R6,z+16
	ldd R7,z+17
	ldd R8,z+18
	ldd R9,z+19
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	xcall div32u
	movw R2,R16
	movw R4,R18
	ldd R30,y+2
	ldd R31,y+3
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	std y+5,R3
	std y+4,R2
;              ByteIndex=(Index*2)&(Disk->BytsPerSec-1);
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R30,y+2
	ldd R31,y+3
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R30,R28
	ldd R6,z+18
	ldd R7,z+19
	ldd R8,z+20
	ldd R9,z+21
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R6,R16
	movw R8,R18
	and R6,R2
	and R7,R3
	and R8,R4
	and R9,R5
	movw R10,R6
;              break ;
	xjmp L38
L42:
;         case FAT32 :
;              SecIndex=Index*4/Disk->BytsPerSec+Disk->FATStartSec ;
	movw R30,R28
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	ldi R20,4
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	ldd R30,y+2
	ldd R31,y+3
	ldd R6,z+16
	ldd R7,z+17
	ldd R8,z+18
	ldd R9,z+19
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	xcall div32u
	movw R2,R16
	movw R4,R18
	ldd R30,y+2
	ldd R31,y+3
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	std y+5,R3
	std y+4,R2
;              ByteIndex=(Index*4)&(Disk->BytsPerSec-1);
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R30,y+2
	ldd R31,y+3
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R30,R28
	ldd R6,z+18
	ldd R7,z+19
	ldd R8,z+20
	ldd R9,z+21
	ldi R20,4
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R6,R16
	movw R8,R18
	and R6,R2
	and R7,R3
	and R8,R4
	and R9,R5
	movw R10,R6
;              break ;
;         default :
;              return ;
L38:
;     }
;     
;     Buf=OpenSec(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 _OpenSec
	movw R14,R16
;     if(Buf==NULL)
	cpi R16,0
	cpc R16,R17
	brne L43
X17:
;     {
;         return ;
	xjmp L30
L43:
;     }
;     ReadSec(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 _ReadSec
;     
;     switch(Disk->FATType)
	ldd R30,y+2
	ldd R31,y+3
	ldd R12,z+1
	clr R13
	tst R12
	brne X18
	tst R13
	breq L48
X18:
	movw R24,R12
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X23
	xjmp L59
X23:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X24
	xjmp L60
X24:
	xjmp L46
X19:
;     {
L48:
;         case FAT12 :
;              temp=Next&0x0fff ;/* 判断哪12位有效 */
	ldi R20,255
	ldi R21,15
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+22
	ldd R3,z+23
	ldd R4,z+24
	ldd R5,z+25
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R12,R2
;              if((Index&0x01)!=0)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L49
;              {
;                  temp=temp*16 ;
	ldi R16,16
	ldi R17,0
	movw R18,R12
	xcall empy16s
	movw R12,R16
;             	 temp|=(Buf[ByteIndex]&0x0f);
	movw R30,R10
	add R30,R14
	adc R31,R15
	ldd R24,z+0
	clr R25
	andi R24,15
	andi R25,0
	or R12,R24
	or R13,R25
;             	 Buf[ByteIndex]=temp ;
	movw R30,R10
	add R30,R14
	adc R31,R15
	std z+0,R12
;              }
	xjmp L50
L49:
;        	     else 
;        	     {
;                  Buf[ByteIndex]=temp ;
	movw R30,R10
	add R30,R14
	adc R31,R15
	std z+0,R12
;              }
L50:
;              ByteIndex++;
	movw R24,R10
	adiw R24,1
	movw R10,R24
;              temp=temp>>8 ;
	mov R12,R13
	clr R13
;              /* 下一个字节是否在下一个扇区 */
;              if(ByteIndex>=Disk->BytsPerSec)
	ldd R30,y+2
	ldd R31,y+3
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	movw R6,R24
	clr R8
	clr R9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X25
	xjmp L51
X25:
;              {
;                  Buf=OpenSec(Drive,SecIndex+1);
	ldd R24,y+4
	ldd R25,y+5
	adiw R24,1
	movw R2,R24
	clr R4
	clr R5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+16
	xcall _OpenSec
	movw R14,R16
;                  if(Buf==NULL)
	cpi R16,0
	cpc R16,R17
	brne L53
X20:
;                      break ;
	xjmp L46
L53:
;                  ReadSec(Drive,SecIndex+1);
	ldd R24,y+4
	ldd R25,y+5
	adiw R24,1
	movw R2,R24
	clr R4
	clr R5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+16
	xcall _ReadSec
;                  /* 判断哪12位有效 */
;                  if((Index&0x01)!=0)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L55
;                  {
;                      Buf[0]=temp ;
	movw R30,R14
	std z+0,R12
;                  }
	xjmp L56
L55:
;                  else 
;                  {
;                      Buf[0]=(Buf[0]&0xf0)|temp ;
	movw R30,R14
	ldd R24,z+0
	clr R25
	andi R24,240
	andi R25,0
	or R24,R12
	or R25,R13
	std z+0,R24
;                  }
L56:
;                  WriteSec(Drive,SecIndex+1);
	ldd R24,y+4
	ldd R25,y+5
	adiw R24,1
	movw R2,R24
	clr R4
	clr R5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+16
	xcall _WriteSec
;                  CloseSec(Drive,SecIndex+1);
	ldd R24,y+4
	ldd R25,y+5
	adiw R24,1
	movw R2,R24
	clr R4
	clr R5
	std y+0,R4
	std y+1,R5
	movw R18,R2
	ldd R16,y+16
	xcall _CloseSec
;              }
	xjmp L46
L51:
;              else 
;              {
;                  /* 判断哪12位有效 */
;                 if((Index&0x01)!=0)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L57
;                 {
;                     Buf[ByteIndex]=temp ;
	movw R30,R10
	add R30,R14
	adc R31,R15
	std z+0,R12
;                 }
	xjmp L46
L57:
;                 else 
;                 {
;                     Buf[ByteIndex]=(Buf[ByteIndex]&0xf0)|temp ;
	movw R2,R10
	add R2,R14
	adc R3,R15
	movw R30,R2
	ldd R24,z+0
	clr R25
	andi R24,240
	andi R25,0
	or R24,R12
	or R25,R13
	std z+0,R24
;                 }
;              }
;              break ;
	xjmp L46
L59:
;         case FAT16 :
;              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

⌨️ 快捷键说明

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