rwsec.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 257 行
LIS
257 行
.module RWSec.c
.area text(rom, con, rel)
; i -> R10,R11
.even
0000 _CacheInit::
0000 0E940000 xcall push_gset3
0004 ;
0004 ; /****************************************Copyright (c)**************************************************
0004 ; ** 广州周立功单片机发展有限公司
0004 ; ** 研 究 所
0004 ; ** ARM开发组
0004 ; **
0004 ; ** http://www.zlgmcu.com
0004 ; **
0004 ; **--------------文件信息--------------------------------------------------------------------------------
0004 ; **文 件 名: disk.c
0004 ; **创 建 人: 陈明计
0004 ; **最后修改日期: 2004年3月11日
0004 ; **描 述: FAT文件系统关于cache管理的部分
0004 ; **
0004 ; **--------------历史版本信息----------------------------------------------------------------------------
0004 ; ** 创建人: 陈明计
0004 ; ** 版 本: V1.0
0004 ; ** 日 期: 2003年9月3日
0004 ; ** 描 述: 原始版本
0004 ; **
0004 ; **--------------当前版本修订------------------------------------------------------------------------------
0004 ; ** 修改人: 陈明计
0004 ; ** 日 期: 2004年4月10日
0004 ; ** 描 述: 增加注释
0004 ; **
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; ********************************************************************************************************/
0004 ; #define IN_RWSEC
0004 ;
0004 ; #include "SYS_Config.h"
0004 ; #include "fat.h"
0004 ;
0004 ; Disk_cache DiskCache[MAX_DISK_CACHES];/* 磁盘cache */
0004 ;
0004 ; /*********************************************************************************************************
0004 ; ** 函数名称: CacheInit
0004 ; ** 功能描述: 初始化磁盘cache
0004 ; ** 输 入: 无
0004 ; ** 输 出: 无
0004 ; ** 全局变量: DiskCache
0004 ; ** 调用模块: 无
0004 ; ** 作 者: 陈明计
0004 ; ** 日 期: 2003年9月3日
0004 ; **-------------------------------------------------------------------------------------------------------
0004 ; ** 修 改 人: 陈明计
0004 ; ** 日 期: 2004年4月10日
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; ********************************************************************************************************/
0004 ; void CacheInit(void)
0004 ; {
0004 ; INT16U i ;
0004 ;
0004 ; for(i=0;i<MAX_DISK_CACHES;i++)
0004 AA24 clr R10
0006 BB24 clr R11
0008 4BC0 xjmp L5
000A L2:
000A 08E0 ldi R16,520
000C 12E0 ldi R17,2
000E 9501 movw R18,R10
0010 0E940000 xcall empy16s
0014 F801 movw R30,R16
0016 80E0 ldi R24,<_DiskCache
0018 90E0 ldi R25,>_DiskCache
001A E80F add R30,R24
001C F91F adc R31,R25
001E 8FEF ldi R24,255
0020 8083 std z+0,R24
0022 08E0 ldi R16,520
0024 12E0 ldi R17,2
0026 9501 movw R18,R10
0028 0E940000 xcall empy16s
002C F801 movw R30,R16
002E 80E0 ldi R24,<_DiskCache+1
0030 90E0 ldi R25,>_DiskCache+1
0032 E80F add R30,R24
0034 F91F adc R31,R25
0036 2224 clr R2
0038 2082 std z+0,R2
003A 08E0 ldi R16,520
003C 12E0 ldi R17,2
003E 9501 movw R18,R10
0040 0E940000 xcall empy16s
0044 F801 movw R30,R16
0046 80E0 ldi R24,<_DiskCache+2
0048 90E0 ldi R25,>_DiskCache+2
004A E80F add R30,R24
004C F91F adc R31,R25
004E 2224 clr R2
0050 3324 clr R3
0052 3182 std z+1,R3
0054 2082 std z+0,R2
0056 08E0 ldi R16,520
0058 12E0 ldi R17,2
005A 9501 movw R18,R10
005C 0E940000 xcall empy16s
0060 1801 movw R2,R16
0062 80E0 ldi R24,<_DiskCache+2
0064 90E0 ldi R25,>_DiskCache+2
0066 280E add R2,R24
0068 391E adc R3,R25
006A F101 movw R30,R2
006C 8081 ldd R24,z+0
006E 9181 ldd R25,z+1
0070 0197 sbiw R24,1
0072 9183 std z+1,R25
0074 8083 std z+0,R24
0076 08E0 ldi R16,520
0078 12E0 ldi R17,2
007A 9501 movw R18,R10
007C 0E940000 xcall empy16s
0080 F801 movw R30,R16
0082 80E0 ldi R24,<_DiskCache+4
0084 90E0 ldi R25,>_DiskCache+4
0086 E80F add R30,R24
0088 F91F adc R31,R25
008A 40E0 ldi R20,0
008C 50E0 ldi R21,0
008E 60E0 ldi R22,0
0090 70E0 ldi R23,0
0092 4083 std z+0,R20
0094 5183 std z+1,R21
0096 6283 std z+2,R22
0098 7383 std z+3,R23
009A L3:
009A C501 movw R24,R10
009C 0196 adiw R24,1
009E 5C01 movw R10,R24
00A0 L5:
00A0 C501 movw R24,R10
00A2 8130 cpi R24,1
00A4 E0E0 ldi R30,0
00A6 9E07 cpc R25,R30
00A8 08F4 brsh X0
00AA AFCF xjmp L2
00AC X0:
00AC L1:
00AC 0E940000 xcall pop_gset3
00B0 .dbline 0 ; func end
00B0 0895 ret
00B2 ; Index -> y+0
00B2 ; Drive -> R16
.even
00B2 _CloseSec::
00B2 3A93 st -y,r19
00B4 2A93 st -y,r18
00B6 ; {
00B6 ; DiskCache[i].Drive=EMPTY_DRIVE ;/* cache空闲 */
00B6 ; DiskCache[i].Flag=0 ; /* 扇区无需回写 */
00B6 ; DiskCache[i].RW_ID=0 ; /* 访问纪录 */
00B6 ; DiskCache[i].RW_ID--; /* 访问纪录 */
00B6 ; DiskCache[i].SecIndex=0 ; /* 缓冲的扇区号 */
00B6 ; }
00B6 ; }
00B6 ;
00B6 ;
00B6 ; /*********************************************************************************************************
00B6 ; ** 函数名称: CloseSec
00B6 ; ** 功能描述: 解锁指定cache(允许切换出内存)
00B6 ; ** 输 入: Drive:逻辑驱动器号
00B6 ; ** Index:缓冲的扇区号
00B6 ; ** 输 出: 无
00B6 ; ** 全局变量: DiskCache
00B6 ; ** 调用模块: 无
00B6 ; ** 作 者: 陈明计
00B6 ; ** 日 期: 2003年9月3日
00B6 ; **-------------------------------------------------------------------------------------------------------
00B6 ; ** 修 改 人: 陈明计
00B6 ; ** 日 期: 2004年4月10日
00B6 ; **------------------------------------------------------------------------------------------------------
00B6 ; ********************************************************************************************************/
00B6 ; void CloseSec(INT8U Drive,INT32U Index)
00B6 ; {
00B6 ; Drive=Drive ;
00B6 ; Index=Index ;
00B6 FE01 movw R30,R28
00B8 2080 ldd R2,z+0
00BA 3180 ldd R3,z+1
00BC 4280 ldd R4,z+2
00BE 5380 ldd R5,z+3
00C0 FE01 movw R30,R28
00C2 2082 std z+0,R2
00C4 3182 std z+1,R3
00C6 4282 std z+2,R4
00C8 5382 std z+3,R5
00CA L10:
00CA 2296 adiw R28,2
00CC .dbline 0 ; func end
00CC 0895 ret
00CE ; Pa -> y+0
00CE ; Disk -> R20,R21
00CE ; Index -> R22,R23
.even
00CE _CacheWriteBack2::
00CE 0E940000 xcall push_gset2
00D2 B801 movw R22,R16
00D4 2B97 sbiw R28,11
00D6 ; }
00D6 ;
00D6 ; /*********************************************************************************************************
00D6 ; ** 函数名称: CacheWriteBack2
00D6 ; ** 功能描述: 把指定扇区写回逻辑盘
00D6 ; ** 输 入: Index:cache索引
00D6 ; ** 输 出: 无
00D6 ; ** 全局变量: DiskCache
00D6 ; ** 调用模块: GetDiskInfo
00D6 ; ** 作 者: 陈明计
00D6 ; ** 日 期: 2003年9月3日
00D6 ; **-------------------------------------------------------------------------------------------------------
00D6 ; ** 修 改 人: 陈明计
00D6 ; ** 日 期: 2004年4月10日
00D6 ; **------------------------------------------------------------------------------------------------------
00D6 ; ********************************************************************************************************/
00D6 ; void CacheWriteBack2(INT16U Index)
00D6 ; {
00D6 ; Disk_RW_Parameter Pa ;
00D6 ; Disk_Info *Disk ;
00D6 ;
00D6 ; Disk=GetDiskInfo(DiskCache[Index].Drive);// 获取逻辑盘信息
00D6 08E0 ldi R16,520
00D8 12E0 ldi R17,2
00DA 9B01 movw R18,R22
00DC 0E940000 xcall empy16s
00E0 F801 movw R30,R16
00E2 80E0 ldi R24,<_DiskCache
00E4 90E0 ldi R25,>_DiskCache
00E6 E80F add R30,R24
00E8 F91F adc R31,R25
00EA 0081 ldd R16,z+0
00EC 0E940000 xcall _GetDiskInfo
00F0 A801 movw R20,R16
00F2 ; if(Disk!=NULL)
00F2 0030 cpi R16,0
00F4 0107 cpc R16,R17
00F6 09F4 brne X3
00F8 53C0 xjmp L12
00FA X3:
00FA X1:
00FA ; if(Disk->DiskCommand!=NULL)
00FA FA01 movw R30,R20
00FC 24A4 ldd R2,z+44
00FE 35A4 ldd R3,z+45
0100 2220 tst R2
0102 19F4 brne X2
0104 3320 tst R3
0106 09F4 brne X4
0108 4BC0 xjmp L14
010A X4:
010A X2:
010A ; {
010A ; DiskCache[Index].Flag&=~CACHE_WRITED ;// 不再需要回写
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?