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

📄 fat.lis

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module fat.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
                        .area data(ram, con, rel)
 0000                   .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
 0000           _old_pos_a::
 0000                   .blkb 2
                        .area idata
 0000 0000              .word 0
                        .area data(ram, con, rel)
 0002                   .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
 0002                   .dbsym e old_pos_a _old_pos_a i
                        .area lit(rom, con, rel)
 0000           _Search_FileExName1::
 0000 4D50              .byte 'M,'P
 0002 33                .byte 51
 0003                   .dbsym e Search_FileExName1 _Search_FileExName1 A[3:3]kc
                        .area text(rom, con, rel)
 0000                   .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
 0000                   .dbfunc e fat_root_dir_addr _fat_root_dir_addr fl
 0000                   .dbstruct 0 62 BootSec
 0000                   .dbfield 0 BS_jmpBoot A[3:3]c
 0000                   .dbfield 3 BS_OEMName A[8:8]c
 0000                   .dbfield 11 BPB_BytesPerSec i
 0000                   .dbfield 13 BPB_SecPerClus c
 0000                   .dbfield 14 BPB_RsvdSecCnt i
 0000                   .dbfield 16 BPB_NumFATs c
 0000                   .dbfield 17 BPB_RootEntCnt i
 0000                   .dbfield 19 BPB_TotSec16 i
 0000                   .dbfield 21 BPB_Media c
 0000                   .dbfield 22 BPB_FATSz16 i
 0000                   .dbfield 24 BPB_SecPerTrk i
 0000                   .dbfield 26 BPB_NumHeads i
 0000                   .dbfield 28 BPB_HiddSec l
 0000                   .dbfield 32 BPB_TotSec32 l
 0000                   .dbfield 36 BPB_PhyDriNum c
 0000                   .dbfield 37 BPB_Rsvd1 c
 0000                   .dbfield 38 BPB_ExtBootSig c
 0000                   .dbfield 39 BPB_VolumeSer l
 0000                   .dbfield 43 BPB_VolumeLab A[11:11]c
 0000                   .dbfield 54 BPB_SysID A[8:8]c
 0000                   .dbend
 0000                   .dbstruct 0 90 BootSec32
 0000                   .dbfield 0 BS_jmpBoot A[3:3]c
 0000                   .dbfield 3 BS_OEMName A[8:8]c
 0000                   .dbfield 11 BPB_BytesPerSec i
 0000                   .dbfield 13 BPB_SecPerClus c
 0000                   .dbfield 14 BPB_RsvdSecCnt i
 0000                   .dbfield 16 BPB_NumFATs c
 0000                   .dbfield 17 BPB_RootEntCnt i
 0000                   .dbfield 19 BPB_TotSec16 i
 0000                   .dbfield 21 BPB_Media c
 0000                   .dbfield 22 BPB_FATSz16 i
 0000                   .dbfield 24 BPB_SecPerTrk i
 0000                   .dbfield 26 BPB_NumHeads i
 0000                   .dbfield 28 BPB_HiddSec l
 0000                   .dbfield 32 BPB_TotSec32 l
 0000                   .dbfield 36 BPB_FATSz32 l
 0000                   .dbfield 40 BPB_ExtFlag i
 0000                   .dbfield 42 BPB_FileSysVer i
 0000                   .dbfield 44 BPB_RootCluNum l
 0000                   .dbfield 48 BPB_FileSysInf i
 0000                   .dbfield 50 BPB_BootBack i
 0000                   .dbfield 52 BPB_Rsvd A[12:12]c
 0000                   .dbfield 64 BPB_PhyDriNum c
 0000                   .dbfield 65 BPB_Rsvd1 c
 0000                   .dbfield 66 BPB_ExtBootSig c
 0000                   .dbfield 67 BPB_VolumeSer l
 0000                   .dbfield 71 BPB_VolumeLab A[11:11]c
 0000                   .dbfield 82 BPB_SysID A[8:8]c
 0000                   .dbend
 0000           ;         VBRadd -> R12,R13
 0000           ;        bootp32 -> R14,R15
 0000           ;          bootp -> R10,R11
 0000           ;           buff -> R14,R15
                        .even
 0000           _fat_root_dir_addr::
 0000 0E940000          xcall push_xgsetF0FC
 0004 7801              movw R14,R16
 0006 2297              sbiw R28,2
 0008                   .dbline -1
 0008                   .dbline 22
 0008           ; #include "fat.h"
 0008           ; #include "mmc.h"
 0008           ; 
 0008           ; //每扇区的字节数目
 0008           ; unsigned int    BlockSize;            //每扇区的字节数,一般为512
 0008           ; unsigned long fat_offset;             ////FAT1的起始扇区号
 0008           ; unsigned long data_offset;    //数据区的起始扇区数,FAT32的根目录区和数据区重合:
 0008           ; unsigned char FatFlags;               //FAT类型:FAT32,FAT16,FAT12
 0008           ; unsigned long blocknow;
 0008           ; unsigned char SecPerClus;             //每个簇占用的扇区数目,1GB的SD卡应为8
 0008           ; unsigned char   *pointer_FDT;
 0008           ; unsigned long   FirstRootDirSecNum;  //根目录区(FDT)的起始扇区号
 0008           ; unsigned int    old_pos_a=0;
 0008           ; unsigned long   old_pos_blk;
 0008           ; 
 0008           ; const unsigned char Search_FileExName1[3]={'M','P','3'};      //要查找的是TXT文件,可以改成其它的
 0008           ; 
 0008           ; //############################################################################
 0008           ; //从BPB中获取根目录区的起始地址,同时判断FAT制式(判定方法不可靠,不是微软推荐的)
 0008           ; unsigned long fat_root_dir_addr(unsigned char *buff) 
 0008           ; //############################################################################
 0008           ; {
 0008                   .dbline 27
 0008           ;       struct BootSec *bootp;                  //FAT16 BPB
 0008           ;       struct BootSec32 *bootp32;              //FAT32 BPB
 0008           ;       unsigned int    VBRadd;                 //DBR起始扇区号,在它之前都是磁盘分区信息占用的扇区数目
 0008           ; 
 0008           ;       MMC_SD_ReadSingleBlock(BIOS_PARAMETER_BLOCK,buff);   //读取BPB/MBR
 0008 F982              std y+1,R15
 000A E882              std y+0,R14
 000C 00E0              ldi R16,0
 000E 10E0              ldi R17,0
 0010 20E0              ldi R18,0
 0012 30E0              ldi R19,0
 0014 0E940000          xcall _MMC_SD_ReadSingleBlock
 0018                   .dbline 28
 0018           ;       if(buff[0] != 0xEB || buff[0] != 0xE9)    //buff[0]!=0xEB,0xE9,this is mbr //我们的SD卡应该是这一种
 0018 F701              movw R30,R14
 001A 2080              ldd R2,z+0
 001C 3324              clr R3
 001E 822D              mov R24,R2
 0020 8B3E              cpi R24,235
 0022 11F4              brne L4
 0024           X0:
 0024 893E              cpi R24,233
 0026 89F0              breq L2
 0028           X1:
 0028           L4:
 0028                   .dbline 29
 0028           ;       {
 0028                   .dbline 30
 0028           ;               VBRadd = buff[VBR_ADDR] + (buff[VBR_ADDR + 1])*256;     //real BPB address
 0028 F701              movw R30,R14
 002A E953              subi R30,57  ; addi 455
 002C FE4F              sbci R31,254
 002E 2081              ldd R18,z+0
 0030 3327              clr R19
 0032 00E0              ldi R16,256
 0034 11E0              ldi R17,1
 0036 0E940000          xcall empy16s
 003A F701              movw R30,R14
 003C EA53              subi R30,58  ; addi 454
 003E FE4F              sbci R31,254
 0040 C080              ldd R12,z+0
 0042 DD24              clr R13
 0044 C00E              add R12,R16
 0046 D11E              adc R13,R17
 0048                   .dbline 31
 0048           ;       }
 0048 02C0              xjmp L3
 004A           L2:
 004A                   .dbline 33
 004A           ;       else     //  buff[0]==0xEB,mbr和DBR相同,都是从0扇区开始
 004A           ;       {
 004A                   .dbline 34
 004A           ;               VBRadd = 0;
 004A CC24              clr R12
 004C DD24              clr R13
 004E                   .dbline 35
 004E           ;       }
 004E           L3:
 004E                   .dbline 36
 004E           ;       MMC_SD_ReadSingleBlock(VBRadd,buff);            //重新再读取DBR
 004E F982              std y+1,R15
 0050 E882              std y+0,R14
 0052 8601              movw R16,R12
 0054 9701              movw R18,R14
 0056 2227              clr R18
 0058 3327              clr R19
 005A 0E940000          xcall _MMC_SD_ReadSingleBlock
 005E                   .dbline 38
 005E           ; 
 005E           ;       bootp=(struct BootSec *)buff;           //Fat16 的BPB 
 005E 5701              movw R10,R14
 0060                   .dbline 39
 0060           ;       bootp32=(struct BootSec32 *)buff;         //Fat32 的BPB
 0060                   .dbline 41
 0060           ; 
 0060           ;       if(bootp->BPB_RootEntCnt == 0)           //根据根目录下面项目数为0,确定是FAT32
 0060 F501              movw R30,R10
 0062 2188              ldd R2,z+17
 0064 3288              ldd R3,z+18
 0066 2220              tst R2
 0068 09F0              breq X4
 006A 4EC0              xjmp L5
 006C           X4:
 006C 3320              tst R3
 006E 09F0              breq X5
 0070 4BC0              xjmp L5
 0072           X5:
 0072           X2:
 0072                   .dbline 42
 0072           ;       {
 0072                   .dbline 43
 0072           ;               BlockSize=bootp32->BPB_BytesPerSec;             //获取每扇区字节数目                                                       
 0072 2384              ldd R2,z+11
 0074 3484              ldd R3,z+12
 0076 30921900          sts _BlockSize+1,R3
 007A 20921800          sts _BlockSize,R2
 007E                   .dbline 44
 007E           ;               FatFlags = FAT_Flg_32;  //Fat32文件系统
 007E 82E0              ldi R24,2
 0080 80930F00          sts _FatFlags,R24
 0084                   .dbline 45
 0084           ;               fat_offset = bootp32->BPB_RsvdSecCnt + VBRadd;  //FAT1的起始扇区号
 0084 2684              ldd R2,z+14
 0086 3784              ldd R3,z+15
 0088 2C0C              add R2,R12
 008A 3D1C              adc R3,R13
 008C 4424              clr R4
 008E 5524              clr R5
 0090 30921500          sts _fat_offset+1,R3
 0094 20921400          sts _fat_offset,R2
 0098 50921700          sts _fat_offset+2+1,R5
 009C 40921600          sts _fat_offset+2,R4
 00A0                   .dbline 47
 00A0           ;               //根目录区(FDT)的起始扇区号=保留扇区+FAT占用扇区:
 00A0           ;               FirstRootDirSecNum=VBRadd+(bootp32->BPB_RsvdSecCnt+(bootp32->BPB_NumFATs*bootp32->BPB_FATSz32));
 00A0 24A0              ldd R2,z+36
 00A2 35A0              ldd R3,z+37
 00A4 46A0              ldd R4,z+38
 00A6 57A0              ldd R5,z+39
 00A8 0089              ldd R16,z+16
 00AA 1127              clr R17
 00AC 2227              clr R18
 00AE 3327              clr R19
 00B0 5A92              st -y,R5
 00B2 4A92              st -y,R4
 00B4 3A92              st -y,R3
 00B6 2A92              st -y,R2
 00B8 0E940000          xcall empy32u
 00BC F701              movw R30,R14
 00BE 2684              ldd R2,z+14
 00C0 3784              ldd R3,z+15
 00C2 4424              clr R4
 00C4 5524              clr R5
 00C6 200E              add R2,R16
 00C8 311E              adc R3,R17
 00CA 421E              adc R4,R18
 00CC 531E              adc R5,R19
 00CE 3601              movw R6,R12
 00D0 8824              clr R8
 00D2 9924              clr R9
 00D4 620C              add R6,R2
 00D6 731C              adc R7,R3
 00D8 841C              adc R8,R4
 00DA 951C              adc R9,R5
 00DC 70920500          sts _FirstRootDirSecNum+1,R7
 00E0 60920400          sts _FirstRootDirSecNum,R6
 00E4 90920700          sts _FirstRootDirSecNum+2+1,R9
 00E8 80920600          sts _FirstRootDirSecNum+2,R8
 00EC                   .dbline 48
 00EC           ;               SecPerClus = bootp32->BPB_SecPerClus;   //每个簇占用的扇区数目,SD卡应为8
 00EC 2584              ldd R2,z+13
 00EE 20920A00          sts _SecPerClus,R2
 00F2                   .dbline 50
 00F2           ;           //数据区的起始扇区数,FAT32的根目录区和数据区重合:
 00F2           ;               data_offset = FirstRootDirSecNum;       
 00F2 1301              movw R2,R6
 00F4 2401              movw R4,R8
 00F6 30921100          sts _data_offset+1,R3
 00FA 20921000          sts _data_offset,R2
 00FE 50921300          sts _data_offset+2+1,R5
 0102 40921200          sts _data_offset+2,R4
 0106                   .dbline 51
 0106           ;       }
 0106 54C0              xjmp L6
 0108           L5:
 0108                   .dbline 53
 0108           ;       else    //FAT16或者FAT12文件系统
 0108           ;       {
 0108                   .dbline 54
 0108           ;           BlockSize=bootp->BPB_BytesPerSec;           //获取每扇区字节数目    
 0108 F501              movw R30,R10
 010A 2384              ldd R2,z+11
 010C 3484              ldd R3,z+12
 010E 30921900          sts _BlockSize+1,R3
 0112 20921800          sts _BlockSize,R2
 0116                   .dbline 55
 0116           ;               if(bootp->BPB_SysID[4] == '2')  //根据扩展FAT12/FAT16的系统ID部分,判断
 0116 82AD              ldd R24,z+58
 0118 8233              cpi R24,50
 011A 21F4              brne L7
 011C           X3:
 011C                   .dbline 56
 011C           ;                       FatFlags = FAT_Flg_12;          //FAT12
 011C 2224              clr R2
 011E 20920F00          sts _FatFlags,R2
 0122 03C0              xjmp L8
 0124           L7:
 0124                   .dbline 58
 0124           ;               else
 0124           ;                       FatFlags = FAT_Flg_16;          //FAT16
 0124 81E0              ldi R24,1
 0126 80930F00          sts _FatFlags,R24
 012A           L8:
 012A                   .dbline 59
 012A           ;               fat_offset = bootp->BPB_RsvdSecCnt + VBRadd;
 012A F501              movw R30,R10
 012C 2684              ldd R2,z+14
 012E 3784              ldd R3,z+15
 0130 2C0C              add R2,R12
 0132 3D1C              adc R3,R13
 0134 4424              clr R4
 0136 5524              clr R5
 0138 30921500          sts _fat_offset+1,R3
 013C 20921400          sts _fat_offset,R2
 0140 50921700          sts _fat_offset+2+1,R5
 0144 40921600          sts _fat_offset+2,R4
 0148                   .dbline 61
 0148           ;               //根目录区(FDT)的起始扇区号=保留扇区+FAT占用扇区:
 0148           ;               FirstRootDirSecNum=VBRadd+(bootp->BPB_RsvdSecCnt+(bootp->BPB_NumFATs*bootp->BPB_FATSz16));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -