📄 fat16.txt
字号:
000106 f0110fff TST r1,#0xff
00010a d003 BEQ |L4.276|
;;;274 filename[(*len)++] = (GB2312 & 0x00FF);
00010c 7821 LDRB r1,[r4,#0]
00010e 1c4a ADDS r2,r1,#1
000110 7022 STRB r2,[r4,#0]
000112 5548 STRB r0,[r1,r5]
|L4.276|
000114 1cbf ADDS r7,r7,#2 ;267
000116 b2ff UXTB r7,r7 ;267
000118 2f1f CMP r7,#0x1f ;267
00011a d9de BLS |L4.218|
;;;275 }
;;;276 if(k > 0)
00011c f1b80f00 CMP r8,#0
000120 d009 BEQ |L4.310|
;;;277 {
;;;278 if( ((BUFFER[(k - 1) * 32]) & 0x40) != 0) //已经到达长文件名的最后一个目录项
000122 f81b0c20 LDRB r0,[r11,#-0x20]
000126 0640 LSLS r0,r0,#25
000128 d441 BMI |L4.430|
;;;279 break;
;;;280 k--;
00012a f1a80801 SUB r8,r8,#1
00012e f00808ff AND r8,r8,#0xff
000132 e788 B |L4.70|
|L4.308|
000134 e006 B |L4.324|
|L4.310|
;;;281 }
;;;282 else if(k == 0) //该扇区已读完,需要读上一扇区
;;;283 {
;;;284 ReadBlock(secAddr + secNumOff - 1);
000136 f1aa0001 SUB r0,r10,#1
00013a f7fffffe BL ReadBlock
;;;285 k = 16;//从上一扇区的最后一个目录项开始读(长文件的目录项是倒放在扇区中)
00013e f04f0810 MOV r8,#0x10
000142 e780 B |L4.70|
|L4.324|
;;;286 }
;;;287 }
;;;288 }
;;;289 else //无长文件名
;;;290 {
;;;291 ID = (DIR*)(&BUFFER[persecdirOff * 32]);
;;;292 j = 7;
000144 2007 MOVS r0,#7
|L4.326|
;;;293 while( ID->FileName[j--] == 0x20);
000146 5c0a LDRB r2,[r1,r0]
000148 1e40 SUBS r0,r0,#1
00014a b240 SXTB r0,r0
00014c 2a20 CMP r2,#0x20
00014e d0fa BEQ |L4.326|
;;;294 j++;
000150 1c40 ADDS r0,r0,#1
;;;295 while(j >= 0)
000152 e005 B |L4.352|
|L4.340|
;;;296 {
;;;297 filename[j] = ID->FileName[j];
000154 5c0a LDRB r2,[r1,r0]
000156 542a STRB r2,[r5,r0]
;;;298 (*len)++;
000158 7822 LDRB r2,[r4,#0]
00015a 1c52 ADDS r2,r2,#1
00015c 7022 STRB r2,[r4,#0]
;;;299 j--;
00015e 1e40 SUBS r0,r0,#1
|L4.352|
000160 b240 SXTB r0,r0 ;294
000162 2800 CMP r0,#0 ;295
000164 daf6 BGE |L4.340|
;;;300 }
;;;301 j = 10;
000166 200a MOVS r0,#0xa
|L4.360|
;;;302 while( ID->FileName[j--] == 0x20);
000168 5c0a LDRB r2,[r1,r0]
00016a 1e40 SUBS r0,r0,#1
00016c b240 SXTB r0,r0
00016e 2a20 CMP r2,#0x20
000170 d0fa BEQ |L4.360|
;;;303 j++;
000172 1c40 ADDS r0,r0,#1
000174 b240 SXTB r0,r0
;;;304 if(j >= 8)//有扩展名,记录下来
000176 2808 CMP r0,#8
000178 db19 BLT |L4.430|
;;;305 {
;;;306 filename[(*len)++] = '.';
00017a 7820 LDRB r0,[r4,#0]
00017c 232e MOVS r3,#0x2e
00017e 1c42 ADDS r2,r0,#1
000180 7022 STRB r2,[r4,#0]
000182 5543 STRB r3,[r0,r5]
;;;307 if(ID->FileName[8] != 0x20)
000184 7a0a LDRB r2,[r1,#8]
000186 2a20 CMP r2,#0x20
000188 d003 BEQ |L4.402|
;;;308 filename[(*len)++] = ID->FileName[8];
00018a 7820 LDRB r0,[r4,#0]
00018c 1c43 ADDS r3,r0,#1
00018e 7023 STRB r3,[r4,#0]
000190 5542 STRB r2,[r0,r5]
|L4.402|
;;;309 if(ID->FileName[9] != 0x20)
000192 7a48 LDRB r0,[r1,#9]
000194 2820 CMP r0,#0x20
000196 d003 BEQ |L4.416|
;;;310 filename[(*len)++] = ID->FileName[9];
000198 7822 LDRB r2,[r4,#0]
00019a 1c53 ADDS r3,r2,#1
00019c 7023 STRB r3,[r4,#0]
00019e 5550 STRB r0,[r2,r5]
|L4.416|
;;;311 if(ID->FileName[10] != 0x20)
0001a0 7a89 LDRB r1,[r1,#0xa]
0001a2 2920 CMP r1,#0x20
0001a4 d003 BEQ |L4.430|
;;;312 filename[(*len)++] = ID->FileName[10];
0001a6 7820 LDRB r0,[r4,#0]
0001a8 1c42 ADDS r2,r0,#1
0001aa 7022 STRB r2,[r4,#0]
0001ac 5541 STRB r1,[r0,r5]
|L4.430|
0001ae 4650 MOV r0,r10
;;;313 }
;;;314 }
;;;315 ReadBlock(secAddr + secNumOff); //由于这里BUFFER的内容可能有变化,因此在返回时应复原
0001b0 e8bd5ff0 POP {r4-r12,lr}
0001b4 f7ffbffe B.W ReadBlock
;;;316 }
;;;317
ENDP
|L4.440|
0001b8 00000000 DCD ||.bss||
AREA ||i.List_DateAndTime||, CODE, READONLY, ALIGN=2
List_DateAndTime PROC
;;;325 void List_DateAndTime(DIR * ID)
;;;326 {
000000 b510 PUSH {r4,lr}
000002 4604 MOV r4,r0
;;;327 u8 month = 0, date = 0, hour = 0 , minite = 0, second = 0;
;;;328 u16 tmp = 0 , year = 0;
;;;329 //获取日期
;;;330 tmp = ID->FileUpdateData[0] + (ID->FileUpdateData[1] <<8);
000004 7e00 LDRB r0,[r0,#0x18]
000006 7e61 LDRB r1,[r4,#0x19]
000008 eb002001 ADD r0,r0,r1,LSL #8
00000c b280 UXTH r0,r0
;;;331 year = ((tmp & 0xFE00) >>9) + 1980;
00000e f24071bc MOV r1,#0x7bc
000012 eb012150 ADD r1,r1,r0,LSR #9
;;;332 month = (tmp & 0x01E0) >>5;
000016 f3c01243 UBFX r2,r0,#5,#4
;;;333 date = (tmp & 0x001F);
00001a f000031f AND r3,r0,#0x1f
;;;334 printf("%4u-%02u-%02u", year, month, date);
00001e a00d ADR r0,|L5.84|
000020 f7fffffe BL __1printf
;;;335 //获取时间
;;;336 tmp = ID->FileUpdateTime[0] + (ID->FileUpdateTime[1] <<8) ;
000024 7da0 LDRB r0,[r4,#0x16]
000026 7de1 LDRB r1,[r4,#0x17]
000028 eb002001 ADD r0,r0,r1,LSL #8
00002c b280 UXTH r0,r0
;;;337 hour = (tmp & 0xF800) >>11;
00002e 0ac1 LSRS r1,r0,#11
;;;338 minite = (tmp & 0x07E0) >>5;
000030 f3c01245 UBFX r2,r0,#5,#6
;;;339 second = (tmp & 0x001F) * 2;
000034 06c0 LSLS r0,r0,#27
000036 0e83 LSRS r3,r0,#26
;;;340 printf(" %02u:%02u:%02u", hour, minite, second);
000038 a00a ADR r0,|L5.100|
00003a f7fffffe BL __1printf
;;;341 if(ID->FileAttrib & 0x10)//子目录
00003e 7ae0 LDRB r0,[r4,#0xb]
000040 06c0 LSLS r0,r0,#27
000042 d501 BPL |L5.72|
;;;342 printf(" <DIR> ");
000044 a00c ADR r0,|L5.120|
000046 e000 B |L5.74|
|L5.72|
;;;343 else //文件
;;;344 printf(" ");
000048 a00f ADR r0,|L5.136|
|L5.74|
00004a e8bd4010 POP {r4,lr}
00004e f7ffbffe B.W __1printf
;;;345 }
;;;346
ENDP
000052 0000 DCW 0x0000
|L5.84|
000054 2534752d DCB "%4u-"
000058 25303275 DCB "%02u"
00005c 2d253032 DCB "-%02"
000060 75000000 DCB "u\0\0\0"
|L5.100|
000064 20202025 DCB " %"
000068 3032753a DCB "02u:"
00006c 25303275 DCB "%02u"
000070 3a253032 DCB ":%02"
000074 75000000 DCB "u\0\0\0"
|L5.120|
000078 20202020 DCB " "
00007c 3c444952 DCB "<DIR"
000080 3e202020 DCB "> "
000084 20200000 DCB " \0\0"
|L5.136|
000088 20202020 DCB " "
00008c 20202020 DCB " "
000090 20202020 DCB " "
000094 20200000 DCB " \0\0"
AREA ||i.FAT_FileOpen||, CODE, READONLY, ALIGN=2
FAT_FileOpen PROC
000000 b510 PUSH {r4,lr}
000002 4c03 LDR r4,|L6.16|
000004 2100 MOVS r1,#0
000006 60e1 STR r1,[r4,#0xc] ; FileIndex
000008 f7fffffe BL LBAConvClus
00000c 8060 STRH r0,[r4,#2] ; FileIndex
00000e bd10 POP {r4,pc}
ENDP
|L6.16|
000010 00000200 DCD ||.bss||+0x200
AREA ||i.SearchFoler||, CODE, READONLY, ALIGN=2
SearchFoler PROC
;;;358 u32 SearchFoler(u32 dirAddr, u8 foldername[], u8 namelen, u8 type)
;;;359 {
000000 e92d4fff PUSH {r0-r11,lr}
000004 b0c3 SUB sp,sp,#0x10c
000006 ea5f0802 MOVS r8,r2
00000a 4699 MOV r9,r3
;;;360 u16 cluster ;
;;;361 u32 i;//totalSec, i;
;;;362 u8 m ;
;;;363 DIR *ID;
;;;364 u8 filename[256];
;;;365 u8 len ;
;;;366 if(namelen == 0)
00000c d06a BEQ |L7.228|
;;;367 return 0;
;;;368 cluster = LBAConvClus(dirAddr); //将扇区号转化为簇号
00000e f7fffffe BL LBAConvClus
000012 f8dfb10c LDR r11,|L7.288|
000016 4607 MOV r7,r0
|L7.24|
;;;369 while(1)
;;;370 { //这里一个目录如果占用的空间不只一个簇,也可以解决
;;;371 dirAddr = ClusConvLBA(cluster); //将簇号转为扇区号
000018 4638 MOV r0,r7
00001a f7fffffe BL ClusConvLBA
00001e 4682 MOV r10,r0
;;;372 for(i = 0; i < BPB_SecPerClus; i++)
000020 2400 MOVS r4,#0
000022 e065 B |L7.240|
|L7.36|
;;;373 {
;;;374 ReadBlock(dirAddr + i);
000024 eb0a0004 ADD r0,r10,r4
000028 f7fffffe BL ReadBlock
;;;375 for(m = 0; m < 16; m++)
00002c f05f0500 MOVS.W r5,#0
|L7.48|
;;;376 {
;;;377 if(BUFFER[m * 32] != 0x00 && BUFFER[m * 32] != 0xE5 && BUFFER[m * 32 + 0xB] != 0x0F && (BUFFER[m * 32 + 0xB] & 0x10 ) && type)
000030 eb0b1645 ADD r6,r11,r5,LSL #5
000034 7830 LDRB r0,[r6,#0]
000036 2800 CMP r0,#0
000038 d055 BEQ |L7.230|
00003a 28e5 CMP r0,#0xe5
00003c d053 BEQ |L7.230|
00003e 7af0 LDRB r0,[r6,#0xb]
000040 280f CMP r0,#0xf
000042 d050 BEQ |L7.230|
000044 06c0 LSLS r0,r0,#27
000046 d522 BPL |L7.142|
000048 f1b90f00 CMP r9,#0
00004c d04b BEQ |L7.230|
;;;378 //该项为子目录名
;;;379 {
;;;380 ID = (DIR*)(&BUFFER[m * 32]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -