dir.lis

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

LIS
1,634
字号
 041A E696              adiw R28,54
 041C 0E940000          xcall pop_gset5
 0420                   .dbline 0 ; func end
 0420 0895              ret
 0422           ;      ClusIndex -> y+40
 0422           ;             Rt -> R10
 0422           ;          Drive -> R12
 0422           ;          Temp1 -> y+36
 0422           ;           temp -> y+4
 0422           ;           Path -> R10,R11
                        .even
 0422           _MakeDir::
 0422 0E940000          xcall push_gset4
 0426 5801              movw R10,R16
 0428 AC97              sbiw R28,44
 042A           ; }
 042A           ; 
 042A           ; /*********************************************************************************************************
 042A           ; ** 函数名称: MakeDir
 042A           ; ** 功能描述: 建立目录
 042A           ; ** 输   入: Path:路径名
 042A           ; ** 输   出: RETURN_OK:成功
 042A           ; **           其它参考fat.h中关于返回值的说明
 042A           ; ** 全局变量: 无
 042A           ; ** 调用模块: strupr,ClearClus,AddFDT
 042A           ; ** 作   者: 陈明计
 042A           ; ** 日   期: 2003年9月8日
 042A           ; **-------------------------------------------------------------------------------------------------------
 042A           ; ** 修 改 人: 陈明计
 042A           ; ** 日   期: 2004年4月10日
 042A           ; **------------------------------------------------------------------------------------------------------
 042A           ; ********************************************************************************************************/
 042A           ; INT8U MakeDir(char *Path)
 042A           ; {
 042A           ;     INT32U ClusIndex,Temp1 ;
 042A           ;     INT8U  Drive,Rt ;
 042A           ;     FDT    temp ;
 042A           ;     
 042A           ;     strupr(Path);/* 变为大写 */
 042A 8501              movw R16,R10
 042C C2D1              xcall _strupr
 042E           ;     
 042E           ;     ClusIndex=_GetFDTInfo(temp.Name,Path);
 042E 9501              movw R18,R10
 0430 8E01              movw R16,R28
 0432 0C5F              subi R16,252  ; offset = 4
 0434 1F4F              sbci R17,255
 0436 4DDE              xcall __GetFDTInfo
 0438 FE01              movw R30,R28
 043A 00A7              std z+40,R16
 043C 11A7              std z+41,R17
 043E 22A7              std z+42,R18
 0440 33A7              std z+43,R19
 0442           ;     if(ClusIndex==BAD_CLUS)
 0442 47EF              ldi R20,247
 0444 5FEF              ldi R21,255
 0446 6FEF              ldi R22,255
 0448 7FE0              ldi R23,15
 044A FE01              movw R30,R28
 044C 20A4              ldd R2,z+40
 044E 31A4              ldd R3,z+41
 0450 42A4              ldd R4,z+42
 0452 53A4              ldd R5,z+43
 0454 2416              cp R2,R20
 0456 3506              cpc R3,R21
 0458 4606              cpc R4,R22
 045A 5706              cpc R5,R23
 045C 11F4              brne L109
 045E           ;     {
 045E           ;         return PATH_NOT_FIND ;
 045E 0EE0              ldi R16,14
 0460 EDC0              xjmp L108
 0462           L109:
 0462           ;     }
 0462           ;     
 0462           ;     Drive=GetDrive(Path);
 0462 8501              movw R16,R10
 0464 9DDE              xcall _GetDrive
 0466 C02E              mov R12,R16
 0468           ;     
 0468           ;     /* FDT是否存在 */
 0468           ;     Rt=FDTIsLie(Drive,ClusIndex,temp.Name);
 0468 CE01              movw R24,R28
 046A 0496              adiw R24,4
 046C 9B83              std y+3,R25
 046E 8A83              std y+2,R24
 0470 FE01              movw R30,R28
 0472 20A4              ldd R2,z+40
 0474 31A4              ldd R3,z+41
 0476 42A4              ldd R4,z+42
 0478 53A4              ldd R5,z+43
 047A 4882              std y+0,R4
 047C 5982              std y+1,R5
 047E 9101              movw R18,R2
 0480 0E940000          xcall _FDTIsLie
 0484 A02E              mov R10,R16
 0486           ;     if(Rt!=NOT_FIND_FDT)
 0486 0730              cpi R16,7
 0488 09F0              breq L111
 048A           ;     {
 048A           ;         return Rt ;
 048A D8C0              xjmp L108
 048C           L111:
 048C           ;     }
 048C           ;     
 048C           ;     /* 不存在 */
 048C           ;     Temp1=FATAddClus(Drive,0);
 048C 40E0              ldi R20,0
 048E 50E0              ldi R21,0
 0490 60E0              ldi R22,0
 0492 70E0              ldi R23,0
 0494 6883              std y+0,R22
 0496 7983              std y+1,R23
 0498 9A01              movw R18,R20
 049A 0C2D              mov R16,R12
 049C 0E940000          xcall _FATAddClus
 04A0 FE01              movw R30,R28
 04A2 04A3              std z+36,R16
 04A4 15A3              std z+37,R17
 04A6 26A3              std z+38,R18
 04A8 37A3              std z+39,R19
 04AA           ;     
 04AA           ;     if((Temp1<=EMPTY_CLUS_1)||(Temp1>=BAD_CLUS))/* 获取目录所需磁盘空间 */
 04AA 41E0              ldi R20,1
 04AC 50E0              ldi R21,0
 04AE 60E0              ldi R22,0
 04B0 70E0              ldi R23,0
 04B2 FE01              movw R30,R28
 04B4 24A0              ldd R2,z+36
 04B6 35A0              ldd R3,z+37
 04B8 46A0              ldd R4,z+38
 04BA 57A0              ldd R5,z+39
 04BC 4215              cp R20,R2
 04BE 5305              cpc R21,R3
 04C0 6405              cpc R22,R4
 04C2 7505              cpc R23,R5
 04C4 70F4              brsh L115
 04C6 47EF              ldi R20,247
 04C8 5FEF              ldi R21,255
 04CA 6FEF              ldi R22,255
 04CC 7FE0              ldi R23,15
 04CE FE01              movw R30,R28
 04D0 24A0              ldd R2,z+36
 04D2 35A0              ldd R3,z+37
 04D4 46A0              ldd R4,z+38
 04D6 57A0              ldd R5,z+39
 04D8 2416              cp R2,R20
 04DA 3506              cpc R3,R21
 04DC 4606              cpc R4,R22
 04DE 5706              cpc R5,R23
 04E0 10F0              brlo L113
 04E2           L115:
 04E2           ;     {
 04E2           ;         /* 没有空闲空间 */
 04E2           ;         return DISK_FULL ;
 04E2 02E0              ldi R16,2
 04E4 ABC0              xjmp L108
 04E6           L113:
 04E6           ;     }
 04E6           ;     
 04E6           ;     ClearClus(Drive,Temp1);
 04E6 FE01              movw R30,R28
 04E8 24A0              ldd R2,z+36
 04EA 35A0              ldd R3,z+37
 04EC 46A0              ldd R4,z+38
 04EE 57A0              ldd R5,z+39
 04F0 4882              std y+0,R4
 04F2 5982              std y+1,R5
 04F4 9101              movw R18,R2
 04F6 0C2D              mov R16,R12
 04F8 0E940000          xcall _ClearClus
 04FC           ;     /* 清空簇 */
 04FC           ;     
 04FC           ;     /* 设置FDT属性 */
 04FC           ;     temp.Attr=ATTR_DIRECTORY ;
 04FC 80E1              ldi R24,16
 04FE 8F87              std y+15,R24
 0500           ;     temp.FileSize=0 ;
 0500 40E0              ldi R20,0
 0502 50E0              ldi R21,0
 0504 60E0              ldi R22,0
 0506 70E0              ldi R23,0
 0508 FE01              movw R30,R28
 050A 40A3              std z+32,R20
 050C 51A3              std z+33,R21
 050E 62A3              std z+34,R22
 0510 73A3              std z+35,R23
 0512           ;     
 0512           ;     temp.NTRes=0 ;
 0512 2224              clr R2
 0514 288A              std y+16,R2
 0516           ;     temp.CrtTimeTenth=time_getTime();
 0516 0E940000          xcall _fs_getTime
 051A 098B              std y+17,R16
 051C           ;     temp.CrtTime=time_getTime();
 051C 0E940000          xcall _fs_getTime
 0520 1B8B              std y+19,R17
 0522 0A8B              std y+18,R16
 0524           ;     temp.CrtDate=time_getDate();
 0524 0E940000          xcall _fs_getDate
 0528 1D8B              std y+21,R17
 052A 0C8B              std y+20,R16
 052C           ;     temp.LstAccDate=time_getDate();
 052C 0E940000          xcall _fs_getDate
 0530 1F8B              std y+23,R17
 0532 0E8B              std y+22,R16
 0534           ;     temp.WrtTime=time_getTime();
 0534 0E940000          xcall _fs_getTime
 0538 1B8F              std y+27,R17
 053A 0A8F              std y+26,R16
 053C           ;     temp.WrtDate=time_getDate();
 053C 0E940000          xcall _fs_getDate
 0540 1D8F              std y+29,R17
 0542 0C8F              std y+28,R16
 0544           ;     
 0544           ;     temp.FstClusLO=(INT16U)(Temp1&0xffff);
 0544 4FEF              ldi R20,255
 0546 5FEF              ldi R21,255
 0548 60E0              ldi R22,0
 054A 70E0              ldi R23,0
 054C FE01              movw R30,R28
 054E 24A0              ldd R2,z+36
 0550 35A0              ldd R3,z+37
 0552 46A0              ldd R4,z+38
 0554 57A0              ldd R5,z+39
 0556 2422              and R2,R20
 0558 3522              and R3,R21
 055A 4622              and R4,R22
 055C 5722              and R5,R23
 055E 3F8E              std y+31,R3
 0560 2E8E              std y+30,R2
 0562           ;     //temp.FstClusHI=Temp1/0x10000 ;
 0562           ;     temp.FstClusHI=(INT16U)(Temp1>>16);
 0562 FE01              movw R30,R28
 0564 24A0              ldd R2,z+36
 0566 35A0              ldd R3,z+37
 0568 46A0              ldd R4,z+38
 056A 57A0              ldd R5,z+39
 056C 1201              movw R2,R4
 056E 398E              std y+25,R3
 0570 288E              std y+24,R2
 0572           ;     
 0572           ;     Rt=AddFDT(Drive,ClusIndex,&temp);
 0572 CE01              movw R24,R28
 0574 0496              adiw R24,4
 0576 9B83              std y+3,R25
 0578 8A83              std y+2,R24
 057A FE01              movw R30,R28
 057C 20A4              ldd R2,z+40
 057E 31A4              ldd R3,z+41
 0580 42A4              ldd R4,z+42
 0582 53A4              ldd R5,z+43
 0584 4882              std y+0,R4
 0586 5982              std y+1,R5
 0588 9101              movw R18,R2
 058A 0C2D              mov R16,R12
 058C 0E940000          xcall _AddFDT
 0590 A02E              mov R10,R16
 0592           ;     /* 增加目录项 */
 0592           ;     if(Rt==RETURN_OK)
 0592 0023              tst R16
 0594 09F0              breq X7
 0596 46C0              xjmp L127
 0598           X7:
 0598           ;     {
 0598           ;         /* 建立'.'目录 */
 0598           ;         temp.Name[0]='.' ;
 0598 8EE2              ldi R24,46
 059A 8C83              std y+4,R24
 059C           ;         temp.Name[1]=0x20 ;
 059C 80E2              ldi R24,32
 059E 8D83              std y+5,R24
 05A0           ;         temp.Name[2]=0x20 ;
 05A0 8E83              std y+6,R24
 05A2           ;         temp.Name[3]=0x20 ;
 05A2 8F83              std y+7,R24
 05A4           ;         temp.Name[4]=0x20 ;
 05A4 8887              std y+8,R24
 05A6           ;         temp.Name[5]=0x20 ;
 05A6 8987              std y+9,R24
 05A8           ;         temp.Name[6]=0x20 ;
 05A8 8A87              std y+10,R24
 05AA           ;         temp.Name[7]=0x20 ;
 05AA 8B87              std y+11,R24
 05AC           ;         temp.Name[8]=0x20 ;
 05AC 8C87              std y+12,R24
 05AE           ;         temp.Name[9]=0x20 ;
 05AE 8D87              std y+13,R24
 05B0           ;         temp.Name[10]=0x20 ;
 05B0 8E87              std y+14,R24
 05B2           ;         
 05B2           ;         AddFDT(Drive,Temp1,&temp);
 05B2 CE01              movw R24,R28
 05B4 0496              adiw R24,4
 05B6 9B83              std y+3,R25
 05B8 8A83              std y+2,R24
 05BA FE01              movw R30,R28
 05BC 24A0              ldd R2,z+36
 05BE 35A0              ldd R3,z+37
 05C0 46A0              ldd R4,z+38
 05C2 57A0              ldd R5,z+39
 05C4 4882              std y+0,R4
 05C6 5982              std y+1,R5
 05C8 9101              movw R18,R2
 05CA 0C2D              mov R16,R12
 05CC 0E940000          xcall _AddFDT
 05D0           ;         
 05D0           ;         /* 建立'..'目录 */
 05D0           ;         temp.Name[1]='.' ;
 05D0 8EE2              ldi R24,46
 05D2 8D83              std y+5,R24
 05D4           ;         
 05D4           ;         temp.FstClusLO=(INT16U)(ClusIndex&0xffff);
 05D4 4FEF              ldi R20,255
 05D6 5FEF              ldi R21,255
 05D8 60E0              ldi R22,0
 05DA 70E0              ldi R23,0
 05DC FE01              movw R30,R28
 05DE 20A4              ldd R2,z+40
 05E0 31A4              ldd R3,z+41
 05E2 42A4              ldd R4,z+42
 05E4 53A4              ldd R5,z+43
 05E6 2422              and R2,R20
 05E8 3522              and R3,R21
 05EA 4622              and R4,R22
 05EC 5722              and R5,R23
 05EE 3F8E              std y+31,R3

⌨️ 快捷键说明

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