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