⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfsa_internal.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   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 + -