📄 fat.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -ofat.o --depend=fat.d --device=DARMP --apcs=interwork -O3 -IC:\Keil\ARM\INC\Philips --omf_browse=fat.crf FAT.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
FAT_Init PROC
;;;57 BYTE FAT_Init()//Initialize of FAT need initialize SD first
;;;58 {
000000 e92d41f0 PUSH {r4-r8,lr}
;;;59 struct bootsector710 *bs = 0;
;;;60 struct bpb710Bytes *bpb = 0;
;;;61 struct partrecordBytes *pr = 0;
;;;62
;;;63 BYTE buffer[512];
;;;64 DWORD hidsec=0;
;;;65 DWORD Capacity;
;;;66
;;;67 Capacity = FAT_ReadCapacity();
000004 e59f6ed4 LDR r6,|L1.3808|
000008 e24ddc02 SUB sp,sp,#0x200 ;58
00000c e596002c LDR r0,[r6,#0x2c] ; FAT_ReadCapacity
000010 e1a0e00f MOV lr,pc
000014 e12fff10 BX r0
;;;68 if(Capacity<0xff)return 1;
000018 e35000ff CMP r0,#0xff
00001c e1a04000 MOV r4,r0 ;67
000020 3a000028 BCC |L1.200|
;;;69
;;;70
;;;71 if(FAT_ReadSector(0,buffer))return 1;
000024 e5962028 LDR r2,[r6,#0x28] ; FAT_ReadSector
000028 e28d1000 ADD r1,sp,#0
00002c e3a00000 MOV r0,#0
000030 e1a0e00f MOV lr,pc
000034 e12fff12 BX r2
000038 e3500000 CMP r0,#0
00003c 1a000021 BNE |L1.200|
;;;72 bs = (struct bootsector710 *)buffer;
;;;73
;;;74 pr = (struct partrecordBytes*)((struct partsector*)buffer)->psPart;//first partition
000040 e28d7c01 ADD r7,sp,#0x100
;;;75 hidsec = get32_little(pr->prStartLBA);//the hidden sectors
000044 e28d0c01 ADD r0,sp,#0x100
000048 e28d8000 ADD r8,sp,#0 ;72
00004c e28770be ADD r7,r7,#0xbe ;74
000050 e28000c6 ADD r0,r0,#0xc6
000054 ebfffffe BL get32_little
;;;76 if(hidsec >= Capacity/512)
000058 e15004a4 CMP r0,r4,LSR #9
00005c e1a05000 MOV r5,r0 ;75
;;;77 {
;;;78 hidsec = 0;
000060 23a05000 MOVCS r5,#0
000064 2a000013 BCS |L1.184|
;;;79 }
;;;80 else
;;;81 {
;;;82 if(FAT_ReadSector(get32_little(pr->prStartLBA),buffer))return 1;//read the bpb sector
000068 e2870008 ADD r0,r7,#8
00006c ebfffffe BL get32_little
000070 e5962028 LDR r2,[r6,#0x28] ; FAT_ReadSector
000074 e28d1000 ADD r1,sp,#0
000078 e1a0e00f MOV lr,pc
00007c e12fff12 BX r2
000080 e3500000 CMP r0,#0
000084 1a00000f BNE |L1.200|
;;;83 bs = (struct bootsector710 *)buffer;
;;;84 if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)
000088 e5dd0000 LDRB r0,[sp,#0]
00008c e35000e9 CMP r0,#0xe9
000090 135000eb CMPNE r0,#0xeb
000094 0a00000f BEQ |L1.216|
;;;85 {
;;;86 hidsec = 0;
;;;87 if(FAT_ReadSector(0,buffer))return 1;//read the bpb sector
000098 e5962028 LDR r2,[r6,#0x28] ; FAT_ReadSector
00009c e3a05000 MOV r5,#0 ;86
0000a0 e28d1000 ADD r1,sp,#0
0000a4 e1a00005 MOV r0,r5
0000a8 e1a0e00f MOV lr,pc
0000ac e12fff12 BX r2
0000b0 e3500000 CMP r0,#0
0000b4 1a000003 BNE |L1.200|
|L1.184|
;;;88 bs = (struct bootsector710 *)buffer;
;;;89 }
;;;90 }
;;;91
;;;92 if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)//对付没有bootsect的sd卡 //dead with the card which has no bootsect
0000b8 e5dd0000 LDRB r0,[sp,#0]
0000bc e35000e9 CMP r0,#0xe9
0000c0 135000eb CMPNE r0,#0xeb
0000c4 0a000003 BEQ |L1.216|
|L1.200|
;;;93 {
;;;94 return 1;
0000c8 e3a00001 MOV r0,#1
|L1.204|
0000cc e28ddc02 ADD sp,sp,#0x200
0000d0 e8bd41f0 POP {r4-r8,lr}
;;;95 }
;;;96 bpb = (struct bpb710Bytes*)bs->bsBPB;
;;;97
;;;98
;;;99 if(get16_little(bpb->bpbFATsecs))//detemine thd FAT type //do not support FAT12
;;;100 {
;;;101 FAT32_Enable=0; //FAT16
;;;102 FATsectors = get16_little(bpb->bpbFATsecs);//FAT占用的扇区数 //the sectors number occupied by one fat talbe
;;;103 FirstDirClust = 2;
;;;104 }
;;;105 else
;;;106 {
;;;107 FAT32_Enable=1; //FAT32
;;;108 FATsectors = get32_little(bpb->bpbBigFATsecs);//FAT占用的扇区数 //the sectors number occupied by one fat talbe
;;;109 FirstDirClust = get32_little(bpb->bpbRootClust);
;;;110 }
;;;111
;;;112 BytesPerSector = get16_little(bpb->bpbBytesPerSec);//每扇区字节数
;;;113 SectorsPerClust = bpb->bpbSecPerClust;//每簇扇区数
;;;114 FirstFATSector = get16_little(bpb->bpbResSectors)+hidsec;//第一个FAT表扇区
;;;115 RootDirCount = get16_little(bpb->bpbRootDirEnts);//根目录项数
;;;116 RootDirSectors = (RootDirCount*32)>>9;//根目录占用的扇区数
;;;117 FirstDirSector = FirstFATSector+bpb->bpbFATs*FATsectors;//第一个目录扇区
;;;118 FirstDataSector = FirstDirSector+RootDirSectors;//第一个数据扇区
;;;119 return 0;
;;;120 }
0000d4 e12fff1e BX lr
|L1.216|
0000d8 e288400b ADD r4,r8,#0xb ;96
0000dc e2880016 ADD r0,r8,#0x16 ;99
0000e0 ebfffffe BL get16_little
0000e4 e3500000 CMP r0,#0 ;99
0000e8 0a000006 BEQ |L1.264|
0000ec e3a00000 MOV r0,#0 ;101
0000f0 e5c60002 STRB r0,[r6,#2] ;101 ; FAT32_Enable
0000f4 e284000b ADD r0,r4,#0xb ;102
0000f8 ebfffffe BL get16_little
0000fc e5860014 STR r0,[r6,#0x14] ;102 ; FATsectors
000100 e3a00002 MOV r0,#2 ;103
000104 ea000006 B |L1.292|
|L1.264|
000108 e3a00001 MOV r0,#1 ;107
00010c e5c60002 STRB r0,[r6,#2] ;107 ; FAT32_Enable
000110 e2840019 ADD r0,r4,#0x19 ;108
000114 ebfffffe BL get32_little
000118 e5860014 STR r0,[r6,#0x14] ;108 ; FATsectors
00011c e2840021 ADD r0,r4,#0x21 ;109
000120 ebfffffe BL get32_little
|L1.292|
000124 e586000c STR r0,[r6,#0xc] ;109 ; FirstDirClust
000128 e1a00004 MOV r0,r4 ;112
00012c ebfffffe BL get16_little
000130 e1c600b4 STRH r0,[r6,#4] ;112 ; BytesPerSector
000134 e5dd000d LDRB r0,[sp,#0xd] ;113
000138 e1c600b6 STRH r0,[r6,#6] ;113 ; SectorsPerClust
00013c e2840003 ADD r0,r4,#3 ;114
000140 ebfffffe BL get16_little
000144 e0800005 ADD r0,r0,r5 ;114
000148 e5860018 STR r0,[r6,#0x18] ;114 ; FirstFATSector
00014c e2840006 ADD r0,r4,#6 ;115
000150 ebfffffe BL get16_little
000154 e5860024 STR r0,[r6,#0x24] ;115 ; RootDirCount
000158 e1a00280 LSL r0,r0,#5 ;116
00015c e1a004a0 LSR r0,r0,#9 ;116
000160 e5860020 STR r0,[r6,#0x20] ;116 ; RootDirSectors
000164 e2863014 ADD r3,r6,#0x14 ;117
000168 e5dd1010 LDRB r1,[sp,#0x10] ;117
00016c e893000c LDM r3,{r2,r3} ;117 ; FATsectors, FirstFATSector
000170 e0213192 MLA r1,r2,r1,r3 ;117
000174 e0800001 ADD r0,r0,r1 ;118
000178 e586101c STR r1,[r6,#0x1c] ;117 ; FirstDirSector
00017c e5860010 STR r0,[r6,#0x10] ;118 ; FirstDataSector
000180 e3a00000 MOV r0,#0 ;119
000184 eaffffd0 B |L1.204|
;;;121
ENDP
FAT_LoadPartCluster PROC
;;;125 DWORD sector;
;;;126 sector=(DWORD)FirstDataSector+(DWORD)(cluster-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
000188 e59f3d50 LDR r3,|L1.3808|
00018c e1a0c001 MOV r12,r1
000190 e92d4010 PUSH {r4,lr}
000194 e1a01002 MOV r1,r2
000198 e1d320b6 LDRH r2,[r3,#6] ; SectorsPerClust
00019c e593e010 LDR lr,[r3,#0x10] ; FirstDataSector
0001a0 e2400002 SUB r0,r0,#2
0001a4 e020e092 MLA r0,r2,r0,lr
;;;127 if(FAT_ReadSector(sector+part,buffer))return 1;
0001a8 e5932028 LDR r2,[r3,#0x28] ; FAT_ReadSector
0001ac e080000c ADD r0,r0,r12
0001b0 e1a0e00f MOV lr,pc
0001b4 e12fff12 BX r2
0001b8 e8bd4010 POP {r4,lr}
0001bc e3500000 CMP r0,#0
0001c0 13a00001 MOVNE r0,#1
;;;128 else return 0;
;;;129 }
0001c4 e12fff1e BX lr
;;;130
ENDP
FAT_NextCluster PROC
;;;150 DWORD FAT_NextCluster(DWORD cluster)
;;;151 {
0001c8 e92d4070 PUSH {r4-r6,lr}
;;;152 //BYTE buffer[512];
;;;153 BYTE temp;
;;;154 DWORD sector;
;;;155 DWORD offset;
;;;156
;;;157 if(cluster<2)return 0x0ffffff8;
0001cc e3500002 CMP r0,#2
0001d0 e1a05000 MOV r5,r0 ;151
0001d4 3a000017 BCC |L1.568|
;;;158
;;;159 if(FAT32_Enable)temp = 127;
0001d8 e59f6d00 LDR r6,|L1.3808|
0001dc e5d60002 LDRB r0,[r6,#2] ; FAT32_Enable
0001e0 e3500000 CMP r0,#0
;;;160 else temp = 255;
0001e4 03a000ff MOVEQ r0,#0xff
0001e8 13a0007f MOVNE r0,#0x7f ;159
;;;161
;;;162 offset = cluster/(temp+1);
0001ec e2801001 ADD r1,r0,#1
0001f0 e1a00005 MOV r0,r5
0001f4 ebfffffe BL __aeabi_uidivmod
;;;163 sector=FirstFATSector+offset;//calculate the actual sector where the FAT placed
;;;164
;;;165 offset=cluster%(temp+1);//find the position //计算出在表中的偏移量
0001f8 e1a04001 MOV r4,r1
;;;166 cluster -= offset;//找出需要的起始位置 ,以便于当前保存的起始簇号比较
0001fc e0455001 SUB r5,r5,r1
;;;167
;;;168 if(TABLE_READ == 0 || cluster != START_CLUSTER)//从未读过 or 不在已有的FAT表内 需重新读
000200 e5d61000 LDRB r1,[r6,#0] ; TABLE_READ
000204 e5962018 LDR r2,[r6,#0x18] ;163 ; FirstFATSector
000208 e3510000 CMP r1,#0
00020c e0800002 ADD r0,r0,r2 ;163
000210 0a000002 BEQ |L1.544|
000214 e5961008 LDR r1,[r6,#8] ; START_CLUSTER
000218 e1550001 CMP r5,r1
00021c 0a00000b BEQ |L1.592|
|L1.544|
;;;169 {
;;;170 if(FAT_ReadSector(sector,FAT_TABLE))return 0x0ffffff8;//read fat table / return 0xfff8 when error occured
000220 e5962028 LDR r2,[r6,#0x28] ; FAT_ReadSector
000224 e59f1cb8 LDR r1,|L1.3812|
000228 e1a0e00f MOV lr,pc
00022c e12fff12 BX r2
000230 e3500000 CMP r0,#0
000234 0a000002 BEQ |L1.580|
|L1.568|
000238 e3e0027f MVN r0,#0xf0000007
|L1.572|
00023c e8bd4070 POP {r4-r6,lr}
;;;171 START_CLUSTER = cluster;
;;;172 TABLE_READ = 1;
;;;173 }
;;;174
;;;175 // if(cluster != START_CLUSTER)//不在已有的FAT表内 需重新读
;;;176 // {
;;;177 // if(FAT_ReadSector(sector,FAT_TABLE))return 0x0ffffff8;//read fat table / return 0xfff8 when error occured
;;;178 // START_CLUSTER = cluster;
;;;179 // TABLE_READ = 1;
;;;180 // }
;;;181
;;;182 if(FAT32_Enable)
;;;183 {
;;;184 // offset=cluster%128;//find the position
;;;185 sector=((DWORD *)FAT_TABLE)[offset];
;;;186 }
;;;187 else
;;;188 {
;;;189 // offset=cluster%256;//find the position
;;;190 sector=((WORD *)FAT_TABLE)[offset];
;;;191 }
;;;192 return (DWORD)sector;//return the cluste number
;;;193 }
000240 e12fff1e BX lr
|L1.580|
000244 e3a00001 MOV r0,#1 ;172
000248 e5865008 STR r5,[r6,#8] ;172 ; START_CLUSTER
00024c e5c60000 STRB r0,[r6,#0] ;172 ; TABLE_READ
|L1.592|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -