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 + -
显示快捷键?