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

📄 fat.lis

📁 用AVR的MP3代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module fat.c
                        .area data(ram, con, rel)
 0000           _LongNameBuffer::
 0000                   .blkw 1
                        .area idata
 0000 4300              .word _LONGNAME_BUFFER_ADDR
                        .area data(ram, con, rel)
 0002                   .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
 0002                   .dbsym e LongNameBuffer _LongNameBuffer pc
 0002           _DirNameBuffer::
 0002                   .blkw 1
                        .area idata
 0002 2500              .word _DIRNAME_BUFFER_ADDR
                        .area data(ram, con, rel)
 0004                   .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
 0004                   .dbsym e DirNameBuffer _DirNameBuffer pc
 0004           _FatInCache::
 0004                   .blkb 4
                        .area idata
 0004 00000000          .word 0,0
                        .area data(ram, con, rel)
 0008                   .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
 0008                   .dbsym e FatInCache _FatInCache l
                        .area text(rom, con, rel)
 0000                   .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
 0000                   .dbfunc e ReadBlock _ReadBlock fV
 0000           ;           temp -> y+0
 0000           ;            LBA -> y+4
                        .even
 0000           _ReadBlock::
 0000 0E940000          xcall push_arg4
 0004 2497              sbiw R28,4
 0006                   .dbline -1
 0006                   .dbline 34
 0006           ; /************************************************************/
 0006           ; /*                     FAT Code for   M32L                                        */
 0006           ; /*                               By   pasyong                                                         */
 0006           ; /*                               2006-4                                                                       */
 0006           ; /*                               Base ICC6.31A                                                */
 0006           ; /************************************************************/
 0006           ; #include <iom64v.h>
 0006           ; #include <macros.h>
 0006           ; #include <string.h>
 0006           ; #include "sd.h"
 0006           ; #include "fat.h"
 0006           ; #include "lcd.h"
 0006           ; 
 0006           ; 
 0006           ; extern uchar BUFFER[512];
 0006           ; unsigned char  LONGNAME_BUFFER_ADDR[30];
 0006           ; unsigned char  DIRNAME_BUFFER_ADDR[30];
 0006           ; unsigned char *LongNameBuffer =               (unsigned char *) LONGNAME_BUFFER_ADDR;
 0006           ; unsigned char *DirNameBuffer =                (unsigned char *) DIRNAME_BUFFER_ADDR;
 0006           ; struct partrecord PartInfo;
 0006           ; unsigned char Fat32Enabled;
 0006           ; unsigned long FirstDataSector;
 0006           ; unsigned int  BytesPerSector;
 0006           ; unsigned int  SectorsPerCluster;
 0006           ; unsigned long FirstFATSector;
 0006           ; unsigned long FirstDirSector;
 0006           ; unsigned long FileSize;
 0006           ; unsigned long FatInCache = 0;
 0006           ; 
 0006           ; //********************************************************************************************
 0006           ; //读一个扇区
 0006           ; void ReadBlock(unsigned long LBA)
 0006           ; //********************************************************************************************
 0006           ; {   unsigned long temp;
 0006                   .dbline 35
 0006           ;     temp=LBA<<9;
 0006 89E0              ldi R24,9
 0008 90E0              ldi R25,0
 000A FE01              movw R30,R28
 000C 2480              ldd R2,z+4
 000E 3580              ldd R3,z+5
 0010 4680              ldd R4,z+6
 0012 5780              ldd R5,z+7
 0014 8A93              st -y,R24
 0016 8101              movw R16,R2
 0018 9201              movw R18,R4
 001A 0E940000          xcall lsl32
 001E FE01              movw R30,R28
 0020 0083              std z+0,R16
 0022 1183              std z+1,R17
 0024 2283              std z+2,R18
 0026 3383              std z+3,R19
 0028                   .dbline 36
 0028           ;     SD_Read_Block(temp);
 0028 FE01              movw R30,R28
 002A 0081              ldd R16,z+0
 002C 1181              ldd R17,z+1
 002E 2281              ldd R18,z+2
 0030 3381              ldd R19,z+3
 0032 0E940000          xcall _SD_Read_Block
 0036                   .dbline -2
 0036           L1:
 0036 2896              adiw R28,8
 0038                   .dbline 0 ; func end
 0038 0895              ret
 003A                   .dbsym l temp 0 l
 003A                   .dbsym l LBA 4 l
 003A                   .dbend
 003A                   .dbfunc e fatClustToSect _fatClustToSect fl
 003A           ;          clust -> y+4
                        .even
 003A           _fatClustToSect::
 003A 0E940000          xcall push_arg4
 003E 0E940000          xcall push_gset2
 0042                   .dbline -1
 0042                   .dbline 42
 0042           ; }
 0042           ; /*-----------------------------------------------------------------------
 0042           ;  查询数据区一个簇开始扇区号
 0042           ; -----------------------------------------------------------------------*/
 0042           ; unsigned long fatClustToSect(unsigned long clust)
 0042           ; {
 0042                   .dbline 43
 0042           ;       return ((clust-2) * SectorsPerCluster) + FirstDataSector;
 0042 42E0              ldi R20,2
 0044 50E0              ldi R21,0
 0046 60E0              ldi R22,0
 0048 70E0              ldi R23,0
 004A FE01              movw R30,R28
 004C 2480              ldd R2,z+4
 004E 3580              ldd R3,z+5
 0050 4680              ldd R4,z+6
 0052 5780              ldd R5,z+7
 0054 241A              sub R2,R20
 0056 350A              sbc R3,R21
 0058 460A              sbc R4,R22
 005A 570A              sbc R5,R23
 005C 60900C00          lds R6,_SectorsPerCluster
 0060 70900D00          lds R7,_SectorsPerCluster+1
 0064 8824              clr R8
 0066 9924              clr R9
 0068 9A92              st -y,R9
 006A 8A92              st -y,R8
 006C 7A92              st -y,R7
 006E 6A92              st -y,R6
 0070 8101              movw R16,R2
 0072 9201              movw R18,R4
 0074 0E940000          xcall empy32u
 0078 1801              movw R2,R16
 007A 2901              movw R4,R18
 007C 80901200          lds R8,_FirstDataSector+2
 0080 90901300          lds R9,_FirstDataSector+2+1
 0084 60901000          lds R6,_FirstDataSector
 0088 70901100          lds R7,_FirstDataSector+1
 008C 260C              add R2,R6
 008E 371C              adc R3,R7
 0090 481C              adc R4,R8
 0092 591C              adc R5,R9
 0094 8101              movw R16,R2
 0096 9201              movw R18,R4
 0098                   .dbline -2
 0098           L2:
 0098 0E940000          xcall pop_gset2
 009C 2496              adiw R28,4
 009E                   .dbline 0 ; func end
 009E 0895              ret
 00A0                   .dbsym l clust 4 l
 00A0                   .dbend
 00A0                   .dbfunc e fatClusterSize _fatClusterSize fi
                        .even
 00A0           _fatClusterSize::
 00A0                   .dbline -1
 00A0                   .dbline 49
 00A0           ; }
 00A0           ; /*-----------------------------------------------------------------------
 00A0           ;  查询一个簇所占扇区数
 00A0           ; -----------------------------------------------------------------------*/
 00A0           ; unsigned int fatClusterSize(void)
 00A0           ; {
 00A0                   .dbline 51
 00A0           ;       // return the number of sectors in a disk cluster
 00A0           ;       return SectorsPerCluster;
 00A0 00910C00          lds R16,_SectorsPerCluster
 00A4 10910D00          lds R17,_SectorsPerCluster+1
 00A8                   .dbline -2
 00A8           L3:
 00A8                   .dbline 0 ; func end
 00A8 0895              ret
 00AA                   .dbend
 00AA                   .dbfunc e fatInit _fatInit fc
 00AA                   .dbstruct 0 41 bpb710
 00AA                   .dbfield 0 bpbBytesPerSec i
 00AA                   .dbfield 2 bpbSecPerClust c
 00AA                   .dbfield 3 bpbResSectors i
 00AA                   .dbfield 5 bpbFATs c
 00AA                   .dbfield 6 bpbRootDirEnts i
 00AA                   .dbfield 8 bpbSectors i
 00AA                   .dbfield 10 bpbMedia c
 00AA                   .dbfield 11 bpbFATsecs i
 00AA                   .dbfield 13 bpbSecPerTrack i
 00AA                   .dbfield 15 bpbHeads i
 00AA                   .dbfield 17 bpbHiddenSecs l
 00AA                   .dbfield 21 bpbHugeSectors l
 00AA                   .dbfield 25 bpbBigFATsecs l
 00AA                   .dbfield 29 bpbExtFlags i
 00AA                   .dbfield 31 bpbFSVers i
 00AA                   .dbfield 33 bpbRootClust l
 00AA                   .dbfield 37 bpbFSInfo i
 00AA                   .dbfield 39 bpbBackup i
 00AA                   .dbend
 00AA           ;             t2 -> R10
 00AA           ;             t1 -> R12
 00AA           ;           data -> R10,R11
 00AA           ;            bpb -> R10,R11
                        .even
 00AA           _fatInit::
 00AA 0E940000          xcall push_gset4
 00AE 2297              sbiw R28,2
 00B0                   .dbline -1
 00B0                   .dbline 57
 00B0           ; }
 00B0           ; /*-----------------------------------------------------------------------
 00B0           ; 查询SD卡文件系统信息
 00B0           ; -----------------------------------------------------------------------*/
 00B0           ; unsigned char fatInit()
 00B0           ; {
 00B0                   .dbline 62
 00B0           ;     unsigned int data;unsigned char t1,t2;
 00B0           ; 
 00B0           ;       struct bpb710 *bpb;
 00B0           ;       // 读MBR结构
 00B0           ;       ReadBlock(0);  
 00B0 00E0              ldi R16,0
 00B2 10E0              ldi R17,0
 00B4 20E0              ldi R18,0
 00B6 30E0              ldi R19,0
 00B8 A3DF              xcall _ReadBlock
 00BA                   .dbline 64
 00BA           ;       // 读取分区表信息
 00BA           ;       PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
 00BA 80E0              ldi R24,<_BUFFER+446
 00BC 90E0              ldi R25,>_BUFFER+446
 00BE E0E0              ldi R30,<_PartInfo
 00C0 F0E0              ldi R31,>_PartInfo
 00C2 00E1              ldi R16,16
 00C4 10E0              ldi R17,0
 00C6 FA93              st -y,R31
 00C8 EA93              st -y,R30
 00CA 9A93              st -y,R25
 00CC 8A93              st -y,R24
 00CE 0E940000          xcall asgnblk
 00D2                   .dbline 67
 00D2           ;       // 读引导扇区
 00D2           ;       // 引导扇区号在PartInfo.prStartLBA中
 00D2           ;       ReadBlock(PartInfo.prStartLBA);  //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
 00D2 20911F00          lds R18,_PartInfo+8+2
 00D6 30912000          lds R19,_PartInfo+8+2+1
 00DA 00911D00          lds R16,_PartInfo+8
 00DE 10911E00          lds R17,_PartInfo+8+1
 00E2 8EDF              xcall _ReadBlock
 00E4                   .dbline 68
 00E4           ;       bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
 00E4 80E0              ldi R24,<_BUFFER+11
 00E6 90E0              ldi R25,>_BUFFER+11
 00E8 5C01              movw R10,R24
 00EA                   .dbline 70
 00EA           ; 
 00EA           ;       FirstDataSector = PartInfo.prStartLBA;
 00EA 40901F00          lds R4,_PartInfo+8+2
 00EE 50902000          lds R5,_PartInfo+8+2+1
 00F2 20901D00          lds R2,_PartInfo+8
 00F6 30901E00          lds R3,_PartInfo+8+1
 00FA 30921100          sts _FirstDataSector+1,R3
 00FE 20921000          sts _FirstDataSector,R2
 0102 50921300          sts _FirstDataSector+2+1,R5
 0106 40921200          sts _FirstDataSector+2,R4
 010A                   .dbline 71
 010A           ;       if(bpb->bpbFATsecs)
 010A FC01              movw R30,R24
 010C 2384              ldd R2,z+11
 010E 3484              ldd R3,z+12
 0110 2220              tst R2
 0112 11F4              brne X0
 0114 3320              tst R3
 0116 21F1              breq L9
 0118           X0:
 0118                   .dbline 72
 0118           ;       {
 0118                   .dbline 74
 0118           ;               // bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
 0118           ;               FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
 0118 F501              movw R30,R10
 011A 2385              ldd R18,z+11
 011C 3485              ldd R19,z+12
 011E F501              movw R30,R10
 0120 0581              ldd R16,z+5
 0122 1127              clr R17
 0124 0E940000          xcall empy16s
 0128 F501              movw R30,R10
 012A 2380              ldd R2,z+3
 012C 3480              ldd R3,z+4
 012E 200E              add R2,R16
 0130 311E              adc R3,R17
 0132 4424              clr R4
 0134 5524              clr R5
 0136 80901200          lds R8,_FirstDataSector+2
 013A 90901300          lds R9,_FirstDataSector+2+1
 013E 60901000          lds R6,_FirstDataSector
 0142 70901100          lds R7,_FirstDataSector+1
 0146 620C              add R6,R2
 0148 731C              adc R7,R3
 014A 841C              adc R8,R4
 014C 951C              adc R9,R5
 014E 70921100          sts _FirstDataSector+1,R7
 0152 60921000          sts _FirstDataSector,R6
 0156 90921300          sts _FirstDataSector+2+1,R9
 015A 80921200          sts _FirstDataSector+2,R8

⌨️ 快捷键说明

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