📄 bfsa_internal.lst
字号:
\ 0000006C 391C MOV R1,R7
\ 0000006E 4143 MUL R1,R0
\ 00000070 02B4 PUSH {R1}
\ 00000072 9446 MOV R12,R2
\ 00000074 .... LDR R1,??DataTable20 ;; FlashBaseAdd
\ 00000076 0968 LDR R1,[R1, #+0]
\ 00000078 B21E SUB R2,R6,#+2
\ 0000007A 4243 MUL R2,R0
\ 0000007C 288A LDRH R0,[R5, #+16]
\ 0000007E 1018 ADD R0,R2,R0
\ 00000080 7843 MUL R0,R7
\ 00000082 0818 ADD R0,R1,R0
\ 00000084 6246 MOV R2,R12
\ 00000086 02BC POP {R1}
\ 00000088 ........ _BLF AT91F_Flash_Write_Address,??AT91F_Flash_Write_Address??rT
\ 0000008C 0028 CMP R0,#+0
\ 0000008E E4D1 BNE ??findFreeCluster_4
\ 00000090 2878 LDRB R0,[R5, #+0]
\ 00000092 0028 CMP R0,#+0
\ 00000094 BFD1 BNE ??findFreeCluster_1
\ 00000096 .... LDR R1,??DataTable21 ;; 0xff7
\ 00000098 BEE7 B ??findFreeCluster_2
405 }
406
407 /*****************************************************************
408 *
409 *
410 * S U B - R O U T I N E : getNextCluster
411 *
412 *-----------------------------------------------------------------
413 *
414 * int getNextCluster(USHORT uCurrent)
415 *
416 * Object :
417 * This function returns the next cluster from the FAT for the
418 * current cluster.
419 *
420 * Argument:
421 * uCurrent :[IN] current cluster.
422 *
423 * Return value :
424 * the next cluster if any,
425 * 0 if there is no more cluster in chain
426 * on error :
427 * BAD_ARGUMENT
428 *
429 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
430 ULONG getNextCluster(USHORT uCurrent)
431 {
\ getNextCluster:
\ 00000000 10B5 PUSH {R4,LR}
432 ULONG status = BFSA_SUCCESS;
433
434 if (uCurrent > BFSA_media.MaxCluster)
\ 00000002 .... LDR R4,??DataTable22 ;; BFSA_media
\ 00000004 6169 LDR R1,[R4, #+20]
\ 00000006 8142 CMP R1,R0
\ 00000008 01D2 BCS ??getNextCluster_0
435 {
436 status = BAD_ARGUMENT;
\ 0000000A .... LDR R0,??DataTable23 ;; 0x80000400
\ 0000000C 1AE0 B ??getNextCluster_1
437 }
438 else
439 {
440 status = readFatEntry(uCurrent);
\ ??getNextCluster_0:
\ 0000000E ........ BL readFatEntry
441
442 if( ((BFSA_media.FATtype == BFSA_FAT16)&&(status == EOC16 || status == 0xFFF8 || status == BAD16))
443 || ((BFSA_media.FATtype == BFSA_FAT12)&&(status == EOC12 || status == 0x0FF8 || status == BAD12)) )
\ 00000012 2178 LDRB R1,[R4, #+0]
\ 00000014 0129 CMP R1,#+1
\ 00000016 09D1 BNE ??getNextCluster_2
\ 00000018 .... LDR R1,??DataTable24 ;; 0xffff
\ 0000001A 8842 CMP R0,R1
\ 0000001C 11D0 BEQ ??getNextCluster_3
\ 0000001E C91F SUB R1,R1,#+7
\ 00000020 8842 CMP R0,R1
\ 00000022 0ED0 BEQ ??getNextCluster_3
\ 00000024 491E SUB R1,R1,#+1
\ 00000026 8842 CMP R0,R1
\ 00000028 0CD1 BNE ??getNextCluster_1
\ 0000002A 0AE0 B ??getNextCluster_3
\ ??getNextCluster_2:
\ 0000002C 0029 CMP R1,#+0
\ 0000002E 09D1 BNE ??getNextCluster_1
\ 00000030 .... LDR R1,??DataTable25 ;; 0xfff
\ 00000032 8842 CMP R0,R1
\ 00000034 05D0 BEQ ??getNextCluster_3
\ 00000036 C91F SUB R1,R1,#+7
\ 00000038 8842 CMP R0,R1
\ 0000003A 02D0 BEQ ??getNextCluster_3
\ 0000003C 491E SUB R1,R1,#+1
\ 0000003E 8842 CMP R0,R1
\ 00000040 00D1 BNE ??getNextCluster_1
444 {
445 // No more Cluster in chain
446 status = BFSA_SUCCESS;
\ ??getNextCluster_3:
\ 00000042 0020 MOV R0,#+0
447 }
448 }
449 return( status );
\ ??getNextCluster_1:
\ 00000044 .... B ?Subroutine15
450 }
451
452
453 /*****************************************************************
454 *
455 *
456 * S U B - R O U T I N E : isValidFileNameChar
457 *
458 *-----------------------------------------------------------------
459 *
460 * UCHAR isValidFileNameChar(char car)
461 *
462 * Object :
463 * This function returns TRUE if car is a valid character in a
464 * file name.
465 *
466 * Argument:
467 * car :[IN] character to test.
468 *
469 *****************************************************************/
470 #ifdef ADS_COMPIL
471 __inline
472 #else
\ In segment CODE, align 4, keep-with-next
473 inline
474 #endif
475 UCHAR isValidFileNameChar( char car )
476 {
\ isValidFileNameChar:
\ 00000000 011C MOV R1,R0
477 UCHAR status = TRUE;
\ 00000002 0120 MOV R0,#+1
478
479 // Invalid char
480 if( (car < 0x20) && (car != 0x05) )
\ 00000004 2029 CMP R1,#+32
\ 00000006 03D2 BCS ??isValidFileNameChar_0
\ 00000008 0529 CMP R1,#+5
\ 0000000A 07D0 BEQ ??isValidFileNameChar_1
481 {
482 status = FALSE;
\ ??isValidFileNameChar_2:
\ 0000000C 0020 MOV R0,#+0
\ 0000000E 05E0 B ??isValidFileNameChar_1
483 }
484 else
485 {
486 // Lower case not allowed
487 if( (car >='a') && (car <='z') )
\ ??isValidFileNameChar_0:
\ 00000010 6129 CMP R1,#+97
\ 00000012 05D3 BCC ??isValidFileNameChar_3
\ 00000014 7B29 CMP R1,#+123
\ 00000016 F9D3 BCC ??isValidFileNameChar_2
\ 00000018 7C29 CMP R1,#+124
\ 0000001A F7D0 BEQ ??isValidFileNameChar_2
488 {
489 status = FALSE;
490 }
491 else
492 {
493 // Invalid char
494 /* 0x22 : '"', 0x2A : '*', 0x2B : '+', 0x2C : ',', 0x2E : '.', 0x2F : '/' */
495 /* 0x3A : '', 0x3B : ';', 0x3C : '<', 0x3D : '=', 0x3E : '>', 0x3F : '?' */
496 /* 0x5B : '[', 0x5C : '\', 0x5D : ']', 0x7C : '|' */
497 if ( (car==0x22) || (car==0x2A) || (car==0x2B) || (car==0x2C) || (car==0x2E) || (car==0x2F)
498 || (car==0x3A) || (car==0x3B) || (car==0x3C) || (car==0x3D) || (car==0x3E) || (car==0x3F)
499 || (car==0x5B) || (car==0x5C) || (car==0x5D) || (car==0x7C) )
500 {
501 status = FALSE;
502 }
503 }
504
505 }
506 return( status );
\ ??isValidFileNameChar_1:
\ 0000001C 00B0 ADD SP,#+0
\ 0000001E 7047 BX LR ;; return
\ ??isValidFileNameChar_3:
\ 00000020 2229 CMP R1,#+34
\ 00000022 F3D0 BEQ ??isValidFileNameChar_2
\ 00000024 2A29 CMP R1,#+42
\ 00000026 F1D0 BEQ ??isValidFileNameChar_2
\ 00000028 2B29 CMP R1,#+43
\ 0000002A EFD0 BEQ ??isValidFileNameChar_2
\ 0000002C 2C29 CMP R1,#+44
\ 0000002E EDD0 BEQ ??isValidFileNameChar_2
\ 00000030 2E29 CMP R1,#+46
\ 00000032 EBD0 BEQ ??isValidFileNameChar_2
\ 00000034 2F29 CMP R1,#+47
\ 00000036 E9D0 BEQ ??isValidFileNameChar_2
\ 00000038 3A29 CMP R1,#+58
\ 0000003A E7D0 BEQ ??isValidFileNameChar_2
\ 0000003C 3B29 CMP R1,#+59
\ 0000003E E5D0 BEQ ??isValidFileNameChar_2
\ 00000040 3C29 CMP R1,#+60
\ 00000042 E3D0 BEQ ??isValidFileNameChar_2
\ 00000044 3D29 CMP R1,#+61
\ 00000046 E1D0 BEQ ??isValidFileNameChar_2
\ 00000048 3E29 CMP R1,#+62
\ 0000004A DFD0 BEQ ??isValidFileNameChar_2
\ 0000004C 3F29 CMP R1,#+63
\ 0000004E DDD0 BEQ ??isValidFileNameChar_2
\ 00000050 5B29 CMP R1,#+91
\ 00000052 DBD0 BEQ ??isValidFileNameChar_2
\ 00000054 5C29 CMP R1,#+92
\ 00000056 D9D0 BEQ ??isValidFileNameChar_2
\ 00000058 5D29 CMP R1,#+93
\ 0000005A DFD1 BNE ??isValidFileNameChar_1
\ 0000005C D6E7 B ??isValidFileNameChar_2
507 }
508
509 /*****************************************************************
510 *
511 *
512 * S U B - R O U T I N E : isValidFileName
513 *
514 *-----------------------------------------------------------------
515 *
516 * UCHAR isValidFileName(char *fileName)
517 *
518 * Object :
519 * This function returns TRUE if the file name is valid.
520 *
521 * Argument:
522 * fileName :[IN] file name string.
523 *
524 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
525 UCHAR isValidFileName(char *fileName)
526 {
\ isValidFileName:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
527 UCHAR _c;
528
529 if (!fileName)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -