📄 sd.lst
字号:
0E2F 92200067 STS 0x67,R2
(0162)
(0163)
(0164) // 读取目录区数据
(0165) sector = fatClustToSect(FirstDirSector);
0E31 912002B7 LDS R18,_FirstDirSector+2
0E33 913002B8 LDS R19,_FirstDirSector+3
0E35 910002B5 LDS R16,_FirstDirSector
0E37 911002B6 LDS R17,_FirstDirSector+1
0E39 DE2A RCALL _fatClustToSect
0E3A 01FE MOVW R30,R28
0E3B 8302 STD Z+2,R16
0E3C 8313 STD Z+3,R17
0E3D 8324 STD Z+4,R18
0E3E 8335 STD Z+5,R19
(0166)
(0167) hasBuffer = 0;
0E3F 2400 CLR R0
0E40 2411 CLR R1
0E41 8A1D STD Y+21,R1
0E42 8A0C STD Y+20,R0
(0168)
(0169) index = 16;
0E43 E180 LDI R24,0x10
0E44 E090 LDI R25,0
0E45 8B9B STD Y+19,R25
0E46 8B8A STD Y+18,R24
(0170) do
(0171) {
(0172) if(index == 16) // 是否该一人一扇区time for next sector ?
0E47 898A LDD R24,Y+18
0E48 899B LDD R25,Y+19
0E49 3180 CPI R24,0x10
0E4A E0E0 LDI R30,0
0E4B 079E CPC R25,R30
0E4C F009 BEQ 0x0E4E
0E4D C02A RJMP 0x0E78
(0173) {
(0174) ReadBlock(sector++);
0E4E 01FE MOVW R30,R28
0E4F 8022 LDD R2,Z+2
0E50 8033 LDD R3,Z+3
0E51 8044 LDD R4,Z+4
0E52 8055 LDD R5,Z+5
0E53 01FE MOVW R30,R28
0E54 8226 STD Z+6,R2
0E55 8237 STD Z+7,R3
0E56 8640 STD Z+8,R4
0E57 8651 STD Z+9,R5
0E58 E041 LDI R20,1
0E59 E050 LDI R21,0
0E5A E060 LDI R22,0
0E5B E070 LDI R23,0
0E5C 01FE MOVW R30,R28
0E5D 8026 LDD R2,Z+6
0E5E 8037 LDD R3,Z+7
0E5F 8440 LDD R4,Z+8
0E60 8451 LDD R5,Z+9
0E61 0E24 ADD R2,R20
0E62 1E35 ADC R3,R21
0E63 1E46 ADC R4,R22
0E64 1E57 ADC R5,R23
0E65 01FE MOVW R30,R28
0E66 8222 STD Z+2,R2
0E67 8233 STD Z+3,R3
0E68 8244 STD Z+4,R4
0E69 8255 STD Z+5,R5
0E6A 01FE MOVW R30,R28
0E6B 8106 LDD R16,Z+6
0E6C 8117 LDD R17,Z+7
0E6D 8520 LDD R18,Z+8
0E6E 8531 LDD R19,Z+9
0E6F DDD7 RCALL _ReadBlock
(0175) de = (struct direntry *)BUFFER;
0E70 EB81 LDI R24,0xB1
0E71 E090 LDI R25,0
0E72 8B99 STD Y+17,R25
0E73 8B88 STD Y+16,R24
(0176) index = 0;
0E74 2400 CLR R0
0E75 2411 CLR R1
0E76 8A1B STD Y+19,R1
0E77 8A0A STD Y+18,R0
(0177) }
(0178)
(0179) if(*de->deName != 0xE5)
0E78 89E8 LDD R30,Y+16
0E79 89F9 LDD R31,Y+17
0E7A 8180 LDD R24,Z+0
0E7B 3E85 CPI R24,0xE5
0E7C F409 BNE 0x0E7E
0E7D C122 RJMP 0x0FA0
(0180) {
(0181) // 如果if not a deleted entry
(0182) if(de->deAttributes == ATTR_LONG_FILENAME)
0E7E 8583 LDD R24,Z+11
0E7F 308F CPI R24,0xF
0E80 F009 BEQ 0x0E82
0E81 C06F RJMP 0x0EF1
(0183) {
(0184) // we have a long name entry
(0185) we = (struct winentry *) de;
0E82 8808 LDD R0,Y+16
0E83 8819 LDD R1,Y+17
0E84 861F STD Y+15,R1
0E85 860E STD Y+14,R0
(0186) b = 13 *( (we->weCnt-1) & 0x0f); // index into string
0E86 01F0 MOVW R30,R0
0E87 8180 LDD R24,Z+0
0E88 5081 SUBI R24,1
0E89 708F ANDI R24,0xF
0E8A E09D LDI R25,0xD
0E8B 9F98 MUL R25,R24
0E8C 8A1F STD Y+23,R1
0E8D 8A0E STD Y+22,R0
(0187) p = &LongNameBuffer[b];
0E8E 90200065 LDS R2,0x65
0E90 90300066 LDS R3,0x66
0E92 0160 MOVW R12,R0
0E93 0CC2 ADD R12,R2
0E94 1CD3 ADC R13,R3
(0188) for (i=0;i<5;i++) *p++ = we->wePart1[i*2]; // copy first part
0E95 24EE CLR R14
0E96 24FF CLR R15
0E97 E002 LDI R16,2
0E98 E010 LDI R17,0
0E99 0197 MOVW R18,R14
0E9A 940E1356 CALL empy16s
0E9C 01F8 MOVW R30,R16
0E9D 858E LDD R24,Y+14
0E9E 859F LDD R25,Y+15
0E9F 9601 ADIW R24,1
0EA0 0FE8 ADD R30,R24
0EA1 1FF9 ADC R31,R25
0EA2 8020 LDD R2,Z+0
0EA3 01F6 MOVW R30,R12
0EA4 9221 ST R2,Z+
0EA5 016F MOVW R12,R30
0EA6 01C7 MOVW R24,R14
0EA7 9601 ADIW R24,1
0EA8 017C MOVW R14,R24
0EA9 3085 CPI R24,5
0EAA E0E0 LDI R30,0
0EAB 079E CPC R25,R30
0EAC F354 BLT 0x0E97
(0189) for (i=0;i<6;i++) *p++ = we->wePart2[i*2]; // second part
0EAD 24EE CLR R14
0EAE 24FF CLR R15
0EAF E002 LDI R16,2
0EB0 E010 LDI R17,0
0EB1 0197 MOVW R18,R14
0EB2 940E1356 CALL empy16s
0EB4 01F8 MOVW R30,R16
0EB5 858E LDD R24,Y+14
0EB6 859F LDD R25,Y+15
0EB7 960E ADIW R24,0xE
0EB8 0FE8 ADD R30,R24
0EB9 1FF9 ADC R31,R25
0EBA 8020 LDD R2,Z+0
0EBB 01F6 MOVW R30,R12
0EBC 9221 ST R2,Z+
0EBD 016F MOVW R12,R30
0EBE 01C7 MOVW R24,R14
0EBF 9601 ADIW R24,1
0EC0 017C MOVW R14,R24
0EC1 3086 CPI R24,6
0EC2 E0E0 LDI R30,0
0EC3 079E CPC R25,R30
0EC4 F354 BLT 0x0EAF
(0190) for (i=0;i<2;i++) *p++ = we->wePart3[i*2]; // and third part
0EC5 24EE CLR R14
0EC6 24FF CLR R15
0EC7 E002 LDI R16,2
0EC8 E010 LDI R17,0
0EC9 0197 MOVW R18,R14
0ECA 940E1356 CALL empy16s
0ECC 01F8 MOVW R30,R16
0ECD 858E LDD R24,Y+14
0ECE 859F LDD R25,Y+15
0ECF 964C ADIW R24,0x1C
0ED0 0FE8 ADD R30,R24
0ED1 1FF9 ADC R31,R25
0ED2 8020 LDD R2,Z+0
0ED3 01F6 MOVW R30,R12
0ED4 9221 ST R2,Z+
0ED5 016F MOVW R12,R30
0ED6 01C7 MOVW R24,R14
0ED7 9601 ADIW R24,1
0ED8 017C MOVW R14,R24
0ED9 3082 CPI R24,2
0EDA E0E0 LDI R30,0
0EDB 079E CPC R25,R30
0EDC F354 BLT 0x0EC7
(0191) if (we->weCnt & 0x40) *p = 0; // in case dirnamelength is multiple of 13
0EDD 85EE LDD R30,Y+14
0EDE 85FF LDD R31,Y+15
0EDF 8020 LDD R2,Z+0
0EE0 FE26 SBRS R2,6
0EE1 C003 RJMP 0x0EE5
0EE2 2422 CLR R2
0EE3 01F6 MOVW R30,R12
0EE4 8220 STD Z+0,R2
(0192) if ((we->weCnt & 0x0f) == 1) hasBuffer = 1; // mark that we have a long entry
0EE5 85EE LDD R30,Y+14
0EE6 85FF LDD R31,Y+15
0EE7 8180 LDD R24,Z+0
0EE8 708F ANDI R24,0xF
0EE9 3081 CPI R24,1
0EEA F009 BEQ 0x0EEC
0EEB C0B4 RJMP 0x0FA0
0EEC E081 LDI R24,1
0EED E090 LDI R25,0
0EEE 8B9D STD Y+21,R25
0EEF 8B8C STD Y+20,R24
(0193) }
0EF0 C0AF RJMP 0x0FA0
(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)
0EF1 880C LDD R0,Y+20
0EF2 881D LDD R1,Y+21
0EF3 2000 TST R0
0EF4 F419 BNE 0x0EF8
0EF5 2011 TST R1
0EF6 F409 BNE 0x0EF8
0EF7 C0A8 RJMP 0x0FA0
(0199) {
(0200) // a long entry name has been collected
(0201) // is it a directory ?
(0202) if(de->deAttributes == ATTR_DIRECTORY)
0EF8 89E8 LDD R30,Y+16
0EF9 89F9 LDD R31,Y+17
0EFA 8583 LDD R24,Z+11
0EFB 3180 CPI R24,0x10
0EFC F009 BEQ 0x0EFE
0EFD C08B RJMP 0x0F89
(0203) {
(0204) unsigned long save = FirstDirSector;
0EFE 904002B7 LDS R4,_FirstDirSector+2
0F00 905002B8 LDS R5,_FirstDirSector+3
0F02 902002B5 LDS R2,_FirstDirSector
0F04 903002B6 LDS R3,_FirstDirSector+1
0F06 01FE MOVW R30,R28
0F07 8226 STD Z+6,R2
0F08 8237 STD Z+7,R3
0F09 8640 STD Z+8,R4
0F0A 8651 STD Z+9,R5
(0205) unsigned int save2 = baseentry;
0F0B 90A0006D LDS R10,0x6D
0F0D 90B0006E LDS R11,0x6E
(0206) unsigned long rval;
(0207)
(0208) strcpy(DirNameBuffer,LongNameBuffer);
0F0F 91200065 LDS R18,0x65
0F11 91300066 LDS R19,0x66
0F13 91000067 LDS R16,0x67
0F15 91100068 LDS R17,0x68
0F17 940E12BB CALL _strcpy
(0209) strcat(DirNameBuffer,"/");
0F19 E721 LDI R18,0x71
0F1A E030 LDI R19,0
0F1B 91000067 LDS R16,0x67
0F1D 91100068 LDS R17,0x68
0F1F 940E12AE CALL _strcat
(0210)
(0211) // rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
(0212)
(0213) // call recursively
(0214) FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
0F21 89E8 LDD R30,Y+16
0F22 89F9 LDD R31,Y+17
0F23 8C22 LDD R2,Z+26
0F24 8C33 LDD R3,Z+27
0F25 2444 CLR R4
0F26 2455 CLR R5
0F27 89E8 LDD R30,Y+16
0F28 89F9 LDD R31,Y+17
0F29 8864 LDD R6,Z+20
0F2A 8875 LDD R7,Z+21
0F2B 2488 CLR R8
0F2C 2499 CLR R9
0F2D 0143 MOVW R8,R6
0F2E 2466 CLR R6
0F2F 2477 CLR R7
0F30 0C62 ADD R6,R2
0F31 1C73 ADC R7,R3
0F32 1C84 ADC R8,R4
0F33 1C95 ADC R9,R5
0F34 927002B6 STS _FirstDirSector+1,R7
0F36 926002B5 STS _FirstDirSector,R6
0F38 929002B8 STS _FirstDirSector+3,R9
0F3A 928002B7 STS _FirstDirSector+2,R8
(0215) rval = fatGetDirEntry(entry);
0F3C A10A LDD R16,Y+34
0F3D A11B LDD R17,Y+35
0F3E DEDF RCALL _fatGetDirEntry
0F3F 01FE MOVW R30,R28
0F40 8702 STD Z+10,R16
0F41 8713 STD Z+11,R17
0F42 8724 STD Z+12,R18
0F43 8735 STD Z+13,R19
(0216) FirstDirSector = save;
0F44 01FE MOVW R30,R28
0F45 8026 LDD R2,Z+6
0F46 8037 LDD R3,Z+7
0F47 8440 LDD R4,Z+8
0F48 8451 LDD R5,Z+9
0F49 923002B6 STS _FirstDirSector+1,R3
0F4B 922002B5 STS _FirstDirSector,R2
0F4D 925002B8 STS _FirstDirSector+3,R5
0F4F 924002B7 STS _FirstDirSector+2,R4
(0217) baseentry = save2;
0F51 92B0006E STS 0x6E,R11
0F53 92A0006D STS 0x6D,R10
(0218) if (rval)
0F55 E040 LDI R20,0
0F56 E050 LDI R21,0
0F57 E060 LDI R22,0
0F58 E070 LDI R23,0
0F59 01FE MOVW R30,R28
0F5A 8422 LDD R2,Z+10
0F5B 8433 LDD R3,Z+11
0F5C 8444 LDD R4,Z+12
0F5D 8455 LDD R5,Z+13
0F5E 1624 CP R2,R20
0F5F 0635 CPC R3,R21
0F60 0646 CPC R4,R22
0F61 0657 CPC R5,R23
0F62 F031 BEQ 0x0F69
(0219) return rval;
0F63 01FE MOVW R30,R28
0F64 8502 LDD R16,Z+10
0F65 8513 LDD R17,Z+11
0F66 8524 LDD R18,Z+12
0F67 8535 LDD R19,Z+13
0F68 C086 RJMP 0x0FEF
(0220) else
(0221) {
(0222) // reload original sector
(0223) ReadBlock(sector-1);//ataReadSectors( DRIVE0, sector-1, 1, SectorBuffer);
0F69 E041 LDI R20,1
0F6A E050 LDI R21,0
0F6B E060 LDI R22,0
0F6C E070 LDI R23,0
0F6D 01FE MOVW R30,R28
0F6E 8022 LDD R2,Z+2
0F6F 8033 LDD R3,Z+3
0F70 8044 LDD R4,Z+4
0F71 8055 LDD R5,Z+5
0F72 1A24 SUB R2,R20
0F73 0A35 SBC R3,R21
0F74 0A46 SBC R4,R22
0F75 0A57 SBC R5,R23
0F76 0181 MOVW R16,R2
0F77 0192 MOVW R18,R4
0F78 DCCE RCALL _ReadBlock
(0224) entrycount--; // decrement entry counter
0F79 9180006F LDS R24,0x6F
0F7B 91900070 LDS R25,0x70
0F7D 9701 SBIW R24,1
0F7E 93900070 STS 0x70,R25
0F80 9380006F STS 0x6F,R24
(0225) *DirNameBuffer = 0;
0F82 2422 CLR R2
0F83 91E00067 LDS R30,0x67
0F85 91F00068 LDS R31,0x68
0F87 8220 STD Z+0,R2
(0226) }
(0227) }
0F88 C00A RJMP 0x0F93
(0228) else // normal file entry
(0229) if(entrycount == entry)
0F89 9020006F LDS R2,0x6F
0F8B 90300070 LDS R3,0x70
0F8D A00A LDD R0,Y+34
0F8E A01B LDD R1,Y+35
0F8F 1420 CP R2,R0
0F90 0431 CPC R3,R1
0F91 F409 BNE 0x0F93
(0230) break;
0F92 C024 RJMP 0x0FB7
(0231) hasBuffer = 0; // clear buffer
0F93 2400 CLR R0
0F94 2411 CLR R1
0F95 8A1D STD Y+21,R1
0F96 8A0C STD Y+20,R0
(0232) entrycount++; // increment entry counter
0F97 9180006F LDS R24,0x6F
0F99 91900070 LDS R25,0x70
0F9B 9601 ADIW R24,1
0F9C 93900070 STS 0x70,R25
0F9E 9380006F STS 0x6F,R24
(0233) }
(0234) // else ignore short_name_only entries
(0235) }
(0236) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -