📄 disk.s
字号:
.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 + -