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

📄 fat16.lst

📁 实现了avr下对sd卡的读写,支持文件存取,删除的功能
💻 LST
📖 第 1 页 / 共 2 页
字号:
  47:FAT16.c       **** //-------------------------------------------------------------------------
  48:FAT16.c       **** uint8_t IsEqual(uint8_t *pa,uint8_t *pb,uint8_t size){	//内存比较
 281               	.LM19:
 282               	/* prologue: frame size=0 */
 283               	/* prologue end (size=0) */
 284 00b6 DC01      		movw r26,r24
 285 00b8 FB01      		movw r30,r22
 286               	.L23:
  49:FAT16.c       **** 	for(;size;size--)if(*pa++!=*pb++)return 0;
 288               	.LM20:
 289 00ba 4423      		tst r20
 290 00bc 49F0      		breq .L22
 291 00be 9191      		ld r25,Z+
 292 00c0 8D91      		ld r24,X+
 293 00c2 8917      		cp r24,r25
 294 00c4 19F0      		breq .L18
 295 00c6 80E0      		ldi r24,lo8(0)
 296 00c8 90E0      		ldi r25,hi8(0)
 297 00ca 0895      		ret
 298               	.L18:
 299 00cc 4150      		subi r20,lo8(-(-1))
 300 00ce F5CF      		rjmp .L23
 301               	.L22:
  50:FAT16.c       **** 	return 1;
 303               	.LM21:
 304 00d0 81E0      		ldi r24,lo8(1)
 305 00d2 90E0      		ldi r25,hi8(1)
  51:FAT16.c       **** }
 307               	.LM22:
 308 00d4 0895      		ret
 309               	/* epilogue: frame size=0 */
 310               	/* epilogue: noreturn */
 311               	/* epilogue end (size=0) */
 312               	/* function IsEqual size 16 (16) */
 314               	.Lscope5:
 318               	.global	EmptyBytes
 320               	EmptyBytes:
  52:FAT16.c       **** //-------------------------------------------------------------------------
  53:FAT16.c       **** void EmptyBytes(uint8_t *pd,uint16_t size){			//内存清空,因为单片机资源很紧张的,一个512的缓冲区要反
 322               	.LM23:
 323               	/* prologue: frame size=0 */
 324               	/* prologue end (size=0) */
 325 00d6 FC01      		movw r30,r24
 326               	.L31:
  54:FAT16.c       **** 	for(;size;size--)*pd++ =0;
 328               	.LM24:
 329 00d8 6115      		cp r22,__zero_reg__
 330 00da 7105      		cpc r23,__zero_reg__
 331 00dc 21F0      		breq .L30
 332 00de 1192      		st Z+,__zero_reg__
 333 00e0 6150      		subi r22,lo8(-(-1))
 334 00e2 7040      		sbci r23,hi8(-(-1))
 335 00e4 F9CF      		rjmp .L31
 336               	.L30:
 337 00e6 0895      		ret
 338               	/* epilogue: frame size=0 */
 339               	/* epilogue: noreturn */
 340               	/* epilogue end (size=0) */
 341               	/* function EmptyBytes size 9 (9) */
 343               	.Lscope6:
 345               	.global	ReadMBR
 347               	ReadMBR:
  55:FAT16.c       **** }
  56:FAT16.c       **** //-------------------------------------------------------------------------
  57:FAT16.c       **** uint8_t ReadMBR(void){									//读取MBR数据结构
 349               	.LM25:
 350               	/* prologue: frame size=0 */
 351               	/* prologue end (size=0) */
  58:FAT16.c       **** 	uint8_t ok;
  59:FAT16.c       **** 	FAT_MBR * MBR=(FAT_MBR*)BUFFER;
  60:FAT16.c       **** 	ok=ReadBlock(MBR_Sector);//已经把值存到buffer里了
 353               	.LM26:
 354 00e8 60E0      		ldi r22,lo8(0)
 355 00ea 70E0      		ldi r23,hi8(0)
 356 00ec 80E0      		ldi r24,hlo8(0)
 357 00ee 90E0      		ldi r25,hhi8(0)
 358 00f0 0E94 0000 		call ReadBlock
  61:FAT16.c       **** 	if(ok==SD_FAIL)return SD_FAIL;
 360               	.LM27:
 361 00f4 8130      		cpi r24,lo8(1)
 362 00f6 39F0      		breq .L35
  62:FAT16.c       **** 	if(MBR->MBR_Signature!=0xAA55)return SD_FAIL;		//读有效标志,55AA????(网上资料所给)
 364               	.LM28:
 365 00f8 8091 0000 		lds r24,BUFFER+510
 366 00fc 9091 0000 		lds r25,(BUFFER+510)+1
 367 0100 8555      		subi r24,lo8(-21931)
 368 0102 9A4A      		sbci r25,hi8(-21931)
 369 0104 19F0      		breq .L34
 370               	.L35:
 371 0106 81E0      		ldi r24,lo8(1)
 372 0108 90E0      		ldi r25,hi8(1)
 373 010a 0895      		ret
 374               	.L34:
  63:FAT16.c       **** 		
  64:FAT16.c       **** 	//获取参数
  65:FAT16.c       **** 	PB_RelativeSector=MBR->MBR_pb[0].PB_RelativeSector;//读逻辑地址与绝对地址的偏移
 376               	.LM29:
 377 010c 8091 0000 		lds r24,BUFFER+454
 378 0110 8093 0000 		sts PB_RelativeSector,r24
  66:FAT16.c       **** 	return SD_SUCC;
 380               	.LM30:
 381 0114 80E0      		ldi r24,lo8(0)
 382 0116 90E0      		ldi r25,hi8(0)
  67:FAT16.c       **** }
 384               	.LM31:
 385 0118 0895      		ret
 386               	/* epilogue: frame size=0 */
 387               	/* epilogue: noreturn */
 388               	/* epilogue end (size=0) */
 389               	/* function ReadMBR size 26 (26) */
 391               	.Lscope7:
 393               	.global	ReadBPB
 395               	ReadBPB:
  68:FAT16.c       **** //-------------------------------------------------------------------------
  69:FAT16.c       **** uint8_t ReadBPB(void){									//读取BPB数据结构,共4字节
 397               	.LM32:
 398               	/* prologue: frame size=0 */
 399               	/* prologue end (size=0) */
  70:FAT16.c       **** 	uint8_t ok;
  71:FAT16.c       **** 	FAT_BPB * BPB=(FAT_BPB*)BUFFER;
  72:FAT16.c       **** 	ok=ReadFatBlock(FAT_Sector);
 401               	.LM33:
 402 011a 60E0      		ldi r22,lo8(0)
 403 011c 70E0      		ldi r23,hi8(0)
 404 011e 80E0      		ldi r24,hlo8(0)
 405 0120 90E0      		ldi r25,hhi8(0)
 406 0122 0E94 0000 		call ReadFatBlock
  73:FAT16.c       **** 	if(ok==SD_FAIL)return SD_FAIL;
 408               	.LM34:
 409 0126 8130      		cpi r24,lo8(1)
 410 0128 19F4      		brne .L37
 412               	.LM35:
 413 012a 81E0      		ldi r24,lo8(1)
 414 012c 90E0      		ldi r25,hi8(1)
 415 012e 0895      		ret
 416               	.L37:
  74:FAT16.c       **** 	
  75:FAT16.c       **** 	//获取参数,从512的结构体中获取信息
  76:FAT16.c       **** 	BPB_BytesPerSec = BPB->BPB_BytesPerSec;//每扇区的字节数,一般为512
 418               	.LM36:
 419 0130 8091 0000 		lds r24,BUFFER+11
 420 0134 9091 0000 		lds r25,(BUFFER+11)+1
 421 0138 9093 0000 		sts (BPB_BytesPerSec)+1,r25
 422 013c 8093 0000 		sts BPB_BytesPerSec,r24
  77:FAT16.c       **** 	BPB_SecPerClus = BPB->BPB_SecPerClus;//每簇扇区数,一般为8
 424               	.LM37:
 425 0140 8091 0000 		lds r24,BUFFER+13
 426 0144 8093 0000 		sts BPB_SecPerClus,r24
  78:FAT16.c       **** 	BPB_RsvdSecCnt = BPB->BPB_RsvdSecCnt;//保留扇区数,一般为2
 428               	.LM38:
 429 0148 8091 0000 		lds r24,BUFFER+14
 430 014c 9091 0000 		lds r25,(BUFFER+14)+1
 431 0150 9093 0000 		sts (BPB_RsvdSecCnt)+1,r25
 432 0154 8093 0000 		sts BPB_RsvdSecCnt,r24
  79:FAT16.c       **** 	BPB_NumFATs = BPB->BPB_NumFATs;//FAT 表数目,一般为2
 434               	.LM39:
 435 0158 8091 0000 		lds r24,BUFFER+16
 436 015c 8093 0000 		sts BPB_NumFATs,r24
  80:FAT16.c       **** 	BPB_RootEntCnt = BPB->BPB_RootEntCnt;//根目录区的目录项数,来计算根目录的扇区数
 438               	.LM40:
 439 0160 8091 0000 		lds r24,BUFFER+17
 440 0164 9091 0000 		lds r25,(BUFFER+17)+1
 441 0168 9093 0000 		sts (BPB_RootEntCnt)+1,r25
 442 016c 8093 0000 		sts BPB_RootEntCnt,r24
  81:FAT16.c       **** 	BPB_TotSec16 = BPB->BPB_TotSec16;//总扇区数
 444               	.LM41:
 445 0170 8091 0000 		lds r24,BUFFER+19
 446 0174 9091 0000 		lds r25,(BUFFER+19)+1
 447 0178 9093 0000 		sts (BPB_TotSec16)+1,r25
 448 017c 8093 0000 		sts BPB_TotSec16,r24
  82:FAT16.c       **** 	BPB_FATSz16 = BPB->BPB_FATSz16;//FAT 表所占的扇区数, 以16 位表示,这里一般一个表242项,每项4B,这样24
 450               	.LM42:
 451 0180 8091 0000 		lds r24,BUFFER+22
 452 0184 9091 0000 		lds r25,(BUFFER+22)+1
 453 0188 9093 0000 		sts (BPB_FATSz16)+1,r25
 454 018c 8093 0000 		sts BPB_FATSz16,r24
  83:FAT16.c       **** 	BPB_HiddSec = BPB->BPB_HiddSec;//隐藏扇区数,一般为0
 456               	.LM43:
 457 0190 8091 0000 		lds r24,BUFFER+28
 458 0194 9091 0000 		lds r25,(BUFFER+28)+1
 459 0198 A091 0000 		lds r26,(BUFFER+28)+2
 460 019c B091 0000 		lds r27,(BUFFER+28)+3
 461 01a0 8093 0000 		sts BPB_HiddSec,r24
 462 01a4 9093 0000 		sts (BPB_HiddSec)+1,r25
 463 01a8 A093 0000 		sts (BPB_HiddSec)+2,r26
 464 01ac B093 0000 		sts (BPB_HiddSec)+3,r27
  84:FAT16.c       **** 	return SD_SUCC;
 466               	.LM44:
 467 01b0 80E0      		ldi r24,lo8(0)
 468 01b2 90E0      		ldi r25,hi8(0)
  85:FAT16.c       **** }
 470               	.LM45:
 471 01b4 0895      		ret
 472               	/* epilogue: frame size=0 */
 473               	/* epilogue: noreturn */
 474               	/* epilogue end (size=0) */
 475               	/* function ReadBPB size 78 (78) */
 477               	.Lscope8:
 479               	.global	DirStartSec
 481               	DirStartSec:
  86:FAT16.c       **** //-------------------------------------------------------------------------
  87:FAT16.c       **** uint32_t DirStartSec(void){							//获取根目录开始扇区号
 483               	.LM46:
 484               	/* prologue: frame size=0 */
 485               	/* prologue end (size=0) */
  88:FAT16.c       **** 	return BPB_RsvdSecCnt+BPB_NumFATs*BPB_FATSz16;////因为dbr是逻辑第0扇区,所以其有2个扇区这么大,是操

⌨️ 快捷键说明

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