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

📄 fat.s

📁 这个是通过51做的SD卡读写和MP3的程序!
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module fat.c
	.area data(ram, con, rel)
_LongNameBuffer::
	.blkw 1
	.area idata
	.word _LONGNAME_BUFFER_ADDR
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
	.dbsym e LongNameBuffer _LongNameBuffer pc
_DirNameBuffer::
	.blkw 1
	.area idata
	.word _DIRNAME_BUFFER_ADDR
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
	.dbsym e DirNameBuffer _DirNameBuffer pc
_FatInCache::
	.blkb 4
	.area idata
	.word 0,0
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
	.dbsym e FatInCache _FatInCache l
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
	.dbfunc e ReadBlock _ReadBlock fV
;           temp -> y+0
;            LBA -> y+4
	.even
_ReadBlock::
	xcall push_arg4
	sbiw R28,4
	.dbline -1
	.dbline 33
; /************************************************************/
; /*		         FAT Code for   M32L					    */
; /*				   By   pasyong								*/
; /*				   2006-4									*/
; /*				   Base ICC6.31A					        */
; /************************************************************/
; #include <iom32v.h>
; #include <macros.h>
; #include <string.h>
; #include "sd.h"
; #include "fat.h"
; #include "3310.h"
; 
; extern uchar BUFFER[512];
; unsigned char  LONGNAME_BUFFER_ADDR[30];
; unsigned char  DIRNAME_BUFFER_ADDR[30];
; unsigned char *LongNameBuffer =		(unsigned char *) LONGNAME_BUFFER_ADDR;
; unsigned char *DirNameBuffer =		(unsigned char *) DIRNAME_BUFFER_ADDR;
; struct partrecord PartInfo;
; unsigned char Fat32Enabled;
; unsigned long FirstDataSector;
; unsigned int  BytesPerSector;
; unsigned int  SectorsPerCluster;
; unsigned long FirstFATSector;
; unsigned long FirstDirSector;
; unsigned long FileSize;
; unsigned long FatInCache = 0;
; 
; //********************************************************************************************
; //读一个扇区
; void ReadBlock(unsigned long LBA)
; //********************************************************************************************
; {   unsigned long temp;
	.dbline 34
;     temp=LBA<<9;
	ldi R24,9
	ldi R25,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R28
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 35
;     SD_Read_Block(temp);
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	xcall _SD_Read_Block
	.dbline -2
L1:
	adiw R28,8
	.dbline 0 ; func end
	ret
	.dbsym l temp 0 l
	.dbsym l LBA 4 l
	.dbend
	.dbfunc e fatClustToSect _fatClustToSect fl
;          clust -> y+4
	.even
_fatClustToSect::
	xcall push_arg4
	xcall push_gset2
	.dbline -1
	.dbline 41
; }
; /*-----------------------------------------------------------------------
;  查询数据区一个簇开始扇区号
; -----------------------------------------------------------------------*/
; unsigned long fatClustToSect(unsigned long clust)
; {
	.dbline 42
; 	return ((clust-2) * SectorsPerCluster) + FirstDataSector;
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	lds R6,_SectorsPerCluster
	lds R7,_SectorsPerCluster+1
	clr R8
	clr R9
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R2
	movw R18,R4
	xcall empy32u
	movw R2,R16
	movw R4,R18
	lds R8,_FirstDataSector+2
	lds R9,_FirstDataSector+2+1
	lds R6,_FirstDataSector
	lds R7,_FirstDataSector+1
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R16,R2
	movw R18,R4
	.dbline -2
L2:
	xcall pop_gset2
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l clust 4 l
	.dbend
	.dbfunc e fatClusterSize _fatClusterSize fi
	.even
_fatClusterSize::
	.dbline -1
	.dbline 48
; }
; /*-----------------------------------------------------------------------
;  查询一个簇所占扇区数
; -----------------------------------------------------------------------*/
; unsigned int fatClusterSize(void)
; {
	.dbline 50
; 	// return the number of sectors in a disk cluster
; 	return SectorsPerCluster;
	lds R16,_SectorsPerCluster
	lds R17,_SectorsPerCluster+1
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e fatInit _fatInit fc
	.dbstruct 0 41 bpb710
	.dbfield 0 bpbBytesPerSec i
	.dbfield 2 bpbSecPerClust c
	.dbfield 3 bpbResSectors i
	.dbfield 5 bpbFATs c
	.dbfield 6 bpbRootDirEnts i
	.dbfield 8 bpbSectors i
	.dbfield 10 bpbMedia c
	.dbfield 11 bpbFATsecs i
	.dbfield 13 bpbSecPerTrack i
	.dbfield 15 bpbHeads i
	.dbfield 17 bpbHiddenSecs l
	.dbfield 21 bpbHugeSectors l
	.dbfield 25 bpbBigFATsecs l
	.dbfield 29 bpbExtFlags i
	.dbfield 31 bpbFSVers i
	.dbfield 33 bpbRootClust l
	.dbfield 37 bpbFSInfo i
	.dbfield 39 bpbBackup i
	.dbend
;             t2 -> R10
;             t1 -> R12
;           data -> R10,R11
;            bpb -> R10,R11
	.even
_fatInit::
	xcall push_gset4
	sbiw R28,2
	.dbline -1
	.dbline 56
; }
; /*-----------------------------------------------------------------------
; 查询SD卡文件系统信息
; -----------------------------------------------------------------------*/
; unsigned char fatInit()
; {
	.dbline 61
;     unsigned int data;unsigned char t1,t2;
; 
; 	struct bpb710 *bpb;
; 	// 读MBR结构
; 	ReadBlock(0);  
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,0
	xcall _ReadBlock
	.dbline 63
; 	// 读取分区表信息
; 	PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
	ldi R24,<_BUFFER+446
	ldi R25,>_BUFFER+446
	ldi R30,<_PartInfo
	ldi R31,>_PartInfo
	ldi R16,16
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgnblk
	.dbline 66
; 	// 读引导扇区
; 	// 引导扇区号在PartInfo.prStartLBA中
; 	ReadBlock(PartInfo.prStartLBA);  //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
	lds R18,_PartInfo+8+2
	lds R19,_PartInfo+8+2+1
	lds R16,_PartInfo+8
	lds R17,_PartInfo+8+1
	xcall _ReadBlock
	.dbline 67
; 	bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
	ldi R24,<_BUFFER+11
	ldi R25,>_BUFFER+11
	movw R10,R24
	.dbline 69
; 
; 	FirstDataSector	= PartInfo.prStartLBA;
	lds R4,_PartInfo+8+2
	lds R5,_PartInfo+8+2+1
	lds R2,_PartInfo+8
	lds R3,_PartInfo+8+1
	sts _FirstDataSector+1,R3
	sts _FirstDataSector,R2
	sts _FirstDataSector+2+1,R5
	sts _FirstDataSector+2,R4
	.dbline 70
; 	if(bpb->bpbFATsecs)
	movw R30,R24
	ldd R2,z+11
	ldd R3,z+12
	tst R2
	brne X0
	tst R3
	breq L9
X0:
	.dbline 71
; 	{
	.dbline 73
; 		// bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
; 		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
	movw R30,R10
	ldd R18,z+11
	ldd R19,z+12
	movw R30,R10
	ldd R16,z+5
	clr R17
	xcall empy16s
	movw R30,R10
	ldd R2,z+3
	ldd R3,z+4
	add R2,R16
	adc R3,R17
	clr R4
	clr R5
	lds R8,_FirstDataSector+2
	lds R9,_FirstDataSector+2+1
	lds R6,_FirstDataSector
	lds R7,_FirstDataSector+1
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	sts _FirstDataSector+1,R7
	sts _FirstDataSector,R6
	sts _FirstDataSector+2+1,R9
	sts _FirstDataSector+2,R8
	.dbline 74
; 	}
	xjmp L10
L9:
	.dbline 76
; 	else
; 	{
	.dbline 78
; 		// bpbFATsecs是0,为FAT32,FAT表所占的扇区数在bpbBigFATsecs里
; 		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
	movw R30,R10
	ldd R2,z+25
	ldd R3,z+26
	ldd R4,z+27
	ldd R5,z+28
	movw R30,R10
	ldd R6,z+5
	clr R7
	clr R8
	clr R9
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32u
	movw R30,R10
	ldd R2,z+3
	ldd R3,z+4
	clr R4
	clr R5
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	lds R8,_FirstDataSector+2
	lds R9,_FirstDataSector+2+1
	lds R6,_FirstDataSector
	lds R7,_FirstDataSector+1
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	sts _FirstDataSector+1,R7
	sts _FirstDataSector,R6
	sts _FirstDataSector+2+1,R9
	sts _FirstDataSector+2,R8
	.dbline 79
; 	}
L10:
	.dbline 81
; 	
; 	SectorsPerCluster	= bpb->bpbSecPerClust;
	movw R30,R10
	ldd R2,z+2
	clr R3
	sts _SectorsPerCluster+1,R3
	sts _SectorsPerCluster,R2
	.dbline 82
; 	BytesPerSector		= bpb->bpbBytesPerSec;
	movw R30,R10
	ldd R2,z+0
	ldd R3,z+1
	sts _BytesPerSector+1,R3
	sts _BytesPerSector,R2
	.dbline 83
; 	FirstFATSector		= bpb->bpbResSectors + PartInfo.prStartLBA;
	lds R4,_PartInfo+8+2
	lds R5,_PartInfo+8+2+1
	lds R2,_PartInfo+8
	lds R3,_PartInfo+8+1
	ldd R6,z+3
	ldd R7,z+4
	clr R8
	clr R9
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	sts _FirstFATSector+1,R7
	sts _FirstFATSector,R6
	sts _FirstFATSector+2+1,R9
	sts _FirstFATSector+2,R8
	.dbline 85
; //查询SD卡文件系统分区类型
; 	switch (PartInfo.prPartType)
	lds R12,_PartInfo+4
	clr R13
	movw R24,R12
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	breq L16
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	breq L16
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brlt L13
L18:
	movw R24,R12
	cpi R24,11
	ldi R30,0
	cpc R25,R30
	breq L17
	cpi R24,12
	ldi R30,0
	cpc R25,R30
	breq L17
	cpi R24,14
	ldi R30,0
	cpc R25,R30
	breq L16
	xjmp L13
X1:
	.dbline 86
; 	{
L16:
	.dbline 91
; 		case PART_TYPE_DOSFAT16:
; 		case PART_TYPE_FAT16: 
; 		case PART_TYPE_FAT16LBA:
; 			// 第一个目录扇区号为2
; 			FirstDirSector	= CLUST_FIRST;
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sts _FirstDirSector+1,R21
	sts _FirstDirSector,R20
	sts _FirstDirSector+2+1,R23
	sts _FirstDirSector+2,R22
	.dbline 93
; 			//FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
; 			Fat32Enabled = 0;
	clr R2
	sts _Fat32Enabled,R2
	.dbline 95
; 			
; 			break;
	xjmp L13
L17:
	.dbline 99
; 		case PART_TYPE_FAT32LBA:
; 		case PART_TYPE_FAT32:
; 			
; 			FirstDirSector = bpb->bpbRootClust;
	movw R30,R10
	ldd R2,z+33
	ldd R3,z+34
	ldd R4,z+35
	ldd R5,z+36
	sts _FirstDirSector+1,R3
	sts _FirstDirSector,R2
	sts _FirstDirSector+2+1,R5
	sts _FirstDirSector+2,R4
	.dbline 100
; 			Fat32Enabled = 1;
	ldi R24,1
	sts _Fat32Enabled,R24
	.dbline 101
; 			break;
	.dbline 102
; 		default:break;
L13:
	.dbline 106
; 			//return 1;
; 	}
; //查询SD卡文件系统信息
; 	switch (PartInfo.prPartType)
	lds R10,_PartInfo+4
	clr R11
	movw R24,R10
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	breq L23
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	breq L25
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brge X3
	xjmp L19
X3:
L34:
	movw R24,R10
	cpi R24,11
	ldi R30,0
	cpc R25,R30
	breq L31
	cpi R24,12
	ldi R30,0
	cpc R25,R30
	breq L29
	cpi R24,14
	ldi R30,0
	cpc R25,R30
	breq L27
	xjmp L19
X2:
	.dbline 107
; 	{
L23:
	.dbline 109
; 		case PART_TYPE_DOSFAT16:
; 				LCD_write_english_string(0,0,"DOSFAT 16");
	ldi R24,<L24
	ldi R25,>L24
	std y+1,R25
	std y+0,R24
	clr R18
	clr R16
	xcall _LCD_write_english_string
	.dbline 110
; 				break;
	xjmp L20
L25:
	.dbline 112
; 		case PART_TYPE_FAT16:
; 				LCD_write_english_string(0,0,"FAT16 ");
	ldi R24,<L26
	ldi R25,>L26
	std y+1,R25
	std y+0,R24
	clr R18
	clr R16
	xcall _LCD_write_english_string
	.dbline 113
; 				break;
	xjmp L20
L27:
	.dbline 115
; 		case PART_TYPE_FAT16LBA:
; 				LCD_write_english_string(0,0,"FAT16 LBA");
	ldi R24,<L28
	ldi R25,>L28
	std y+1,R25
	std y+0,R24
	clr R18
	clr R16
	xcall _LCD_write_english_string
	.dbline 116
; 				break;
	xjmp L20
L29:
	.dbline 118
; 		case PART_TYPE_FAT32LBA:
; 				LCD_write_english_string(0,0,"FAT32 LBA");
	ldi R24,<L30
	ldi R25,>L30
	std y+1,R25
	std y+0,R24
	clr R18
	clr R16
	xcall _LCD_write_english_string
	.dbline 119
; 				break;
	xjmp L20
L31:
	.dbline 121

⌨️ 快捷键说明

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