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

📄 sd.lst

📁 用AVR的MP3代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -