disk.lis

来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,577 行 · 第 1/5 页

LIS
1,577
字号
 0196           L18:
 0196 0E940000          xcall pop_gset1
 019A                   .dbline 0 ; func end
 019A 0895              ret
 019C           ;             Rt -> R16,R17
 019C           ;              i -> R18
                        .even
 019C           _GetEmptyDiskInfoAddr::
 019C           ; }
 019C           ; 
 019C           ; /*********************************************************************************************************
 019C           ; ** 函数名称: GetEmptyDiskInfoAddr
 019C           ; ** 功能描述: 获取空闲逻辑盘
 019C           ; ** 输   入: 无
 019C           ; ** 输   出: 指向逻辑盘信息的结构体指针
 019C           ; ** 全局变量: DiskInfo
 019C           ; ** 调用模块: 无
 019C           ; ** 作   者: 陈明计
 019C           ; ** 日   期: 2003年9月3日
 019C           ; **-------------------------------------------------------------------------------------------------------
 019C           ; ** 修 改 人:
 019C           ; ** 日   期:
 019C           ; **------------------------------------------------------------------------------------------------------
 019C           ; ********************************************************************************************************/
 019C           ; Disk_Info *GetEmptyDiskInfoAddr(void)
 019C           ; {
 019C           ;     INT8U i ;
 019C           ;     Disk_Info *Rt ;
 019C           ;     
 019C           ;     Rt=NULL ;
 019C 0027              clr R16
 019E 1127              clr R17
 01A0           ;     for(i=0;i<MAX_DRIVES;i++)
 01A0 2227              clr R18
 01A2 1BC0              xjmp L27
 01A4           L24:
 01A4           ;     {
 01A4           ;         // 逻辑盘号空闲
 01A4           ;         if(DiskInfo[i].Drive==EMPTY_DRIVE)
 01A4 8EE2              ldi R24,46
 01A6 829F              mul R24,R18
 01A8 F001              movw R30,R0
 01AA 80E0              ldi R24,<_DiskInfo
 01AC 90E0              ldi R25,>_DiskInfo
 01AE E80F              add R30,R24
 01B0 F91F              adc R31,R25
 01B2 8081              ldd R24,z+0
 01B4 8F3F              cpi R24,255
 01B6 81F4              brne L28
 01B8           ;         {
 01B8           ;             Rt=DiskInfo+i ;
 01B8 8EE2              ldi R24,46
 01BA 829F              mul R24,R18
 01BC 8001              movw R16,R0
 01BE 80E0              ldi R24,<_DiskInfo
 01C0 90E0              ldi R25,>_DiskInfo
 01C2 080F              add R16,R24
 01C4 191F              adc R17,R25
 01C6           ;             DiskInfo[i].Drive=i ;
 01C6 8EE2              ldi R24,46
 01C8 829F              mul R24,R18
 01CA F001              movw R30,R0
 01CC 80E0              ldi R24,<_DiskInfo
 01CE 90E0              ldi R25,>_DiskInfo
 01D0 E80F              add R30,R24
 01D2 F91F              adc R31,R25
 01D4 2083              std z+0,R18
 01D6           ;             break ;
 01D6 03C0              xjmp L26
 01D8           L28:
 01D8           L25:
 01D8 2395              inc R18
 01DA           L27:
 01DA 2130              cpi R18,1
 01DC 18F3              brlo L24
 01DE           L26:
 01DE           ;         }
 01DE           ;     }
 01DE           ;     return Rt ;
 01DE           L23:
 01DE                   .dbline 0 ; func end
 01DE 0895              ret
 01E0           ;           temp -> R12,R13
 01E0           ;          temp1 -> y+2
 01E0           ;            Buf -> R14,R15
 01E0           ;              i -> R10
 01E0           ;    DiskCommand -> R10,R11
                        .even
 01E0           _AddFileDriver::
 01E0 0E940000          xcall push_gset5
 01E4 5801              movw R10,R16
 01E6 2697              sbiw R28,6
 01E8           ; }
 01E8           ; 
 01E8           ; /*********************************************************************************************************
 01E8           ; ** 函数名称: AddFileDriver
 01E8           ; ** 功能描述: 增加一个底层驱动程序
 01E8           ; ** 输   入: DiskCommand:驱动程序接口函数
 01E8           ; ** 输   出: 无
 01E8           ; ** 全局变量: DiskInfo
 01E8           ; ** 调用模块: 无
 01E8           ; ** 作   者: 陈明计
 01E8           ; ** 日   期: 2003年9月5日
 01E8           ; **-------------------------------------------------------------------------------------------------------
 01E8           ; ** 修 改 人: 陈明计
 01E8           ; ** 日   期: 2004年4月10日
 01E8           ; **------------------------------------------------------------------------------------------------------
 01E8           ; ********************************************************************************************************/
 01E8           ; void AddFileDriver( INT16U(* DiskCommand)(INT8U Command,void *Parameter) )
 01E8           ; { 
 01E8           ;     INT8U  i ;
 01E8           ;     INT8U  *Buf ;
 01E8           ;     INT16U temp ;
 01E8           ;     INT32U temp1 ;
 01E8           ;     
 01E8           ;     if(DiskCommand==NULL)// 参数无效退出
 01E8 AA20              tst R10
 01EA 19F4              brne L31
 01EC BB20              tst R11
 01EE 09F4              brne L31
 01F0           X1:
 01F0           ;     {
 01F0           ;         return ;
 01F0 A7C3              xjmp L30
 01F2           L31:
 01F2           ;     }
 01F2           ;     
 01F2           ;     if(DiskCommand(DISK_INIT,NULL)==DISK_INIT_NOT_OK)// 底层驱动初始化不成功退出
 01F2 2227              clr R18
 01F4 3327              clr R19
 01F6 0027              clr R16
 01F8 F501              movw R30,R10
 01FA 0E940000          xcall xicall
 01FE 0338              cpi R16,131
 0200 E0E0              ldi R30,0
 0202 1E07              cpc R17,R30
 0204 29F4              brne L33
 0206           ;     {
 0206           ;         #if FS_DEBUG_EN
 0206           ;           #if USART1_EN
 0206           ;               Uart1_SendString("\nSD/MMC INIT NOT OK");//调试用,初始化失败
 0206 00E0              ldi R16,<L35
 0208 10E0              ldi R17,>L35
 020A 0E940000          xcall _Uart1_SendString
 020E           ;           #endif
 020E           ;           #endif
 020E           ;               
 020E           ;         return ;
 020E 98C3              xjmp L30
 0210           L33:
 0210           ;     }
 0210           ;     
 0210           ;     for(i=0;i<MAX_DRIVES;i++)/* 重新获取逻辑盘信息 */
 0210 AA24              clr R10
 0212 92C3              xjmp L39
 0214           L36:
 0214           ;     {
 0214           ;         /* 逻辑盘已分配 */
 0214           ;         if(DiskInfo[i].Drive!=EMPTY_DRIVE)
 0214 8EE2              ldi R24,46
 0216 8A9D              mul R24,R10
 0218 F001              movw R30,R0
 021A 80E0              ldi R24,<_DiskInfo
 021C 90E0              ldi R25,>_DiskInfo
 021E E80F              add R30,R24
 0220 F91F              adc R31,R25
 0222 8081              ldd R24,z+0
 0224 8F3F              cpi R24,255
 0226 09F4              brne X5
 0228 86C3              xjmp L40
 022A           X5:
 022A           ;         {
 022A           ;             Buf=OpenSec(DiskInfo[i].Drive,0);/* 打开扇区0(保留扇区) */
 022A 40E0              ldi R20,0
 022C 50E0              ldi R21,0
 022E 60E0              ldi R22,0
 0230 70E0              ldi R23,0
 0232 6883              std y+0,R22
 0234 7983              std y+1,R23
 0236 9A01              movw R18,R20
 0238 8EE2              ldi R24,46
 023A 8A9D              mul R24,R10
 023C F001              movw R30,R0
 023E 80E0              ldi R24,<_DiskInfo
 0240 90E0              ldi R25,>_DiskInfo
 0242 E80F              add R30,R24
 0244 F91F              adc R31,R25
 0246 0081              ldd R16,z+0
 0248 0E940000          xcall _OpenSec
 024C 7801              movw R14,R16
 024E           ;             ReadSec(DiskInfo[i].Drive,0);
 024E 40E0              ldi R20,0
 0250 50E0              ldi R21,0
 0252 60E0              ldi R22,0
 0254 70E0              ldi R23,0
 0256 6883              std y+0,R22
 0258 7983              std y+1,R23
 025A 9A01              movw R18,R20
 025C 8EE2              ldi R24,46
 025E 8A9D              mul R24,R10
 0260 F001              movw R30,R0
 0262 80E0              ldi R24,<_DiskInfo
 0264 90E0              ldi R25,>_DiskInfo
 0266 E80F              add R30,R24
 0268 F91F              adc R31,R25
 026A 0081              ldd R16,z+0
 026C 0E940000          xcall _ReadSec
 0270           ;           
 0270           ;             if(Buf!=NULL)
 0270 EE20              tst R14
 0272 19F4              brne X2
 0274 FF20              tst R15
 0276 09F4              brne X6
 0278 4DC3              xjmp L42
 027A           X6:
 027A           X2:
 027A           ;             {
 027A           ;                 /* 每扇区字节数 */
 027A           ;                 DiskInfo[i].BytsPerSec=((INT16U)Buf[12]<<8)+Buf[11];
 027A 8EE2              ldi R24,46
 027C 8A9D              mul R24,R10
 027E F001              movw R30,R0
 0280 80E0              ldi R24,<_DiskInfo+16
 0282 90E0              ldi R25,>_DiskInfo+16
 0284 E80F              add R30,R24
 0286 F91F              adc R31,R25
 0288 D701              movw R26,R14
 028A 1B96              adiw R26,11
 028C 2C90              ld R2,x
 028E D701              movw R26,R14
 0290 1C96              adiw R26,12
 0292 3C90              ld R3,x
 0294 4424              clr R4
 0296 5524              clr R5
 0298 2082              std z+0,R2
 029A 3182              std z+1,R3
 029C 4282              std z+2,R4
 029E 5382              std z+3,R5
 02A0           ;                   #if FS_DEBUG_EN
 02A0           ;                       #if USART1_EN
 02A0           ;                   {   
 02A0           ;                       Uart1_SendString("\n 1.BytsPerSec:");//调试用,每扇区字节数
 02A0 00E0              ldi R16,<L45
 02A2 10E0              ldi R17,>L45
 02A4 0E940000          xcall _Uart1_SendString
 02A8           ;                       PUT_INT32U_DecTOString(DiskInfo[i].BytsPerSec);
 02A8 8EE2              ldi R24,46
 02AA 8A9D              mul R24,R10
 02AC F001              movw R30,R0
 02AE 80E0              ldi R24,<_DiskInfo+16
 02B0 90E0              ldi R25,>_DiskInfo+16
 02B2 E80F              add R30,R24
 02B4 F91F              adc R31,R25
 02B6 0081              ldd R16,z+0
 02B8 1181              ldd R17,z+1
 02BA 2281              ldd R18,z+2
 02BC 3381              ldd R19,z+3
 02BE 0E940000          xcall _PUT_INT32U_DecTOString
 02C2           ;                   }
 02C2           ;                       #endif
 02C2           ;                   #endif
 02C2           ;             
 02C2           ;               /* 每簇扇区数 */
 02C2           ;                 DiskInfo[i].SecPerClus=Buf[13];
 02C2 8EE2              ldi R24,46
 02C4 8A9D              mul R24,R10
 02C6 F001              movw R30,R0
 02C8 80E0              ldi R24,<_DiskInfo+2
 02CA 90E0              ldi R25,>_DiskInfo+2
 02CC E80F              add R30,R24
 02CE F91F              adc R31,R25
 02D0 D701              movw R26,R14
 02D2 1D96              adiw R26,13
 02D4 2C90              ld R2,x
 02D6 2082              std z+0,R2
 02D8           ;                       #if FS_DEBUG_EN
 02D8           ;                       #if USART1_EN
 02D8           ;                   {
 02D8           ;                       Uart1_SendString("\n 2.SecPerClus:");//调试用 ,每簇扇区数
 02D8 00E0              ldi R16,<L48
 02DA 10E0              ldi R17,>L48
 02DC 0E940000          xcall _Uart1_SendString
 02E0           ;                       PUT_INT32U_DecTOString(DiskInfo[i].SecPerClus);
 02E0 8EE2              ldi R24,46
 02E2 8A9D              mul R24,R10
 02E4 F001              movw R30,R0
 02E6 80E0              ldi R24,<_DiskInfo+2
 02E8 90E0              ldi R25,>_DiskInfo+2
 02EA E80F              add R30,R24
 02EC F91F              adc R31,R25
 02EE 2080              ldd R2,z+0
 02F0 3324              clr R3
 02F2 4424              clr R4
 02F4 5524              clr R5
 02F6 8101              movw R16,R2
 02F8 9201              movw R18,R4
 02FA 0E940000          xcall _PUT_INT32U_DecTOString
 02FE           ;                   }
 02FE           ;                   #endif
 02FE           ;                       #endif
 02FE           ;                
 02FE           ;               /* FAT开始扇区号 */
 02FE           ;                 DiskInfo[i].FATStartSec=((INT16U)Buf[15]<<8)+Buf[14];
 02FE 8EE2              ldi R24,46
 0300 8A9D              mul R24,R10
 0302 F001              movw R30,R0
 0304 80E0              ldi R24,<_DiskInfo+4
 0306 90E0              ldi R25,>_DiskInfo+4
 0308 E80F              add R30,R24
 030A F91F              adc R31,R25
 030C D701              movw R26,R14
 030E 1E96              adiw R26,14
 0310 2C90              ld R2,x
 0312 D701              movw R26,R14
 0314 1F96              adiw R26,15
 0316 3C90              ld R3,x

⌨️ 快捷键说明

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