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

📄 fat.s

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 S
📖 第 1 页 / 共 3 页
字号:
X13:
	.dbline 114
; 			{
	.dbline 115
; 				*Block += ((TMP_Buffer[0] & 0x0F) << 8);
	movw R30,R12
	ldd R24,z+0
	clr R25
	andi R24,15
	andi R25,0
	mov R25,R24
	clr R24
	movw R2,R24
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R10
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 116
; 			}
	xjmp L21
L24:
	.dbline 118
; 			else
; 			{
	.dbline 119
; 				*Block += (TMP_Buffer[0] << 4);
	movw R30,R12
	ldd R2,z+0
	clr R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R10
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 120
; 			}
	.dbline 121
; 		}
	xjmp L21
L20:
	.dbline 123
; 		else
; 		{
	.dbline 124
; 			MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
	std y+1,R13
	std y+0,R12
	ldd R16,y+2
	ldd R17,y+3
	ldd R18,y+4
	ldd R19,y+5
	xcall _MMC_SD_ReadSingleBlock
	.dbline 125
; 			if((Cluster % 2) == 0)
	ldd R2,y+20
	ldd R3,y+21
	ldd R4,y+22
	ldd R5,y+23
	mov R16,R2
	andi R16,1
	brne L26
X14:
	.dbline 126
; 			{
	.dbline 127
; 				*Block = ((TMP_Buffer[FAT_Byte_Addresse + 1] & 0x0F) << 8) + TMP_Buffer[FAT_Byte_Addresse];
	movw R30,R14
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	movw R30,R14
	adiw R30,1
	add R30,R12
	adc R31,R13
	ldd R24,z+0
	andi R24,15
	mov R3,R24
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R10
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 128
; 			}
	xjmp L27
L26:
	.dbline 130
; 			else
; 			{
	.dbline 131
; 				*Block = (TMP_Buffer[FAT_Byte_Addresse + 1] << 4) + (TMP_Buffer[FAT_Byte_Addresse] >> 4);
	movw R30,R14
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	asr R3
	ror R2
	asr R3
	ror R2
	asr R3
	ror R2
	asr R3
	ror R2
	movw R30,R14
	adiw R30,1
	add R30,R12
	adc R31,R13
	ldd R4,z+0
	clr R5
	lsl R4
	rol R5
	lsl R4
	rol R5
	lsl R4
	rol R5
	lsl R4
	rol R5
	add R4,R2
	adc R5,R3
	movw R2,R4
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R10
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 132
; 			}
L27:
	.dbline 133
; 		}
L21:
	.dbline 134
; 		if(*Block == 0xFFF)
	ldi R20,255
	ldi R21,15
	ldi R22,0
	ldi R23,0
	movw R30,R10
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq X22
	xjmp L9
X22:
X15:
	.dbline 135
; 			*Block = 0xFFFFFFFF;
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,255
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 136
; 	}
	xjmp L9
L16:
	.dbline 137
; 	else if(FatFlags == FAT_Flg_32)
	lds R24,_FatFlags
	cpi R24,2
	breq X23
	xjmp L9
X23:
X16:
	.dbline 138
; 	{
	.dbline 140
; 		unsigned long Tmp;
; 		Tmp=Cluster/128;
	ldi R24,7
	ldi R25,0
	ldd R16,y+20
	ldd R17,y+21
	ldd R18,y+22
	ldd R19,y+23
	st -y,R24
	xcall lsr32
	std y+6,R16
	std y+7,R17
	std y+8,R18
	std y+9,R19
	.dbline 141
; 		if(Cluster == 0xFFFFFFFF)
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,255
	ldd R2,y+20
	ldd R3,y+21
	ldd R4,y+22
	ldd R5,y+23
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L32
X17:
	.dbline 142
; 		{
	.dbline 143
; 		 	*Block = 0xFFFFFFFF;
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,255
	movw R30,R10
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 144
; 			return; //文件已经到达末尾
	xjmp L9
L32:
	.dbline 147
; 		}
; 		
; 		   FAT_Byte_Addresse = (Cluster*4)%512;
	ldi R24,2
	ldi R25,0
	ldd R16,y+20
	ldd R17,y+21
	ldd R18,y+22
	ldd R19,y+23
	st -y,R24
	xcall lsl32
	movw R2,R16
	movw R4,R18
	ldi R20,255
	ldi R21,1
	ldi R22,0
	ldi R23,0
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R14,R2
	.dbline 148
; 		   FAT_Block_Addresse = Tmp + fat_offset ;
	lds R4,_fat_offset+2
	lds R5,_fat_offset+2+1
	lds R2,_fat_offset
	lds R3,_fat_offset+1
	ldd R6,y+6
	ldd R7,y+7
	ldd R8,y+8
	ldd R9,y+9
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	std y+2,R6
	std y+3,R7
	std y+4,R8
	std y+5,R9
	.dbline 150
; 		   
; 		MMC_SD_ReadSingleBlock (FAT_Block_Addresse,TMP_Buffer);
	std y+1,R13
	std y+0,R12
	ldd R16,y+2
	ldd R17,y+3
	ldd R18,y+4
	ldd R19,y+5
	xcall _MMC_SD_ReadSingleBlock
	.dbline 158
; 		//测试使用:
; 		//DisplayHexNum(1,1,TMP_Buffer[FAT_Byte_Addresse+3]);
; 		//DisplayHexNum(2,1,TMP_Buffer[FAT_Byte_Addresse+2]);
; 		//DisplayHexNum(3,1,TMP_Buffer[FAT_Byte_Addresse+1]);
; 		//DisplayHexNum(4,1,TMP_Buffer[FAT_Byte_Addresse]);
; 		//Delay(1000);
; 		//
; 		*Block = (TMP_Buffer[FAT_Byte_Addresse+3]*(unsigned long)16777216) +
	movw R30,R14
	adiw R30,2
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	ldi R20,0
	ldi R21,0
	ldi R22,1
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R2,R16
	movw R4,R18
	movw R30,R14
	adiw R30,3
	add R30,R12
	adc R31,R13
	ldd R6,z+0
	clr R7
	clr R8
	clr R9
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,1
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R6,R16
	movw R8,R18
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R14
	adiw R30,1
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	ldi R20,0
	ldi R21,1
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	add R6,R16
	adc R7,R17
	adc R8,R18
	adc R9,R19
	movw R30,R14
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R10
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 162
; 					(TMP_Buffer[FAT_Byte_Addresse+2]*(unsigned long)65536) +
; 					(TMP_Buffer[FAT_Byte_Addresse+1]*(unsigned long)256) +
; 					 TMP_Buffer[FAT_Byte_Addresse];
; 	}
	.dbline 163
; 	return;
	.dbline -2
L9:
	.dbline 0 ; func end
	adiw R28,10
	xcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym l Tmp 6 l
	.dbsym l FAT_Block_Addresse 2 l
	.dbsym r FAT_Byte_Addresse 14 i
	.dbsym r TMP_Buffer 12 pc
	.dbsym r Block 10 pl
	.dbsym l Cluster 20 l
	.dbend
	.dbfunc e fat_read_dir_ent _fat_read_dir_ent fl
	.dbstruct 0 32 DirEntry
	.dbfield 0 DIR_Name A[11:11]c
	.dbfield 11 DIR_Attr c
	.dbfield 12 DIR_NTRes c
	.dbfield 13 DIR_CrtTimeTenth c
	.dbfield 14 DIR_CrtTime i
	.dbfield 16 DIR_CrtDate i
	.dbfield 18 DIR_LastAccDate i
	.dbfield 20 DIR_FstClusHI i
	.dbfield 22 DIR_WrtTime i
	.dbfield 24 DIR_WrtDate i
	.dbfield 26 DIR_FstClusLO i
	.dbfield 28 DIR_FileSize l
	.dbend
;          Block -> y+6
;            blk -> y+2
; TMP_Entry_Count -> R10,R11
;              a -> R14,R15
;            dir -> R12,R13
;           buff -> y+30
;     Dir_Attrib -> y+28
;           Size -> y+26
;    Entry_Count -> y+24
;    dir_cluster -> y+20
	.even
_fat_read_dir_ent::
	xcall push_arg4
	xcall push_xgsetF0FC
	sbiw R28,10
	.dbline -1
	.dbline 174
; }
; 
; //############################################################################
; //读取文件目录区FDT相关信息,错误的时候返回0xffffffff,目录搜索完毕,返回0xFFFFFFFE
; unsigned long fat_read_dir_ent(unsigned long dir_cluster,//目录所在簇
; 							unsigned int Entry_Count,	//目录中文件序号
; 							unsigned long *Size,		//文件长度
; 							unsigned char *Dir_Attrib,	//文件属性
; 							unsigned char *buff)		//函数所需buffer
; //############################################################################
; {
	.dbline 175
; 	unsigned int TMP_Entry_Count = 0;
	clr R10
	clr R11
	.dbline 176
; 	unsigned long Block=0;			//目录所在扇区地址
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std y+6,R20
	std y+7,R21
	std y+8,R22
	std y+9,R23
	.dbline 181
; 	unsigned long blk;
; 	unsigned int a;
; 	struct DirEntry *dir; 			//文件目录指针
; 
; 	if (dir_cluster == 0)	//读取根目录,得到FDT起始扇区号
	ldd R2,y+20
	ldd R3,y+21
	ldd R4,y+22
	ldd R5,y+23
	ldi R16,0
	cp R2,R16
	cpc R3,R16
	cpc R4,R16
	cpc R5,R16
	brne L35
X24:
	.dbline 182
; 	{
	.dbline 183
; 		Block = FirstRootDirSecNum;
	lds R4,_FirstRootDirSecNum+2
	lds R5,_FirstRootDirSecNum+2+1
	lds R2,_FirstRootDirSecNum
	lds R3,_FirstRootDirSecNum+1
	std y+6,R2
	std y+7,R3
	std y+8,R4
	std y+9,R5
	.dbline 184
; 	}
	xjmp L36
L35:
	.dbline 186
; 	else					//读取子目录,本程序中用不到
; 	{
	.dbline 187
; 		Block = (dir_cluster-2)*SecPerClus+data_offset;
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R16,y+20
	ldd R17,y+21
	ldd R18,y+22
	ldd R19,y+23
	sub R16,R20
	sbc R17,R21
	sbc R18,R22
	sbc R19,R23
	lds R2,_SecPerClus
	clr R3
	clr R4
	clr R5
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall empy32u
	movw R2,R16
	movw R4,R18
	lds R8,_data_offset+2
	lds R9,_data_offset+2+1
	lds R6,_data_offset
	lds R7,_data_offset+1
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	std y+6,R2
	std y+7,R3
	std y+8,R4
	std y+9,R5
	.dbline 188
; 	}
L36:
	.dbline 191
; 	//下面的算法效率有问题。注意它每次都是从根目录下面依次去找第Entry_Count个文件
; 	//for (blk = old_pos_blk;;blk++)
; 	for (blk = Block;;blk++)    //从该目录下面,依次读取一个扇区
	ldd R2,y+6
	ldd R3,y+7
	ldd R4,y+8
	ldd R5,y+9
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
L37:
	.dbline 192
; 	{
	.dbline 193
; 		MMC_SD_ReadSingleBlock(blk,buff);
	ldd R0,y+30
	ldd R1,y+31
	std y+1,R1
	std y+0,R0
	ldd R16,y+2
	ldd R17,y+3
	ldd R18,y+4
	ldd R19,y+5
	xcall _MMC_SD_ReadSingleBlock
L41:
	.dbline 196
; 	Next_a: 
; 		//for (a=old_pos_a;a<BlockSize; a = a + 32)
; 		for (a=0;a<BlockSize; a = a + 32)  //依次分析每一个32字节的目录/文件结构
	clr R14
	clr R15
	xjmp L45
L42:
	.dbline 197
; 		{	//依次分析每一个文件或目录,可能会出现空的、已删除、正常的目录/文件
	.dbline 198
; 			dir=(struct DirEntry *)(buff + a); //装载目录内容
	movw R12,R14
	ldd R0,y+30
	ldd R1,y+31
	add R12,R0
	adc R13,R1
	.dbline 199
; 			if (dir->DIR_Name[0] == 0) 		 //目录已经搜索完毕,返回.
	movw R30,R12
	ldd R2,z+0
	tst R2
	brne L46
X25:
	.dbline 200
; 			{
	.dbline 201
; 				return (0xFFFFFFFE);
	ldi R16,254
	ldi R17,255
	ldi R18,255
	ldi R19,255
	xjmp L34
L46:
	.dbline 204
; 			}
; 			//非卷标,非长文件名,并且文件没有删除
;    			if ((dir->DIR_Attr != ATTR_LONG_NAME) && (dir->DIR_Attr != DIR_ATTRIB_VOL_ID) && (dir->DIR_Name[0] != DIR_ENTRY_IS_FREE)) 
	movw R30,R12
	ldd R2,z+11
	clr R3
	mov R24,R2
	cpi R24,15
	brne X42
	xjmp L48
X42:
X26:
	cpi R24,8
	brne X43
	xjmp L48
X43:
X27:
	ldd R24,z+0
	cpi R24,229
	brne X44
	xjmp L48
X44:
X28:
	.dbline 205
; 			{   
	.dbline 207
; 				//搜索字库文件:
; 				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')
	ldd R0,y+24
	ldd R1,y+25
	tst R0
	breq X45
	xjmp L50
X45:
	tst R1
	breq X46
	xjmp L50
X46:
X29:
	ldd R24,z+2
	cpi R24,70
	breq X47
	xjmp L50
X47:
X30:
	ldd R24,z+3
	cpi R24,79
	breq X48
	xjmp L50
X48:
X31:
	ldd R24,z+4
	cpi R24,78
	breq X49
	xjmp L50
X49:
X32:
	ldd R24,z+5
	cpi R24,84
	breq X50
	xjmp L50
X50:
X33:
	ldd R24,z+6
	cpi R24,49
	breq X51
	xjmp L50
X51:
X34:
	ldd R24,z+7
	cpi R24,54
	breq X52
	xjmp L50
X52:
X35:
	.dbline 208
; 				{
	.dbline 209
; 				    pointer_FDT=buff + a;					
	movw R2,R14
	ldd R0,y+30
	ldd R1,y+31
	add R2,R0
	adc R3,R1
	sts _pointer_FDT+1,R3
	sts _pointer_FDT,R2
	.dbline 210
; 					*Dir_Attrib = dir->DIR_Attr;
	ldd R2,z+11
	ldd R30,y+28
	ldd R31,y+29
	std z+0,R2
	.dbline 213
; 
; 					//文件长度
; 					*Size=dir->DIR_FileSize;
	movw R30,R12
	ldd R2,z+28
	ldd R3,z+29
	ldd R4,z+30
	ldd R5,z+31
	ldd R30,y+26
	ldd R31,y+27
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 216
; 					
; 					//文件起始簇的低16位
; 					dir_cluster = dir->DIR_FstClusLO + (dir->DIR_FstClusHI)*65536;
	movw R30,R12
	ldd R2,z+20
	ldd R3,z+21
	clr R4
	clr R5
	ldi R20,0
	ldi R21,0
	ldi R22,1
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32s
	movw R30,R12
	adiw R30,26
	ldd R2,z+0
	ldd R3,z+1
	clr R4
	clr R5
	add R2,R16
	adc R3,R17
	adc R4,R18

⌨️ 快捷键说明

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