📄 rwsec.s
字号:
.module RWSec.c
.area text(rom, con, rel)
; i -> R10,R11
.even
_CacheInit::
xcall push_gset3
;
; /****************************************Copyright (c)**************************************************
; ** 广州周立功单片机发展有限公司
; ** 研 究 所
; ** ARM开发组
; **
; ** http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文 件 名: disk.c
; **创 建 人: 陈明计
; **最后修改日期: 2004年3月11日
; **描 述: FAT文件系统关于cache管理的部分
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版 本: V1.0
; ** 日 期: 2003年9月3日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人: 陈明计
; ** 日 期: 2004年4月10日
; ** 描 述: 增加注释
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; #define IN_RWSEC
;
; #include "SYS_Config.h"
; #include "fat.h"
;
; Disk_cache DiskCache[MAX_DISK_CACHES];/* 磁盘cache */
;
; /*********************************************************************************************************
; ** 函数名称: CacheInit
; ** 功能描述: 初始化磁盘cache
; ** 输 入: 无
; ** 输 出: 无
; ** 全局变量: DiskCache
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void CacheInit(void)
; {
; INT16U i ;
;
; for(i=0;i<MAX_DISK_CACHES;i++)
clr R10
clr R11
xjmp L5
L2:
ldi R16,520
ldi R17,2
movw R18,R10
xcall empy16s
movw R30,R16
ldi R24,<_DiskCache
ldi R25,>_DiskCache
add R30,R24
adc R31,R25
ldi R24,255
std z+0,R24
ldi R16,520
ldi R17,2
movw R18,R10
xcall empy16s
movw R30,R16
ldi R24,<_DiskCache+1
ldi R25,>_DiskCache+1
add R30,R24
adc R31,R25
clr R2
std z+0,R2
ldi R16,520
ldi R17,2
movw R18,R10
xcall empy16s
movw R30,R16
ldi R24,<_DiskCache+2
ldi R25,>_DiskCache+2
add R30,R24
adc R31,R25
clr R2
clr R3
std z+1,R3
std z+0,R2
ldi R16,520
ldi R17,2
movw R18,R10
xcall empy16s
movw R2,R16
ldi R24,<_DiskCache+2
ldi R25,>_DiskCache+2
add R2,R24
adc R3,R25
movw R30,R2
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
std z+1,R25
std z+0,R24
ldi R16,520
ldi R17,2
movw R18,R10
xcall empy16s
movw R30,R16
ldi R24,<_DiskCache+4
ldi R25,>_DiskCache+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
L3:
movw R24,R10
adiw R24,1
movw R10,R24
L5:
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
brsh X0
xjmp L2
X0:
L1:
xcall pop_gset3
.dbline 0 ; func end
ret
; Index -> y+0
; Drive -> R16
.even
_CloseSec::
st -y,r19
st -y,r18
; {
; DiskCache[i].Drive=EMPTY_DRIVE ;/* cache空闲 */
; DiskCache[i].Flag=0 ; /* 扇区无需回写 */
; DiskCache[i].RW_ID=0 ; /* 访问纪录 */
; DiskCache[i].RW_ID--; /* 访问纪录 */
; DiskCache[i].SecIndex=0 ; /* 缓冲的扇区号 */
; }
; }
;
;
; /*********************************************************************************************************
; ** 函数名称: CloseSec
; ** 功能描述: 解锁指定cache(允许切换出内存)
; ** 输 入: Drive:逻辑驱动器号
; ** Index:缓冲的扇区号
; ** 输 出: 无
; ** 全局变量: DiskCache
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void CloseSec(INT8U Drive,INT32U Index)
; {
; Drive=Drive ;
; Index=Index ;
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
L10:
adiw R28,2
.dbline 0 ; func end
ret
; Pa -> y+0
; Disk -> R20,R21
; Index -> R22,R23
.even
_CacheWriteBack2::
xcall push_gset2
movw R22,R16
sbiw R28,11
; }
;
; /*********************************************************************************************************
; ** 函数名称: CacheWriteBack2
; ** 功能描述: 把指定扇区写回逻辑盘
; ** 输 入: Index:cache索引
; ** 输 出: 无
; ** 全局变量: DiskCache
; ** 调用模块: GetDiskInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void CacheWriteBack2(INT16U Index)
; {
; Disk_RW_Parameter Pa ;
; Disk_Info *Disk ;
;
; Disk=GetDiskInfo(DiskCache[Index].Drive);// 获取逻辑盘信息
ldi R16,520
ldi R17,2
movw R18,R22
xcall empy16s
movw R30,R16
ldi R24,<_DiskCache
ldi R25,>_DiskCache
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _GetDiskInfo
movw R20,R16
; if(Disk!=NULL)
cpi R16,0
cpc R16,R17
brne X3
xjmp L12
X3:
X1:
; if(Disk->DiskCommand!=NULL)
movw R30,R20
ldd R2,z+44
ldd R3,z+45
tst R2
brne X2
tst R3
brne X4
xjmp L14
X4:
X2:
; {
; DiskCache[Index].Flag&=~CACHE_WRITED ;// 不再需要回写
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -