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

📄 testlcd.lst

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LST
📖 第 1 页 / 共 5 页
字号:
     732 0113      MOVW	R2,R6
     733 0124      MOVW	R4,R8
     734 940E 1943 CALL	0x1943
(0051) 	}
     736 C036      RJMP	0x076D
(0052) 	else	//FAT16或者FAT12文件系统
(0053) 	{
(0054) 	    BlockSize=bootp->BPB_BytesPerSec;		//获取每扇区字节数目	
     737 01F5      MOVW	R30,R10
     738 940E 19E0 CALL	0x19E0
(0055) 		if(bootp->BPB_SysID[4] == '2')  //根据扩展FAT12/FAT16的系统ID部分,判断
     73A AD82      LDD	R24,Z+58
     73B 3382      CPI	R24,0x32
     73C F421      BNE	0x0741
(0056) 			FatFlags = FAT_Flg_12;		//FAT12
     73D 2422      CLR	R2
     73E 9220 00C1 STS	FatFlags,R2
     740 C003      RJMP	0x0744
(0057) 		else
(0058) 			FatFlags = FAT_Flg_16;		//FAT16
     741 E081      LDI	R24,1
     742 9380 00C1 STS	FatFlags,R24
(0059) 		fat_offset = bootp->BPB_RsvdSecCnt + VBRadd;
     744 01F5      MOVW	R30,R10
     745 940E 184C CALL	0x184C
(0060) 		//根目录区(FDT)的起始扇区号=保留扇区+FAT占用扇区:
(0061) 		FirstRootDirSecNum=VBRadd+(bootp->BPB_RsvdSecCnt+(bootp->BPB_NumFATs*bootp->BPB_FATSz16));
     747 8926      LDD	R18,Z+22
     748 8937      LDD	R19,Z+23
     749 8900      LDD	R16,Z+16
     74A 2711      CLR	R17
     74B 940E 1650 CALL	empy16s
     74D 01F5      MOVW	R30,R10
     74E 8426      LDD	R2,Z+14
     74F 8437      LDD	R3,Z+15
     750 0E20      ADD	R2,R16
     751 1E31      ADC	R3,R17
     752 0126      MOVW	R4,R12
     753 0C42      ADD	R4,R2
     754 1C53      ADC	R5,R3
     755 0112      MOVW	R2,R4
     756 2444      CLR	R4
     757 2455      CLR	R5
     758 9230 00B7 STS	FirstRootDirSecNum+1,R3
     75A 9220 00B6 STS	FirstRootDirSecNum,R2
     75C 9250 00B9 STS	FirstRootDirSecNum+3,R5
     75E 9240 00B8 STS	FirstRootDirSecNum+2,R4
(0062) 		SecPerClus = bootp->BPB_SecPerClus;		//每个簇占用的扇区数目,SD卡应为8
     760 8425      LDD	R2,Z+13
     761 9220 00BC STS	SecPerClus,R2
(0063) 	    //数据区的起始扇区数,FAT16/FAT12的根目录,一般占用32个扇区的大小:
(0064) 		data_offset = FirstRootDirSecNum + 32;	
     763 E240      LDI	R20,0x20
     764 E050      LDI	R21,0
     765 E060      LDI	R22,0
     766 E070      LDI	R23,0
     767 940E 1900 CALL	0x1900
     769 940E 198D CALL	0x198D
     76B 940E 1943 CALL	0x1943
(0065) 	}
(0066) 	return(FirstRootDirSecNum);	 //返回根目录区的起始扇区号
     76D 9120 00B8 LDS	R18,FirstRootDirSecNum+2
     76F 9130 00B9 LDS	R19,FirstRootDirSecNum+3
     771 9100 00B6 LDS	R16,FirstRootDirSecNum
     773 9110 00B7 LDS	R17,FirstRootDirSecNum+1
     775 9622      ADIW	R28,2
     776 940C 1693 JMP	pop_xgsetF0FC
_fat_load:
  Tmp                  --> Y,+6
  FAT_Block_Addresse   --> Y,+2
  FAT_Byte_Addresse    --> R14
  TMP_Buffer           --> R12
  Block                --> R10
  Cluster              --> Y,+20
     778 940E 18D6 CALL	0x18D6
     77A 972A      SBIW	R28,0xA
     77B 8CA8      LDD	R10,Y+24
     77C 8CB9      LDD	R11,Y+25
     77D 8CCA      LDD	R12,Y+26
     77E 8CDB      LDD	R13,Y+27
(0067) }
(0068) 
(0069) //############################################################################
(0070) //解析FAT链表
(0071) void fat_load(unsigned long Cluster, 		//文件起始扇区
(0072) 				unsigned long *Block,		//返回文件下一扇区
(0073) 				unsigned char *TMP_Buffer) 	//函数所需buffer
(0074) //############################################################################
(0075) {
(0076) 	unsigned int FAT_Byte_Addresse;	
(0077) 	unsigned long FAT_Block_Addresse;
(0078) 
(0079) 	//读取FAT表,根据FAT制式搜寻扇区
(0080) 	if(FatFlags == FAT_Flg_16)
     77F 9180 00C1 LDS	R24,FatFlags
     781 3081      CPI	R24,1
     782 F009      BEQ	0x0784
     783 C041      RJMP	0x07C5
(0081) 	{
(0082) 		if(Cluster == 0xFFFF)
     784 940E 1A4B CALL	0x1A4B
     786 940E 1818 CALL	0x1818
     788 940E 17E4 CALL	0x17E4
     78A F409      BNE	0x078C
(0083) 		{
(0084) 			return; //文件已经到达末尾
     78B C15C      RJMP	0x08E8
(0085) 		}
(0086) 		FAT_Byte_Addresse = ((Cluster<<1) & 0x1FF);
     78C EF4F      LDI	R20,0xFF
     78D E051      LDI	R21,1
     78E E060      LDI	R22,0
     78F E070      LDI	R23,0
     790 940E 1818 CALL	0x1818
     792 0C22      LSL	R2
     793 1C33      ROL	R3
     794 1C44      ROL	R4
     795 1C55      ROL	R5
     796 940E 1913 CALL	0x1913
     798 0171      MOVW	R14,R2
     799 940E 1992 CALL	0x1992
     79B 940E 187C CALL	0x187C
     79D 940E 19F1 CALL	0x19F1
     79F 940E 17B6 CALL	0x17B6
(0087) 		FAT_Block_Addresse = ((Cluster<<1)/BlockSize) + fat_offset;
     7A1 940E 15DA CALL	div32u
     7A3 0118      MOVW	R2,R16
     7A4 0129      MOVW	R4,R18
     7A5 9080 00C8 LDS	R8,fat_offset+2
     7A7 9090 00C9 LDS	R9,fat_offset+3
     7A9 9060 00C6 LDS	R6,fat_offset
     7AB 9070 00C7 LDS	R7,fat_offset+1
     7AD 940E 17DF CALL	0x17DF
     7AF 940E 18B6 CALL	0x18B6
     7B1 940E 1832 CALL	0x1832
     7B3 940E 1881 CALL	0x1881
     7B5 940E 1909 CALL	0x1909
(0088) 		MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
(0089) 		*Block = (TMP_Buffer[FAT_Byte_Addresse + 1] << 8) + TMP_Buffer[FAT_Byte_Addresse];
     7B7 8030      LDD	R3,Z+0
     7B8 940E 17E9 CALL	0x17E9
     7BA 940E 1A4B CALL	0x1A4B
     7BC 940E 17E4 CALL	0x17E4
(0090) 		if(*Block == 0xFFFF)
     7BE F009      BEQ	0x07C0
     7BF C128      RJMP	0x08E8
(0091) 			*Block = 0xFFFFFFFF;
     7C0 940E 183B CALL	0x183B
     7C2 940E 19C7 CALL	0x19C7
(0092) 	}
     7C4 C123      RJMP	0x08E8
(0093) 	else if(FatFlags == FAT_Flg_12)
     7C5 9020 00C1 LDS	R2,FatFlags
     7C7 2022      TST	R2
     7C8 F009      BEQ	0x07CA
     7C9 C0A8      RJMP	0x0872
(0094) 	{
(0095) 		if(Cluster == 0xFFF)
     7CA 940E 1A55 CALL	0x1A55
     7CC 940E 1818 CALL	0x1818
     7CE 940E 17E4 CALL	0x17E4
     7D0 F409      BNE	0x07D2
(0096) 		{
(0097) 			return; //文件已经到达末尾
     7D1 C116      RJMP	0x08E8
(0098) 		}
(0099) 		FAT_Byte_Addresse = (((Cluster*3)>>1) & 0x1FF);
     7D2 940E 1818 CALL	0x1818
     7D4 E043      LDI	R20,3
     7D5 E050      LDI	R21,0
     7D6 E060      LDI	R22,0
     7D7 940E 17A4 CALL	0x17A4
     7D9 0118      MOVW	R2,R16
     7DA 0129      MOVW	R4,R18
     7DB 9456      LSR	R5
     7DC 9447      ROR	R4
     7DD 9437      ROR	R3
     7DE 9427      ROR	R2
     7DF 940E 18F6 CALL	0x18F6
     7E1 940E 1818 CALL	0x1818
(0100) 		FAT_Block_Addresse = (((Cluster*3)>>1) / BlockSize) + fat_offset;
     7E3 E043      LDI	R20,3
     7E4 E050      LDI	R21,0
     7E5 E060      LDI	R22,0
     7E6 940E 17A4 CALL	0x17A4
     7E8 940E 1A7D CALL	0x1A7D
     7EA 940E 1992 CALL	0x1992
     7EC 940E 17B6 CALL	0x17B6
     7EE 940E 15DA CALL	div32u
     7F0 0118      MOVW	R2,R16
     7F1 0129      MOVW	R4,R18
     7F2 9080 00C8 LDS	R8,fat_offset+2
     7F4 9090 00C9 LDS	R9,fat_offset+3
     7F6 9060 00C6 LDS	R6,fat_offset
     7F8 9070 00C7 LDS	R7,fat_offset+1
     7FA 940E 17DF CALL	0x17DF
     7FC 940E 18B6 CALL	0x18B6
(0101) 		if(FAT_Byte_Addresse == 0x1FF)
     7FE 01C7      MOVW	R24,R14
     7FF 3F8F      CPI	R24,0xFF
     800 E0A1      LDI	R26,1
     801 079A      CPC	R25,R26
     802 F009      BEQ	0x0804
     803 C040      RJMP	0x0844
(0102) 		{
(0103) 			MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
     804 940E 1832 CALL	0x1832
     806 940E 1818 CALL	0x1818
(0104) 			if((Cluster % 2) == 0)
     808 2D02      MOV	R16,R2
     809 7001      ANDI	R16,1
     80A F459      BNE	0x0816
     80B 940E 1881 CALL	0x1881
(0105) 			{
(0106) 				*Block = TMP_Buffer[FAT_Byte_Addresse];
     80D 2433      CLR	R3
     80E 2444      CLR	R4
     80F 2455      CLR	R5
     810 01F5      MOVW	R30,R10
     811 8220      STD	Z+0,R2
     812 8231      STD	Z+1,R3
     813 8242      STD	Z+2,R4
     814 8253      STD	Z+3,R5
(0107) 			}
     815 C004      RJMP	0x081A
(0108) 			else
(0109) 			{
(0110) 				*Block = (TMP_Buffer[FAT_Byte_Addresse] >> 4);
     816 940E 1869 CALL	0x1869
     818 940E 17E9 CALL	0x17E9
(0111) 			}
(0112) 			MMC_SD_ReadSingleBlock(FAT_Block_Addresse+1,TMP_Buffer);
     81A 82D9      STD	Y+1,R13
     81B 82C8      STD	Y+0,R12
     81C 940E 19EC CALL	0x19EC
     81E 940E 1847 CALL	0x1847
     820 0F04      ADD	R16,R20
     821 1F15      ADC	R17,R21
     822 1F26      ADC	R18,R22
     823 1F37      ADC	R19,R23
     824 940E 14AB CALL	_MMC_SD_ReadSingleBlock
     826 940E 1818 CALL	0x1818
(0113) 			if((Cluster % 2) == 0)
     828 2D02      MOV	R16,R2
     829 7001      ANDI	R16,1
     82A F469      BNE	0x0838
(0114) 			{
(0115) 				*Block += ((TMP_Buffer[0] & 0x0F) << 8);
     82B 01F6      MOVW	R30,R12
     82C 8180      LDD	R24,Z+0
     82D 2799      CLR	R25
     82E 708F      ANDI	R24,0xF
     82F 7090      ANDI	R25,0
     830 2F98      MOV	R25,R24
     831 2788      CLR	R24
     832 011C      MOVW	R2,R24
     833 940E 1811 CALL	0x1811
     835 940E 185B CALL	0x185B
(0116) 			}
     837 C02C      RJMP	0x0864
(0117) 			else
(0118) 			{
(0119) 				*Block += (TMP_Buffer[0] << 4);
     838 01F6      MOVW	R30,R12
     839 8020      LDD	R2,Z+0
     83A 2433      CLR	R3
     83B 940E 18E1 CALL	0x18E1
     83D 940E 18E1 CALL	0x18E1
     83F 940E 1811 CALL	0x1811
     841 940E 185B CALL	0x185B
(0120) 			}
(0121) 		}
     843 C020      RJMP	0x0864
(0122) 		else
(0123) 		{
(0124) 			MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
     844 940E 1832 CALL	0x1832
     846 940E 1818 CALL	0x1818
(0125) 			if((Cluster % 2) == 0)
     848 2D02      MOV	R16,R2
     849 7001      ANDI	R16,1
     84A F451      BNE	0x0855
     84B 940E 1881 CALL	0x1881
     84D 940E 1909 CALL	0x1909
(0126) 			{
(0127) 				*Block = ((TMP_Buffer[FAT_Byte_Addresse + 1] & 0x0F) << 8) + TMP_Buffer[FAT_Byte_Addresse];
     84F 8180      LDD	R24,Z+0
     850 708F      ANDI	R24,0xF
     851 2E38      MOV	R3,R24
     852 940E 17E9 CALL	0x17E9
(0128) 			}
     854 C00F      RJMP	0x0864
(0129) 			else
(0130) 			{
(0131) 				*Block = (TMP_Buffer[FAT_Byte_Addresse + 1] << 4) + (TMP_Buffer[FAT_Byte_Addresse] >> 4);
     855 940E 1869 CALL	0x1869
     857 940E 1909 CALL	0x1909
     859 8040      LDD	R4,Z+0
     85A 2455      CLR	R5
     85B 940E 1983 CALL	0x1983
     85D 940E 1983 CALL	0x1983
     85F 0C42      ADD	R4,R2
     860 1C53      ADC	R5,R3
     861 0112      MOVW	R2,R4
     862 940E 17E9 CALL	0x17E9
(0132) 			}
(0133) 		}
(0134) 		if(*Block == 0xFFF)
     864 940E 1A55 CALL	0x1A55
     866 01F5      MOVW	R30,R10
     867 940E 1A73 CALL	0x1A73
     869 940E 17E4 CALL	0x17E4
     86B F009      BEQ	0x086D
     86C C07B      RJMP	0x08E8
(0135) 			*Block = 0xFFFFFFFF;
     86D 940E 183B CALL	0x183B
     86F 940E 19C7 CALL	0x19C7
(0136) 	}
     871 C076      RJMP	0x08E8
(0137) 	else if(FatFlags == FAT_Flg_32)
     872 9180 00C1 LDS	R24,FatFlags
     874 3082      CPI	R24,2
     875 F009      BEQ	0x0877
     876 C071      RJMP	0x08E8
(0138) 	{
(0139) 		unsigned long Tmp;
(0140) 		Tmp=Cluster/128;
     877 E087      LDI	R24,7
     878 E090      LDI	R25,0
     879 940E 187C CALL	0x187C
     87B 938A      ST	R24,-Y
     87C 940E 1705 CALL	lsr32
     87E 830E      STD	Y+6,R16
     87F 831F      STD	Y+7,R17
     880 8728      STD	Y+8,R18
     881 8739      STD	Y+9,R19
     882 940E 183B CALL	0x183B
     884 940E 1818 CALL	0x1818
     886 940E 17E4 CALL	0x17E4
(0141) 		if(Cluster == 0xFFFFFFFF)
     888 F431      BNE	0x088F
     889 940E 183B CALL	0x183B
(0142) 		{
(0143) 		 	*Block = 0xFFFFFFFF;
     88B 01F5      MOVW	R30,R10
     88C 940E 19C7 CALL	0x19C7
(0144) 			return; //文件已经到达末尾
     88E C059      RJMP	0x08E8
(0145) 		}
(0146) 		
(0147) 		   FAT_Byte_Addresse = (Cluster*4)%512;
     88F E082      LDI	R24,2
     890 E090      LDI	R25,0
     891 940E 187C CALL	0x187C
     893 938A      ST	R24,-Y
     894 940E 16FB CALL	lsl32
     896 0118      MOVW	R2,R16
     897 0129      MOVW	R4,R18
     898 940E 18F6 CALL	0x18F6
(0148) 		   FAT_Block_Addresse = Tmp + fat_offset ;
     89A 9040 00C8 LDS	R4,fat_offset+2
     89C 9050 00C9 LDS	R5,fat_offset+3
     89E 9020 00C6 LDS	R2,fat_offset
     8A0 9030 00C7 LDS	R3,fat_offset+1
     8A2 940E 1AA0 CALL	0x1AA0
     8A4 940E 1877 CALL	0x1877
     8A6 826A      STD	Y+2,R6
     8A7 827B      STD	Y+3,R7
     8A8 828C      STD	Y+4,R8
     8A9 829D      STD	Y+5,R9
     8AA 940E 1832 CALL	0x1832
(0149) 		   
(0150) 		MMC_SD_ReadSingleBlock (FAT_Block_Addresse,TMP_Buffer);
(0151) 		//测试使用:
(0152) 		//DisplayHexNum(1,1,TMP_Buffer[FAT_Byte_Addresse+3]);
(0153) 		//DisplayHexNum(2,1,TMP_Buffer[FAT_Byte_Addresse+2]);
(0154) 		//DisplayHexNum(3,1,TMP_Buffer[FAT_Byte_Addresse+1]);
(0155) 		//DisplayHexNum(4,1,TMP_Buffer[FAT_Byte_Addresse]);
(0156) 		//Delay(1000);
(0157) 		//
(0158) 		*Block = (TMP_Buffer[FAT_Byte_Addresse+3]*(unsigned long)16777216) +
     8AC 01F7      MOVW	R30,R14
     8AD 9632      ADIW	R30,2
     8AE 940E 1890 CALL	0x1890
     8B0 E040      LDI	R20,0
     8B1 E050      LDI	R21,0
     8B2 E061      LDI	R22,1
     8B3 940E 17A4 CALL	0x17A4

⌨️ 快捷键说明

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