📄 sd_lib.lss
字号:
82e: a1 f3 breq .-24 ; 0x818 <GetEmptyDIR+0x3a>
830: 98 f3 brcs .-26 ; 0x818 <GetEmptyDIR+0x3a>
832: 08 94 sec
834: e1 1c adc r14, r1
836: f1 1c adc r15, r1
838: 21 96 adiw r28, 0x01 ; 1
83a: ec 14 cp r14, r12
83c: fd 04 cpc r15, r13
83e: 18 f3 brcs .-58 ; 0x806 <GetEmptyDIR+0x28>
}
}
return ID;
}
840: c8 01 movw r24, r16
842: df 91 pop r29
844: cf 91 pop r28
846: 1f 91 pop r17
848: 0f 91 pop r16
84a: ff 90 pop r15
84c: ef 90 pop r14
84e: df 90 pop r13
850: cf 90 pop r12
852: 08 95 ret
00000854 <GetFileID>:
//-------------------------------------------------------------------------
//获得和文件名对应的目录
uint8_t GetFileID(uint8_t Name[11],DIR *ID,uint16_t *pIndex){
854: 6f 92 push r6
856: 7f 92 push r7
858: 8f 92 push r8
85a: 9f 92 push r9
85c: af 92 push r10
85e: bf 92 push r11
860: cf 92 push r12
862: df 92 push r13
864: ef 92 push r14
866: ff 92 push r15
868: 0f 93 push r16
86a: 1f 93 push r17
86c: cf 93 push r28
86e: df 93 push r29
870: 4c 01 movw r8, r24
872: 3b 01 movw r6, r22
874: 7a 01 movw r14, r20
uint16_t i,DirSecCut,DirStart,m;
DirSecCut = GetDirSecCount();//////目录项占用的扇区数
876: 0e 94 5d 03 call 0x6ba <GetDirSecCount>
87a: 5c 01 movw r10, r24
DirStart = DirStartSec();
87c: 0e 94 43 03 call 0x686 <DirStartSec>
for(i=0,*pIndex=0;i<DirSecCut;i++){
880: cc 24 eor r12, r12
882: dd 24 eor r13, r13
884: f7 01 movw r30, r14
886: d1 82 std Z+1, r13 ; 0x01
888: c0 82 st Z, r12
88a: ca 14 cp r12, r10
88c: db 04 cpc r13, r11
88e: 70 f5 brcc .+92 ; 0x8ec <__stack+0x8d>
890: 8b 01 movw r16, r22
ReadFatBlock(DirStart+i);
892: c8 01 movw r24, r16
894: aa 27 eor r26, r26
896: bb 27 eor r27, r27
898: bc 01 movw r22, r24
89a: cd 01 movw r24, r26
89c: 0e 94 9c 02 call 0x538 <ReadFatBlock>
8a0: c2 eb ldi r28, 0xB2 ; 178
8a2: d0 e0 ldi r29, 0x00 ; 0
for(m=0;m<16;m++){
if(IsEqual(Name,(uint8_t *)&((DIR*)&BUFFER[m*32])->FileName,11)){//isequal内存比较函数 , name和filename的 头指针,长度传进去即可
8a4: 4b e0 ldi r20, 0x0B ; 11
8a6: be 01 movw r22, r28
8a8: c4 01 movw r24, r8
8aa: 0e 94 c3 02 call 0x586 <IsEqual>
8ae: 88 23 and r24, r24
8b0: 49 f0 breq .+18 ; 0x8c4 <__stack+0x65>
*ID = *((DIR*)&BUFFER[m*32]);//如果成立,就把id取出
8b2: 80 e2 ldi r24, 0x20 ; 32
8b4: f3 01 movw r30, r6
8b6: 09 90 ld r0, Y+
8b8: 01 92 st Z+, r0
8ba: 8a 95 dec r24
8bc: e1 f7 brne .-8 ; 0x8b6 <__stack+0x57>
return 1; //找到对应的目录项,返回1.
8be: 81 e0 ldi r24, 0x01 ; 1
8c0: 90 e0 ldi r25, 0x00 ; 0
8c2: 16 c0 rjmp .+44 ; 0x8f0 <__stack+0x91>
}
(*pIndex)++;//记录下第几块扇区
8c4: f7 01 movw r30, r14
8c6: 80 81 ld r24, Z
8c8: 91 81 ldd r25, Z+1 ; 0x01
8ca: 01 96 adiw r24, 0x01 ; 1
8cc: 91 83 std Z+1, r25 ; 0x01
8ce: 80 83 st Z, r24
8d0: a0 96 adiw r28, 0x20 ; 32
8d2: f2 e0 ldi r31, 0x02 ; 2
8d4: c2 39 cpi r28, 0x92 ; 146
8d6: df 07 cpc r29, r31
8d8: 29 f3 breq .-54 ; 0x8a4 <__stack+0x45>
8da: 20 f3 brcs .-56 ; 0x8a4 <__stack+0x45>
8dc: 08 94 sec
8de: c1 1c adc r12, r1
8e0: d1 1c adc r13, r1
8e2: 0f 5f subi r16, 0xFF ; 255
8e4: 1f 4f sbci r17, 0xFF ; 255
8e6: ca 14 cp r12, r10
8e8: db 04 cpc r13, r11
8ea: 98 f2 brcs .-90 ; 0x892 <__stack+0x33>
}
}
return 0; //没有找到对应的目录项,返回0.
8ec: 80 e0 ldi r24, 0x00 ; 0
8ee: 90 e0 ldi r25, 0x00 ; 0
8f0: df 91 pop r29
8f2: cf 91 pop r28
8f4: 1f 91 pop r17
8f6: 0f 91 pop r16
8f8: ff 90 pop r15
8fa: ef 90 pop r14
8fc: df 90 pop r13
8fe: cf 90 pop r12
900: bf 90 pop r11
902: af 90 pop r10
904: 9f 90 pop r9
906: 8f 90 pop r8
908: 7f 90 pop r7
90a: 6f 90 pop r6
90c: 08 95 ret
0000090e <GetNextFAT>:
}
//-------------------------------------------------------------------------
uint16_t GetNextFAT(void){ //获取一个空的FAT项
90e: 0f 93 push r16
910: 1f 93 push r17
912: cf 93 push r28
914: df 93 push r29
uint16_t FAT_Count,i;
FAT_Count=BPB_FATSz16*256; //FAT表总项数
916: 80 91 ac 00 lds r24, 0x00AC
91a: 90 91 ad 00 lds r25, 0x00AD
91e: 18 2f mov r17, r24
920: 00 27 eor r16, r16
for(i=0;i<FAT_Count;i++){
922: c0 e0 ldi r28, 0x00 ; 0
924: d0 e0 ldi r29, 0x00 ; 0
926: c0 17 cp r28, r16
928: d1 07 cpc r29, r17
92a: 48 f4 brcc .+18 ; 0x93e <GetNextFAT+0x30>
if(ReadFAT(i)==0)return i;
92c: ce 01 movw r24, r28
92e: 0e 94 a5 03 call 0x74a <ReadFAT>
932: 89 2b or r24, r25
934: 11 f4 brne .+4 ; 0x93a <GetNextFAT+0x2c>
936: ce 01 movw r24, r28
938: 04 c0 rjmp .+8 ; 0x942 <GetNextFAT+0x34>
93a: 21 96 adiw r28, 0x01 ; 1
93c: f4 cf rjmp .-24 ; 0x926 <GetNextFAT+0x18>
}
return 0;
93e: 80 e0 ldi r24, 0x00 ; 0
940: 90 e0 ldi r25, 0x00 ; 0
942: df 91 pop r29
944: cf 91 pop r28
946: 1f 91 pop r17
948: 0f 91 pop r16
94a: 08 95 ret
0000094c <ReadDIR>:
}
//-------------------------------------------------------------------------
void ReadDIR(uint16_t Index, DIR* Value){ //读取根目录的指定项
94c: ef 92 push r14
94e: ff 92 push r15
950: 0f 93 push r16
952: 1f 93 push r17
954: 8c 01 movw r16, r24
956: 7b 01 movw r14, r22
uint32_t LBA = DirStartSec()+Index/16;//index的最大模值是16
958: 0e 94 43 03 call 0x686 <DirStartSec>
95c: 9b 01 movw r18, r22
95e: ac 01 movw r20, r24
960: c8 01 movw r24, r16
962: f4 e0 ldi r31, 0x04 ; 4
964: 96 95 lsr r25
966: 87 95 ror r24
968: fa 95 dec r31
96a: e1 f7 brne .-8 ; 0x964 <ReadDIR+0x18>
96c: aa 27 eor r26, r26
96e: bb 27 eor r27, r27
970: 82 0f add r24, r18
972: 93 1f adc r25, r19
974: a4 1f adc r26, r20
976: b5 1f adc r27, r21
ReadFatBlock(LBA);
978: bc 01 movw r22, r24
97a: cd 01 movw r24, r26
97c: 0e 94 9c 02 call 0x538 <ReadFatBlock>
CopyBytes((uint8_t *)&BUFFER[(Index%16)*32],(uint8_t *)Value,32);//把32个字节长度都copy下来,注意都要从512byte的缓冲区里copy出来,不然系统资源不够用
980: 0f 70 andi r16, 0x0F ; 15
982: 10 70 andi r17, 0x00 ; 0
984: e5 e0 ldi r30, 0x05 ; 5
986: 00 0f add r16, r16
988: 11 1f adc r17, r17
98a: ea 95 dec r30
98c: e1 f7 brne .-8 ; 0x986 <ReadDIR+0x3a>
98e: 40 e2 ldi r20, 0x20 ; 32
990: 50 e0 ldi r21, 0x00 ; 0
992: b7 01 movw r22, r14
994: c8 01 movw r24, r16
996: 8e 54 subi r24, 0x4E ; 78
998: 9f 4f sbci r25, 0xFF ; 255
99a: 0e 94 b8 02 call 0x570 <CopyBytes>
99e: 1f 91 pop r17
9a0: 0f 91 pop r16
9a2: ff 90 pop r15
9a4: ef 90 pop r14
9a6: 08 95 ret
000009a8 <WriteDIR>:
}
//-------------------------------------------------------------------------
void WriteDIR(uint16_t Index, DIR* Value){ //写根目录的指定项
9a8: af 92 push r10
9aa: bf 92 push r11
9ac: cf 92 push r12
9ae: df 92 push r13
9b0: ef 92 push r14
9b2: ff 92 push r15
9b4: 0f 93 push r16
9b6: 1f 93 push r17
9b8: 8c 01 movw r16, r24
9ba: 5b 01 movw r10, r22
uint32_t LBA = DirStartSec()+Index/16;
9bc: 0e 94 43 03 call 0x686 <DirStartSec>
9c0: 6b 01 movw r12, r22
9c2: 7c 01 movw r14, r24
9c4: c8 01 movw r24, r16
9c6: b4 e0 ldi r27, 0x04 ; 4
9c8: 96 95 lsr r25
9ca: 87 95 ror r24
9cc: ba 95 dec r27
9ce: e1 f7 brne .-8 ; 0x9c8 <WriteDIR+0x20>
9d0: aa 27 eor r26, r26
9d2: bb 27 eor r27, r27
9d4: c8 0e add r12, r24
9d6: d9 1e adc r13, r25
9d8: ea 1e adc r14, r26
9da: fb 1e adc r15, r27
ReadFatBlock(LBA);
9dc: c7 01 movw r24, r14
9de: b6 01 movw r22, r12
9e0: 0e 94 9c 02 call 0x538 <ReadFatBlock>
CopyBytes((uint8_t *)Value,(uint8_t *)&BUFFER[(Index%16)*32],32);
9e4: 0f 70 andi r16, 0x0F ; 15
9e6: 10 70 andi r17, 0x00 ; 0
9e8: a5 e0 ldi r26, 0x05 ; 5
9ea: 00 0f add r16, r16
9ec: 11 1f adc r17, r17
9ee: aa 95 dec r26
9f0: e1 f7 brne .-8 ; 0x9ea <WriteDIR+0x42>
9f2: 0e 54 subi r16, 0x4E ; 78
9f4: 1f 4f sbci r17, 0xFF ; 255
9f6: 40 e2 ldi r20, 0x20 ; 32
9f8: 50 e0 ldi r21, 0x00 ; 0
9fa: b8 01 movw r22, r16
9fc: c5 01 movw r24, r10
9fe: 0e 94 b8 02 call 0x570 <CopyBytes>
WriteFatBlock(LBA);
a02: c7 01 movw r24, r14
a04: b6 01 movw r22, r12
a06: 0e 94 aa 02 call 0x554 <WriteFatBlock>
a0a: 1f 91 pop r17
a0c: 0f 91 pop r16
a0e: ff 90 pop r15
a10: ef 90 pop r14
a12: df 90 pop r13
a14: cf 90 pop r12
a16: bf 90 pop r11
a18: af 90 pop r10
a1a: 08 95 ret
00000a1c <CopyFAT>:
}
//-------------------------------------------------------------------------
void CopyFAT(void){ //复制文件分配表,使其和备份一致
a1c: cf 93 push r28
a1e: df 93 push r29
uint16_t i;
for(i=0;i<BPB_FATSz16;i++){
a20: c0 e0 ldi r28, 0x00 ; 0
a22: d0 e0 ldi r29, 0x00 ; 0
a24: 80 91 ac 00 lds r24, 0x00AC
a28: 90 91 ad 00 lds r25, 0x00AD
a2c: c8 17 cp r28, r24
a2e: d9 07 cpc r29, r25
a30: 30 f5 brcc .+76 ; 0xa7e <CopyFAT+0x62>
ReadFatBlock(BPB_RsvdSecCnt+i);
a32: 80 91 b2 02 lds r24, 0x02B2
a36: 90 91 b3 02 lds r25, 0x02B3
a3a: 8c 0f add r24, r28
a3c: 9d 1f adc r25, r29
a3e: aa 27 eor r26, r26
a40: bb 27 eor r27, r27
a42: bc 01 movw r22, r24
a44: cd 01 movw r24, r26
a46: 0e 94 9c 02 call 0x538 <ReadFatBlock>
WriteFatBlock(BPB_RsvdSecCnt+BPB_FATSz16+i);
a4a: 80 91 b2 02 lds r24, 0x02B2
a4e: 90 91 b3 02 lds r25, 0x02B3
a52: 20 91 ac 00 lds r18, 0x00AC
a56: 30 91 ad 00 lds r19, 0x00AD
a5a: 82 0f add r24, r18
a5c: 93 1f adc r25, r19
a5e: 8c 0f add r24, r28
a60: 9d 1f adc r25, r29
a62: aa 27 eor r26, r26
a64: bb 27 eor r27, r27
a66: bc 01 movw r22, r24
a68: cd 01 movw r24, r26
a6a: 0e 94 aa 02 call 0x554 <WriteFatBlock>
a6e: 21 96 adiw r28, 0x01 ; 1
a70: 80 91 ac 00 lds r24, 0x00AC
a74: 90 91 ad 00 lds r25, 0x00AD
a78: c8 17 cp r28, r24
a7a: d9 07 cpc r29, r25
a7c: d0 f2 brcs .-76 ; 0xa32 <CopyFAT+0x16>
a7e: df 91 pop r29
a80: cf 91 pop r28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -