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