📄 fat16.lst
字号:
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 + -