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

📄 testlcd.lst

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LST
📖 第 1 页 / 共 5 页
字号:
     8B5 0118      MOVW	R2,R16
     8B6 0129      MOVW	R4,R18
     8B7 01F7      MOVW	R30,R14
     8B8 9633      ADIW	R30,3
     8B9 0DEC      ADD	R30,R12
     8BA 1DFD      ADC	R31,R13
     8BB 8060      LDD	R6,Z+0
     8BC 2477      CLR	R7
     8BD 2488      CLR	R8
     8BE 2499      CLR	R9
     8BF E040      LDI	R20,0
     8C0 E050      LDI	R21,0
     8C1 E060      LDI	R22,0
     8C2 E071      LDI	R23,1
     8C3 929A      ST	R9,-Y
     8C4 928A      ST	R8,-Y
     8C5 927A      ST	R7,-Y
     8C6 926A      ST	R6,-Y
     8C7 018A      MOVW	R16,R20
     8C8 019B      MOVW	R18,R22
     8C9 940E 1660 CALL	empy32s
     8CB 0138      MOVW	R6,R16
     8CC 0149      MOVW	R8,R18
     8CD 940E 1877 CALL	0x1877
     8CF 01F7      MOVW	R30,R14
     8D0 9631      ADIW	R30,1
     8D1 940E 1890 CALL	0x1890
     8D3 E040      LDI	R20,0
     8D4 E051      LDI	R21,1
     8D5 E060      LDI	R22,0
     8D6 940E 17A4 CALL	0x17A4
     8D8 0E60      ADD	R6,R16
     8D9 1E71      ADC	R7,R17
     8DA 1E82      ADC	R8,R18
     8DB 1E93      ADC	R9,R19
     8DC 940E 1881 CALL	0x1881
     8DE 2433      CLR	R3
     8DF 2444      CLR	R4
     8E0 2455      CLR	R5
     8E1 940E 1877 CALL	0x1877
     8E3 01F5      MOVW	R30,R10
     8E4 8260      STD	Z+0,R6
     8E5 8271      STD	Z+1,R7
     8E6 8282      STD	Z+2,R8
     8E7 8293      STD	Z+3,R9
(0159) 					(TMP_Buffer[FAT_Byte_Addresse+2]*(unsigned long)65536) +
(0160) 					(TMP_Buffer[FAT_Byte_Addresse+1]*(unsigned long)256) +
(0161) 					 TMP_Buffer[FAT_Byte_Addresse];
(0162) 	}
(0163) 	return;
     8E8 962A      ADIW	R28,0xA
     8E9 940E 1693 CALL	pop_xgsetF0FC
     8EB 9624      ADIW	R28,4
     8EC 9508      RET
_fat_read_dir_ent:
  Block                --> Y,+6
  blk                  --> Y,+2
  TMP_Entry_Count      --> R10
  a                    --> R14
  dir                  --> R12
  buff                 --> Y,+30
  Dir_Attrib           --> Y,+28
  Size                 --> Y,+26
  Entry_Count          --> Y,+24
  dir_cluster          --> Y,+20
     8ED 940E 18D6 CALL	0x18D6
     8EF 972A      SBIW	R28,0xA
(0164) }
(0165) 
(0166) //############################################################################
(0167) //读取文件目录区FDT相关信息,错误的时候返回0xffffffff,目录搜索完毕,返回0xFFFFFFFE
(0168) unsigned long fat_read_dir_ent(unsigned long dir_cluster,//目录所在簇
(0169) 							unsigned int Entry_Count,	//目录中文件序号
(0170) 							unsigned long *Size,		//文件长度
(0171) 							unsigned char *Dir_Attrib,	//文件属性
(0172) 							unsigned char *buff)		//函数所需buffer
(0173) //############################################################################
(0174) {
(0175) 	unsigned int TMP_Entry_Count = 0;
     8F0 24AA      CLR	R10
     8F1 24BB      CLR	R11
     8F2 940E 19B3 CALL	0x19B3
(0176) 	unsigned long Block=0;			//目录所在扇区地址
     8F4 834E      STD	Y+6,R20
     8F5 835F      STD	Y+7,R21
     8F6 8768      STD	Y+8,R22
     8F7 8779      STD	Y+9,R23
     8F8 940E 1818 CALL	0x1818
     8FA 940E 1A08 CALL	0x1A08
(0177) 	unsigned long blk;
(0178) 	unsigned int a;
(0179) 	struct DirEntry *dir; 			//文件目录指针
(0180) 
(0181) 	if (dir_cluster == 0)	//读取根目录,得到FDT起始扇区号
     8FC F429      BNE	0x0902
     8FD 940E 1900 CALL	0x1900
     8FF 940E 1A82 CALL	0x1A82
(0182) 	{
(0183) 		Block = FirstRootDirSecNum;
(0184) 	}
     901 C008      RJMP	0x090A
(0185) 	else					//读取子目录,本程序中用不到
(0186) 	{
(0187) 		Block = (dir_cluster-2)*SecPerClus+data_offset;
     902 940E 1922 CALL	0x1922
     904 940E 187C CALL	0x187C
     906 940E 174B CALL	0x174B
     908 940E 1A82 CALL	0x1A82
(0188) 	}
(0189) 	//下面的算法效率有问题。注意它每次都是从根目录下面依次去找第Entry_Count个文件
(0190) 	//for (blk = old_pos_blk;;blk++)
(0191) 	for (blk = Block;;blk++)    //从该目录下面,依次读取一个扇区
     90A 940E 1A91 CALL	0x1A91
     90C 940E 18B6 CALL	0x18B6
(0192) 	{
(0193) 		MMC_SD_ReadSingleBlock(blk,buff);
     90E 8C0E      LDD	R0,Y+30
     90F 8C1F      LDD	R1,Y+31
     910 8219      STD	Y+1,R1
     911 8208      STD	Y+0,R0
     912 810A      LDD	R16,Y+2
     913 811B      LDD	R17,Y+3
     914 812C      LDD	R18,Y+4
     915 813D      LDD	R19,Y+5
     916 940E 14AB CALL	_MMC_SD_ReadSingleBlock
(0194) 	Next_a: 
(0195) 		//for (a=old_pos_a;a<BlockSize; a = a + 32)
(0196) 		for (a=0;a<BlockSize; a = a + 32)  //依次分析每一个32字节的目录/文件结构
     918 24EE      CLR	R14
     919 24FF      CLR	R15
     91A C066      RJMP	0x0981
(0197) 		{	//依次分析每一个文件或目录,可能会出现空的、已删除、正常的目录/文件
(0198) 			dir=(struct DirEntry *)(buff + a); //装载目录内容
     91B 0167      MOVW	R12,R14
     91C 8C0E      LDD	R0,Y+30
     91D 8C1F      LDD	R1,Y+31
     91E 0CC0      ADD	R12,R0
     91F 1CD1      ADC	R13,R1
(0199) 			if (dir->DIR_Name[0] == 0) 		 //目录已经搜索完毕,返回.
     920 01F6      MOVW	R30,R12
     921 8020      LDD	R2,Z+0
     922 2022      TST	R2
     923 F429      BNE	0x0929
(0200) 			{
(0201) 				return (0xFFFFFFFE);
     924 EF0E      LDI	R16,0xFE
     925 EF1F      LDI	R17,0xFF
     926 EF2F      LDI	R18,0xFF
     927 EF3F      LDI	R19,0xFF
     928 C069      RJMP	0x0992
(0202) 			}
(0203) 			//非卷标,非长文件名,并且文件没有删除
(0204)    			if ((dir->DIR_Attr != ATTR_LONG_NAME) && (dir->DIR_Attr != DIR_ATTRIB_VOL_ID) && (dir->DIR_Name[0] != DIR_ENTRY_IS_FREE)) 
     929 01F6      MOVW	R30,R12
     92A 8423      LDD	R2,Z+11
     92B 2433      CLR	R3
     92C 2D82      MOV	R24,R2
     92D 308F      CPI	R24,0xF
     92E F409      BNE	0x0930
     92F C04E      RJMP	0x097E
     930 3088      CPI	R24,0x8
     931 F409      BNE	0x0933
     932 C04B      RJMP	0x097E
     933 8180      LDD	R24,Z+0
     934 3E85      CPI	R24,0xE5
     935 F409      BNE	0x0937
     936 C047      RJMP	0x097E
(0205) 			{   
(0206) 				//搜索字库文件:
(0207) 				if(Entry_Count==0 && dir->DIR_Name[2] == 'F' && dir->DIR_Name[3] == 'O' && dir->DIR_Name[4] == 'N' && dir->DIR_Name[5] == 'T' && dir->DIR_Name[6] == '1' && dir->DIR_Name[7] == '6')
     937 8C08      LDD	R0,Y+24
     938 8C19      LDD	R1,Y+25
     939 2000      TST	R0
     93A F009      BEQ	0x093C
     93B C01E      RJMP	0x095A
     93C 2011      TST	R1
     93D F009      BEQ	0x093F
     93E C01B      RJMP	0x095A
     93F 8182      LDD	R24,Z+2
     940 3486      CPI	R24,0x46
     941 F009      BEQ	0x0943
     942 C017      RJMP	0x095A
     943 8183      LDD	R24,Z+3
     944 348F      CPI	R24,0x4F
     945 F009      BEQ	0x0947
     946 C013      RJMP	0x095A
     947 8184      LDD	R24,Z+4
     948 348E      CPI	R24,0x4E
     949 F009      BEQ	0x094B
     94A C00F      RJMP	0x095A
     94B 8185      LDD	R24,Z+5
     94C 3584      CPI	R24,0x54
     94D F009      BEQ	0x094F
     94E C00B      RJMP	0x095A
     94F 8186      LDD	R24,Z+6
     950 3381      CPI	R24,0x31
     951 F009      BEQ	0x0953
     952 C007      RJMP	0x095A
     953 8187      LDD	R24,Z+7
     954 3386      CPI	R24,0x36
     955 F009      BEQ	0x0957
     956 C003      RJMP	0x095A
(0208) 				{
(0209) 				    pointer_FDT=buff + a;					
     957 940E 170F CALL	<created procedures>
(0210) 					*Dir_Attrib = dir->DIR_Attr;
(0211) 
(0212) 					//文件长度
(0213) 					*Size=dir->DIR_FileSize;
(0214) 					
(0215) 					//文件起始簇的低16位
(0216) 					dir_cluster = dir->DIR_FstClusLO + (dir->DIR_FstClusHI)*65536;
(0217) 						
(0218) 					//返回起始簇
(0219) 					return(dir_cluster);
     959 C038      RJMP	0x0992
(0220) 				}
(0221) 			    //搜索mp3文件:
(0222) 				else if(dir->DIR_Name[8] == Search_FileExName1[0] && dir->DIR_Name[9] == Search_FileExName1[1] && dir->DIR_Name[10] == Search_FileExName1[2]) //找到要搜索的文件
     95A E5E4      LDI	R30,0x54
     95B E0F0      LDI	R31,0
     95C 9024      LPM	R2,0(Z)
     95D 01F6      MOVW	R30,R12
     95E 8430      LDD	R3,Z+8
     95F 1432      CP	R3,R2
     960 F009      BEQ	0x0962
     961 C01C      RJMP	0x097E
     962 E5E5      LDI	R30,0x55
     963 E0F0      LDI	R31,0
     964 9024      LPM	R2,0(Z)
     965 01F6      MOVW	R30,R12
     966 8431      LDD	R3,Z+9
     967 1432      CP	R3,R2
     968 F009      BEQ	0x096A
     969 C014      RJMP	0x097E
     96A E5E6      LDI	R30,0x56
     96B E0F0      LDI	R31,0
     96C 9024      LPM	R2,0(Z)
     96D 01F6      MOVW	R30,R12
     96E 8432      LDD	R3,Z+10
     96F 1432      CP	R3,R2
     970 F009      BEQ	0x0972
     971 C00C      RJMP	0x097E
(0223) 				{
(0224) 				 	TMP_Entry_Count++;
     972 01C5      MOVW	R24,R10
     973 9601      ADIW	R24,1
     974 015C      MOVW	R10,R24
(0225) 					//找寻第Entery_Count个指定文件
(0226) 					if (TMP_Entry_Count == Entry_Count) 
     975 8C08      LDD	R0,Y+24
     976 8C19      LDD	R1,Y+25
     977 1580      CP	R24,R0
     978 0591      CPC	R25,R1
     979 F009      BEQ	0x097B
     97A C003      RJMP	0x097E
(0227) 					{
(0228) 				    	pointer_FDT=buff + a;					
     97B 940E 170F CALL	<created procedures>
(0229) 						*Dir_Attrib = dir->DIR_Attr;
(0230) 
(0231) 						//文件长度
(0232) 						*Size=dir->DIR_FileSize;
(0233) 					
(0234) 						//文件起始簇的低16位
(0235) 						dir_cluster = dir->DIR_FstClusLO + (dir->DIR_FstClusHI)*65536;
(0236) 						/*
(0237) 						if((a+32)<512)	//判断是否该搜索下一个扇区的目录文件信息了
(0238) 						{
(0239) 					   	 	old_pos_a=a+32;
(0240) 					   	 	old_pos_blk=blk;
(0241) 						 }
(0242) 						else 			   //到下一扇区寻找
(0243) 						{
(0244) 					   	 	old_pos_a=0;		
(0245) 					   		old_pos_blk=blk+1;
(0246) 						}
(0247) 						*/
(0248) 						//返回起始簇
(0249) 						return(dir_cluster);
     97D C014      RJMP	0x0992
     97E 01C7      MOVW	R24,R14
     97F 9680      ADIW	R24,0x20
     980 017C      MOVW	R14,R24
     981 9020 00CA LDS	R2,BlockSize
     983 9030 00CB LDS	R3,BlockSize+1
     985 14E2      CP	R14,R2
     986 04F3      CPC	R15,R3
     987 F408      BCC	0x0989
     988 CF92      RJMP	0x091B
     989 E041      LDI	R20,1
     98A E050      LDI	R21,0
     98B 940E 199E CALL	0x199E
     98D 940E 198D CALL	0x198D
     98F 940E 18B6 CALL	0x18B6
     991 CF7C      RJMP	0x090E
     992 962A      ADIW	R28,0xA
     993 940E 1693 CALL	pop_xgsetF0FC
     995 9624      ADIW	R28,4
     996 9508      RET
_fat_read_file:
  Block                --> Y,+4
  blockserial          --> R10
  BlockCount           --> Y,+22
  buff                 --> R12
  Cluster              --> Y,+16
     997 940E 15B9 CALL	push_arg4
     999 940E 16C7 CALL	push_xgsetF03C
     99B 9728      SBIW	R28,0x8
     99C 88CC      LDD	R12,Y+20
     99D 88DD      LDD	R13,Y+21
     99E 8CAA      LDD	R10,Y+26
     99F 8CBB      LDD	R11,Y+27
(0250) 					}
(0251) 				}
(0252) 			}
(0253) 		}
(0254) 	}
(0255) 	return (0xFFFFFFFF); //目录本身有错误,返回0xFFFF
(0256) }
(0257) 
(0258) 
(0259) //############################################################################
(0260) //读取文件内容每次512bytes,文件没有读完,返回0;否则为1
(0261) unsigned char fat_read_file(unsigned long Cluster,		//文件起始簇号
(0262) 				 			unsigned char *buff,		//文件内容缓冲区
(0263) 				 			unsigned long BlockCount,	//扇区号
(0264) 							unsigned char *blockserial) 
(0265) //############################################################################
(0266) {
(0267) 	unsigned long Block;
(0268) 	static unsigned char serial=0; 
(0269) 	
(0270) 	if(BlockCount == 0)
     9A0 882E      LDD	R2,Y+22
     9A1 883F      LDD	R3,Y+23
     9A2 8C48      LDD	R4,Y+24
     9A3 8C59      LDD	R5,Y+25
     9A4 940E 1A08 CALL	0x1A08
     9A6 F009      BEQ	0x09A8
     9A7 C024      RJMP	0x09CC
(0271) 	{
(0272) 		fat_load(Cluster,&Block,buff);
     9A8 940E 19AC CALL	0x19AC
     9AA 940E 1A69 CALL	0x1A69
     9AC DDCB      RCALL	_fat_load
(0273) 		//测试使用
(0274) 		//DisplayLong(Block,1);
(0275) 		MMC_SD_ReadSingleBlock((Cluster-2)*SecPerClus+data_offset+serial,buff);
     9AD 82D9      STD	Y+1,R13
     9AE 82C8      STD	Y+0,R12
     9AF 940E 1922 CALL	0x1922
     9B1 940E 1A69 CALL	0x1A69
     9B3 940E 174B CALL	0x174B
     9B5 9060 0062 LDS	R6,serial
     9B7 2477      CLR	R7
     9B8 2488      CLR	R8
     9B9 2499      CLR	R9
     9BA 940E 17DF CALL	0x17DF
     9BC 940E 18EC CALL	0x18EC
(0276) 		serial++;
(0277) 		blocknow = Cluster;
     9BE 8828      LDD	R2,Y+16
     9BF 8839      LDD	R3,Y+17
     9C0 884A      LDD	R4,Y+18
     9C1 885B      LDD	R5,Y+19
     9C2 940E 1930 CALL	0x1930
     9C4 940E 18CB CALL	0x18CB
(0278) 		*blockserial = SecPerClus-serial;
(0279) 		if(serial == SecPerClus)
     9C6 F009      BEQ	0x09C8
     9C7 C020      RJMP	0x09E8
(0280) 			serial = 0;
     9C8 2422      CLR	R2
     9C9 9220 0062 STS	serial,R2
(0281) 	}
     9CB C01C      RJMP	0x09E8
(0282) 	else
(0283) 	{
(0284) 		fat_load(blocknow,&Block,buff);
     9CC 940E 19AC CALL	0x19AC
     9CE 940E 1927 CALL	0x1927
     9D0 DDA7      RCALL	_fat_load
(0285) 		MMC_SD_ReadSingleBlock((blocknow-2)*SecPerClus+data_offset+serial,buff);
     9D1 82D9      STD	Y+1,R13
     9D2 82C8      STD	Y+0,R12
     9D3 940E 1922 CALL	0x1922
     9D5 940E 1927 CALL	0x1927

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -