📄 fat16.txt
字号:
;;;472 break;
;;;473 }
;;;474 }
0000f6 b043 ADD sp,sp,#0x10c
0000f8 e8bd8ff0 POP {r4-r11,pc}
;;;475
ENDP
|L8.252|
0000fc 00000000 DCD ||.bss||
|L8.256|
000100 00000000 DCD ||.data||
|L8.260|
000104 44726976 DCB "Driv"
000108 6572204e DCB "er N"
00010c 616d6520 DCB "ame "
000110 49733a20 DCB "Is: "
000114 00000000 DCB "\0\0\0\0"
|L8.280|
000118 25630000 DCB "%c\0\0"
|L8.284|
00011c 0d0a0000 DCB "\r\n\0\0"
AREA ||i.FAT_FileRead||, CODE, READONLY, ALIGN=2
FAT_FileRead PROC
;;;499 void FAT_FileRead(u32 start,u32 length, u8* buff)
;;;500 {
000000 e92d47f0 PUSH {r4-r10,lr}
;;;501 u16 BytePerClus;//, ClusNum;
;;;502 u8 *data = buff;
;;;503 BytePerClus = BPB_SecPerClus * 512; // 每簇的字节数
000004 f8df90a0 LDR r9,|L9.168|
000008 000e MOVS r6,r1 ;500
00000a f8991001 LDRB r1,[r9,#1] ; BPB_SecPerClus
00000e 4614 MOV r4,r2 ;502
000010 ea4f6141 LSL r1,r1,#25
000014 ea4f4711 LSR r7,r1,#16
;;;504
;;;505 if(length == 0)
000018 d044 BEQ |L9.164|
;;;506 return;
;;;507
;;;508 FileIndex.SecOff = (start % BytePerClus) / 512; //开始位置所在扇区簇内偏移
00001a fbb0f1f7 UDIV r1,r0,r7
00001e fb070011 MLS r0,r7,r1,r0
000022 0a41 LSRS r1,r0,#9
000024 4d21 LDR r5,|L9.172|
;;;509 FileIndex.ByteOff = (start % BytePerClus) % 512; //开始位置扇区内偏移
000026 f3c00008 UBFX r0,r0,#0,#9
00002a 6069 STR r1,[r5,#4] ;508 ; FileIndex
00002c 8028 STRH r0,[r5,#0] ; FileIndex
;;;510
;;;511 FileIndex.LBA = ClusConvLBA(FileIndex.ClusID) + FileIndex.SecOff; //开始位置所在的扇区号
00002e 8868 LDRH r0,[r5,#2] ; FileIndex
000030 f7fffffe BL ClusConvLBA
000034 6869 LDR r1,[r5,#4] ; FileIndex
000036 4408 ADD r0,r0,r1
000038 60a8 STR r0,[r5,#8] ; FileIndex
;;;512
;;;513 ReadBlock(FileIndex.LBA); //预读取一个扇区的内容
00003a f7fffffe BL ReadBlock
00003e f04f0800 MOV r8,#0
000042 f44f7a00 MOV r10,#0x200
000046 e01f B |L9.136|
|L9.72|
;;;514
;;;515 goto FAT_FileRead_Start;
;;;516
;;;517 while(1)
;;;518 {
;;;519 while(FileIndex.SecOff < BPB_SecPerClus)
;;;520 {
;;;521 ReadBlock(FileIndex.LBA);
000048 f7fffffe BL ReadBlock
;;;522 FileIndex.ByteOff = 0;
00004c f8a58000 STRH r8,[r5,#0] ; FileIndex
|L9.80|
;;;523 FAT_FileRead_Start:
;;;524 while(FileIndex.ByteOff < 512)
;;;525 {
;;;526 *data++ = BUFFER[FileIndex.ByteOff];
000050 8828 LDRH r0,[r5,#0] ; FileIndex
000052 4917 LDR r1,|L9.176|
000054 5c08 LDRB r0,[r1,r0]
000056 f8040b01 STRB r0,[r4],#1
;;;527 FileIndex.ByteOff++;
00005a 8828 LDRH r0,[r5,#0] ; FileIndex
00005c 1c40 ADDS r0,r0,#1
00005e 8028 STRH r0,[r5,#0] ; FileIndex
;;;528 FileIndex.HaveReadByte++;
000060 68e8 LDR r0,[r5,#0xc] ; FileIndex
000062 1c40 ADDS r0,r0,#1
;;;529 if(FileIndex.HaveReadByte % BytePerClus == 0)
000064 fbb0f1f7 UDIV r1,r0,r7
000068 60e8 STR r0,[r5,#0xc] ;528 ; FileIndex
00006a fb070011 MLS r0,r7,r1,r0
00006e b948 CBNZ r0,|L9.132|
;;;530 {
;;;531 FileIndex.ClusID = ReadFAT(FileIndex.ClusID); //下一簇簇号
000070 8868 LDRH r0,[r5,#2] ; FileIndex
000072 f7fffffe BL ReadFAT
000076 8068 STRH r0,[r5,#2] ; FileIndex
;;;532 FileIndex.LBA = ClusConvLBA(FileIndex.ClusID);
000078 b280 UXTH r0,r0
00007a f7fffffe BL ClusConvLBA
00007e 60a8 STR r0,[r5,#8] ; FileIndex
;;;533 FileIndex.SecOff = 0;
000080 f8c58004 STR r8,[r5,#4] ; FileIndex
|L9.132|
;;;534 }
;;;535 //如果读取完成就退出
;;;536 if(--length == 0)
000084 1e76 SUBS r6,r6,#1
000086 d00d BEQ |L9.164|
|L9.136|
000088 8828 LDRH r0,[r5,#0] ;524 ; FileIndex
00008a 4550 CMP r0,r10 ;524
00008c d3e0 BCC |L9.80|
;;;537 return;
;;;538 }
;;;539 FileIndex.LBA++;
00008e 68a8 LDR r0,[r5,#8] ; FileIndex
000090 1c40 ADDS r0,r0,#1
000092 60a8 STR r0,[r5,#8] ; FileIndex
;;;540 FileIndex.SecOff++;
000094 6869 LDR r1,[r5,#4] ; FileIndex
000096 1c49 ADDS r1,r1,#1
000098 6069 STR r1,[r5,#4] ; FileIndex
00009a f8992001 LDRB r2,[r9,#1]
|L9.158|
00009e 4291 CMP r1,r2 ;519
0000a0 d2fd BCS |L9.158|
0000a2 e7d1 B |L9.72|
|L9.164|
;;;541 }
;;;542 }
;;;543 }
0000a4 e8bd87f0 POP {r4-r10,pc}
ENDP
|L9.168|
0000a8 00000000 DCD ||.data||
|L9.172|
0000ac 00000200 DCD ||.bss||+0x200
|L9.176|
0000b0 00000000 DCD ||.bss||
AREA ||i.ReadBlock||, CODE, READONLY, ALIGN=2
ReadBlock PROC
000000 0241 LSLS r1,r0,#9
000002 f44f7200 MOV r2,#0x200
000006 4801 LDR r0,|L10.12|
000008 f7ffbffe B.W MSD_ReadBlock
ENDP
|L10.12|
00000c 00000000 DCD ||.bss||
AREA ||i.IsEqual||, CODE, READONLY, ALIGN=1
IsEqual PROC
000000 b530 PUSH {r4,r5,lr}
000002 2300 MOVS r3,#0
000004 e007 B |L11.22|
|L11.6|
000006 5cc4 LDRB r4,[r0,r3]
000008 5ccd LDRB r5,[r1,r3]
00000a 42ac CMP r4,r5
00000c d001 BEQ |L11.18|
00000e 2000 MOVS r0,#0
000010 bd30 POP {r4,r5,pc}
|L11.18|
000012 1c5b ADDS r3,r3,#1
000014 b2db UXTB r3,r3
|L11.22|
000016 4293 CMP r3,r2
000018 d3f5 BCC |L11.6|
00001a 2001 MOVS r0,#1
00001c bd30 POP {r4,r5,pc}
ENDP
AREA ||i.ClusConvLBA||, CODE, READONLY, ALIGN=2
ClusConvLBA PROC
000000 b510 PUSH {r4,lr}
000002 4604 MOV r4,r0
000004 f7fffffe BL DataStartSec
000008 4902 LDR r1,|L12.20|
00000a 1ea4 SUBS r4,r4,#2
00000c 7849 LDRB r1,[r1,#1] ; BPB_SecPerClus
00000e fb010004 MLA r0,r1,r4,r0
000012 bd10 POP {r4,pc}
ENDP
|L12.20|
000014 00000000 DCD ||.data||
AREA ||i.LBAConvClus||, CODE, READONLY, ALIGN=2
LBAConvClus PROC
000000 b510 PUSH {r4,lr}
000002 4604 MOV r4,r0
000004 f7fffffe BL DataStartSec
000008 4903 LDR r1,|L13.24|
00000a 1a20 SUBS r0,r4,r0
00000c 7849 LDRB r1,[r1,#1] ; BPB_SecPerClus
00000e fbb0f0f1 UDIV r0,r0,r1
000012 1c80 ADDS r0,r0,#2
000014 b280 UXTH r0,r0
000016 bd10 POP {r4,pc}
ENDP
|L13.24|
000018 00000000 DCD ||.data||
AREA ||i.ReadFAT||, CODE, READONLY, ALIGN=2
ReadFAT PROC
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
000004 4807 LDR r0,|L14.36|
000006 4c06 LDR r4,|L14.32|
000008 6901 LDR r1,[r0,#0x10] ; RelativeSectors
00000a 8880 LDRH r0,[r0,#4] ; BPB_RsvdSecCnt
00000c 4408 ADD r0,r0,r1
00000e eb002015 ADD r0,r0,r5,LSR #8
000012 f7fffffe BL ReadBlock
000016 b2e8 UXTB r0,r5
000018 f8340010 LDRH r0,[r4,r0,LSL #1]
00001c bd70 POP {r4-r6,pc}
ENDP
00001e 0000 DCW 0x0000
|L14.32|
000020 00000000 DCD ||.bss||
|L14.36|
000024 00000000 DCD ||.data||
AREA ||i.DataStartSec||, CODE, READONLY, ALIGN=2
DataStartSec PROC
000000 b500 PUSH {lr}
000002 f7fffffe BL DirStartSec
000006 4902 LDR r1,|L15.16|
000008 88c9 LDRH r1,[r1,#6] ; BPB_RootEntCnt
00000a eb001011 ADD r0,r0,r1,LSR #4
00000e bd00 POP {pc}
ENDP
|L15.16|
000010 00000000 DCD ||.data||
AREA ||.data||, DATA, ALIGN=2
SystemID
000000 00 DCB 0x00
BPB_SecPerClus
000001 00 DCB 0x00
BPB_NumFATs
000002 0000 DCB 0x00,0x00
BPB_RsvdSecCnt
000004 0000 DCB 0x00,0x00
BPB_RootEntCnt
000006 0000 DCB 0x00,0x00
BPB_TotSec16
000008 0000 DCB 0x00,0x00
BPB_FATSz16
00000a 0000 DCB 0x00,0x00
BPB_BytesPerSec
00000c 00000000 DCB 0x00,0x00,0x00,0x00
RelativeSectors
000010 00000000 DCD 0x00000000
TotalSectors
000014 00000000 DCD 0x00000000
BPB_HiddSec
000018 00000000 DCD 0x00000000
AREA ||.bss||, DATA, NOINIT, ALIGN=0
BUFFER
% 512
FileIndex
% 16
AREA |area_number.18|, DATA, ALIGN=1
EXPORTAS |area_number.18|, ||.data||
ClusterNum
000000 0000 DCB 0x00,0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -