⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd.lst

📁 这个是通过51做的SD卡读写和MP3的程序!
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -