📄 bfsa_internal.lst
字号:
\ 00000002 0024 MOV R4,#+0
144
145 for (_i=0; _i<BFSA_media.numFAT; _i++)
\ 00000004 0026 MOV R6,#+0
\ 00000006 124D LDR R5,??writeFAT_0 ;; BFSA_media
\ 00000008 00E0 B ??writeFAT_1
\ ??writeFAT_2:
\ 0000000A 761C ADD R6,R6,#+1
\ ??writeFAT_1:
\ 0000000C 3006 LSL R0,R6,#+24
\ 0000000E 000E LSR R0,R0,#+24
\ 00000010 6989 LDRH R1,[R5, #+10]
\ 00000012 8842 CMP R0,R1
\ 00000014 1AD2 BCS ??writeFAT_3
\ 00000016 6888 LDRH R0,[R5, #+2]
\ 00000018 2F89 LDRH R7,[R5, #+8]
\ 0000001A 391C MOV R1,R7
\ 0000001C 4143 MUL R1,R0
\ 0000001E 0D4A LDR R2,??writeFAT_0+0x4 ;; 0x401
\ 00000020 9142 CMP R1,R2
\ 00000022 00DB BLT ??writeFAT_4
\ 00000024 511E SUB R1,R2,#+1
\ ??writeFAT_4:
\ 00000026 0023 MOV R3,#+0
\ 00000028 .... LDR R2,??DataTable15 ;; BFSABuffer
\ 0000002A 02B4 PUSH {R1}
\ 0000002C 9446 MOV R12,R2
\ 0000002E EA88 LDRH R2,[R5, #+6]
\ 00000030 4243 MUL R2,R0
\ 00000032 .... LDR R1,??DataTable20 ;; FlashBaseAdd
\ 00000034 0968 LDR R1,[R1, #+0]
\ 00000036 5118 ADD R1,R2,R1
\ 00000038 7743 MUL R7,R6
\ 0000003A 4743 MUL R7,R0
\ 0000003C C819 ADD R0,R1,R7
\ 0000003E 6246 MOV R2,R12
\ 00000040 02BC POP {R1}
146 {
147 if( FALSE == AT91F_Flash_Write_Address(BFSA_media.FATSectStart*BFSA_media.bytesPerSector // Destination
148 + (ULONG) FlashBaseAdd
149 + (_i*BFSA_media.SectPerFAT*BFSA_media.bytesPerSector),
150 min(sizeofBFSA_fatBuff, BFSA_media.SectPerFAT*BFSA_media.bytesPerSector), // Size
151 (unsigned char*)BFSABuffer.BFSA_fatBuff, FALSE)) // Source
\ 00000042 ........ _BLF AT91F_Flash_Write_Address,??AT91F_Flash_Write_Address??rT
\ 00000046 0028 CMP R0,#+0
\ 00000048 DFD1 BNE ??writeFAT_2
152 {
153 status = MMC_ACCESS_ERROR;
\ 0000004A .... LDR R4,??DataTable7 ;; 0x80000100
154 break;
155 }
156 }
157 return status;
\ ??writeFAT_3:
\ 0000004C 201C MOV R0,R4
\ 0000004E .... B ?Subroutine16
\ ??writeFAT_0:
\ 00000050 ........ DC32 BFSA_media
\ 00000054 01040000 DC32 0x401
158 }
\ In segment CODE, align 4, keep-with-next
\ ?Subroutine16:
\ 00000000 F0BC POP {R4-R7}
\ 00000002 02BC POP {R1}
\ 00000004 0847 BX R1 ;; return
\ 00000006 C046 NOP
\ ??Subroutine16_0:
\ 00000008 ........ DC32 BFSA_current_dir + 102
159
160 /*****************************************************************
161 *
162 *
163 * S U B - R O U T I N E : readFatEntry
164 *
165 *-----------------------------------------------------------------
166 *
167 * USHORT readFatEntry(USHORT cluster)
168 *
169 * Object :
170 * This function returns the value of the FAT entry for the cluster number.
171 *
172 * Argument:
173 * cluster [IN] : cluster number.
174 *
175 * Return value :
176 * the value of the FAT entry for this cluster,
177 * 0x0FF7 if the cluster is over the max cluster number.
178 *
179 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
180 USHORT readFatEntry( USHORT cluster )
181 {
\ readFatEntry:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 011C MOV R1,R0
182 USHORT fatOffset;
183 USHORT fatEntry = (BFSA_media.FATtype == BFSA_FAT12?BAD12:BAD16); // Bad Cluster
\ 00000004 .... LDR R2,??DataTable22 ;; BFSA_media
\ 00000006 1478 LDRB R4,[R2, #+0]
\ 00000008 002C CMP R4,#+0
\ 0000000A 01D1 BNE ??readFatEntry_0
\ 0000000C .... LDR R0,??DataTable21 ;; 0xff7
\ 0000000E 00E0 B ??readFatEntry_1
\ ??readFatEntry_0:
\ 00000010 .... LDR R0,??DataTable17 ;; 0xfff7
184
185 if (cluster > BFSA_media.MaxCluster)
\ ??readFatEntry_1:
\ 00000012 5269 LDR R2,[R2, #+20]
\ 00000014 8A42 CMP R2,R1
\ 00000016 1AD3 BCC ??readFatEntry_2
186 {
187 TRACE_DEBUG_H( "dbg:PBcluster:0x%X\n\r",cluster);
188 }
189 else
190 {
191 if (BFSA_media.FATtype == BFSA_FAT12)
\ 00000018 .... LDR R2,??DataTable15 ;; BFSABuffer
\ 0000001A 8023 MOV R3,#+128
\ 0000001C DB00 LSL R3,R3,#+3 ;; #+1024
\ 0000001E 002C CMP R4,#+0
\ 00000020 11D1 BNE ??readFatEntry_3
192 {
193 // Divide the cluster number by 2, resulting in an integer quotient
194 // Add the same cluster number to this quotient, producing the offset of the cluster's entry in the FAT.
195 fatOffset = cluster + (cluster / 2);
\ 00000022 4C08 LSR R4,R1,#+1
\ 00000024 0C19 ADD R4,R1,R4
\ 00000026 2404 LSL R4,R4,#+16
\ 00000028 240C LSR R4,R4,#+16
196
197 // Pb with FAT > buffer of FAT
198 /* if( fatOffset > sizeofBFSA_fatBuff )
199 {
200 // Read next of FAT
201 po_memcpy( BFSA_fatBuff,
202 (void*)(BFSA_media.FATSectStart*BFSA_media.bytesPerSector + (ULONG)FlashBaseAdd+sizeof( BFSA_fatBuff ) ),
203 sizeofBFSA_fatBuff );
204 fatOffset -= sizeof( BFSA_fatBuff );
205 }
206 */
207
208 /*
209 if( fatOffset > sizeofBFSA_fatBuff )
210 {
211 AT91F_ReadMedia( (void*)(BFSA_media.FATSectStart*BFSA_media.bytesPerSector + (ULONG)FlashBaseAdd+sizeof( BFSA_fatBuff ),
212 sizeofBFSA_fatBuff ),
213 BFSA_fatBuff ) );
214 fatOffset -= sizeofBFSA_fatBuff );
215 }
216
217 */
218
219
220 if( fatOffset < sizeofBFSA_fatBuff )
\ 0000002A 9C42 CMP R4,R3
\ 0000002C 0FD2 BCS ??readFatEntry_2
221 {
222 fatEntry = BFSABuffer.BFSA_fatBuff[fatOffset]+BFSABuffer.BFSA_fatBuff[fatOffset+1]*0x100;
\ 0000002E 1019 ADD R0,R2,R4
\ 00000030 0278 LDRB R2,[R0, #+0]
\ 00000032 4078 LDRB R0,[R0, #+1]
\ 00000034 0002 LSL R0,R0,#+8
\ 00000036 1018 ADD R0,R2,R0
223
224 // Cluster is ODD or EVEN ?
225 if (cluster & 0x0001)
\ 00000038 C907 LSL R1,R1,#+31
\ 0000003A 02D5 BPL ??readFatEntry_4
226 {
227 // If the current cluster number is odd, keep the highest 12 bits of the 16-bit word.
228 fatEntry = fatEntry >> 4;
\ 0000003C 0004 LSL R0,R0,#+16
\ ??readFatEntry_5:
\ 0000003E 000D LSR R0,R0,#+20
\ 00000040 05E0 B ??readFatEntry_2
229 }
230 else
231 {
232 // If the current cluster number is even, keep the lowest 12 bits of the 16-bit word.
233 fatEntry = fatEntry & 0x0FFF;
\ ??readFatEntry_4:
\ 00000042 0005 LSL R0,R0,#+20
\ 00000044 FBE7 B ??readFatEntry_5
234 }
235 }
236 }
237 else
238 {
239 TRACE_DEBUG_L( "dbg:NO FAT 12\n\r");
240 if( (cluster*2) < sizeofBFSA_fatBuff )
\ ??readFatEntry_3:
\ 00000046 4900 LSL R1,R1,#+1
\ 00000048 9942 CMP R1,R3
\ 0000004A 00DA BGE ??readFatEntry_2
241 {
242 // In a 16-bit FAT, cluster n is represented by the entry at offset n * 2 in the table.
243 fatEntry = *((USHORT*) &BFSABuffer.BFSA_fatBuff[cluster*2]);
\ 0000004C 505A LDRH R0,[R2, R1]
\ ??readFatEntry_2:
\ 0000004E C046 NOP
244 }
245 }
246 }
247 return( fatEntry );
\ 00000050 REQUIRE ?Subroutine15
\ 00000050 ;; // Fall through to label ?Subroutine15
248 }
249
250 /*****************************************************************
251 *
252 *
253 * S U B - R O U T I N E : writeFatEntry
254 *
255 *-----------------------------------------------------------------
256 *
257 * USHORT writeFatEntry(USHORT cluster,USHORT value)
258 *
259 * Object :
260 * This function write a value to FAT entry for cluster
261 *
262 * Argument:
263 * cluster [IN] : cluster number.
264 * value [IN] : value.
265 *
266 * Return value :
267 * 0 on success,
268 * 0x0FF7 if the cluster is over the max cluster number.
269 *
270 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
271 ULONG writeFatEntry( USHORT cluster, USHORT value )
272 {
\ writeFatEntry:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 021C MOV R2,R0
273 USHORT fatOffset;
274 ULONG status = (BFSA_media.FATtype == BFSA_FAT12?BAD12:BAD16); // Bad Cluster
\ 00000004 .... LDR R3,??DataTable22 ;; BFSA_media
\ 00000006 1C78 LDRB R4,[R3, #+0]
\ 00000008 002C CMP R4,#+0
\ 0000000A 01D1 BNE ??writeFatEntry_0
\ 0000000C .... LDR R0,??DataTable21 ;; 0xff7
\ 0000000E 00E0 B ??writeFatEntry_1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -