📄 fat16.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 938] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o..\Release\fat16.o --depend=..\Release\fat16.d --device=DARMSTM --apcs=interwork -O3 -I..\code\header -I..\code\library\inc -I..\..\include -I..\..\..\..\library\inc -I..\..\..\..\..\FWLib\library\inc -I..\code\FAT16 -I..\code\driver -ID:\Keil\ARM\INC\ST\STM32F10x -DVECT_TAB_FLASH --omf_browse=..\Release\fat16.crf ..\code\FAT16\fat16.c]
THUMB
AREA ||i.FAT_Init||, CODE, READONLY, ALIGN=2
FAT_Init PROC
;;;53 void FAT_Init(void)
;;;54 {
000000 b570 PUSH {r4-r6,lr}
000002 4c12 LDR r4,|L1.76|
000004 2000 MOVS r0,#0
000006 f7fffffe BL ReadBlock
00000a 4d11 LDR r5,|L1.80|
00000c f89401c2 LDRB r0,[r4,#0x1c2]
000010 7028 STRB r0,[r5,#0] ; SystemID
000012 f8d401c6 LDR r0,[r4,#0x1c6]
000016 6128 STR r0,[r5,#0x10] ; RelativeSectors
000018 f8d411ca LDR r1,[r4,#0x1ca]
00001c 6169 STR r1,[r5,#0x14] ; TotalSectors
00001e f7fffffe BL ReadBlock
000022 7b60 LDRB r0,[r4,#0xd]
000024 7068 STRB r0,[r5,#1] ; BPB_SecPerClus
000026 89e0 LDRH r0,[r4,#0xe]
000028 80a8 STRH r0,[r5,#4] ; BPB_RsvdSecCnt
00002a 7c20 LDRB r0,[r4,#0x10]
00002c 70a8 STRB r0,[r5,#2] ; BPB_NumFATs
00002e f8b40011 LDRH r0,[r4,#0x11]
000032 80e8 STRH r0,[r5,#6] ; BPB_RootEntCnt
000034 f8b40013 LDRH r0,[r4,#0x13]
000038 8128 STRH r0,[r5,#8] ; BPB_TotSec16
00003a 8ae0 LDRH r0,[r4,#0x16]
00003c 8168 STRH r0,[r5,#0xa] ; BPB_FATSz16
00003e 69e0 LDR r0,[r4,#0x1c]
000040 61a8 STR r0,[r5,#0x18] ; BPB_HiddSec
000042 f8b4000b LDRH r0,[r4,#0xb]
000046 81a8 STRH r0,[r5,#0xc] ; BPB_BytesPerSec
;;;55 ReadMBR();
;;;56 ReadBPB();
;;;57 }
000048 bd70 POP {r4-r6,pc}
;;;58
ENDP
00004a 0000 DCW 0x0000
|L1.76|
00004c 00000000 DCD ||.bss||
|L1.80|
000050 00000000 DCD ||.data||
AREA ||i.DirStartSec||, CODE, READONLY, ALIGN=2
DirStartSec PROC
000000 4804 LDR r0,|L2.20|
000002 8882 LDRH r2,[r0,#4] ; BPB_RsvdSecCnt
000004 6901 LDR r1,[r0,#0x10] ; RelativeSectors
000006 4411 ADD r1,r1,r2
000008 7882 LDRB r2,[r0,#2] ; BPB_NumFATs
00000a 8940 LDRH r0,[r0,#0xa] ; BPB_FATSz16
00000c fb021000 MLA r0,r2,r0,r1
000010 4770 BX lr
ENDP
000012 0000 DCW 0x0000
|L2.20|
000014 00000000 DCD ||.data||
AREA ||i.CalcuFreeSpace||, CODE, READONLY, ALIGN=2
CalcuFreeSpace PROC
;;;196 u32 CalcuFreeSpace()
;;;197 {
000000 e92d41f0 PUSH {r4-r8,lr}
;;;198 u32 size;
;;;199 u16 i, j;
;;;200 u16 *RAM = (u16*)BUFFER;
;;;201 size = 0;
000004 2500 MOVS r5,#0
000006 4e0f LDR r6,|L3.68|
;;;202 //BPB_FATSz16
;;;203 for(i = 0 ; i < BPB_FATSz16 ; i++)
000008 462c MOV r4,r5
00000a 4f0f LDR r7,|L3.72|
00000c e013 B |L3.54|
|L3.14|
;;;204 {
;;;205 ReadBlock(RelativeSectors + BPB_RsvdSecCnt + i);
00000e 88b9 LDRH r1,[r7,#4] ; BPB_RsvdSecCnt
000010 6938 LDR r0,[r7,#0x10] ; RelativeSectors
000012 4408 ADD r0,r0,r1
000014 4420 ADD r0,r0,r4
000016 f7fffffe BL ReadBlock
;;;206 for(j = 0; j < 256; j++)
00001a 7879 LDRB r1,[r7,#1]
00001c 89ba LDRH r2,[r7,#0xc]
00001e 2000 MOVS r0,#0
|L3.32|
;;;207 {
;;;208 if(RAM[j] == 0x00)//空闭簇
000020 f8363010 LDRH r3,[r6,r0,LSL #1]
000024 b90b CBNZ r3,|L3.42|
;;;209 size += BPB_SecPerClus * BPB_BytesPerSec;
000026 fb015502 MLA r5,r1,r2,r5
|L3.42|
00002a 1c40 ADDS r0,r0,#1 ;206
00002c b280 UXTH r0,r0 ;206
00002e 28ff CMP r0,#0xff ;206
000030 d9f6 BLS |L3.32|
000032 1c64 ADDS r4,r4,#1 ;203
000034 b2a4 UXTH r4,r4 ;203
|L3.54|
000036 8978 LDRH r0,[r7,#0xa] ;203 ; BPB_FATSz16
000038 4284 CMP r4,r0 ;203
00003a d3e8 BCC |L3.14|
;;;210 }
;;;211 }
;;;212 return size;
00003c 4628 MOV r0,r5
;;;213 }
00003e e8bd81f0 POP {r4-r8,pc}
;;;214
ENDP
000042 0000 DCW 0x0000
|L3.68|
000044 00000000 DCD ||.bss||
|L3.72|
000048 00000000 DCD ||.data||
AREA ||i.GetFileName||, CODE, READONLY, ALIGN=2
GetFileName PROC
;;;226 void GetFileName(u32 secAddr, u16 secNumOff, u8 persecdirOff, u8 filename[], u8 *len)
;;;227 {
000000 e92d5ff0 PUSH {r4-r12,lr}
000004 ea5f0802 MOVS r8,r2
;;;228 u8 i,k;
;;;229 DIR *ID;
;;;230 u16 tmp ,GB2312;
;;;231 signed char j;
;;;232 *len = 0;
000008 9c0a LDR r4,[sp,#0x28]
00000a f04f0200 MOV r2,#0
00000e 4e6a LDR r6,|L4.440|
000010 461d MOV r5,r3 ;227
000012 7022 STRB r2,[r4,#0]
000014 eb000a01 ADD r10,r0,r1
;;;233 if(persecdirOff == 0) //当短文件名在扇区的第一目录项时,由于需要以上一目录项来判断是否有长文件名,需要特殊处理
000018 d10d BNE |L4.54|
;;;234 {
;;;235 ReadBlock(secAddr + secNumOff - 1);
00001a f1aa0001 SUB r0,r10,#1
00001e f7fffffe BL ReadBlock
;;;236 if( BUFFER[15 * 32 + 0xB] == 0x0F) //该文件有长文件名
000022 f89601eb LDRB r0,[r6,#0x1eb] ; BUFFER
000026 280f CMP r0,#0xf
000028 d102 BNE |L4.48|
;;;237 persecdirOff = 16;//从上一扇区的最后一个目录项开始读(长文件的目录项是倒放在扇区中)
00002a f04f0810 MOV r8,#0x10
00002e e002 B |L4.54|
|L4.48|
000030 4650 MOV r0,r10
;;;238 else
;;;239 ReadBlock(secAddr + secNumOff);//该文件无长名,需要返回原来扇区读短文件名
000032 f7fffffe BL ReadBlock
|L4.54|
;;;240 }
;;;241 if( BUFFER[(persecdirOff - 1) * 32 + 0xB] == 0x0F) //该文件有长文件名
000036 eb061148 ADD r1,r6,r8,LSL #5
00003a f8110c15 LDRB r0,[r1,#-0x15]
00003e 280f CMP r0,#0xf
000040 d178 BNE |L4.308|
000042 f04f09ff MOV r9,#0xff
|L4.70|
;;;242 {
;;;243 k = persecdirOff;
;;;244 while(1)
;;;245 {
;;;246 ID = (DIR*)(&BUFFER[(k - 1) * 32]);
000046 485c LDR r0,|L4.440|
;;;247
;;;248 //从长文件目录项中读取文件名,每个长目录分3个区域存放
;;;249 for(i = 0x1 ; i <= 0xA; i+=2)
000048 2701 MOVS r7,#1
00004a eb001b48 ADD r11,r0,r8,LSL #5 ;246
00004e f1ab0620 SUB r6,r11,#0x20 ;246
|L4.82|
;;;250 {
;;;251 tmp = *(((u8 *)ID) + i) + (*(((u8 *)ID) + i + 1) << 8);
000052 19f1 ADDS r1,r6,r7
000054 5df0 LDRB r0,[r6,r7]
000056 7849 LDRB r1,[r1,#1]
000058 eb002001 ADD r0,r0,r1,LSL #8
00005c b280 UXTH r0,r0
;;;252 GB2312 = UnicodeToGB2312(tmp); //将对应的Unicode码转化为GB2312码
00005e f7fffffe BL UnicodeToGB2312
;;;253 if(((GB2312 & 0xFF00) != 0) && ((GB2312 & 0xFF00) != 0xFF00))//去掉0和FF
000062 0a01 LSRS r1,r0,#8
000064 d007 BEQ |L4.118|
000066 ebb92f10 CMP r9,r0,LSR #8
00006a d004 BEQ |L4.118|
;;;254 filename[(*len)++] = (GB2312 & 0xFF00) >> 8;
00006c 7821 LDRB r1,[r4,#0]
00006e 0a03 LSRS r3,r0,#8
000070 1c4a ADDS r2,r1,#1
000072 7022 STRB r2,[r4,#0]
000074 554b STRB r3,[r1,r5]
|L4.118|
;;;255 if(((GB2312 & 0x00FF) != 0) && ((GB2312 & 0x00FF) != 0x00FF))
000076 f0100fff TST r0,#0xff
00007a d007 BEQ |L4.140|
00007c 43c1 MVNS r1,r0
00007e f0110fff TST r1,#0xff
000082 d003 BEQ |L4.140|
;;;256 filename[(*len)++] = (GB2312 & 0x00FF);
000084 7821 LDRB r1,[r4,#0]
000086 1c4a ADDS r2,r1,#1
000088 7022 STRB r2,[r4,#0]
00008a 5548 STRB r0,[r1,r5]
|L4.140|
00008c 1cbf ADDS r7,r7,#2 ;249
00008e b2ff UXTB r7,r7 ;249
000090 2f0a CMP r7,#0xa ;249
000092 d9de BLS |L4.82|
;;;257 }
;;;258 for(i = 0xE ; i <= 0x19; i+=2)
000094 270e MOVS r7,#0xe
|L4.150|
;;;259 {
;;;260 tmp = *(((u8 *)ID) + i) + (*(((u8 *)ID) + i + 1) << 8);
000096 19f1 ADDS r1,r6,r7
000098 5df0 LDRB r0,[r6,r7]
00009a 7849 LDRB r1,[r1,#1]
00009c eb002001 ADD r0,r0,r1,LSL #8
0000a0 b280 UXTH r0,r0
;;;261 GB2312 = UnicodeToGB2312(tmp); //将对应的Unicode码转化为GB2312码
0000a2 f7fffffe BL UnicodeToGB2312
;;;262 if(((GB2312 & 0xFF00) != 0) && ((GB2312 & 0xFF00) != 0xFF00))//去掉0和FF
0000a6 0a01 LSRS r1,r0,#8
0000a8 d007 BEQ |L4.186|
0000aa ebb92f10 CMP r9,r0,LSR #8
0000ae d004 BEQ |L4.186|
;;;263 filename[(*len)++] = (GB2312 & 0xFF00) >> 8;
0000b0 7821 LDRB r1,[r4,#0]
0000b2 0a03 LSRS r3,r0,#8
0000b4 1c4a ADDS r2,r1,#1
0000b6 7022 STRB r2,[r4,#0]
0000b8 554b STRB r3,[r1,r5]
|L4.186|
;;;264 if(((GB2312 & 0x00FF) != 0) && ((GB2312 & 0x00FF) != 0x00FF))
0000ba f0100fff TST r0,#0xff
0000be d007 BEQ |L4.208|
0000c0 43c1 MVNS r1,r0
0000c2 f0110fff TST r1,#0xff
0000c6 d003 BEQ |L4.208|
;;;265 filename[(*len)++] = (GB2312 & 0x00FF);
0000c8 7821 LDRB r1,[r4,#0]
0000ca 1c4a ADDS r2,r1,#1
0000cc 7022 STRB r2,[r4,#0]
0000ce 5548 STRB r0,[r1,r5]
|L4.208|
0000d0 1cbf ADDS r7,r7,#2 ;258
0000d2 b2ff UXTB r7,r7 ;258
0000d4 2f19 CMP r7,#0x19 ;258
0000d6 d9de BLS |L4.150|
;;;266 }
;;;267 for(i = 0x1C ; i <= 0x1F; i+=2)
0000d8 271c MOVS r7,#0x1c
|L4.218|
;;;268 {
;;;269 tmp = *(((u8 *)ID) + i) + (*(((u8 *)ID) + i + 1) << 8);
0000da 19f1 ADDS r1,r6,r7
0000dc 5df0 LDRB r0,[r6,r7]
0000de 7849 LDRB r1,[r1,#1]
0000e0 eb002001 ADD r0,r0,r1,LSL #8
0000e4 b280 UXTH r0,r0
;;;270 GB2312 = UnicodeToGB2312(tmp); //将对应的Unicode码转化为GB2312码
0000e6 f7fffffe BL UnicodeToGB2312
;;;271 if(((GB2312 & 0xFF00) != 0) && ((GB2312 & 0xFF00) != 0xFF00))//去掉0和FF
0000ea 0a01 LSRS r1,r0,#8
0000ec d007 BEQ |L4.254|
0000ee ebb92f10 CMP r9,r0,LSR #8
0000f2 d004 BEQ |L4.254|
;;;272 filename[(*len)++] = (GB2312 & 0xFF00) >> 8;
0000f4 7821 LDRB r1,[r4,#0]
0000f6 0a02 LSRS r2,r0,#8
0000f8 1c4b ADDS r3,r1,#1
0000fa 7023 STRB r3,[r4,#0]
0000fc 554a STRB r2,[r1,r5]
|L4.254|
;;;273 if(((GB2312 & 0x00FF) != 0) && ((GB2312 & 0x00FF) != 0x00FF))
0000fe f0100fff TST r0,#0xff
000102 d007 BEQ |L4.276|
000104 43c1 MVNS r1,r0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -