📄 sd.lst
字号:
(0184) we = (struct winentry *) de;
0F11 840E LDD R0,Y+14
0F12 841F LDD R1,Y+15
0F13 861D STD Y+13,R1
0F14 860C STD Y+12,R0
(0185) b = 13 *( (we->weCnt-1) & 0x0f); // index into string
0F15 01F0 MOVW R30,R0
0F16 8180 LDD R24,Z+0
0F17 5081 SUBI R24,1
0F18 708F ANDI R24,0xF
0F19 E09D LDI R25,0xD
0F1A 9F98 MUL R25,R24
0F1B 8A1D STD Y+21,R1
0F1C 8A0C STD Y+20,R0
(0186) p = &LongNameBuffer[b];
0F1D 90200065 LDS R2,LongNameBuffer
0F1F 90300066 LDS R3,LongNameBuffer+1
0F21 0160 MOVW R12,R0
0F22 0CC2 ADD R12,R2
0F23 1CD3 ADC R13,R3
(0187) for (i=0;i<5;i++) *p++ = we->wePart1[i*2]; // copy first part
0F24 24EE CLR R14
0F25 24FF CLR R15
0F26 E002 LDI R16,2
0F27 E010 LDI R17,0
0F28 0197 MOVW R18,R14
0F29 940E1351 CALL empy16s
0F2B 01F8 MOVW R30,R16
0F2C 858C LDD R24,Y+12
0F2D 859D LDD R25,Y+13
0F2E 9601 ADIW R24,1
0F2F 0FE8 ADD R30,R24
0F30 1FF9 ADC R31,R25
0F31 8020 LDD R2,Z+0
0F32 01F6 MOVW R30,R12
0F33 9221 ST R2,Z+
0F34 016F MOVW R12,R30
0F35 01C7 MOVW R24,R14
0F36 9601 ADIW R24,1
0F37 017C MOVW R14,R24
0F38 3085 CPI R24,5
0F39 E0E0 LDI R30,0
0F3A 079E CPC R25,R30
0F3B F354 BLT 0x0F26
(0188) for (i=0;i<6;i++) *p++ = we->wePart2[i*2]; // second part
0F3C 24EE CLR R14
0F3D 24FF CLR R15
0F3E E002 LDI R16,2
0F3F E010 LDI R17,0
0F40 0197 MOVW R18,R14
0F41 940E1351 CALL empy16s
0F43 01F8 MOVW R30,R16
0F44 858C LDD R24,Y+12
0F45 859D LDD R25,Y+13
0F46 960E ADIW R24,0xE
0F47 0FE8 ADD R30,R24
0F48 1FF9 ADC R31,R25
0F49 8020 LDD R2,Z+0
0F4A 01F6 MOVW R30,R12
0F4B 9221 ST R2,Z+
0F4C 016F MOVW R12,R30
0F4D 01C7 MOVW R24,R14
0F4E 9601 ADIW R24,1
0F4F 017C MOVW R14,R24
0F50 3086 CPI R24,6
0F51 E0E0 LDI R30,0
0F52 079E CPC R25,R30
0F53 F354 BLT 0x0F3E
(0189) for (i=0;i<2;i++) *p++ = we->wePart3[i*2]; // and third part
0F54 24EE CLR R14
0F55 24FF CLR R15
0F56 E002 LDI R16,2
0F57 E010 LDI R17,0
0F58 0197 MOVW R18,R14
0F59 940E1351 CALL empy16s
0F5B 01F8 MOVW R30,R16
0F5C 858C LDD R24,Y+12
0F5D 859D LDD R25,Y+13
0F5E 964C ADIW R24,0x1C
0F5F 0FE8 ADD R30,R24
0F60 1FF9 ADC R31,R25
0F61 8020 LDD R2,Z+0
0F62 01F6 MOVW R30,R12
0F63 9221 ST R2,Z+
0F64 016F MOVW R12,R30
0F65 01C7 MOVW R24,R14
0F66 9601 ADIW R24,1
0F67 017C MOVW R14,R24
0F68 3082 CPI R24,2
0F69 E0E0 LDI R30,0
0F6A 079E CPC R25,R30
0F6B F354 BLT 0x0F56
(0190) if (we->weCnt & 0x40) *p = 0; // in case dirnamelength is multiple of 13
0F6C 85EC LDD R30,Y+12
0F6D 85FD LDD R31,Y+13
0F6E 8020 LDD R2,Z+0
0F6F FE26 SBRS R2,6
0F70 C003 RJMP 0x0F74
0F71 2422 CLR R2
0F72 01F6 MOVW R30,R12
0F73 8220 STD Z+0,R2
(0191) if ((we->weCnt & 0x0f) == 1) hasBuffer = 1; // mark that we have a long entry
0F74 85EC LDD R30,Y+12
0F75 85FD LDD R31,Y+13
0F76 8180 LDD R24,Z+0
0F77 708F ANDI R24,0xF
0F78 3081 CPI R24,1
0F79 F009 BEQ 0x0F7B
0F7A C0B4 RJMP 0x102F
0F7B E081 LDI R24,1
0F7C E090 LDI R25,0
0F7D 8B9B STD Y+19,R25
0F7E 8B8A STD Y+18,R24
(0192) }
0F7F C0AF RJMP 0x102F
(0193) else
(0194) {
(0195) // we have a short name entry
(0196) // check if this is the end of a multi-part long name entry
(0197) if(hasBuffer)
0F80 880A LDD R0,Y+18
0F81 881B LDD R1,Y+19
0F82 2000 TST R0
0F83 F419 BNE 0x0F87
0F84 2011 TST R1
0F85 F409 BNE 0x0F87
0F86 C0A8 RJMP 0x102F
(0198) {
(0199) // a long entry name has been collected
(0200) // is it a directory ?
(0201) if(de->deAttributes == ATTR_DIRECTORY)
0F87 85EE LDD R30,Y+14
0F88 85FF LDD R31,Y+15
0F89 8583 LDD R24,Z+11
0F8A 3180 CPI R24,0x10
0F8B F009 BEQ 0x0F8D
0F8C C08B RJMP 0x1018
(0202) {
(0203) unsigned long save = FirstDirSector;
0F8D 904002BC LDS R4,FirstDirSector+2
0F8F 905002BD LDS R5,FirstDirSector+3
0F91 902002BA LDS R2,FirstDirSector
0F93 903002BB LDS R3,FirstDirSector+1
0F95 01FE MOVW R30,R28
0F96 8224 STD Z+4,R2
0F97 8235 STD Z+5,R3
0F98 8246 STD Z+6,R4
0F99 8257 STD Z+7,R5
(0204) unsigned int save2 = baseentry;
0F9A 90A0006D LDS R10,baseentry
0F9C 90B0006E LDS R11,baseentry+1
(0205) unsigned long rval;
(0206)
(0207) strcpy(DirNameBuffer,LongNameBuffer);
0F9E 91200065 LDS R18,LongNameBuffer
0FA0 91300066 LDS R19,LongNameBuffer+1
0FA2 91000067 LDS R16,DirNameBuffer
0FA4 91100068 LDS R17,DirNameBuffer+1
0FA6 940E12B6 CALL _strcpy
(0208) strcat(DirNameBuffer,"/");
0FA8 E721 LDI R18,0x71
0FA9 E030 LDI R19,0
0FAA 91000067 LDS R16,DirNameBuffer
0FAC 91100068 LDS R17,DirNameBuffer+1
0FAE 940E12A9 CALL _strcat
(0209)
(0210) // rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
(0211)
(0212) // call recursively
(0213) FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
0FB0 85EE LDD R30,Y+14
0FB1 85FF LDD R31,Y+15
0FB2 8C22 LDD R2,Z+26
0FB3 8C33 LDD R3,Z+27
0FB4 2444 CLR R4
0FB5 2455 CLR R5
0FB6 85EE LDD R30,Y+14
0FB7 85FF LDD R31,Y+15
0FB8 8864 LDD R6,Z+20
0FB9 8875 LDD R7,Z+21
0FBA 2488 CLR R8
0FBB 2499 CLR R9
0FBC 0143 MOVW R8,R6
0FBD 2466 CLR R6
0FBE 2477 CLR R7
0FBF 0C62 ADD R6,R2
0FC0 1C73 ADC R7,R3
0FC1 1C84 ADC R8,R4
0FC2 1C95 ADC R9,R5
0FC3 927002BB STS FirstDirSector+1,R7
0FC5 926002BA STS FirstDirSector,R6
0FC7 929002BD STS FirstDirSector+3,R9
0FC9 928002BC STS FirstDirSector+2,R8
(0214) rval = fatGetDirEntry(entry);
0FCB A108 LDD R16,Y+32
0FCC A119 LDD R17,Y+33
0FCD DEDF RCALL _fatGetDirEntry
0FCE 01FE MOVW R30,R28
0FCF 8700 STD Z+8,R16
0FD0 8711 STD Z+9,R17
0FD1 8722 STD Z+10,R18
0FD2 8733 STD Z+11,R19
(0215) FirstDirSector = save;
0FD3 01FE MOVW R30,R28
0FD4 8024 LDD R2,Z+4
0FD5 8035 LDD R3,Z+5
0FD6 8046 LDD R4,Z+6
0FD7 8057 LDD R5,Z+7
0FD8 923002BB STS FirstDirSector+1,R3
0FDA 922002BA STS FirstDirSector,R2
0FDC 925002BD STS FirstDirSector+3,R5
0FDE 924002BC STS FirstDirSector+2,R4
(0216) baseentry = save2;
0FE0 92B0006E STS baseentry+1,R11
0FE2 92A0006D STS baseentry,R10
(0217) if (rval)
0FE4 E040 LDI R20,0
0FE5 E050 LDI R21,0
0FE6 E060 LDI R22,0
0FE7 E070 LDI R23,0
0FE8 01FE MOVW R30,R28
0FE9 8420 LDD R2,Z+8
0FEA 8431 LDD R3,Z+9
0FEB 8442 LDD R4,Z+10
0FEC 8453 LDD R5,Z+11
0FED 1624 CP R2,R20
0FEE 0635 CPC R3,R21
0FEF 0646 CPC R4,R22
0FF0 0657 CPC R5,R23
0FF1 F031 BEQ 0x0FF8
(0218) return rval;
0FF2 01FE MOVW R30,R28
0FF3 8500 LDD R16,Z+8
0FF4 8511 LDD R17,Z+9
0FF5 8522 LDD R18,Z+10
0FF6 8533 LDD R19,Z+11
0FF7 C07C RJMP 0x1074
(0219) else
(0220) {
(0221) // reload original sector
(0222) ReadBlock(sector-1);//ataReadSectors( DRIVE0, sector-1, 1, SectorBuffer);
0FF8 E041 LDI R20,1
0FF9 E050 LDI R21,0
0FFA E060 LDI R22,0
0FFB E070 LDI R23,0
0FFC 01FE MOVW R30,R28
0FFD 8020 LDD R2,Z+0
0FFE 8031 LDD R3,Z+1
0FFF 8042 LDD R4,Z+2
1000 8053 LDD R5,Z+3
1001 1A24 SUB R2,R20
1002 0A35 SBC R3,R21
1003 0A46 SBC R4,R22
1004 0A57 SBC R5,R23
1005 0181 MOVW R16,R2
1006 0192 MOVW R18,R4
1007 DCC6 RCALL _ReadBlock
(0223) entrycount--; // decrement entry counter
1008 9180006F LDS R24,entrycount
100A 91900070 LDS R25,entrycount+1
100C 9701 SBIW R24,1
100D 93900070 STS entrycount+1,R25
100F 9380006F STS entrycount,R24
(0224) *DirNameBuffer = 0;
1011 2422 CLR R2
1012 91E00067 LDS R30,DirNameBuffer
1014 91F00068 LDS R31,DirNameBuffer+1
1016 8220 STD Z+0,R2
(0225) }
(0226) }
1017 C00A RJMP 0x1022
(0227) else // normal file entry
(0228) if(entrycount == entry)
1018 9020006F LDS R2,entrycount
101A 90300070 LDS R3,entrycount+1
101C A008 LDD R0,Y+32
101D A019 LDD R1,Y+33
101E 1420 CP R2,R0
101F 0431 CPC R3,R1
1020 F409 BNE 0x1022
(0229) break;
1021 C024 RJMP 0x1046
(0230) hasBuffer = 0; // clear buffer
1022 2400 CLR R0
1023 2411 CLR R1
1024 8A1B STD Y+19,R1
1025 8A0A STD Y+18,R0
(0231) entrycount++; // increment entry counter
1026 9180006F LDS R24,entrycount
1028 91900070 LDS R25,entrycount+1
102A 9601 ADIW R24,1
102B 93900070 STS entrycount+1,R25
102D 9380006F STS entrycount,R24
(0232) }
(0233) // else ignore short_name_only entries
(0234) }
(0235) }
(0236) de++;
102F 858E LDD R24,Y+14
1030 859F LDD R25,Y+15
1031 9680 ADIW R24,0x20
1032 879F STD Y+15,R25
1033 878E STD Y+14,R24
(0237) index++;
1034 8988 LDD R24,Y+16
1035 8999 LDD R25,Y+17
1036 9601 ADIW R24,1
1037 8B99 STD Y+17,R25
1038 8B88 STD Y+16,R24
(0238) } while (*de->deName || index == 16); // 0 in de->deName[0] if no more entries
1039 85EE LDD R30,Y+14
103A 85FF LDD R31,Y+15
103B 8020 LDD R2,Z+0
103C 2022 TST R2
103D F009 BEQ 0x103F
103E CE97 RJMP 0x0ED6
103F 8988 LDD R24,Y+16
1040 8999 LDD R25,Y+17
1041 3180 CPI R24,0x10
1042 E0E0 LDI R30,0
1043 079E CPC R25,R30
1044 F409 BNE 0x1046
1045 CE90 RJMP 0x0ED6
(0239)
(0240) if (hasBuffer == 0) // end of entries
1046 880A LDD R0,Y+18
1047 881B LDD R1,Y+19
1048 2000 TST R0
1049 F439 BNE 0x1051
104A 2011 TST R1
104B F429 BNE 0x1051
(0241) return 0;
104C E000 LDI R16,0
104D E010 LDI R17,0
104E E020 LDI R18,0
104F E030 LDI R19,0
1050 C023 RJMP 0x1074
(0242)
(0243) FileSize = de->deFileSize;
1051 85EE LDD R30,Y+14
1052 85FF LDD R31,Y+15
1053 8C24 LDD R2,Z+28
1054 8C35 LDD R3,Z+29
1055 8C46 LDD R4,Z+30
1056 8C57 LDD R5,Z+31
1057 923002B7 STS FileSize+1,R3
1059 922002B6 STS FileSize,R2
105B 925002B9 STS FileSize+3,R5
105D 924002B8 STS FileSize+2,R4
(0244) return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
105F 85EE LDD R30,Y+14
1060 85FF LDD R31,Y+15
1061 8C22 LDD R2,Z+26
1062 8C33 LDD R3,Z+27
1063 2444 CLR R4
1064 2455 CLR R5
1065 85EE LDD R30,Y+14
1066 85FF LDD R31,Y+15
1067 8864 LDD R6,Z+20
1068 8875 LDD R7,Z+21
1069 2488 CLR R8
106A 2499 CLR R9
106B 0143 MOVW R8,R6
106C 2466 CLR R6
106D 2477 CLR R7
106E 0C62 ADD R6,R2
106F 1C73 ADC R7,R3
1070 1C84 ADC R8,R4
1071 1C95 ADC R9,R5
1072 0183 MOVW R16,R6
1073 0194 MOVW R18,R8
1074 9666 ADIW R28,0x16
1075 940E139A CALL pop_gset5
1077 9622 ADIW R28,2
1078 9508 RET
_fatNextCluster:
offset --> R10
sector --> Y+12
fatOffset --> Y+8
fatMask --> Y+4
nextCluster --> Y+0
cluster --> Y+22
1079 940E12BF CALL push_arg4
107B 940E13A1 CALL push_gset3
107D 9760 SBIW R28,0x10
(0245) }
(0246)
(0247) /*--
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -