📄 sd.lst
字号:
(0155) unsigned int hasBuffer;
(0156) unsigned int b;
(0157) int i,index;
(0158) char *p;
(0159)
(0160) entrycount = 0;
063F 2422 CLR R2
0640 2433 CLR R3
0641 92300110 STS entrycount+1,R3
0643 9220010F STS entrycount,R2
(0161) DirNameBuffer = 0;
0645 92300108 STS DirNameBuffer+1,R3
0647 92200107 STS DirNameBuffer,R2
(0162)
(0163)
(0164) // 读取目录区数据
(0165) sector = fatClustToSect(FirstDirSector);
0649 9120042B LDS R18,FirstDirSector+2
064B 9130042C LDS R19,FirstDirSector+3
064D 91000429 LDS R16,FirstDirSector
064F 9110042A LDS R17,FirstDirSector+1
0651 DE22 RCALL _fatClustToSect
0652 01FE MOVW R30,R28
0653 8300 STD Z+0,R16
0654 8311 STD Z+1,R17
0655 8322 STD Z+2,R18
0656 8333 STD Z+3,R19
(0166)
(0167) hasBuffer = 0;
0657 2400 CLR R0
0658 2411 CLR R1
0659 8A1B STD Y+19,R1
065A 8A0A STD Y+18,R0
(0168)
(0169) index = 16;
065B E180 LDI R24,0x10
065C E090 LDI R25,0
065D 8B99 STD Y+17,R25
065E 8B88 STD Y+16,R24
(0170) do
(0171) {
(0172) if(index == 16) // 是否该一人一扇区time for next sector ?
065F 8988 LDD R24,Y+16
0660 8999 LDD R25,Y+17
0661 3180 CPI R24,0x10
0662 E0E0 LDI R30,0
0663 079E CPC R25,R30
0664 F009 BEQ 0x0666
0665 C02A RJMP 0x0690
(0173) {
(0174) ReadBlock(sector++);
0666 01FE MOVW R30,R28
0667 8020 LDD R2,Z+0
0668 8031 LDD R3,Z+1
0669 8042 LDD R4,Z+2
066A 8053 LDD R5,Z+3
066B 01FE MOVW R30,R28
066C 8224 STD Z+4,R2
066D 8235 STD Z+5,R3
066E 8246 STD Z+6,R4
066F 8257 STD Z+7,R5
0670 E041 LDI R20,1
0671 E050 LDI R21,0
0672 E060 LDI R22,0
0673 E070 LDI R23,0
0674 01FE MOVW R30,R28
0675 8024 LDD R2,Z+4
0676 8035 LDD R3,Z+5
0677 8046 LDD R4,Z+6
0678 8057 LDD R5,Z+7
0679 0E24 ADD R2,R20
067A 1E35 ADC R3,R21
067B 1E46 ADC R4,R22
067C 1E57 ADC R5,R23
067D 01FE MOVW R30,R28
067E 8220 STD Z+0,R2
067F 8231 STD Z+1,R3
0680 8242 STD Z+2,R4
0681 8253 STD Z+3,R5
0682 01FE MOVW R30,R28
0683 8104 LDD R16,Z+4
0684 8115 LDD R17,Z+5
0685 8126 LDD R18,Z+6
0686 8137 LDD R19,Z+7
0687 DDCF RCALL _ReadBlock
(0175) de = (struct direntry *)BUFFER;
0688 E285 LDI R24,0x25
0689 E092 LDI R25,2
068A 879F STD Y+15,R25
068B 878E STD Y+14,R24
(0176) index = 0;
068C 2400 CLR R0
068D 2411 CLR R1
068E 8A19 STD Y+17,R1
068F 8A08 STD Y+16,R0
(0177) }
(0178)
(0179) if(*de->deName != 0xE5)
0690 85EE LDD R30,Y+14
0691 85FF LDD R31,Y+15
0692 8180 LDD R24,Z+0
0693 3E85 CPI R24,0xE5
0694 F409 BNE 0x0696
0695 C122 RJMP 0x07B8
(0180) {
(0181) // 如果if not a deleted entry
(0182) if(de->deAttributes == ATTR_LONG_FILENAME)
0696 8583 LDD R24,Z+11
0697 308F CPI R24,0xF
0698 F009 BEQ 0x069A
0699 C06F RJMP 0x0709
(0183) {
(0184) // we have a long name entry
(0185) we = (struct winentry *) de;
069A 840E LDD R0,Y+14
069B 841F LDD R1,Y+15
069C 861D STD Y+13,R1
069D 860C STD Y+12,R0
(0186) b = 13 *( (we->weCnt-1) & 0x0f); // index into string
069E 01F0 MOVW R30,R0
069F 8180 LDD R24,Z+0
06A0 5081 SUBI R24,1
06A1 708F ANDI R24,0xF
06A2 E09D LDI R25,0xD
06A3 9F98 MUL R25,R24
06A4 8A1D STD Y+21,R1
06A5 8A0C STD Y+20,R0
(0187) p = &LongNameBuffer[b];
06A6 90200105 LDS R2,LongNameBuffer
06A8 90300106 LDS R3,LongNameBuffer+1
06AA 0160 MOVW R12,R0
06AB 0CC2 ADD R12,R2
06AC 1CD3 ADC R13,R3
(0188) for (i=0;i<5;i++) *p++ = we->wePart1[i*2]; // copy first part
06AD 24EE CLR R14
06AE 24FF CLR R15
06AF E002 LDI R16,2
06B0 E010 LDI R17,0
06B1 0197 MOVW R18,R14
06B2 940E0D58 CALL empy16s
06B4 01F8 MOVW R30,R16
06B5 858C LDD R24,Y+12
06B6 859D LDD R25,Y+13
06B7 9601 ADIW R24,1
06B8 0FE8 ADD R30,R24
06B9 1FF9 ADC R31,R25
06BA 8020 LDD R2,Z+0
06BB 01F6 MOVW R30,R12
06BC 9221 ST R2,Z+
06BD 016F MOVW R12,R30
06BE 01C7 MOVW R24,R14
06BF 9601 ADIW R24,1
06C0 017C MOVW R14,R24
06C1 3085 CPI R24,5
06C2 E0E0 LDI R30,0
06C3 079E CPC R25,R30
06C4 F354 BLT 0x06AF
(0189) for (i=0;i<6;i++) *p++ = we->wePart2[i*2]; // second part
06C5 24EE CLR R14
06C6 24FF CLR R15
06C7 E002 LDI R16,2
06C8 E010 LDI R17,0
06C9 0197 MOVW R18,R14
06CA 940E0D58 CALL empy16s
06CC 01F8 MOVW R30,R16
06CD 858C LDD R24,Y+12
06CE 859D LDD R25,Y+13
06CF 960E ADIW R24,0xE
06D0 0FE8 ADD R30,R24
06D1 1FF9 ADC R31,R25
06D2 8020 LDD R2,Z+0
06D3 01F6 MOVW R30,R12
06D4 9221 ST R2,Z+
06D5 016F MOVW R12,R30
06D6 01C7 MOVW R24,R14
06D7 9601 ADIW R24,1
06D8 017C MOVW R14,R24
06D9 3086 CPI R24,6
06DA E0E0 LDI R30,0
06DB 079E CPC R25,R30
06DC F354 BLT 0x06C7
(0190) for (i=0;i<2;i++) *p++ = we->wePart3[i*2]; // and third part
06DD 24EE CLR R14
06DE 24FF CLR R15
06DF E002 LDI R16,2
06E0 E010 LDI R17,0
06E1 0197 MOVW R18,R14
06E2 940E0D58 CALL empy16s
06E4 01F8 MOVW R30,R16
06E5 858C LDD R24,Y+12
06E6 859D LDD R25,Y+13
06E7 964C ADIW R24,0x1C
06E8 0FE8 ADD R30,R24
06E9 1FF9 ADC R31,R25
06EA 8020 LDD R2,Z+0
06EB 01F6 MOVW R30,R12
06EC 9221 ST R2,Z+
06ED 016F MOVW R12,R30
06EE 01C7 MOVW R24,R14
06EF 9601 ADIW R24,1
06F0 017C MOVW R14,R24
06F1 3082 CPI R24,2
06F2 E0E0 LDI R30,0
06F3 079E CPC R25,R30
06F4 F354 BLT 0x06DF
(0191) if (we->weCnt & 0x40) *p = 0; // in case dirnamelength is multiple of 13
06F5 85EC LDD R30,Y+12
06F6 85FD LDD R31,Y+13
06F7 8020 LDD R2,Z+0
06F8 FE26 SBRS R2,6
06F9 C003 RJMP 0x06FD
06FA 2422 CLR R2
06FB 01F6 MOVW R30,R12
06FC 8220 STD Z+0,R2
(0192) if ((we->weCnt & 0x0f) == 1) hasBuffer = 1; // mark that we have a long entry
06FD 85EC LDD R30,Y+12
06FE 85FD LDD R31,Y+13
06FF 8180 LDD R24,Z+0
0700 708F ANDI R24,0xF
0701 3081 CPI R24,1
0702 F009 BEQ 0x0704
0703 C0B4 RJMP 0x07B8
0704 E081 LDI R24,1
0705 E090 LDI R25,0
0706 8B9B STD Y+19,R25
0707 8B8A STD Y+18,R24
(0193) }
0708 C0AF RJMP 0x07B8
(0194) else
(0195) {
(0196) // we have a short name entry
(0197) // check if this is the end of a multi-part long name entry
(0198) if(hasBuffer)
0709 880A LDD R0,Y+18
070A 881B LDD R1,Y+19
070B 2000 TST R0
070C F419 BNE 0x0710
070D 2011 TST R1
070E F409 BNE 0x0710
070F C0A8 RJMP 0x07B8
(0199) {
(0200) // a long entry name has been collected
(0201) // is it a directory ?
(0202) if(de->deAttributes == ATTR_DIRECTORY)
0710 85EE LDD R30,Y+14
0711 85FF LDD R31,Y+15
0712 8583 LDD R24,Z+11
0713 3180 CPI R24,0x10
0714 F009 BEQ 0x0716
0715 C08B RJMP 0x07A1
(0203) {
(0204) unsigned long save = FirstDirSector;
0716 9040042B LDS R4,FirstDirSector+2
0718 9050042C LDS R5,FirstDirSector+3
071A 90200429 LDS R2,FirstDirSector
071C 9030042A LDS R3,FirstDirSector+1
071E 01FE MOVW R30,R28
071F 8224 STD Z+4,R2
0720 8235 STD Z+5,R3
0721 8246 STD Z+6,R4
0722 8257 STD Z+7,R5
(0205) unsigned int save2 = baseentry;
0723 90A0010D LDS R10,baseentry
0725 90B0010E LDS R11,baseentry+1
(0206) unsigned long rval;
(0207)
(0208) strcpy(DirNameBuffer,LongNameBuffer);
0727 91200105 LDS R18,LongNameBuffer
0729 91300106 LDS R19,LongNameBuffer+1
072B 91000107 LDS R16,DirNameBuffer
072D 91100108 LDS R17,DirNameBuffer+1
072F 940E0CA5 CALL _strcpy
(0209) strcat(DirNameBuffer,"/");
0731 E121 LDI R18,0x11
0732 E031 LDI R19,1
0733 91000107 LDS R16,DirNameBuffer
0735 91100108 LDS R17,DirNameBuffer+1
0737 940E0C98 CALL _strcat
(0210)
(0211) // rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
(0212)
(0213) // call recursively
(0214) FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
0739 85EE LDD R30,Y+14
073A 85FF LDD R31,Y+15
073B 8C22 LDD R2,Z+26
073C 8C33 LDD R3,Z+27
073D 2444 CLR R4
073E 2455 CLR R5
073F 85EE LDD R30,Y+14
0740 85FF LDD R31,Y+15
0741 8864 LDD R6,Z+20
0742 8875 LDD R7,Z+21
0743 2488 CLR R8
0744 2499 CLR R9
0745 0143 MOVW R8,R6
0746 2466 CLR R6
0747 2477 CLR R7
0748 0C62 ADD R6,R2
0749 1C73 ADC R7,R3
074A 1C84 ADC R8,R4
074B 1C95 ADC R9,R5
074C 9270042A STS FirstDirSector+1,R7
074E 92600429 STS FirstDirSector,R6
0750 9290042C STS FirstDirSector+3,R9
0752 9280042B STS FirstDirSector+2,R8
(0215) rval = fatGetDirEntry(entry);
0754 A108 LDD R16,Y+32
0755 A119 LDD R17,Y+33
0756 DEDF RCALL _fatGetDirEntry
0757 01FE MOVW R30,R28
0758 8700 STD Z+8,R16
0759 8711 STD Z+9,R17
075A 8722 STD Z+10,R18
075B 8733 STD Z+11,R19
(0216) FirstDirSector = save;
075C 01FE MOVW R30,R28
075D 8024 LDD R2,Z+4
075E 8035 LDD R3,Z+5
075F 8046 LDD R4,Z+6
0760 8057 LDD R5,Z+7
0761 9230042A STS FirstDirSector+1,R3
0763 92200429 STS FirstDirSector,R2
0765 9250042C STS FirstDirSector+3,R5
0767 9240042B STS FirstDirSector+2,R4
(0217) baseentry = save2;
0769 92B0010E STS baseentry+1,R11
076B 92A0010D STS baseentry,R10
(0218) if (rval)
076D E040 LDI R20,0
076E E050 LDI R21,0
076F E060 LDI R22,0
0770 E070 LDI R23,0
0771 01FE MOVW R30,R28
0772 8420 LDD R2,Z+8
0773 8431 LDD R3,Z+9
0774 8442 LDD R4,Z+10
0775 8453 LDD R5,Z+11
0776 1624 CP R2,R20
0777 0635 CPC R3,R21
0778 0646 CPC R4,R22
0779 0657 CPC R5,R23
077A F031 BEQ 0x0781
(0219) return rval;
077B 01FE MOVW R30,R28
077C 8500 LDD R16,Z+8
077D 8511 LDD R17,Z+9
077E 8522 LDD R18,Z+10
077F 8533 LDD R19,Z+11
0780 C07C RJMP 0x07FD
(0220) else
(0221) {
(0222) // reload original sector
(0223) ReadBlock(sector-1);//ataReadSectors( DRIVE0, sector-1, 1, SectorBuffer);
0781 E041 LDI R20,1
0782 E050 LDI R21,0
0783 E060 LDI R22,0
0784 E070 LDI R23,0
0785 01FE MOVW R30,R28
0786 8020 LDD R2,Z+0
0787 8031 LDD R3,Z+1
0788 8042 LDD R4,Z+2
0789 8053 LDD R5,Z+3
078A 1A24 SUB R2,R20
078B 0A35 SBC R3,R21
078C 0A46 SBC R4,R22
078D 0A57 SBC R5,R23
078E 0181 MOVW R16,R2
078F 0192 MOVW R18,R4
0790 DCC6 RCALL _ReadBlock
(0224) entrycount--; // decrement entry counter
0791 9180010F LDS R24,entrycount
0793 91900110 LDS R25,entrycount+1
0795 9701 SBIW R24,1
0796 93900110 STS entrycount+1,R25
0798 9380010F STS entrycount,R24
(0225) *DirNameBuffer = 0;
079A 2422 CLR R2
079B 91E00107 LDS R30,DirNameBuffer
079D 91F00108 LDS R31,DirNameBuffer+1
079F 8220 STD Z+0,R2
(0226) }
(0227) }
07A0 C00A RJMP 0x07AB
(0228) else // normal file entry
(0229) if(entrycount == entry)
07A1 9020010F LDS R2,entrycount
07A3 90300110 LDS R3,entrycount+1
07A5 A008 LDD R0,Y+32
07A6 A019 LDD R1,Y+33
07A7 1420 CP R2,R0
07A8 0431 CPC R3,R1
07A9 F409 BNE 0x07AB
(0230) break;
07AA C024 RJMP 0x07CF
(0231) hasBuffer = 0; // clear buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -