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

📄 disk.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module disk.c
	.area text(rom, con, rel)
;              i -> R10
	.even
_DiskInit::
	xcall push_gset3
; /****************************************Copyright (c)**************************************************
; **                               广州周立功单片机发展有限公司
; **                                     研    究    所
; **                                        ARM开发组
; **
; **                                 http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文   件   名: disk.c
; **创   建   人: 陈明计
; **最后修改日期: 2003年9月3日
; **描        述: FAT文件系统关于逻辑盘管理的部分
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版  本: V1.0
; ** 日 期: 2003年9月3日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人: 陈明计
; ** 日 期: 2004年4月10日
; ** 描 述: 增加注释
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; #define   IN_DISK 
; 
; #include "SYS_Config.h" 
; #include "FS_Config.h"
; #include "USART1.h"
; #include "fat.h" 
; 
; 
; Disk_Info DiskInfo[MAX_DRIVES];//逻辑盘信息
; /*********************************************************************************************************
; ** 函数名称: DiskInit
; ** 功能描述: 初始化逻辑盘管理模块
; ** 输   入: 无
; ** 输   出: 无
; ** 全局变量: DiskInfo
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void DiskInit(void)
; {
;     INT8U i ;
;     
;     for(i=0;i<MAX_DRIVES;i++)
	clr R10
	xjmp L5
L2:
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R30,R24
	adc R31,R25
	ldi R24,255
	std z+0,R24
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+1
	ldi R25,>_DiskInfo+1
	add R30,R24
	adc R31,R25
	ldi R24,255
	std z+0,R24
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+2
	ldi R25,>_DiskInfo+2
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+3
	ldi R25,>_DiskInfo+3
	add R30,R24
	adc R31,R25
	std z+0,R2
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+12
	ldi R25,>_DiskInfo+12
	add R30,R24
	adc R31,R25
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,255
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+16
	ldi R25,>_DiskInfo+16
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+20
	ldi R25,>_DiskInfo+20
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+24
	ldi R25,>_DiskInfo+24
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+4
	ldi R25,>_DiskInfo+4
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+8
	ldi R25,>_DiskInfo+8
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+28
	ldi R25,>_DiskInfo+28
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+36
	ldi R25,>_DiskInfo+36
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+44
	ldi R25,>_DiskInfo+44
	add R30,R24
	adc R31,R25
	clr R3
	std z+1,R3
	std z+0,R2
L3:
	inc R10
L5:
	mov R24,R10
	cpi R24,1
	brsh X0
	xjmp L2
X0:
;     {
;         DiskInfo[i].Drive=EMPTY_DRIVE ;       // 没有分配
;         DiskInfo[i].FATType=0xff ;            // 无效的文件系统
;         DiskInfo[i].SecPerClus=0 ;            // 每簇扇区数
;         DiskInfo[i].NumFATs=0 ;               // FAT表数
;         DiskInfo[i].SecPerDisk=0xffffffff ;   // 逻辑驱动器包含扇区数
;         DiskInfo[i].BytsPerSec=0 ;            // 每扇区字节数
;         DiskInfo[i].RootDirTable=0 ;          // 根目录开始扇区号(FAT32为开始簇号)
;         DiskInfo[i].RootSecCnt=0 ;            // 根目录占用扇区数
;         DiskInfo[i].FATStartSec=0 ;           // FAT表开始扇区号
;         DiskInfo[i].FATSecCnt=0 ;             // 每个FAT占用扇区数
;         DiskInfo[i].DataStartSec=0 ;          // 数据区开始扇区号
;         DiskInfo[i].PathClusIndex=0 ;         // 当前目录
;         DiskInfo[i].DiskCommand=NULL ;        // 驱动程序
;     }
;     CacheInit();
	xcall _CacheInit
L1:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
;             Rt -> R20,R21
;          Drive -> R16
	.even
_GetDiskInfo::
	xcall push_gset1
;     //初始化磁盘cache
; }
; 
; /*********************************************************************************************************
; ** 函数名称: GetDiskInfo
; ** 功能描述: 获取指定逻辑盘信息
; ** 输   入: 逻辑盘号
; ** 输   出: 指向逻辑盘信息的结构体指针
; ** 全局变量: DiskInfo
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; Disk_Info *GetDiskInfo(INT8U Drive)
; {
;     Disk_Info *Rt ;
;     Rt=NULL ;
	clr R20
	clr R21
;     
;     if(Drive<MAX_DRIVES)
	cpi R16,1
	brsh L19
;     {
;         if(DiskInfo[Drive].Drive!=EMPTY_DRIVE)
	ldi R24,46
	mul R24,R16
	movw R30,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,255
	breq L21
;         {
;             Rt=DiskInfo+Drive ;
	ldi R24,46
	mul R24,R16
	movw R20,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R20,R24
	adc R21,R25
;         }
L21:
;     }
L19:
;     return Rt ;
	movw R16,R20
L18:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
;             Rt -> R16,R17
;              i -> R18
	.even
_GetEmptyDiskInfoAddr::
; }
; 
; /*********************************************************************************************************
; ** 函数名称: GetEmptyDiskInfoAddr
; ** 功能描述: 获取空闲逻辑盘
; ** 输   入: 无
; ** 输   出: 指向逻辑盘信息的结构体指针
; ** 全局变量: DiskInfo
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; Disk_Info *GetEmptyDiskInfoAddr(void)
; {
;     INT8U i ;
;     Disk_Info *Rt ;
;     
;     Rt=NULL ;
	clr R16
	clr R17
;     for(i=0;i<MAX_DRIVES;i++)
	clr R18
	xjmp L27
L24:
;     {
;         // 逻辑盘号空闲
;         if(DiskInfo[i].Drive==EMPTY_DRIVE)
	ldi R24,46
	mul R24,R18
	movw R30,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,255
	brne L28
;         {
;             Rt=DiskInfo+i ;
	ldi R24,46
	mul R24,R18
	movw R16,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R16,R24
	adc R17,R25
;             DiskInfo[i].Drive=i ;
	ldi R24,46
	mul R24,R18
	movw R30,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R30,R24
	adc R31,R25
	std z+0,R18
;             break ;
	xjmp L26
L28:
L25:
	inc R18
L27:
	cpi R18,1
	brlo L24
L26:
;         }
;     }
;     return Rt ;
L23:
	.dbline 0 ; func end
	ret
;           temp -> R12,R13
;          temp1 -> y+2
;            Buf -> R14,R15
;              i -> R10
;    DiskCommand -> R10,R11
	.even
_AddFileDriver::
	xcall push_gset5
	movw R10,R16
	sbiw R28,6
; }
; 
; /*********************************************************************************************************
; ** 函数名称: AddFileDriver
; ** 功能描述: 增加一个底层驱动程序
; ** 输   入: DiskCommand:驱动程序接口函数
; ** 输   出: 无
; ** 全局变量: DiskInfo
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void AddFileDriver( INT16U(* DiskCommand)(INT8U Command,void *Parameter) )
; { 
;     INT8U  i ;
;     INT8U  *Buf ;
;     INT16U temp ;
;     INT32U temp1 ;
;     
;     if(DiskCommand==NULL)// 参数无效退出
	tst R10
	brne L31
	tst R11
	brne L31
X1:
;     {
;         return ;
	xjmp L30
L31:
;     }
;     
;     if(DiskCommand(DISK_INIT,NULL)==DISK_INIT_NOT_OK)// 底层驱动初始化不成功退出
	clr R18
	clr R19
	clr R16
	movw R30,R10
	xcall xicall
	cpi R16,131
	ldi R30,0
	cpc R17,R30
	brne L33
;     {
;         #if FS_DEBUG_EN
; 	    #if USART1_EN
; 	        Uart1_SendString("\nSD/MMC INIT NOT OK");//调试用,初始化失败
	ldi R16,<L35
	ldi R17,>L35
	xcall _Uart1_SendString
; 	    #endif
; 	    #endif
; 		
;         return ;
	xjmp L30
L33:
;     }
;     
;     for(i=0;i<MAX_DRIVES;i++)/* 重新获取逻辑盘信息 */
	clr R10
	xjmp L39
L36:
;     {
;         /* 逻辑盘已分配 */
;         if(DiskInfo[i].Drive!=EMPTY_DRIVE)
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,255
	brne X5
	xjmp L40
X5:
;         {
;             Buf=OpenSec(DiskInfo[i].Drive,0);/* 打开扇区0(保留扇区) */
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std y+0,R22
	std y+1,R23
	movw R18,R20
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _OpenSec
	movw R14,R16
;             ReadSec(DiskInfo[i].Drive,0);
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std y+0,R22
	std y+1,R23
	movw R18,R20
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo
	ldi R25,>_DiskInfo
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _ReadSec
; 	    
;             if(Buf!=NULL)
	tst R14
	brne X2
	tst R15
	brne X6
	xjmp L42
X6:
X2:
;             {
;                 /* 每扇区字节数 */
;                 DiskInfo[i].BytsPerSec=((INT16U)Buf[12]<<8)+Buf[11];
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+16
	ldi R25,>_DiskInfo+16
	add R30,R24
	adc R31,R25
	movw R26,R14
	adiw R26,11
	ld R2,x
	movw R26,R14
	adiw R26,12
	ld R3,x
	clr R4
	clr R5
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
; 	            #if FS_DEBUG_EN
; 		        #if USART1_EN
; 	            {   
; 	                Uart1_SendString("\n 1.BytsPerSec:");//调试用,每扇区字节数
	ldi R16,<L45
	ldi R17,>L45
	xcall _Uart1_SendString
; 	                PUT_INT32U_DecTOString(DiskInfo[i].BytsPerSec);
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+16
	ldi R25,>_DiskInfo+16
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	xcall _PUT_INT32U_DecTOString
; 	            }
; 		        #endif
; 	            #endif
; 	      
; 		/* 每簇扇区数 */
;                 DiskInfo[i].SecPerClus=Buf[13];
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+2
	ldi R25,>_DiskInfo+2
	add R30,R24
	adc R31,R25
	movw R26,R14
	adiw R26,13
	ld R2,x
	std z+0,R2
; 		        #if FS_DEBUG_EN
; 		        #if USART1_EN
; 	            {
; 	                Uart1_SendString("\n 2.SecPerClus:");//调试用 ,每簇扇区数
	ldi R16,<L48
	ldi R17,>L48
	xcall _Uart1_SendString
; 	                PUT_INT32U_DecTOString(DiskInfo[i].SecPerClus);
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+2
	ldi R25,>_DiskInfo+2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	movw R16,R2
	movw R18,R4
	xcall _PUT_INT32U_DecTOString
; 	            }
; 	            #endif
; 		        #endif
;                
; 	        /* FAT开始扇区号 */
;                 DiskInfo[i].FATStartSec=((INT16U)Buf[15]<<8)+Buf[14];
	ldi R24,46
	mul R24,R10
	movw R30,R0
	ldi R24,<_DiskInfo+4
	ldi R25,>_DiskInfo+4
	add R30,R24
	adc R31,R25
	movw R26,R14
	adiw R26,14
	ld R2,x
	movw R26,R14

⌨️ 快捷键说明

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