📄 fat.txt
字号:
000250 e5d61002 LDRB r1,[r6,#2] ;182 ; FAT32_Enable
000254 e59f0c88 LDR r0,|L1.3812|
000258 e3510000 CMP r1,#0 ;182
00025c 00800084 ADDEQ r0,r0,r4,LSL #1 ;190
000260 01d000b0 LDRHEQ r0,[r0,#0] ;190
000264 17900104 LDRNE r0,[r0,r4,LSL #2] ;185
000268 eafffff3 B |L1.572|
;;;194
ENDP
FAT_FindItem PROC
;;;1006 WORD FAT_FindItem(DWORD cluster, BYTE *name, struct FileInfoStruct *FileInfo)
;;;1007 {
00026c e92d4ff0 PUSH {r4-r11,lr}
;;;1008 BYTE buffer[512];
;;;1009 DWORD tempclust;
;;;1010 DWORD sector;
;;;1011 WORD cnt;
;;;1012 WORD offset;
;;;1013 BYTE i;
;;;1014 struct direntryBytes*item = 0;
;;;1015
;;;1016 if((cluster==0) && (FAT32_Enable == 0))// root directory
000270 e59fbc68 LDR r11,|L1.3808|
000274 e1a09001 MOV r9,r1 ;1007
000278 e5db1002 LDRB r1,[r11,#2] ; FAT32_Enable
00027c e24ddf81 SUB sp,sp,#0x204 ;1007
000280 e1a07002 MOV r7,r2 ;1007
000284 e1911000 ORRS r1,r1,r0
;;;1017 {
;;;1018 for(cnt=0;cnt<RootDirSectors;cnt++)
;;;1019 {
;;;1020 if(FAT_ReadSector(FirstDirSector+cnt,buffer)){return 1;}
;;;1021 for(offset=0;offset<512;offset+=32)
;;;1022 {
;;;1023 item=(struct direntryBytes*)(&buffer[offset]);
;;;1024 if((item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
;;;1025 {
;;;1026 for(i=0;i<11;i++)
;;;1027 {
;;;1028 if(buffer[offset+i]!=name[i])break;
;;;1029 }
;;;1030 if(i==11)
;;;1031 {
;;;1032 //return the parameter of the item
;;;1033 FileInfo->StartCluster = get16_little(item->deStartCluster) + (((DWORD)get16_little(item->deHighClust))<<16);//don't care
;;;1034 FileInfo->Size = get32_little(item->deFileSize);
;;;1035 FileInfo->Attr = item->deAttributes;
;;;1036 FileInfo->Sector = FirstDirSector+cnt;
;;;1037 FileInfo->Offset = offset;
;;;1038 return 0;
;;;1039 }
;;;1040 }
;;;1041 }
;;;1042 }
;;;1043 }
;;;1044 else//other folders
;;;1045 {
;;;1046 tempclust=cluster;
000288 11a08000 MOVNE r8,r0
;;;1047 while(1)
00028c 1a000037 BNE |L1.880|
000290 e3a06000 MOV r6,#0 ;1018
000294 ea000031 B |L1.864|
|L1.664|
000298 e59b001c LDR r0,[r11,#0x1c] ;1020 ; FirstDirSector
00029c e59b2028 LDR r2,[r11,#0x28] ;1020 ; FAT_ReadSector
0002a0 e0800006 ADD r0,r0,r6 ;1020
0002a4 e28d1004 ADD r1,sp,#4 ;1020
0002a8 e1a0e00f MOV lr,pc ;1020
0002ac e12fff12 BX r2 ;1020
0002b0 e3500000 CMP r0,#0 ;1020
0002b4 1a000076 BNE |L1.1172|
0002b8 e3a04000 MOV r4,#0 ;1021
0002bc e28d1004 ADD r1,sp,#4 ;1021
|L1.704|
0002c0 e0815004 ADD r5,r1,r4 ;1023
0002c4 e5d50000 LDRB r0,[r5,#0] ;1024
0002c8 e3500000 CMP r0,#0 ;1024
0002cc 135000e5 CMPNE r0,#0xe5 ;1024
0002d0 15d5000b LDRBNE r0,[r5,#0xb] ;1024
0002d4 1350000f CMPNE r0,#0xf ;1024
0002d8 0a00001a BEQ |L1.840|
0002dc e3a00000 MOV r0,#0 ;1026
|L1.736|
0002e0 e0842000 ADD r2,r4,r0 ;1028
0002e4 e7d12002 LDRB r2,[r1,r2] ;1028
0002e8 e7d93000 LDRB r3,[r9,r0] ;1028
0002ec e1520003 CMP r2,r3 ;1028
0002f0 1a000003 BNE |L1.772|
0002f4 e2800001 ADD r0,r0,#1 ;1026
0002f8 e20000ff AND r0,r0,#0xff ;1026
0002fc e350000b CMP r0,#0xb ;1026
000300 3afffff6 BCC |L1.736|
|L1.772|
000304 e350000b CMP r0,#0xb ;1030
000308 1a00000e BNE |L1.840|
00030c e285001a ADD r0,r5,#0x1a ;1033
000310 ebfffffe BL get16_little
000314 e1a08000 MOV r8,r0 ;1033
000318 e2850014 ADD r0,r5,#0x14 ;1033
00031c ebfffffe BL get16_little
000320 e0880800 ADD r0,r8,r0,LSL #16 ;1033
000324 e5870000 STR r0,[r7,#0] ;1033
000328 e285001c ADD r0,r5,#0x1c ;1034
00032c ebfffffe BL get32_little
000330 e5870004 STR r0,[r7,#4] ;1034
000334 e5d5000b LDRB r0,[r5,#0xb] ;1035
000338 e5c70008 STRB r0,[r7,#8] ;1035
00033c e59b001c LDR r0,[r11,#0x1c] ;1036 ; FirstDirSector
000340 e0800006 ADD r0,r0,r6 ;1036
000344 ea000038 B |L1.1068|
|L1.840|
000348 e2840020 ADD r0,r4,#0x20 ;1021
00034c e3c04801 BIC r4,r0,#0x10000 ;1021
000350 e3540c02 CMP r4,#0x200 ;1021
000354 3affffd9 BCC |L1.704|
000358 e2860001 ADD r0,r6,#1 ;1018
00035c e3c06801 BIC r6,r0,#0x10000 ;1018
|L1.864|
000360 e59b0020 LDR r0,[r11,#0x20] ;1018 ; RootDirSectors
000364 e1560000 CMP r6,r0 ;1018
000368 3affffca BCC |L1.664|
00036c ea000048 B |L1.1172|
|L1.880|
;;;1048 {
;;;1049 sector=(DWORD)FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
000370 e1db20b6 LDRH r2,[r11,#6] ; SectorsPerClust
000374 e59b0010 LDR r0,[r11,#0x10] ; FirstDataSector
000378 e2481002 SUB r1,r8,#2
00037c e02a0291 MLA r10,r1,r2,r0
;;;1050 for(cnt=0;cnt<SectorsPerClust;cnt++)
000380 e3a06000 MOV r6,#0
000384 ea000034 B |L1.1116|
|L1.904|
;;;1051 {
;;;1052 if(FAT_ReadSector(sector+cnt,buffer)){return 1;}
000388 e59b2028 LDR r2,[r11,#0x28] ; FAT_ReadSector
00038c e08a0006 ADD r0,r10,r6
000390 e28d1004 ADD r1,sp,#4
000394 e1a0e00f MOV lr,pc
000398 e12fff12 BX r2
00039c e3500000 CMP r0,#0
0003a0 1a00003b BNE |L1.1172|
;;;1053 for(offset=0;offset<512;offset+=32)
0003a4 e3a04000 MOV r4,#0
0003a8 e28d2004 ADD r2,sp,#4
|L1.940|
;;;1054 {
;;;1055 item=(struct direntryBytes*)(&buffer[offset]);
0003ac e0825004 ADD r5,r2,r4
;;;1056 if((item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
0003b0 e5d50000 LDRB r0,[r5,#0]
0003b4 e3500000 CMP r0,#0
0003b8 135000e5 CMPNE r0,#0xe5
0003bc 15d5000b LDRBNE r0,[r5,#0xb]
0003c0 1350000f CMPNE r0,#0xf
0003c4 0a00001e BEQ |L1.1092|
;;;1057 {
;;;1058 for(i=0;i<11;i++)
0003c8 e3a00000 MOV r0,#0
|L1.972|
;;;1059 {
;;;1060 if(buffer[offset+i]!=name[i])break;
0003cc e0841000 ADD r1,r4,r0
0003d0 e7d21001 LDRB r1,[r2,r1]
0003d4 e7d93000 LDRB r3,[r9,r0]
0003d8 e1510003 CMP r1,r3
0003dc 1a000003 BNE |L1.1008|
0003e0 e2800001 ADD r0,r0,#1 ;1058
0003e4 e20000ff AND r0,r0,#0xff ;1058
0003e8 e350000b CMP r0,#0xb ;1058
0003ec 3afffff6 BCC |L1.972|
|L1.1008|
;;;1061 }
;;;1062 if(i==11)
0003f0 e350000b CMP r0,#0xb
0003f4 1a000012 BNE |L1.1092|
;;;1063 {
;;;1064 FileInfo->StartCluster = get16_little(item->deStartCluster) + (((DWORD)get16_little(item->deHighClust))<<16);//don't care
0003f8 e285001a ADD r0,r5,#0x1a
0003fc ebfffffe BL get16_little
000400 e1a08000 MOV r8,r0
000404 e2850014 ADD r0,r5,#0x14
000408 ebfffffe BL get16_little
00040c e0880800 ADD r0,r8,r0,LSL #16
000410 e5870000 STR r0,[r7,#0]
;;;1065 FileInfo->Size = get32_little(item->deFileSize);
000414 e285001c ADD r0,r5,#0x1c
000418 ebfffffe BL get32_little
00041c e5870004 STR r0,[r7,#4]
;;;1066 FileInfo->Attr = item->deAttributes;
000420 e5d5000b LDRB r0,[r5,#0xb]
000424 e5c70008 STRB r0,[r7,#8]
;;;1067 FileInfo->Sector = sector+cnt;
000428 e08a0006 ADD r0,r10,r6
|L1.1068|
00042c e587000c STR r0,[r7,#0xc]
;;;1068 FileInfo->Offset = offset;
;;;1069 return 0;
000430 e3a00000 MOV r0,#0
000434 e1c741b0 STRH r4,[r7,#0x10] ;1068
|L1.1080|
000438 e28ddf81 ADD sp,sp,#0x204
00043c e8bd4ff0 POP {r4-r11,lr}
;;;1070 }
;;;1071 }
;;;1072 }
;;;1073 }
;;;1074 tempclust=FAT_NextCluster(tempclust);//next cluster
;;;1075 if((FAT32_Enable == 0 && tempclust == 0xffff) || tempclust == 0x0ffffff8 || tempclust == 0x0fffffff)break;
;;;1076 }
;;;1077 }
;;;1078 return 1;
;;;1079 }
000440 e12fff1e BX lr
|L1.1092|
000444 e2840020 ADD r0,r4,#0x20 ;1053
000448 e3c04801 BIC r4,r0,#0x10000 ;1053
00044c e3540c02 CMP r4,#0x200 ;1053
000450 3affffd5 BCC |L1.940|
000454 e2860001 ADD r0,r6,#1 ;1050
000458 e3c06801 BIC r6,r0,#0x10000 ;1050
|L1.1116|
00045c e1db00b6 LDRH r0,[r11,#6] ;1050 ; SectorsPerClust
000460 e1560000 CMP r6,r0 ;1050
000464 3affffc7 BCC |L1.904|
000468 e1a00008 MOV r0,r8 ;1074
00046c ebfffffe BL FAT_NextCluster
000470 e1a08000 MOV r8,r0 ;1074
000474 e5db0002 LDRB r0,[r11,#2] ;1075 ; FAT32_Enable
000478 e3500000 CMP r0,#0 ;1075
00047c 02480cff SUBEQ r0,r8,#0xff00 ;1075
000480 025000ff SUBSEQ r0,r0,#0xff ;1075
000484 0a000002 BEQ |L1.1172|
000488 e378028f CMN r8,#0xf0000008 ;1075
00048c 1378021f CMNNE r8,#0xf0000001 ;1075
000490 1affffb6 BNE |L1.880|
|L1.1172|
000494 e3a00001 MOV r0,#1 ;1078
000498 eaffffe6 B |L1.1080|
;;;1080
ENDP
FAT_Open PROC
;;;1083 DWORD FAT_Open(BYTE * dir)
;;;1084 {
00049c e92d43fe PUSH {r1-r9,lr}
;;;1085 BYTE name[11];
;;;1086 BYTE *p=dir;
;;;1087 BYTE deep=0;
;;;1088 BYTE i,j;
;;;1089 DWORD cluster=0;
;;;1090 if(FAT32_Enable)cluster=FirstDirClust;
0004a0 e59f3a38 LDR r3,|L1.3808|
0004a4 e1a04000 MOV r4,r0 ;1084
0004a8 e5d3c002 LDRB r12,[r3,#2] ; FAT32_Enable
0004ac e1a01000 MOV r1,r0 ;1086
0004b0 e3a02000 MOV r2,#0 ;1087
0004b4 e35c0000 CMP r12,#0
0004b8 e1a00002 MOV r0,r2 ;1089
0004bc 1593000c LDRNE r0,[r3,#0xc] ; FirstDirClust
;;;1091 if(*p != '\\')return 1;//invalid path
0004c0 e5d13000 LDRB r3,[r1,#0]
0004c4 e353005c CMP r3,#0x5c
0004c8 1a00004f BNE |L1.1548|
|L1.1228|
;;;1092 while(*p)
;;;1093 {
;;;1094 if(*p == '\\')
0004cc e5d13000 LDRB r3,[r1,#0]
0004d0 e353005c CMP r3,#0x5c
0004d4 e5f13001 LDRB r3,[r1,#1]! ;1092
;;;1095 {
;;;1096 deep++;
0004d8 02822001 ADDEQ r2,r2,#1
0004dc 020220ff ANDEQ r2,r2,#0xff
0004e0 e3530000 CMP r3,#0 ;1092
0004e4 1afffff8 BNE |L1.1228|
;;;1097 }
;;;1098 p++;
;;;1099 }
;;;1100 p=dir;
;;;1101 for(i=0;i<deep-1;i++)
0004e8 e59f79f8 LDR r7,|L1.3816|
0004ec e3a05000 MOV r5,#0
0004f0 e3a08020 MOV r8,#0x20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -