📄 fat16.lst
字号:
\ 0000001A .... LDR R2,??DataTable25 ;; ClusterBuffer
\ 0000001C 0028 CMP R0,#+0
\ 0000001E 03D0 BEQ ??FlushFAT_0
\ ??FlushFAT_1:
\ 00000020 401E SUB R0,R0,#+1
\ 00000022 0B5C LDRB R3,[R1, R0]
\ 00000024 1354 STRB R3,[R2, R0]
\ 00000026 FBD1 BNE ??FlushFAT_1
\ ??FlushFAT_0:
\ 00000028 .... LDR R0,??DataTable14 ;; fat_get + 48
\ 0000002A 0668 LDR R6,[R0, #+0]
\ 0000002C 11E0 B ??FlushFAT_2
274
275 for(i=FirstDirSector;i<SectorsPerCluster;i++)
276 {
277 mmc_read_page(0,i,SectorBuffer);
\ ??FlushFAT_3:
\ 0000002E 2A1C MOV R2,R5
\ 00000030 311C MOV R1,R6
\ 00000032 0020 MOV R0,#+0
\ 00000034 ........ _BLF mmc_read_page,??mmc_read_page??rT
278 memcpy(ClusterBuffer[i],SectorBuffer,BytesPerSector);
\ 00000038 .... LDR R0,??DataTable23 ;; fat_get + 32
\ 0000003A 0068 LDR R0,[R0, #+0]
\ 0000003C .... LDR R1,??DataTable24 ;; ClusterBuffer + 16384
\ 0000003E 7202 LSL R2,R6,#+9
\ 00000040 .... LDR R3,??DataTable25 ;; ClusterBuffer
\ 00000042 9A18 ADD R2,R3,R2
\ 00000044 0028 CMP R0,#+0
\ 00000046 03D0 BEQ ??FlushFAT_4
\ ??FlushFAT_5:
\ 00000048 401E SUB R0,R0,#+1
\ 0000004A 0B5C LDRB R3,[R1, R0]
\ 0000004C 1354 STRB R3,[R2, R0]
\ 0000004E FBD1 BNE ??FlushFAT_5
279 }
\ ??FlushFAT_4:
\ 00000050 761C ADD R6,R6,#+1
\ ??FlushFAT_2:
\ 00000052 .... LDR R0,??DataTable26 ;; fat_get + 40
\ 00000054 0068 LDR R0,[R0, #+0]
\ 00000056 8642 CMP R6,R0
\ 00000058 E9D3 BCC ??FlushFAT_3
\ 0000005A 0023 MOV R3,#+0
\ 0000005C 1EE0 B ??FlushFAT_6
280 for(i=0;i<FATsectors;i++)
281 {
282 for(j=0;j<256;j++)
\ ??FlushFAT_7:
\ 0000005E 0020 MOV R0,#+0
283 {
284 SectorBuffer[j*2]=(FatCache[i*256+j])%256;
\ ??FlushFAT_8:
\ 00000060 1D02 LSL R5,R3,#+8
\ 00000062 2D18 ADD R5,R5,R0
\ 00000064 AD00 LSL R5,R5,#+2
\ 00000066 5559 LDR R5,[R2, R5]
\ 00000068 8E01 LSL R6,R1,#+6
\ 0000006A 4700 LSL R7,R0,#+1
\ 0000006C E719 ADD R7,R4,R7
\ 0000006E BE19 ADD R6,R7,R6
\ 00000070 3570 STRB R5,[R6, #+0]
285 SectorBuffer[j*2+1]=(FatCache[i*256+j])>>8;
\ 00000072 2D0A LSR R5,R5,#+8
\ 00000074 7570 STRB R5,[R6, #+1]
286 }
\ 00000076 401C ADD R0,R0,#+1
\ 00000078 8842 CMP R0,R1
\ 0000007A F1DB BLT ??FlushFAT_8
287 memcpy(ClusterBuffer[i+FirstFATSector],SectorBuffer,BytesPerSector);
\ 0000007C .... LDR R0,??DataTable23 ;; fat_get + 32
\ 0000007E 0068 LDR R0,[R0, #+0]
\ 00000080 .... LDR R1,??DataTable24 ;; ClusterBuffer + 16384
\ 00000082 274A LDR R2,??FlushFAT_9 ;; fat_get + 44
\ 00000084 1268 LDR R2,[R2, #+0]
\ 00000086 9A18 ADD R2,R3,R2
\ 00000088 5202 LSL R2,R2,#+9
\ 0000008A .... LDR R5,??DataTable25 ;; ClusterBuffer
\ 0000008C AA18 ADD R2,R5,R2
\ 0000008E 0028 CMP R0,#+0
\ 00000090 03D0 BEQ ??FlushFAT_10
\ ??FlushFAT_11:
\ 00000092 401E SUB R0,R0,#+1
\ 00000094 0D5C LDRB R5,[R1, R0]
\ 00000096 1554 STRB R5,[R2, R0]
\ 00000098 FBD1 BNE ??FlushFAT_11
288 }
\ ??FlushFAT_10:
\ 0000009A 5B1C ADD R3,R3,#+1
\ ??FlushFAT_6:
\ 0000009C 8021 MOV R1,#+128
\ 0000009E 4900 LSL R1,R1,#+1 ;; #+256
\ 000000A0 .... LDR R2,??DataTable33 ;; FatCache
\ 000000A2 2048 LDR R0,??FlushFAT_9+0x4 ;; fat_get + 36
\ 000000A4 0068 LDR R0,[R0, #+0]
\ 000000A6 8342 CMP R3,R0
\ 000000A8 D9D3 BCC ??FlushFAT_7
289 for(i=0;i<FATsectors;i++)//backup FAT field
\ 000000AA 0023 MOV R3,#+0
\ 000000AC 20E0 B ??FlushFAT_12
290 {
291 for(j=0;j<256;j++)
292 {
293 SectorBuffer[j*2]=(FatCache[i*256+j])%256;
\ ??FlushFAT_13:
\ 000000AE 1D02 LSL R5,R3,#+8
\ 000000B0 2D18 ADD R5,R5,R0
\ 000000B2 AD00 LSL R5,R5,#+2
\ 000000B4 5559 LDR R5,[R2, R5]
\ 000000B6 8E01 LSL R6,R1,#+6
\ 000000B8 4700 LSL R7,R0,#+1
\ 000000BA E719 ADD R7,R4,R7
\ 000000BC BE19 ADD R6,R7,R6
\ 000000BE 3570 STRB R5,[R6, #+0]
294 SectorBuffer[j*2+1]=(FatCache[i*256+j])>>8;
\ 000000C0 2D0A LSR R5,R5,#+8
\ 000000C2 7570 STRB R5,[R6, #+1]
295 }
\ 000000C4 401C ADD R0,R0,#+1
\ 000000C6 8842 CMP R0,R1
\ 000000C8 F1DB BLT ??FlushFAT_13
296 memcpy(ClusterBuffer[i+FirstFATSector+FATsectors],SectorBuffer,BytesPerSector);
\ 000000CA .... LDR R0,??DataTable23 ;; fat_get + 32
\ 000000CC 0668 LDR R6,[R0, #+0]
\ 000000CE .... LDR R0,??DataTable24 ;; ClusterBuffer + 16384
\ 000000D0 134D LDR R5,??FlushFAT_9 ;; fat_get + 44
\ 000000D2 2D68 LDR R5,[R5, #+0]
\ 000000D4 5D19 ADD R5,R3,R5
\ 000000D6 134F LDR R7,??FlushFAT_9+0x4 ;; fat_get + 36
\ 000000D8 3F68 LDR R7,[R7, #+0]
\ 000000DA ED19 ADD R5,R5,R7
\ 000000DC 6D02 LSL R5,R5,#+9
\ 000000DE .... LDR R7,??DataTable25 ;; ClusterBuffer
\ 000000E0 7D19 ADD R5,R7,R5
\ 000000E2 002E CMP R6,#+0
\ 000000E4 03D0 BEQ ??FlushFAT_14
\ ??FlushFAT_15:
\ 000000E6 761E SUB R6,R6,#+1
\ 000000E8 875D LDRB R7,[R0, R6]
\ 000000EA AF55 STRB R7,[R5, R6]
\ 000000EC FBD1 BNE ??FlushFAT_15
297 }
\ ??FlushFAT_14:
\ 000000EE 5B1C ADD R3,R3,#+1
\ ??FlushFAT_12:
\ 000000F0 0C48 LDR R0,??FlushFAT_9+0x4 ;; fat_get + 36
\ 000000F2 0068 LDR R0,[R0, #+0]
\ 000000F4 8342 CMP R3,R0
\ 000000F6 0020 MOV R0,#+0
\ 000000F8 D9D3 BCC ??FlushFAT_13
298 Erase_MMC_Cluster(0);//写入之前,擦除当前簇;
\ 000000FA ........ _BLF Erase_MMC_Cluster,??Erase_MMC_Cluster??rT
299 for(i=0;i<SectorsPerCluster;i++)//一扇区接一扇区写入
\ 000000FE 0025 MOV R5,#+0
\ 00000100 06E0 B ??FlushFAT_16
300 {
301 for(j=0;j<255;j++);//延时
302 mmc_write_page(0,i,ClusterBuffer[i]);
\ ??FlushFAT_17:
\ 00000102 6802 LSL R0,R5,#+9
\ 00000104 2218 ADD R2,R4,R0
\ 00000106 291C MOV R1,R5
\ 00000108 0020 MOV R0,#+0
\ 0000010A ........ _BLF mmc_write_page,??mmc_write_page??rT
303 }
\ 0000010E 6D1C ADD R5,R5,#+1
\ ??FlushFAT_16:
\ 00000110 .... LDR R0,??DataTable26 ;; fat_get + 40
\ 00000112 0068 LDR R0,[R0, #+0]
\ 00000114 8542 CMP R5,R0
\ 00000116 F4D3 BCC ??FlushFAT_17
304 }
\ 00000118 F0BC POP {R4-R7}
\ 0000011A 01BC POP {R0}
\ 0000011C 0047 BX R0 ;; return
\ 0000011E C046 NOP
\ ??FlushFAT_9:
\ 00000120 ........ DC32 fat_get + 44
\ 00000124 ........ DC32 fat_get + 36
305
306 //The sector number of the first sector of that cluster.
307 //FirstSectorofCluster = ((N – 2) * BPB_SecPerClus) + FirstDataSector;
308 //Because No MBR,so: clust-1!
\ In segment CODE, align 4, keep-with-next
309 unsigned long FirstSectorofCluster(unsigned long clust)//数据存放的cluster转为sector
310 {
311 return ((clust-1) * SectorsPerCluster + FirstDataSector);
\ FirstSectorofCluster:
\ 00000000 .... LDR R1,??DataTable27 ;; fat_get
\ 00000002 401E SUB R0,R0,#+1
\ 00000004 8A6A LDR R2,[R1, #+40]
\ 00000006 5043 MUL R0,R2
\ 00000008 C969 LDR R1,[R1, #+28]
\ 0000000A 4018 ADD R0,R0,R1
\ 0000000C 7047 BX LR ;; return
312 }
313
314 // alloc a free cluster. policy is searching from prev cluster number, if no free cluster till end of fat, then search from head of fat.
315 // return a cluster number. 0xffff indicate faild, disk overflow.
316 // argument 0 : no prev cluster.
\ In segment CODE, align 4, keep-with-next
317 WORD AllocCluster(WORD PrevClusterNum)
318 {
\ AllocCluster:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 011C MOV R1,R0
319 static WORD LastAllocClusterNum=0;
320 WORD i;
321
322 if(LastAllocClusterNum == 0)
\ 00000004 ....
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -