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

📄 fat.s

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 S
📖 第 1 页 / 共 3 页
字号:
	adc R5,R19
	std y+20,R2
	std y+21,R3
	std y+22,R4
	std y+23,R5
	.dbline 219
; 						
; 					//返回起始簇
; 					return(dir_cluster);
	ldd R16,y+20
	ldd R17,y+21
	ldd R18,y+22
	ldd R19,y+23
	xjmp L34
L50:
	.dbline 222
; 				}
; 			    //搜索mp3文件:
; 				else if(dir->DIR_Name[8] == Search_FileExName1[0] && dir->DIR_Name[9] == Search_FileExName1[1] && dir->DIR_Name[10] == Search_FileExName1[2]) //找到要搜索的文件
	ldi R30,<_Search_FileExName1
	ldi R31,>_Search_FileExName1
	lpm R2,Z
	movw R30,R12
	ldd R3,z+8
	cp R3,R2
	breq X53
	xjmp L52
X53:
X36:
	ldi R30,<_Search_FileExName1+1
	ldi R31,>_Search_FileExName1+1
	lpm R2,Z
	movw R30,R12
	ldd R3,z+9
	cp R3,R2
	breq X54
	xjmp L52
X54:
X37:
	ldi R30,<_Search_FileExName1+2
	ldi R31,>_Search_FileExName1+2
	lpm R2,Z
	movw R30,R12
	ldd R3,z+10
	cp R3,R2
	breq X55
	xjmp L52
X55:
X38:
	.dbline 223
; 				{
	.dbline 224
; 				 	TMP_Entry_Count++;
	movw R24,R10
	adiw R24,1
	movw R10,R24
	.dbline 226
; 					//找寻第Entery_Count个指定文件
; 					if (TMP_Entry_Count == Entry_Count) 
	ldd R0,y+24
	ldd R1,y+25
	cp R24,R0
	cpc R25,R1
	breq X56
	xjmp L56
X56:
X39:
	.dbline 227
; 					{
	.dbline 228
; 				    	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 229
; 						*Dir_Attrib = dir->DIR_Attr;
	ldd R2,z+11
	ldd R30,y+28
	ldd R31,y+29
	std z+0,R2
	.dbline 232
; 
; 						//文件长度
; 						*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 235
; 					
; 						//文件起始簇的低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
	adc R5,R19
	std y+20,R2
	std y+21,R3
	std y+22,R4
	std y+23,R5
	.dbline 249
; 						/*
; 						if((a+32)<512)	//判断是否该搜索下一个扇区的目录文件信息了
; 						{
; 					   	 	old_pos_a=a+32;
; 					   	 	old_pos_blk=blk;
; 						 }
; 						else 			   //到下一扇区寻找
; 						{
; 					   	 	old_pos_a=0;		
; 					   		old_pos_blk=blk+1;
; 						}
; 						*/
; 						//返回起始簇
; 						return(dir_cluster);
	ldd R16,y+20
	ldd R17,y+21
	ldd R18,y+22
	ldd R19,y+23
	xjmp L34
L56:
	.dbline 251
; 					}
; 				}
L52:
	.dbline 252
; 			}
L48:
	.dbline 253
; 		}
L43:
	.dbline 196
	movw R24,R14
	adiw R24,32
	movw R14,R24
L45:
	.dbline 196
	lds R2,_BlockSize
	lds R3,_BlockSize+1
	cp R14,R2
	cpc R15,R3
	brsh X57
	xjmp L42
X57:
X40:
	.dbline 254
; 	}
L38:
	.dbline 191
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
	.dbline 191
	xjmp L37
X41:
	.dbline -2
L34:
	.dbline 0 ; func end
	adiw R28,10
	xcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym l Block 6 l
	.dbsym l blk 2 l
	.dbsym r TMP_Entry_Count 10 i
	.dbsym r a 14 i
	.dbsym r dir 12 pS[DirEntry]
	.dbsym l buff 30 pc
	.dbsym l Dir_Attrib 28 pc
	.dbsym l Size 26 pl
	.dbsym l Entry_Count 24 i
	.dbsym l dir_cluster 20 l
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
L59:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
	.area text(rom, con, rel)
	.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
	.dbfunc e fat_read_file _fat_read_file fc
	.dbsym s serial L59 c
;          Block -> y+4
;    blockserial -> R10,R11
;     BlockCount -> y+22
;           buff -> R12,R13
;        Cluster -> y+16
	.even
_fat_read_file::
	xcall push_arg4
	xcall push_xgsetF03C
	sbiw R28,8
	ldd R12,y+20
	ldd R13,y+21
	ldd R10,y+26
	ldd R11,y+27
	.dbline -1
	.dbline 266
; 	return (0xFFFFFFFF); //目录本身有错误,返回0xFFFF
; }
; 
; 
; //############################################################################
; //读取文件内容每次512bytes,文件没有读完,返回0;否则为1
; unsigned char fat_read_file(unsigned long Cluster,		//文件起始簇号
; 				 			unsigned char *buff,		//文件内容缓冲区
; 				 			unsigned long BlockCount,	//扇区号
; 							unsigned char *blockserial) 
; //############################################################################
; {
	.dbline 270
; 	unsigned long Block;
; 	static unsigned char serial=0; 
; 	
; 	if(BlockCount == 0)
	ldd R2,y+22
	ldd R3,y+23
	ldd R4,y+24
	ldd R5,y+25
	ldi R16,0
	cp R2,R16
	cpc R3,R16
	cpc R4,R16
	cpc R5,R16
	breq X63
	xjmp L60
X63:
X58:
	.dbline 271
; 	{
	.dbline 272
; 		fat_load(Cluster,&Block,buff);
	std y+3,R13
	std y+2,R12
	movw R24,R28
	adiw R24,4
	std y+1,R25
	std y+0,R24
	ldd R16,y+16
	ldd R17,y+17
	ldd R18,y+18
	ldd R19,y+19
	xcall _fat_load
	.dbline 275
; 		//测试使用
; 		//DisplayLong(Block,1);
; 		MMC_SD_ReadSingleBlock((Cluster-2)*SecPerClus+data_offset+serial,buff);
	std y+1,R13
	std y+0,R12
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R16,y+16
	ldd R17,y+17
	ldd R18,y+18
	ldd R19,y+19
	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
	lds R6,L59
	clr R7
	clr R8
	clr R9
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R16,R2
	movw R18,R4
	xcall _MMC_SD_ReadSingleBlock
	.dbline 276
; 		serial++;
	lds R24,L59
	subi R24,255    ; addi 1
	sts L59,R24
	.dbline 277
; 		blocknow = Cluster;
	ldd R2,y+16
	ldd R3,y+17
	ldd R4,y+18
	ldd R5,y+19
	sts _blocknow+1,R3
	sts _blocknow,R2
	sts _blocknow+2+1,R5
	sts _blocknow+2,R4
	.dbline 278
; 		*blockserial = SecPerClus-serial;
	lds R3,_SecPerClus
	sub R3,R24
	movw R30,R10
	std z+0,R3
	.dbline 279
; 		if(serial == SecPerClus)
	lds R2,_SecPerClus
	lds R3,L59
	cp R3,R2
	breq X64
	xjmp L61
X64:
X59:
	.dbline 280
; 			serial = 0;
	clr R2
	sts L59,R2
	.dbline 281
; 	}
	xjmp L61
L60:
	.dbline 283
; 	else
; 	{
	.dbline 284
; 		fat_load(blocknow,&Block,buff);
	std y+3,R13
	std y+2,R12
	movw R24,R28
	adiw R24,4
	std y+1,R25
	std y+0,R24
	lds R18,_blocknow+2
	lds R19,_blocknow+2+1
	lds R16,_blocknow
	lds R17,_blocknow+1
	xcall _fat_load
	.dbline 285
; 		MMC_SD_ReadSingleBlock((blocknow-2)*SecPerClus+data_offset+serial,buff);
	std y+1,R13
	std y+0,R12
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	lds R18,_blocknow+2
	lds R19,_blocknow+2+1
	lds R16,_blocknow
	lds R17,_blocknow+1
	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
	lds R6,L59
	clr R7
	clr R8
	clr R9
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R16,R2
	movw R18,R4
	xcall _MMC_SD_ReadSingleBlock
	.dbline 286
; 		serial++;
	lds R24,L59
	subi R24,255    ; addi 1
	sts L59,R24
	.dbline 287
; 		*blockserial = SecPerClus-serial;
	lds R3,_SecPerClus
	sub R3,R24
	movw R30,R10
	std z+0,R3
	.dbline 288
; 		if(serial == SecPerClus)
	lds R2,_SecPerClus
	lds R3,L59
	cp R3,R2
	brne L64
X60:
	.dbline 289
; 			serial = 0;
	clr R2
	sts L59,R2
L64:
	.dbline 290
; 	}
L61:
	.dbline 291
; 	if(serial == 0)
	lds R2,L59
	tst R2
	brne L66
X61:
	.dbline 292
; 		blocknow = Block;
	ldd R2,y+4
	ldd R3,y+5
	ldd R4,y+6
	ldd R5,y+7
	sts _blocknow+1,R3
	sts _blocknow,R2
	sts _blocknow+2+1,R5
	sts _blocknow+2,R4
L66:
	.dbline 293
; 	if(blocknow == 0xFFFFFFFF)
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,255
	lds R4,_blocknow+2
	lds R5,_blocknow+2+1
	lds R2,_blocknow
	lds R3,_blocknow+1
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L68
X62:
	.dbline 294
; 		return 1;
	ldi R16,1
	xjmp L58
L68:
	.dbline 296
; 	else
; 		return 0;
	clr R16
	.dbline -2
L58:
	.dbline 0 ; func end
	adiw R28,8
	xcall pop_xgsetF03C
	adiw R28,4
	ret
	.dbsym l Block 4 l
	.dbsym r blockserial 10 pc
	.dbsym l BlockCount 22 l
	.dbsym r buff 12 pc
	.dbsym l Cluster 16 l
	.dbend
	.dbfunc e strscmp _strscmp fc
;           dist -> R18,R19
;            src -> R16,R17
	.even
_strscmp::
	.dbline -1
	.dbline 301
; 
; }
; 
; unsigned char strscmp(unsigned char *src,unsigned char *dist)
; {
	xjmp L72
L71:
	.dbline 303
; 	while(*src)
; 	{
	.dbline 304
; 		if((*src) != (*dist))
	movw R30,R18
	ldd R2,z+0
	movw R30,R16
	ldd R3,z+0
	cp R3,R2
	breq L74
X65:
	.dbline 305
; 		{
	.dbline 306
; 			if((*src) > (*dist))
	movw R30,R18
	ldd R2,z+0
	clr R3
	movw R30,R16
	ldd R4,z+0
	clr R5
	cp R2,R4
	cpc R3,R5
	brge L76
X66:
	.dbline 307
; 				return 1;
	ldi R16,1
	xjmp L70
L76:
	.dbline 309
; 			else
; 				return 2;
	ldi R16,2
	xjmp L70
L74:
	.dbline 311
; 		}
; 		src++;
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 312
; 		dist++;
	subi R18,255  ; offset = 1
	sbci R19,255
	.dbline 313
; 	}
L72:
	.dbline 302
	movw R30,R16
	ldd R2,z+0
	tst R2
	brne L71
X67:
	.dbline 314
; 	return 0;
	clr R16
	.dbline -2
L70:
	.dbline 0 ; func end
	ret
	.dbsym r dist 18 pc
	.dbsym r src 16 pc
	.dbend
	.dbfunc e fat_search_file _fat_search_file fc
; Dir_Cluster_Store -> R14,R15
;              a -> R20
;           buff -> R12,R13
;     Dir_Attrib -> y+20
;           Size -> y+18
;        Cluster -> R10,R11
;      File_Name -> R22,R23
	.even
_fat_search_file::
	xcall push_xgsetF0FC
	movw R10,R18
	movw R22,R16
	sbiw R28,8
	ldd R12,y+22
	ldd R13,y+23
	.dbline -1
	.dbline 325
; }
; 
; //####################################################################################
; //Sucht ein File im Directory
; unsigned char fat_search_file (unsigned char *File_Name,		//要查找的文件名
; 							unsigned long *Cluster, 	//要查找的文件所在簇
; 							unsigned long *Size, 		//查到的文件大小
; 							unsigned char *Dir_Attrib,//查到的文件属性
; 							unsigned char *buff) 	//查到的文件名称
; //####################################################################################
; {
	.dbline 326
; 	unsigned int Dir_Cluster_Store = *Cluster;
	movw R30,R10
	ldd R14,z+0
	ldd R15,z+1
	.dbline 328
; 	unsigned char a;
; 	for (a = 0;a < 100;a++)
	clr R20
	xjmp L82
L79:
	.dbline 329
; 	{
	.dbline 330
; 		*Cluster = fat_read_dir_ent(Dir_Cluster_Store,a,Size,Dir_Attrib,buff);
	std y+7,R13
	std y+6,R12
	ldd R0,y+20
	ldd R1,y+21
	std y+5,R1
	std y+4,R0
	ldd R0,y+18
	ldd R1,y+19
	std y+3,R1
	std y+2,R0
	mov R2,R20
	clr R3
	std y+1,R3
	std y+0,R2
	movw R16,R14
	movw R18,R16
	clr R18
	clr R19
	xcall _fat_read_dir_ent
	movw R30,R10
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 331
; 		if (*Cluster == 0xffff)
	ldi R24,255
	ldi R25,255
	ldi R26,0
	ldi R27,0
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	brne L83
X68:
	.dbline 332
; 		{
	.dbline 333
; 			return(0); //File not Found
	clr R16
	xjmp L78
L83:
	.dbline 335
; 		}
; 		if(strscmp(File_Name,buff) == 0)
	movw R18,R12
	movw R16,R22
	xcall _strscmp
	tst R16
	brne L85
X69:
	.dbline 336
; 		{
	.dbline 337
; 			return(1); //File Found
	ldi R16,1
	xjmp L78
L85:
	.dbline 339
; 		}
; 	}
L80:
	.dbline 328
	inc R20
L82:
	.dbline 328
	cpi R20,100
	brsh X71
	xjmp L79
X71:
X70:
	.dbline 340
; 	return(2); //Error
	ldi R16,2
	.dbline -2
L78:
	.dbline 0 ; func end
	adiw R28,8
	xjmp pop_xgsetF0FC
	.dbsym r Dir_Cluster_Store 14 i
	.dbsym r a 20 c
	.dbsym r buff 12 pc
	.dbsym l Dir_Attrib 20 pc
	.dbsym l Size 18 pl
	.dbsym r Cluster 10 pl
	.dbsym r File_Name 22 pc
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
_old_pos_blk::
	.blkb 4
	.dbsym e old_pos_blk _old_pos_blk l
_FirstRootDirSecNum::
	.blkb 4
	.dbsym e FirstRootDirSecNum _FirstRootDirSecNum l
_pointer_FDT::
	.blkb 2
	.dbsym e pointer_FDT _pointer_FDT pc
_SecPerClus::
	.blkb 1
	.dbsym e SecPerClus _SecPerClus c
_blocknow::
	.blkb 4
	.dbsym e blocknow _blocknow l
_FatFlags::
	.blkb 1
	.dbsym e FatFlags _FatFlags c
_data_offset::
	.blkb 4
	.dbsym e data_offset _data_offset l
_fat_offset::
	.blkb 4
	.dbsym e fat_offset _fat_offset l
_BlockSize::
	.blkb 2
	.dbsym e BlockSize _BlockSize i
; }

⌨️ 快捷键说明

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