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

📄 fat.s

📁 /*** *** *** *** *** *** *** *** *** *** / /* MP3 Code for M32L */ /* By pasyong
💻 S
📖 第 1 页 / 共 3 页
字号:
	xjmp L20
L31:
	.dbline 122
; 		case PART_TYPE_FAT32:
; 				LCD_write_english_string(0,0,"FAT32");
	ldi R24,<L32
	ldi R25,>L32
	std y+1,R25
	std y+0,R24
	clr R18
	clr R16
	xcall _LCD_write_english_string
	.dbline 123
; 				break;
	xjmp L20
L19:
	.dbline 125
; 		default:
; 				LCD_write_english_string(0,0,"No Partition!");
	ldi R24,<L33
	ldi R25,>L33
	std y+1,R25
	std y+0,R24
	clr R18
	clr R16
	xcall _LCD_write_english_string
	.dbline 126
; 				break;
L20:
	.dbline 129
; 	}
; //显示磁盘容量
;   data=PartInfo.prSize>>11;
	ldi R24,11
	ldi R25,0
	lds R4,_PartInfo+12+2
	lds R5,_PartInfo+12+2+1
	lds R2,_PartInfo+12
	lds R3,_PartInfo+12+1
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R10,R16
	.dbline 130
;     LCD_set_XY(56,0);
	clr R18
	ldi R16,56
	xcall _LCD_set_XY
	.dbline 131
;     t1=data/100;
	ldi R18,100
	ldi R19,0
	movw R16,R10
	xcall div16u
	.dbline 132
; 	LCD_write_char(t1+48);
	subi R16,208    ; addi 48
	xcall _LCD_write_char
	.dbline 133
; 	data=data%100;
	ldi R18,100
	ldi R19,0
	movw R16,R10
	xcall mod16u
	movw R10,R16
	.dbline 134
; 	t1=data/10;
	ldi R18,10
	ldi R19,0
	xcall div16u
	mov R12,R16
	.dbline 135
; 	LCD_write_char(t1+48);
	subi R16,208    ; addi 48
	xcall _LCD_write_char
	.dbline 136
; 	t2=data%10;
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall mod16u
	mov R10,R16
	.dbline 137
; 	LCD_write_char(t2+48);
	subi R16,208    ; addi 48
	xcall _LCD_write_char
	.dbline 138
; 	LCD_write_english_string(76,0,"M");
	ldi R24,<L36
	ldi R25,>L36
	std y+1,R25
	std y+0,R24
	clr R18
	ldi R16,76
	xcall _LCD_write_english_string
	.dbline 140
;   //LCD_write_english_string(0,1,"RATE");
; 	return 0;	
	clr R16
	.dbline -2
L4:
	adiw R28,2
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r t2 10 c
	.dbsym r t1 12 c
	.dbsym r data 10 i
	.dbsym r bpb 10 pS[bpb710]
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
_baseentry::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
	.dbsym e baseentry _baseentry i
_entrycount::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
	.dbsym e entrycount _entrycount i
	.area text(rom, con, rel)
	.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
	.dbfunc e fatGetDirEntry _fatGetDirEntry fl
	.dbstruct 0 32 winentry
	.dbfield 0 weCnt c
	.dbfield 1 wePart1 A[10:10]c
	.dbfield 11 weAttributes c
	.dbfield 12 weReserved1 c
	.dbfield 13 weChksum c
	.dbfield 14 wePart2 A[12:12]c
	.dbfield 26 weReserved2 i
	.dbfield 28 wePart3 A[4:4]c
	.dbend
	.dbstruct 0 32 direntry
	.dbfield 0 deName A[8:8]c
	.dbfield 8 deExtension A[3:3]c
	.dbfield 11 deAttributes c
	.dbfield 12 deLowerCase c
	.dbfield 13 deCHundredth c
	.dbfield 14 deCTime A[2:2]c
	.dbfield 16 deCDate A[2:2]c
	.dbfield 18 deADate A[2:2]c
	.dbfield 20 deHighClust i
	.dbfield 22 deMTime A[2:2]c
	.dbfield 24 deMDate A[2:2]c
	.dbfield 26 deStartCluster i
	.dbfield 28 deFileSize l
	.dbend
;           rval -> y+10
;          save2 -> R10,R11
;           save -> y+6
;              b -> y+22
;         sector -> y+2
;      hasBuffer -> y+20
;          index -> y+18
;             de -> y+16
;              p -> R12,R13
;             we -> y+14
;              i -> R14,R15
;          entry -> y+34
	.even
_fatGetDirEntry::
	st -y,r17
	st -y,r16
	xcall push_gset5
	sbiw R28,24
	.dbline -1
	.dbline 151
; }
; 
; /*-----------------------------------------------------------------------
; 查询一个文件的开始簇
; -----------------------------------------------------------------------*/
; unsigned int baseentry = 0;
; unsigned int entrycount = 0;
; 
; 
; unsigned long fatGetDirEntry(unsigned int entry)
; {
	.dbline 153
; 	unsigned long sector;
; 	struct direntry *de = 0;	// 防止compiler warning
	clr R0
	clr R1
	std y+17,R1
	std y+16,R0
	.dbline 160
; 	struct winentry *we;
; 	unsigned int hasBuffer;
; 	unsigned int b;
; 	int i,index;
; 	char *p;
; 	
; 	entrycount = 0;
	clr R2
	clr R3
	sts _entrycount+1,R3
	sts _entrycount,R2
	.dbline 161
; 	DirNameBuffer = 0;
	sts _DirNameBuffer+1,R3
	sts _DirNameBuffer,R2
	.dbline 165
; 	
; 	
; 	// 读取目录区数据
; 	sector = fatClustToSect(FirstDirSector);
	lds R18,_FirstDirSector+2
	lds R19,_FirstDirSector+2+1
	lds R16,_FirstDirSector
	lds R17,_FirstDirSector+1
	xcall _fatClustToSect
	movw R30,R28
	std z+2,R16
	std z+3,R17
	std z+4,R18
	std z+5,R19
	.dbline 167
; 
; 	hasBuffer = 0;
	clr R0
	clr R1
	std y+21,R1
	std y+20,R0
	.dbline 169
; 
; 	index = 16;	
	ldi R24,16
	ldi R25,0
	std y+19,R25
	std y+18,R24
L38:
	.dbline 171
; 	do 
; 	{
	.dbline 172
; 		if(index == 16)	// 是否该一人一扇区time for next sector ?
	ldd R24,y+18
	ldd R25,y+19
	cpi R24,16
	ldi R30,0
	cpc R25,R30
	breq X6
	xjmp L41
X6:
	.dbline 173
; 		{
	.dbline 174
; 			ReadBlock(sector++);
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
	movw R30,R28
	ldd R16,z+6
	ldd R17,z+7
	ldd R18,z+8
	ldd R19,z+9
	xcall _ReadBlock
	.dbline 175
; 			de = (struct direntry *)BUFFER;
	ldi R24,<_BUFFER
	ldi R25,>_BUFFER
	std y+17,R25
	std y+16,R24
	.dbline 176
; 			index = 0;
	clr R0
	clr R1
	std y+19,R1
	std y+18,R0
	.dbline 177
; 		}	
L41:
	.dbline 179
; 	
; 		if(*de->deName != 0xE5)
	ldd R30,y+16
	ldd R31,y+17
	ldd R24,z+0
	cpi R24,229
	brne X7
	xjmp L43
X7:
	.dbline 180
; 		{
	.dbline 182
; 			// 如果if not a deleted entry
; 			if(de->deAttributes == ATTR_LONG_FILENAME)
	ldd R24,z+11
	cpi R24,15
	breq X8
	xjmp L45
X8:
	.dbline 183
; 			{
	.dbline 185
; 				// we have a long name entry
; 				we = (struct winentry *) de;
	ldd R0,y+16
	ldd R1,y+17
	std y+15,R1
	std y+14,R0
	.dbline 186
; 				b = 13 *( (we->weCnt-1) & 0x0f);				// index into string
	movw R30,R0
	ldd R24,z+0
	subi R24,1
	andi R24,15
	ldi R25,13
	mul R25,R24
	std y+23,R1
	std y+22,R0
	.dbline 187
; 				p = &LongNameBuffer[b];
	lds R2,_LongNameBuffer
	lds R3,_LongNameBuffer+1
	movw R12,R0
	add R12,R2
	adc R13,R3
	.dbline 188
	clr R14
	clr R15
L47:
	.dbline 188
	ldi R16,2
	ldi R17,0
	movw R18,R14
	xcall empy16s
	movw R30,R16
	ldd R24,y+14
	ldd R25,y+15
	adiw R24,1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R30,R12
	st Z+,R2
	movw R12,R30
L48:
	.dbline 188
; 				for (i=0;i<5;i++)	*p++ = we->wePart1[i*2];	// copy first part			
	movw R24,R14
	adiw R24,1
	movw R14,R24
	.dbline 188
	cpi R24,5
	ldi R30,0
	cpc R25,R30
	brlt L47
	.dbline 189
	clr R14
	clr R15
L51:
	.dbline 189
	ldi R16,2
	ldi R17,0
	movw R18,R14
	xcall empy16s
	movw R30,R16
	ldd R24,y+14
	ldd R25,y+15
	adiw R24,14
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R30,R12
	st Z+,R2
	movw R12,R30
L52:
	.dbline 189
; 				for (i=0;i<6;i++)	*p++ = we->wePart2[i*2];	// second part
	movw R24,R14
	adiw R24,1
	movw R14,R24
	.dbline 189
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	brlt L51
	.dbline 190
	clr R14
	clr R15
L55:
	.dbline 190
	ldi R16,2
	ldi R17,0
	movw R18,R14
	xcall empy16s
	movw R30,R16
	ldd R24,y+14
	ldd R25,y+15
	adiw R24,28
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R30,R12
	st Z+,R2
	movw R12,R30
L56:
	.dbline 190
; 				for (i=0;i<2;i++)	*p++ = we->wePart3[i*2];	// and third part
	movw R24,R14
	adiw R24,1
	movw R14,R24
	.dbline 190
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brlt L55
	.dbline 191
; 				if (we->weCnt & 0x40) *p = 0;					// in case dirnamelength is multiple of 13
	ldd R30,y+14
	ldd R31,y+15
	ldd R2,z+0
	sbrs R2,6
	rjmp L59
	.dbline 191
	clr R2
	movw R30,R12
	std z+0,R2
L59:
	.dbline 192
; 				if ((we->weCnt & 0x0f) == 1) hasBuffer = 1;		// mark that we have a long entry
	ldd R30,y+14
	ldd R31,y+15
	ldd R24,z+0
	andi R24,15
	cpi R24,1
	breq X9
	xjmp L46
X9:
	.dbline 192
	ldi R24,1
	ldi R25,0
	std y+21,R25
	std y+20,R24
	.dbline 193
; 			}
	xjmp L46
L45:
	.dbline 195
; 			else
; 			{
	.dbline 198
; 				// we have a short name entry
; 				// check if this is the end of a multi-part long name entry
; 				if(hasBuffer)
	ldd R0,y+20
	ldd R1,y+21
	tst R0
	brne X4
	tst R1
	brne X10
	xjmp L63
X10:
X4:
	.dbline 199
; 				{
	.dbline 202
; 					// a long entry name has been collected
; 					// is it a directory ?
; 					if(de->deAttributes == ATTR_DIRECTORY)
	ldd R30,y+16
	ldd R31,y+17
	ldd R24,z+11
	cpi R24,16
	breq X11
	xjmp L65
X11:
	.dbline 203
; 					{
	.dbline 204
; 						unsigned long save = FirstDirSector;
	lds R4,_FirstDirSector+2
	lds R5,_FirstDirSector+2+1
	lds R2,_FirstDirSector
	lds R3,_FirstDirSector+1
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
	.dbline 205
; 						unsigned int save2 = baseentry;
	lds R10,_baseentry
	lds R11,_baseentry+1
	.dbline 208
; 						unsigned long rval;
; 						
; 						strcpy(DirNameBuffer,LongNameBuffer);
	lds R18,_LongNameBuffer
	lds R19,_LongNameBuffer+1
	lds R16,_DirNameBuffer
	lds R17,_DirNameBuffer+1
	xcall _strcpy
	.dbline 209
; 						strcat(DirNameBuffer,"/");
	ldi R18,<L67
	ldi R19,>L67
	lds R16,_DirNameBuffer
	lds R17,_DirNameBuffer+1
	xcall _strcat
	.dbline 214
; 
; //						rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
; 
; 						// call recursively
; 						FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
	ldd R30,y+16
	ldd R31,y+17
	ldd R2,z+26
	ldd R3,z+27
	clr R4
	clr R5
	ldd R30,y+16
	ldd R31,y+17
	ldd R6,z+20
	ldd R7,z+21
	clr R8
	clr R9
	movw R8,R6
	clr R6
	clr R7
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	sts _FirstDirSector+1,R7
	sts _FirstDirSector,R6
	sts _FirstDirSector+2+1,R9
	sts _FirstDirSector+2,R8
	.dbline 215
; 						rval = fatGetDirEntry(entry);
	ldd R16,y+34
	ldd R17,y+35
	xcall _fatGetDirEntry
	movw R30,R28
	std z+10,R16
	std z+11,R17
	std z+12,R18
	std z+13,R19
	.dbline 216

⌨️ 快捷键说明

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